diff --git a/unRAID_Essentials/unraid_api_key_renew.sh b/unRAID_Essentials/unraid_api_key_renew.sh new file mode 100755 index 0000000..3dc16e3 --- /dev/null +++ b/unRAID_Essentials/unraid_api_key_renew.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# ============================================================================================== +# ================================= Unraid API Key Renewal ==================================== +# ============================================================================================== +# +# PURPOSE +# ───────────────────────────────────────────────────────────────────────────── +# Creates/overwrites the Varaverk API key in the unraid-api service registry at +# array start. The registry is ephemeral — OS updates and service restarts clear +# it. This script re-registers the key every boot so Varaverk's enhanced +# monitoring self-heals without manual intervention. +# +# Also updates HOST*_UNRAID_API_KEY in the local host conf so the partnership +# page always reflects the live key value. +# +# ============================================================================================== +# RUNTIME MODES +# ============================================================================================== +# +# unraid_api_key_renew.sh +# Renew the key. Silent on success. +# +# unraid_api_key_renew.sh --dry-run +# Show what would happen — no changes made. +# +# unraid_api_key_renew.sh --log +# Verbose output. +# +# ============================================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source "$SCRIPT_DIR/../load_config.sh" + +parse_args "$@" +acquire_lock +detect_hosts + +# ────────────────────────────────────────────────────────────────────────────── +CONF_FILE="$SCRIPT_DIR/../Configurations/${MY_ID,,}.conf" +VAR_NAME="${MY_ID}_UNRAID_API_KEY" + +if [[ ! -f "$CONF_FILE" ]]; then + error "Conf file not found: $CONF_FILE" + exit 1 +fi + +if [[ "$DRY_RUN" == true ]]; then + warn "DRY RUN — would check registry, renew only if key missing" + exit 0 +fi + +# ────────────────────────────────────────────────────────────────────────────── +# Check if key already exists in the unraid-api registry before creating. +# --overwrite generates a new key value every time, invalidating the old one. +# Only renew if the registry has lost it. +EXISTING=$(timeout 5 /usr/local/sbin/unraid-api apikey --name "Varaverk" --json /dev/null) +KEY=$(echo "$EXISTING" | jq -r '.key // empty' 2>/dev/null) + +if [[ -n "$KEY" ]]; then + log "API key already valid in registry — no renewal needed" + exit 0 +fi + +RAW=$(timeout 10 /usr/local/sbin/unraid-api apikey \ + --name "Varaverk" --create --overwrite \ + --description "Varaverk plugin" --roles ADMIN --json &1) + +if [[ -z "$RAW" ]]; then + error "unraid-api returned no output" + exit 1 +fi + +KEY=$(echo "$RAW" | jq -r '.key // empty' 2>/dev/null) +if [[ -z "$KEY" ]]; then + error "No key in unraid-api response: ${RAW:0:200}" + exit 1 +fi + +# ────────────────────────────────────────────────────────────────────────────── +if grep -q "^\s*${VAR_NAME}\s*=" "$CONF_FILE"; then + sed -i "s|^\(\s*${VAR_NAME}\s*=\s*\)\"[^\"]*\"|\1\"${KEY}\"|" "$CONF_FILE" +else + # Field missing from conf — append it + echo " ${VAR_NAME}=\"${KEY}\"" >> "$CONF_FILE" +fi + +PREVIEW="${KEY:0:8}...${KEY: -4}" +log "API key renewed — $VAR_NAME = $PREVIEW"