Files
BackOne/addons/updater/backone-updater
T
2026-06-30 13:10:35 +07:00

130 lines
3.7 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "${SCRIPT_DIR}/platform-paths.sh" ]; then
# shellcheck source=platform-paths.sh
. "${SCRIPT_DIR}/platform-paths.sh"
else
# shellcheck source=../../pkg/common/platform-paths.sh
. "${SCRIPT_DIR}/../../pkg/common/platform-paths.sh"
fi
backone_resolve_paths
HOME_DIR="${BACKONE_HOME}"
STAMP="${HOME_DIR}/.installed-version"
LOG_DIR="${BACKONE_LOG_DIR:-/var/log/backone}"
LOG_FILE="${LOG_DIR}/updater.log"
MIGRATIONS="${BACKONE_ADDONS_DIR}/updater/migrations"
LEGACY_HOME="/var/lib/zerotier-one"
log() {
mkdir -p "$LOG_DIR"
echo "$(date -Iseconds) $*" | tee -a "$LOG_FILE"
}
read_version() {
if [ -f "$STAMP" ]; then
cat "$STAMP"
else
echo '{"package":"backone","version":"0.0.0","schemaVersion":0}'
fi
}
write_version() {
local version="${1:-$(cat debian/version 2>/dev/null || echo 1.15.0)}"
mkdir -p "$HOME_DIR"
cat > "$STAMP" <<EOF
{"package":"backone","version":"${version}","schemaVersion":2,"updatedAt":"$(date -Iseconds)"}
EOF
chown backone:backone "$STAMP" 2>/dev/null || true
}
run_migrations() {
local scope="${1:-all}"
[ -d "$MIGRATIONS" ] || return 0
for script in "$MIGRATIONS"/*; do
[ -f "$script" ] || continue
case "$(basename "$script")" in
001_*)
[ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
;;
002_*)
[ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
;;
003_*)
[ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
;;
*)
if [ "$scope" != "all" ] && [ "$scope" != "$ADDON_SCOPE" ]; then
continue
fi
;;
esac
log "Running migration: $(basename "$script")"
BACKONE_HOME="$HOME_DIR" bash "$script" || log "Migration warning: $(basename "$script")"
done
}
migrate_zerotier() {
if [ -d "$LEGACY_HOME" ] && [ ! -f "$HOME_DIR/identity.public" ]; then
log "Migrating $LEGACY_HOME -> $HOME_DIR"
mkdir -p "$HOME_DIR"
cp -a "$LEGACY_HOME/." "$HOME_DIR/" 2>/dev/null || true
ln -sfn "$HOME_DIR" "$LEGACY_HOME" 2>/dev/null || true
fi
}
rebuild_manifest() {
local registry="${HOME_DIR}/addons.d/enabled.json"
mkdir -p "${HOME_DIR}/addons.d"
if [ ! -f "$registry" ]; then
echo '[]' > "$registry"
fi
local script_dir manifest_script
script_dir="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
manifest_script="${script_dir}/rebuild-addon-manifest.sh"
if [ ! -x "$manifest_script" ]; then
echo "backone-updater: ${manifest_script} not found" >&2
exit 1
fi
local count
count="$(BACKONE_HOME="$HOME_DIR" BACKONE_ADDONS_DIR="${BACKONE_ADDONS_DIR}" bash "$manifest_script")"
log "Wrote ${HOME_DIR}/app/addons/manifest.json (${count} UI addons)"
}
cmd_migrate() {
local scope="all"
ADDON_SCOPE=""
while [ $# -gt 0 ]; do
case "$1" in
--core) scope="core"; shift ;;
--addon) ADDON_SCOPE="$2"; scope="addon"; shift 2 ;;
--dry-run)
log "Dry run: would migrate scope=$scope addon=$ADDON_SCOPE"
ls -1 "$MIGRATIONS" 2>/dev/null || true
exit 0
;;
*) shift ;;
esac
done
migrate_zerotier
run_migrations "$scope"
write_version
rebuild_manifest
log "Migration complete"
}
cmd_status() {
echo "Installed: $(read_version)"
echo "Package version: $(cat "${BACKONE_ADDONS_DIR}/comms-core/addon.json" 2>/dev/null | grep '"version"' | head -1 || cat debian/version 2>/dev/null || echo unknown)"
echo "Addons registry: ${HOME_DIR}/addons.d/enabled.json"
}
case "${1:-}" in
migrate) shift; cmd_migrate "$@" ;;
status) cmd_status ;;
rebuild-manifest) rebuild_manifest ;;
*) echo "Usage: backone-updater migrate [--core|--addon ID] [--dry-run] | status | rebuild-manifest" >&2; exit 1 ;;
esac