summaryrefslogtreecommitdiff
path: root/rel/files/bin/pleroma_ctl
blob: 9fc5b0bad8a0a64ec2ea9ace3887ff79ca95028c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/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)

	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.

"
else
	SCRIPT=$(readlink -f "$0")
	SCRIPTPATH=$(dirname "$SCRIPT")

	FULL_ARGS="$*"

	ACTION="$1"
	shift
        echo "$1" | grep "^-" >/dev/null
	if [ $? -eq 1 ]; then
		SUBACTION="$1"
		shift
	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("'"$FULL_ARGS"'")'
	fi
fi