Add managed Gitea updates and server installer
This commit is contained in:
104
scripts/proxmox-dashboard-update
Executable file
104
scripts/proxmox-dashboard-update
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
CONFIG_FILE=${DASHBOARD_UPDATE_CONFIG:-/etc/proxmox-dashboard/update.env}
|
||||
STATUS_FILE=${DASHBOARD_UPDATE_STATUS_PATH:-/var/lib/proxmox-dashboard/update-status.json}
|
||||
BINARY_PATH=${DASHBOARD_BINARY_PATH:-/usr/local/bin/proxmox-cpu-dashboard}
|
||||
|
||||
if [ -f "$CONFIG_FILE" ]; then
|
||||
# shellcheck disable=SC1090
|
||||
. "$CONFIG_FILE"
|
||||
fi
|
||||
|
||||
GITEA_URL=${GITEA_URL:-https://git.myown.center}
|
||||
GITEA_REPOSITORY=${GITEA_REPOSITORY:-maxim/ProxmoxDash}
|
||||
GITEA_TOKEN=${GITEA_TOKEN:-}
|
||||
UPDATE_MODE=${UPDATE_MODE:-notify}
|
||||
ASSET_NAME=${ASSET_NAME:-proxmox-dashboard-linux-amd64}
|
||||
|
||||
mkdir -p "$(dirname "$STATUS_FILE")"
|
||||
tmp_dir=$(mktemp -d /tmp/proxmox-dashboard-update.XXXXXX)
|
||||
trap 'rm -rf "$tmp_dir"' EXIT INT TERM
|
||||
|
||||
auth_header=""
|
||||
if [ -n "$GITEA_TOKEN" ]; then
|
||||
auth_header="Authorization: token $GITEA_TOKEN"
|
||||
fi
|
||||
|
||||
api_get() {
|
||||
if [ -n "$auth_header" ]; then
|
||||
curl --fail --silent --show-error --location --header "$auth_header" "$1"
|
||||
else
|
||||
curl --fail --silent --show-error --location "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
write_status() {
|
||||
python3 - "$STATUS_FILE" "$1" "$2" "$3" "$4" "$5" "$6" <<'PY'
|
||||
import datetime, json, os, sys, tempfile
|
||||
path, current, available, state, mode, message, release_url = sys.argv[1:]
|
||||
payload = {
|
||||
"currentVersion": current,
|
||||
"availableVersion": available,
|
||||
"state": state,
|
||||
"mode": mode,
|
||||
"message": message,
|
||||
"releaseUrl": release_url,
|
||||
"checkedAt": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
||||
}
|
||||
fd, temporary = tempfile.mkstemp(dir=os.path.dirname(path), prefix=".update-status-")
|
||||
with os.fdopen(fd, "w") as stream:
|
||||
json.dump(payload, stream)
|
||||
os.chmod(temporary, 0o644)
|
||||
os.replace(temporary, path)
|
||||
PY
|
||||
}
|
||||
|
||||
current_version=$($BINARY_PATH -version 2>/dev/null || printf 'dev')
|
||||
release_json=$(api_get "$GITEA_URL/api/v1/repos/$GITEA_REPOSITORY/releases/latest")
|
||||
printf '%s' "$release_json" > "$tmp_dir/release.json"
|
||||
release_data=$(python3 - "$tmp_dir/release.json" "$ASSET_NAME" <<'PY'
|
||||
import json, sys
|
||||
release = json.load(open(sys.argv[1]))
|
||||
asset_name = sys.argv[2]
|
||||
assets = {item.get("name"): item.get("browser_download_url") for item in release.get("assets", [])}
|
||||
binary = assets.get(asset_name, "")
|
||||
checksum = assets.get(asset_name + ".sha256", "")
|
||||
print(release.get("tag_name", ""))
|
||||
print(release.get("html_url", ""))
|
||||
print(binary)
|
||||
print(checksum)
|
||||
PY
|
||||
)
|
||||
latest_version=$(printf '%s\n' "$release_data" | sed -n '1p')
|
||||
release_url=$(printf '%s\n' "$release_data" | sed -n '2p')
|
||||
binary_url=$(printf '%s\n' "$release_data" | sed -n '3p')
|
||||
checksum_url=$(printf '%s\n' "$release_data" | sed -n '4p')
|
||||
|
||||
if [ -z "$latest_version" ] || [ -z "$binary_url" ]; then
|
||||
write_status "$current_version" "$latest_version" error "$UPDATE_MODE" "В свежем релизе не найден бинарник $ASSET_NAME." "$release_url"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
newest=$(printf '%s\n%s\n' "$current_version" "$latest_version" | sort -V | tail -n 1)
|
||||
if [ "$current_version" = "$latest_version" ] || [ "$newest" = "$current_version" ]; then
|
||||
write_status "$current_version" "$latest_version" current "$UPDATE_MODE" "Установлена свежая версия." "$release_url"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$UPDATE_MODE" != "auto" ]; then
|
||||
write_status "$current_version" "$latest_version" available "$UPDATE_MODE" "Доступна новая версия $latest_version." "$release_url"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
api_get "$binary_url" > "$tmp_dir/$ASSET_NAME"
|
||||
if [ -n "$checksum_url" ]; then
|
||||
api_get "$checksum_url" > "$tmp_dir/$ASSET_NAME.sha256"
|
||||
(cd "$tmp_dir" && sha256sum -c "$ASSET_NAME.sha256")
|
||||
fi
|
||||
chmod 0755 "$tmp_dir/$ASSET_NAME"
|
||||
file "$tmp_dir/$ASSET_NAME" | grep -q 'ELF 64-bit'
|
||||
cp -p "$BINARY_PATH" "$BINARY_PATH.previous"
|
||||
install -m 0755 "$tmp_dir/$ASSET_NAME" "$BINARY_PATH"
|
||||
write_status "$latest_version" "$latest_version" updated "$UPDATE_MODE" "Обновление $latest_version установлено." "$release_url"
|
||||
systemctl restart proxmox-cpu-dashboard.service
|
||||
Reference in New Issue
Block a user