Initial commit

This commit is contained in:
admin committed 2026-09-05 22:47:35 +02:00
commit 8641464a6c
44 files changed
+2192

No files matched your search

+108
View File
@@ -0,0 +1,108 @@
#!/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