#!/usr/bin/env bash set -Eeuo pipefail CONFIG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/hermes-stack-maintenance/config.env" SIGNAL_CONFIG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/hermes-stack-maintenance/signal-cli.env" STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/hermes-stack-maintenance" NOTIFIER="$HOME/.local/libexec/hermes-stack-notify" # shellcheck disable=SC1090 source "$CONFIG_FILE" # shellcheck disable=SC1090 source "$SIGNAL_CONFIG_FILE" version="${1:-}" if [[ -z "$version" ]]; then latest_url="$(curl -LsS --max-time 30 -o /dev/null -w '%{url_effective}' \ https://github.com/AsamK/signal-cli/releases/latest)" version="${latest_url##*/v}" fi [[ "$version" =~ ^[0-9]+(\.[0-9]+)+$ ]] || { printf 'Ungültige signal-cli-Version: %s\n' "$version" >&2 exit 1 } old_version="unbekannt" if [[ -x "$SIGNAL_CLI_BIN" ]]; then old_version="$("$SIGNAL_CLI_BIN" --version 2>/dev/null | grep -Eo '[0-9]+(\.[0-9]+)+' | head -n1 || true)" fi [[ -n "$old_version" ]] || old_version="unbekannt" tmp_dir="$(mktemp -d)" trap 'rm -rf -- "$tmp_dir"' EXIT archive="$tmp_dir/signal-cli.tar.gz" url="https://github.com/AsamK/signal-cli/releases/download/v${version}/signal-cli-${version}.tar.gz" curl --fail --location --show-error "$url" -o "$archive" tar -xzf "$archive" -C "$tmp_dir" binary="$(find "$tmp_dir" -type f -path '*/bin/signal-cli' -print -quit)" [[ -n "$binary" ]] || { printf 'signal-cli-Binary wurde im Archiv nicht gefunden.\n' >&2 exit 1 } source_root="$(dirname "$(dirname "$binary")")" timestamp="$(date +%Y%m%d-%H%M%S)" backup_dir="$STATE_DIR/backups/signal-cli/$timestamp" mkdir -p "$backup_dir" old_target="" if [[ -e "$SIGNAL_CLI_BIN" || -L "$SIGNAL_CLI_BIN" ]]; then old_target="$(readlink -f "$SIGNAL_CLI_BIN" 2>/dev/null || true)" if [[ -n "$old_target" ]]; then old_root="$(dirname "$(dirname "$old_target")")" [[ -d "$old_root" ]] && cp -a "$old_root" "$backup_dir/program" fi fi if [[ -d "${SIGNAL_CONFIG_DIR:-}" ]]; then tar --zstd -cf "$backup_dir/signal-data.tar.zst" \ -C "$(dirname "$SIGNAL_CONFIG_DIR")" "$(basename "$SIGNAL_CONFIG_DIR")" fi was_active=0 systemctl --user is-active --quiet "$SIGNAL_SERVICE" && was_active=1 ((was_active == 0)) || systemctl --user stop "$SIGNAL_SERVICE" target="$HOME/.local/opt/signal-cli-$version" mkdir -p "$target" "$(dirname "$SIGNAL_CLI_BIN")" cp -a "$source_root/." "$target/" ln -sfn "$target/bin/signal-cli" "$SIGNAL_CLI_BIN" if ((was_active)); then systemctl --user restart "$SIGNAL_SERVICE" sleep 5 set +u set -a # shellcheck disable=SC1090 source "$HERMES_ENV" || true set +a set -u signal_http_url="${SIGNAL_HTTP_URL:-}" status="" if [[ -n "$signal_http_url" ]]; then status="$(curl --silent --output /dev/null --max-time 10 \ --write-out '%{http_code}' "${signal_http_url%/}/api/v1/check" || true)" fi if [[ ! "$status" =~ ^2[0-9][0-9]$ ]]; then systemctl --user stop "$SIGNAL_SERVICE" || true if [[ -n "$old_target" ]]; then ln -sfn "$old_target" "$SIGNAL_CLI_BIN" systemctl --user restart "$SIGNAL_SERVICE" || true fi "$NOTIFIER" "signal-cli-Update auf $version fehlgeschlagen; Binary wurde auf $old_version zurückgestellt. Backup: $backup_dir" || true exit 1 fi fi mapfile -t old_backups < <( find "$STATE_DIR/backups/signal-cli" -mindepth 1 -maxdepth 1 -type d \ -printf '%T@ %p\n' | sort -nr | tail -n +4 | cut -d' ' -f2- ) ((${#old_backups[@]} == 0)) || rm -rf -- "${old_backups[@]}" "$NOTIFIER" "signal-cli wurde erfolgreich aktualisiert: $old_version -> $version. Daten- und Binary-Backup: $backup_dir" || true