pleroma_ctl: fix crashes due to different shift(1) behavior on dash
[akkoma] / rel / files / bin / pleroma_ctl
1 #!/bin/sh
2 # XXX: This should be removed when elixir's releases get custom command support
3
4 detect_flavour() {
5 arch="$(uname -m)"
6 if [ "$arch" = "x86_64" ]; then
7 arch="amd64"
8 elif [ "$arch" = "armv7l" ]; then
9 arch="arm"
10 elif [ "$arch" = "aarch64" ]; then
11 arch="arm64"
12 else
13 echo "Unsupported arch: $arch" >&2
14 exit 1
15 fi
16
17 if getconf GNU_LIBC_VERSION >/dev/null; then
18 libc_postfix=""
19 elif [ "$(ldd 2>&1 | head -c 9)" = "musl libc" ]; then
20 libc_postfix="-musl"
21 elif [ "$(find /lib/libc.musl* | wc -l)" ]; then
22 libc_postfix="-musl"
23 else
24 echo "Unsupported libc" >&2
25 exit 1
26 fi
27
28 echo "$arch$libc_postfix"
29 }
30
31 detect_branch() {
32 version="$(cut -d' ' -f2 <"$RELEASE_ROOT"/releases/start_erl.data)"
33 # Expected format: major.minor.patch_version(-number_of_commits_ahead_of_tag-gcommit_hash).branch
34 branch="$(echo "$version" | cut -d'.' -f 4)"
35 if [ "$branch" = "develop" ]; then
36 echo "develop"
37 elif [ "$branch" = "" ]; then
38 echo "stable"
39 else
40 # Note: branch name in version is of SemVer format and may only contain [0-9a-zA-Z-] symbols —
41 # if supporting releases for more branches, need to ensure they contain only these symbols.
42 echo "Can't detect the branch automatically, please specify it by using the --branch option." >&2
43 exit 1
44 fi
45 }
46 update() {
47 set -e
48 NO_RM=false
49
50 while echo "$1" | grep "^-" >/dev/null; do
51 case "$1" in
52 --zip-url)
53 FULL_URI="$2"
54 shift 2
55 ;;
56 --no-rm)
57 NO_RM=true
58 shift
59 ;;
60 --flavour)
61 FLAVOUR="$2"
62 shift 2
63 ;;
64 --branch)
65 BRANCH="$2"
66 shift 2
67 ;;
68 --tmp-dir)
69 TMP_DIR="$2"
70 shift 2
71 ;;
72 -*)
73 echo "invalid option: $1" 1>&2
74 shift
75 ;;
76 esac
77 done
78
79 RELEASE_ROOT=$(dirname "$SCRIPTPATH")
80 uri="https://git.pleroma.social"
81 project_id="2"
82 project_branch="${BRANCH:-$(detect_branch)}"
83 flavour="${FLAVOUR:-$(detect_flavour)}"
84 tmp="${TMP_DIR:-/tmp}"
85 artifact="$tmp/pleroma.zip"
86 full_uri="${FULL_URI:-${uri}/api/v4/projects/${project_id}/jobs/artifacts/${project_branch}/download?job=${flavour}}"
87 echo "Downloading the artifact from ${full_uri} to ${artifact}"
88 curl "$full_uri" -o "${artifact}"
89 echo "Unpacking ${artifact} to ${tmp}"
90 unzip -q "$artifact" -d "$tmp"
91 echo "Copying files over to $RELEASE_ROOT"
92 if [ "$NO_RM" = false ]; then
93 echo "Removing files from the previous release"
94 rm -r "${RELEASE_ROOT:-?}"/*
95 fi
96 cp -rf "$tmp/release"/* "$RELEASE_ROOT"
97 echo "Removing temporary files"
98 rm -r "$tmp/release"
99 rm "$artifact"
100 echo "Done! Please refer to the changelog/release notes for changes and update instructions"
101 set +e
102 }
103
104 if [ -z "$1" ] || [ "$1" = "help" ]; then
105 # TODO: Just list the commands on `pleroma_ctl help` and output help for the individual command on `pleroma_ctl help $COMMAND`
106 echo "Usage: $(basename "$0") COMMAND [ARGS]
107
108 The known commands are:
109
110 create
111 Create database schema (needs to be executed only once)
112
113 migrate
114 Execute database migrations (needs to be done after updates)
115
116 rollback [VERSION]
117 Rollback database migrations (needs to be done before downgrading)
118
119 update [OPTIONS]
120 Update the instance.
121
122 Options:
123 --branch Update to a specified branch, instead of the latest version of the current one.
124 --flavour Update to a specified flavour (CPU architecture+libc), instead of the current one.
125 --zip-url Get the release from a specified url. If set, renders the previous 2 options inactive.
126 --no-rm Do not erase previous release's files.
127 --tmp-dir Download the temporary files to a specified directory.
128
129 and any mix tasks under Pleroma namespace, for example \`mix pleroma.user COMMAND\` is
130 equivalent to \`$(basename "$0") user COMMAND\`
131
132 By default pleroma_ctl will try calling into a running instance to execute non migration-related commands,
133 if for some reason this is undesired, set PLEROMA_CTL_RPC_DISABLED environment variable.
134
135 "
136 else
137 SCRIPT=$(readlink -f "$0")
138 SCRIPTPATH=$(dirname "$SCRIPT")
139
140 FULL_ARGS="$*"
141
142 ACTION="$1"
143 if [ $# -gt 0 ]; then
144 shift
145 fi
146 echo "$1" | grep "^-" >/dev/null
147 if [ $? -eq 1 ]; then
148 SUBACTION="$1"
149 if [ $# -gt 0 ]; then
150 shift
151 fi
152 fi
153
154 if [ "$ACTION" = "update" ]; then
155 update "$@"
156 elif [ "$ACTION" = "migrate" ] || [ "$ACTION" = "rollback" ] || [ "$ACTION" = "create" ] || [ "$ACTION $SUBACTION" = "instance gen" ] || [ "$PLEROMA_CTL_RPC_DISABLED" = true ]; then
157 "$SCRIPTPATH"/pleroma eval 'Pleroma.ReleaseTasks.run("'"$FULL_ARGS"'")'
158 else
159 "$SCRIPTPATH"/pleroma rpc 'Pleroma.ReleaseTasks.run("'"$FULL_ARGS"'")'
160 fi
161 fi