Add installation note about flavour, support special cases (#222)
[akkoma] / rel / files / bin / pleroma_ctl
index b0e1874a98c53752c5e5bdb6f6f47f8babd1f8b2..e0e6d1b5af867bfae4b44c4ccf68c4b3a2c5ac82 100755 (executable)
 # XXX: This should be removed when elixir's releases get custom command support
 
 detect_flavour() {
-       arch="$(arch)"
-       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"
+    arch="amd64"
+    # Special cases
+    if grep -qe "VERSION_CODENAME=jammy" /etc/os-release; then
+        echo "$arch-ubuntu-jammy"
+    else
+        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"
+    fi
 }
 
 detect_branch() {
        version="$(cut -d' ' -f2 <"$RELEASE_ROOT"/releases/start_erl.data)"
-       branch="$(echo "$version" | cut -d'-' -f 4)"
+       # 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 "master"
+               echo "stable"
        else
-               echo "Releases are built only for master and develop branches" >&2
+               # 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="${PLEROMA_CTL_URI:-https://git.pleroma.social}"
-       project_id="${PLEROMA_CTL_PROJECT_ID:-2}"
-       project_branch="$(detect_branch)"
-       flavour="${PLEROMA_CTL_FLAVOUR:-$(detect_flavour)}"
-       echo "Detected flavour: $flavour"
-       tmp="${PLEROMA_CTL_TMP_DIR:-/tmp}"
+       uri="https://akkoma-updates.s3-website.fr-par.scw.cloud"
+       project_id="2"
+       project_branch="${BRANCH:-$(detect_branch)}"
+       flavour="${FLAVOUR:-$(detect_flavour)}"
+       tmp="${TMP_DIR:-/tmp}"
        artifact="$tmp/pleroma.zip"
-       full_uri="${uri}/api/v4/projects/${project_id}/jobs/artifacts/${project_branch}/download?job=${flavour}"
+       full_uri="${FULL_URI:-${uri}/${project_branch}/akkoma-${flavour}}.zip"
        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 "Backing up erlang cookie"
+    erlang_cookie=$(cat $RELEASE_ROOT/releases/COOKIE)
+    echo "Cookie: $erlang_cookie"
        echo "Copying files over to $RELEASE_ROOT"
-       if [ "$1" != "--no-rm" ]; then
+       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 "Restoring erlang cookie"
+    echo $erlang_cookie > $RELEASE_ROOT/releases/COOKIE
        echo "Done! Please refer to the changelog/release notes for changes and update instructions"
+    echo "You probably also want to update your frontend!"
        set +e
 }
 
@@ -83,36 +117,45 @@ if [ -z "$1" ] || [ "$1" = "help" ]; then
          Rollback database migrations (needs to be done before downgrading)
 
        update [OPTIONS]
-         Update the instance using the latest CI artifact for the current branch.
-
-         The only supported option is --no-rm, when set the script won't delete the whole directory, but
-         just force copy over files from the new release. This wastes more space, but may be useful if
-         some files are stored inside of the release directories (although you really shouldn't store them
-         there), or if you want to be able to quickly revert a broken update.
-
-         The script will try to detect your architecture and ABI and set a flavour automatically,
-         but if it is wrong, you can overwrite it by setting PLEROMA_CTL_FLAVOUR to the desired flavour.
-
-         By default the artifact will be downloaded from https://git.pleroma.social for pleroma/pleroma (project id: 2)
-         to /tmp/, you can overwrite these settings by setting PLEROMA_CTL_URI, PLEROMA_CTL_PROJECT_ID and PLEROMA_CTL_TMP_DIR
-         respectively.
+         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" = "update" ]; then
-               update "$2"
-       elif [ "$1" = "migrate" ] || [ "$1" = "rollback" ] || [ "$1" = "create" ] || [ "$1 $2" = "instance gen" ] || [ -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