First
[anni] / 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