diff options
Diffstat (limited to 'rel/files/bin/pleroma_ctl')
| -rwxr-xr-x | rel/files/bin/pleroma_ctl | 121 | 
1 files changed, 121 insertions, 0 deletions
| diff --git a/rel/files/bin/pleroma_ctl b/rel/files/bin/pleroma_ctl new file mode 100755 index 000000000..e731d20eb --- /dev/null +++ b/rel/files/bin/pleroma_ctl @@ -0,0 +1,121 @@ +#!/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 "master" +	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 "Releases are built only for master and develop branches" >&2 +		exit 1 +	fi +} +update() { +	set -e +	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}" +	artifact="$tmp/pleroma.zip" +	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 [ "$1" != "--no-rm" ]; then +		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 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. + + +    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") + +	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("'"$*"'")' +	else +		"$SCRIPTPATH"/pleroma rpc 'Pleroma.ReleaseTasks.run("'"$*"'")' +	fi +fi | 
