Initial commit
This commit is contained in:
commit
8641464a6c
44 files changed
+2192
No files matched your search
Executable
+108
@@ -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
|
||||
Reference in new issue
Block a user