#!/bin/bash set -euo pipefail tag=latest dummy=false token="" function usage() { echo "Usage:" echo "$(basename "${0}") [-t|--tag ] [-T|--token ] [-d|--debug]" echo "" echo " -d|--debug Show more debug information." echo " -t|--tag Release tag or 'latest' (default)." echo " -T|--token Github token with read access to public repositories." echo " -D|--dummy|--dry-run Run in Dry-mode without actually updating but showing the commands to execute." } while [ $# -gt 0 ] do case "${1}" in "-h"|"-?"|"--help") shift usage exit 0 ;; "-d"|"--debug") shift export DEBUG=true ;; "-t"|"--tag") shift tag="${1}" shift ;; "-T"|"--token") shift token="${1}" shift ;; '-D'|'--dummy'|'--dry-run') shift dummy=true ;; *) message "Unknown parameter '$1'" p shift ;; esac done if [ -z "${token}" ]; then echo "You must provide a Github token" exit 4 fi if [ "${tag}" == "latest" ]; then tag=$(curl -L -s -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${token}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/mastodon/mastodon/releases/latest | jq '.tag_name' | sed 's/"//g') if [ "${DEBUG}" == "true" ]; then echo "Latest tag is '${tag}'" fi else if [ "${DEBUG}" == "true" ]; then echo "Looking for tag '${tag}'..." fi next_page=https://api.github.com/repos/mastodon/mastodon/releases releases_file=$(mktemp /tmp/tmp.XXXX) while [ -z "${next_page}" ] do tmpfile=$(mktemp /tmp/tmp.XXXXX) releases=$(curl -L -v -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${token}" -H "X-GitHub-Api-Version: 2022-11-28" "${next_page}" | jq '.[]|.tag_name' 2> "${tmpfile}") echo "${releases}" >> "${releases_file}" next_page=$(grep '< link: ' "${tmpfile}" | sed 's/< link: //g' | sed 's/, /\n/g' | grep 'rel="next"' | grep -o 'https://[^>]*') done if ! pgrep "${tag}" "${releases_file}"; then printf "The tag '%s' is not part of the releases:\n%s" "${tag}" "${releases}" exit 1 fi fi mastodon_home="$(grep "^mastodon:" /etc/passwd | awk 'BEGIN {FS=":"} {print($6)}')/live" if [ ! -d "${mastodon_home}" ]; then printf "The home for the user mastodon '%s', doesn't exist." "${mastodon_home}" exit 2 fi if [ "${DEBUG}" == "true" ]; then echo "Changing to Mastodon's home directory '${mastodon_home}'..." fi cd "${mastodon_home}" || exit 3 current_tag=$(git name-rev --name-only HEAD | awk 'BEGIN {FS="/"} {print($2)}') if [ "${current_tag}" != "${tag}" ]; then if [ "${DEBUG}" == "true" ]; then echo "Fetching from repository..." fi if [ "${dummy}" == "true" ]; then echo sudo -u mastodon git fetch else sudo -u mastodon git fetch fi if [ "${DEBUG}" == "true" ]; then echo "Changing to reference '${tag}'..." fi if [ "${dummy}" == "true" ]; then echo sudo -u mastodon git checkout "${tag}" else sudo -u mastodon git checkout "${tag}" fi current_date=$(date +%Y-%m-%d-%H-%M-%S) mkdir -p /var/backups/postgres backup_file="/var/backups/postgres/pgdump_pre_update_mastodon_to_${tag}_${current_date}.sql.gz" if [ "${dummy}" == "true" ]; then echo "sudo -u postgres pg_dump mastodon | gzip -c > \"${backup_file}\"" else if [ "${DEBUG}" == "true" ]; then echo "Creating a backup of the database in '${backup_file}'..." fi sudo -u postgres pg_dump mastodon | gzip -c > "${backup_file}" fi if [ "${DEBUG}" == "true" ]; then echo "Running bundle install..." fi if [ "${dummy}" == "true" ]; then echo sudo -u mastodon "${mastodon_home}/bin/bundle" install else sudo -u mastodon "${mastodon_home}/bin/bundle" install fi if [ "${DEBUG}" == "true" ]; then echo "Running yarm install..." fi if [ "${dummy}" == "true" ]; then echo sudo -u mastodon "${mastodon_home}/bin/yarn" install --frozen-lockfile else sudo -u mastodon "${mastodon_home}/bin/yarn" install --frozen-lockfile fi if [ "${DEBUG}" == "true" ]; then echo "Restarting Mastodon services..." fi if [ "${dummy}" == "true" ]; then echo sudo systemctl restart mastodon-sidekiq.service mastodon-web.service mastodon-streaming mastodon-streaming@4000.service else sudo systemctl restart mastodon-sidekiq.service mastodon-web.service mastodon-streaming mastodon-streaming@4000.service fi else echo "Current branch is already '${tag}'" exit 0 fi