Merge branch 'refactor/db-not-null-constraints-for-oauth_authorizations' into 'develop'
[akkoma] / rel / files / bin / pleroma_ctl
index ac7339762dbbe463f13de05e70ae4f79ead7e79f..87c486514008b84086e308efee4f7774cc85afad 100755 (executable)
 #!/bin/sh
 # XXX: This should be removed when elixir's releases get custom command support
+
+detect_flavour() {
+       arch="$(uname -m)"
+       if [ "$arch" = "x86_64" ]; then
+               arch="amd64"
+       elif [ "$arch" = "armv7l" ]; then
+               arch="arm"
+       elif [ "$arch" = "aarch64" ]; then
+               arch="arm64"
+       else
+               echo "Unsupported arch: $arch" >&2
+               exit 1
+       fi
+
+       if getconf GNU_LIBC_VERSION >/dev/null; then
+               libc_postfix=""
+       elif [ "$(ldd 2>&1 | head -c 9)" = "musl libc" ]; then
+               libc_postfix="-musl"
+       elif [ "$(find /lib/libc.musl* | wc -l)" ]; then
+               libc_postfix="-musl"
+       else
+               echo "Unsupported libc" >&2
+               exit 1
+       fi
+
+       echo "$arch$libc_postfix"
+}
+
+detect_branch() {
+       version="$(cut -d' ' -f2 <"$RELEASE_ROOT"/releases/start_erl.data)"
+       # Expected format: major.minor.patch_version(-number_of_commits_ahead_of_tag-gcommit_hash).branch
+       branch="$(echo "$version" | cut -d'.' -f 4)"
+       if [ "$branch" = "develop" ]; then
+               echo "develop"
+       elif [ "$branch" = "" ]; then
+               echo "stable"
+       else
+               # Note: branch name in version is of SemVer format and may only contain [0-9a-zA-Z-] symbols —
+               #   if supporting releases for more branches, need to ensure they contain only these symbols.
+               echo "Can't detect the branch automatically, please specify it by using the --branch option." >&2
+               exit 1
+       fi
+}
+update() {
+       set -e
+       NO_RM=false
+
+       while echo "$1" | grep "^-" >/dev/null; do
+               case "$1" in
+               --zip-url)
+                       FULL_URI="$2"
+                       shift 2
+                       ;;
+               --no-rm)
+                       NO_RM=true
+                       shift
+                       ;;
+               --flavour)
+                       FLAVOUR="$2"
+                       shift 2
+                       ;;
+               --branch)
+                       BRANCH="$2"
+                       shift 2
+                       ;;
+               --tmp-dir)
+                       TMP_DIR="$2"
+                       shift 2
+                       ;;
+               -*)
+                       echo "invalid option: $1" 1>&2
+                       shift
+                       ;;
+               esac
+       done
+
+       RELEASE_ROOT=$(dirname "$SCRIPTPATH")
+       uri="https://git.pleroma.social"
+       project_id="2"
+       project_branch="${BRANCH:-$(detect_branch)}"
+       flavour="${FLAVOUR:-$(detect_flavour)}"
+       tmp="${TMP_DIR:-/tmp}"
+       artifact="$tmp/pleroma.zip"
+       full_uri="${FULL_URI:-${uri}/api/v4/projects/${project_id}/jobs/artifacts/${project_branch}/download?job=${flavour}}"
+       echo "Downloading the artifact from ${full_uri} to ${artifact}"
+       curl "$full_uri" -o "${artifact}"
+       echo "Unpacking ${artifact} to ${tmp}"
+       unzip -q "$artifact" -d "$tmp"
+       echo "Copying files over to $RELEASE_ROOT"
+       if [ "$NO_RM" = false ]; then
+               echo "Removing files from the previous release"
+               rm -r "${RELEASE_ROOT:-?}"/*
+       fi
+       cp -rf "$tmp/release"/* "$RELEASE_ROOT"
+       echo "Removing temporary files"
+       rm -r "$tmp/release"
+       rm "$artifact"
+       echo "Done! Please refer to the changelog/release notes for changes and update instructions"
+       set +e
+}
+
 if [ -z "$1" ] || [ "$1" = "help" ]; then
+       # TODO: Just list the commands on `pleroma_ctl help` and output help for the individual command on `pleroma_ctl help $COMMAND`
        echo "Usage: $(basename "$0") COMMAND [ARGS]
 
     The known commands are:
 
-        create                     Create database schema (needs to be executed only once)
-        migrate                    Execute database migrations (needs to be done after updates)
-        rollback [VERSION]         Rollback database migrations (needs to be done before downgrading)
+        create
+         Create database schema (needs to be executed only once)
+
+        migrate
+         Execute database migrations (needs to be done after updates)
+
+        rollback [VERSION]
+         Rollback database migrations (needs to be done before downgrading)
+
+       update [OPTIONS]
+         Update the instance.
+
+         Options:
+         --branch  Update to a specified branch, instead of the latest version of the current one.
+         --flavour Update to a specified flavour (CPU architecture+libc), instead of the current one.
+         --zip-url Get the release from a specified url. If set, renders the previous 2 options inactive.
+         --no-rm   Do not erase previous release's files.
+         --tmp-dir Download the temporary files to a specified directory.
 
     and any mix tasks under Pleroma namespace, for example \`mix pleroma.user COMMAND\` is
     equivalent to \`$(basename "$0") user COMMAND\`
 
     By default pleroma_ctl will try calling into a running instance to execute non migration-related commands,
-    if for some reason this is undesired, set PLEROMA_CTL_RPC_DISABLED environment variable
+    if for some reason this is undesired, set PLEROMA_CTL_RPC_DISABLED environment variable.
+
 "
 else
        SCRIPT=$(readlink -f "$0")
        SCRIPTPATH=$(dirname "$SCRIPT")
-       if [ "$1" = "migrate" ] || [ "$1" = "rollback" ] || [ "$1" = "create" ] || [ -n "$PLEROMA_CTL_RPC_DISABLED" ]; then
-               "$SCRIPTPATH"/pleroma eval 'Pleroma.ReleaseTasks.run("'"$*"'")'
+
+       FULL_ARGS="$*"
+
+       ACTION="$1"
+       if [ $# -gt 0 ]; then
+               shift
+       fi
+       echo "$1" | grep "^-" >/dev/null
+       if [ $? -eq 1 ]; then
+               SUBACTION="$1"
+               if [ $# -gt 0 ]; then
+                       shift
+               fi
+       fi
+
+       if [ "$ACTION" = "update" ]; then
+               update "$@"
+       elif [ "$ACTION" = "migrate" ] || [ "$ACTION" = "rollback" ] || [ "$ACTION" = "create" ] || [ "$ACTION $SUBACTION" = "instance gen" ] || [ "$PLEROMA_CTL_RPC_DISABLED" = true ]; then
+               "$SCRIPTPATH"/pleroma eval 'Pleroma.ReleaseTasks.run("'"$FULL_ARGS"'")'
        else
-               "$SCRIPTPATH"/pleroma rpc 'Pleroma.ReleaseTasks.run("'"$*"'")'
+               "$SCRIPTPATH"/pleroma rpc 'Pleroma.ReleaseTasks.run("'"$FULL_ARGS"'")'
        fi
 fi