Open the sync gates when a partnership actually completes, instead of leaving them shut for ever
This commit is contained in:
@@ -35,6 +35,8 @@
|
|||||||
# Step 9c: Media seed — rsync all DAILY_SYNC_SHARES to mirror (--seed)
|
# Step 9c: Media seed — rsync all DAILY_SYNC_SHARES to mirror (--seed)
|
||||||
# prevents arrs treating every file as missing after bootstrap
|
# prevents arrs treating every file as missing after bootstrap
|
||||||
# Step 9d: Webhook listener — start listener on mirror (runs continuously, no reboot needed)
|
# Step 9d: Webhook listener — start listener on mirror (runs continuously, no reboot needed)
|
||||||
|
# Step 9e: Arm sync gates — open RSYNC/CONF_SYNC/ARR_SYNC in master.conf, which the
|
||||||
|
# template ships closed so a fresh node cannot sync early
|
||||||
# Step 10: Conf push — push master.conf + setup state to all listed hosts
|
# Step 10: Conf push — push master.conf + setup state to all listed hosts
|
||||||
#
|
#
|
||||||
# ==============================================================================================
|
# ==============================================================================================
|
||||||
@@ -158,6 +160,11 @@
|
|||||||
# Skip starting webhook listener on mirror (Step 9d)
|
# Skip starting webhook listener on mirror (Step 9d)
|
||||||
# Listener will start automatically on next array restart
|
# Listener will start automatically on next array restart
|
||||||
#
|
#
|
||||||
|
# Partnership/partnership_onboard.sh --no-arm
|
||||||
|
# Leave RSYNC_ENABLED / CONF_SYNC_ENABLED / ARR_SYNC_ENABLED as they are (Step 9e).
|
||||||
|
# Use when onboarding a node you want to keep inert — a rebuild test, or a mirror whose
|
||||||
|
# shares are not populated yet.
|
||||||
|
#
|
||||||
# Partnership/partnership_onboard.sh --phase1-only
|
# Partnership/partnership_onboard.sh --phase1-only
|
||||||
# OWNER only: SSH key exchange + conf push. Safe to run before HOST2 has Varaverk.
|
# OWNER only: SSH key exchange + conf push. Safe to run before HOST2 has Varaverk.
|
||||||
# Writes HOST2_PHASE1_DONE=true to varaverk_setup.db.
|
# Writes HOST2_PHASE1_DONE=true to varaverk_setup.db.
|
||||||
@@ -188,6 +195,7 @@ SKIP_MEDIA_SEED=false
|
|||||||
SKIP_WEBHOOK_LISTENER=false
|
SKIP_WEBHOOK_LISTENER=false
|
||||||
PHASE1_ONLY=false # OWNER: SSH + conf push only (HOST2 not yet installed)
|
PHASE1_ONLY=false # OWNER: SSH + conf push only (HOST2 not yet installed)
|
||||||
PHASE2_ONLY=false # OWNER: containers/arr/onboard only (triggered by HOST2 after it onboards)
|
PHASE2_ONLY=false # OWNER: containers/arr/onboard only (triggered by HOST2 after it onboards)
|
||||||
|
SKIP_ARM=false # leave the sync gates as they are — see Step 9e
|
||||||
FILTERED_ARGS=()
|
FILTERED_ARGS=()
|
||||||
|
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
@@ -203,6 +211,7 @@ for arg in "$@"; do
|
|||||||
--skip-webhook-listener) SKIP_WEBHOOK_LISTENER=true ;;
|
--skip-webhook-listener) SKIP_WEBHOOK_LISTENER=true ;;
|
||||||
--phase1-only) PHASE1_ONLY=true ;;
|
--phase1-only) PHASE1_ONLY=true ;;
|
||||||
--phase2-only) PHASE2_ONLY=true; SKIP_SSH=true ;;
|
--phase2-only) PHASE2_ONLY=true; SKIP_SSH=true ;;
|
||||||
|
--no-arm) SKIP_ARM=true ;;
|
||||||
*) FILTERED_ARGS+=("$arg") ;;
|
*) FILTERED_ARGS+=("$arg") ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -241,6 +250,33 @@ write_onboard_phase() {
|
|||||||
platform_push_setup_state
|
platform_push_setup_state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ── Helper: set a boolean toggle in master.conf, in place ─────────────────────────────────────
|
||||||
|
# Booleans only. The value pattern stops at whitespace, so a quoted value containing spaces would
|
||||||
|
# be truncated — every gate this arms is true/false and nothing else should use it.
|
||||||
|
#
|
||||||
|
# Preserves what the line already looks like: leading indent, the existing quoting style, and the
|
||||||
|
# column the trailing comment sits in. master.conf is hand-aligned and read by a person; an edit
|
||||||
|
# that reflows a line makes a diff that looks bigger than the change actually is.
|
||||||
|
_arm_conf_var() {
|
||||||
|
local key="$1" val="$2" file="$3" cur pad spaces quoted
|
||||||
|
if ! grep -qE "^[[:space:]]*${key}=" "$file"; then
|
||||||
|
warn " ${key} is not in master.conf — skipped (add it to the template first)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
cur=$(grep -E "^[[:space:]]*${key}=" "$file" | head -1 | sed -E "s|^[[:space:]]*${key}=||; s|[[:space:]]*#.*$||")
|
||||||
|
quoted=""; [[ "$cur" == \"*\" ]] && quoted='"'
|
||||||
|
cur="${cur//\"/}"
|
||||||
|
[[ "$cur" == "$val" ]] && { echo " ${key} already ${val}"; return 0; }
|
||||||
|
# Pad only when a comment follows — otherwise a shorter value leaves trailing whitespace.
|
||||||
|
pad=0
|
||||||
|
if grep -qE "^[[:space:]]*${key}=[^#]*#" "$file"; then
|
||||||
|
pad=$(( ${#cur} - ${#val} )); (( pad < 0 )) && pad=0
|
||||||
|
fi
|
||||||
|
spaces=$(printf '%*s' "$pad" '')
|
||||||
|
sed -i -E "s|^([[:space:]]*)${key}=[^#[:space:]]*([[:space:]]*)(#.*)?$|\1${key}=${quoted}${val}${quoted}${spaces}\2\3|" "$file"
|
||||||
|
echo " ${key}: ${cur} → ${val}"
|
||||||
|
}
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_FALLBACK Partnership Onboard — $MY_ID ($LOCAL_SERVER_NAME) — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
echo "━━━ $ICON_FALLBACK Partnership Onboard — $MY_ID ($LOCAL_SERVER_NAME) — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -732,6 +768,50 @@ else
|
|||||||
fi
|
fi
|
||||||
unset _listener_script
|
unset _listener_script
|
||||||
|
|
||||||
|
# ── Step 9e: Arm the sync gates ───────────────────────────────────────────────────────────────
|
||||||
|
# master.conf.template ships a fresh node inert — RSYNC_ENABLED, CONF_SYNC_ENABLED and
|
||||||
|
# ARR_SYNC_ENABLED all false — because a node that has just been seeded has empty shares and no
|
||||||
|
# verified partner, and those two facts are what make unattended syncing safe to do.
|
||||||
|
#
|
||||||
|
# A successful onboard is the event that makes them true. Without this step the defaults were a
|
||||||
|
# one-way door: the node stayed inert for ever and somebody had to remember to hand-edit three
|
||||||
|
# toggles, on the machine where forgetting looks exactly like everything working.
|
||||||
|
#
|
||||||
|
# Runs before Step 10 on purpose. The push carries the owner's master.conf to every listed host,
|
||||||
|
# so arming here means both sides come up agreeing about whether sync is on; arming after the
|
||||||
|
# push would leave the mirror a version behind until the next conf save.
|
||||||
|
#
|
||||||
|
# Owner only — the mirror receives these values in the push rather than deciding for itself.
|
||||||
|
ARM_OK=true
|
||||||
|
echo ""
|
||||||
|
echo "━━━ $ICON_GEAR Step 9e — Arm Sync Gates ━━━"
|
||||||
|
|
||||||
|
if [[ "$ONBOARD_OK" == false ]]; then
|
||||||
|
warn "Skipping — onboard did not complete, leaving the gates closed"
|
||||||
|
ARM_OK=false
|
||||||
|
elif [[ "$SKIP_ARM" == true ]]; then
|
||||||
|
echo " --no-arm — leaving the sync gates as they are"
|
||||||
|
elif [[ "$AM_OWNER" != true ]]; then
|
||||||
|
echo " mirror — the owner's push decides these"
|
||||||
|
elif [[ "$DRY_RUN" == true ]]; then
|
||||||
|
warn "DRY RUN — would set RSYNC_ENABLED, CONF_SYNC_ENABLED, ARR_SYNC_ENABLED to true"
|
||||||
|
else
|
||||||
|
_master_conf="$SCRIPTS_ROOT/Configurations/master.conf"
|
||||||
|
if [[ ! -f "$_master_conf" ]]; then
|
||||||
|
warn "master.conf not found at $_master_conf — gates left closed"
|
||||||
|
ARM_OK=false
|
||||||
|
else
|
||||||
|
cp -a "$_master_conf" "${_master_conf}.bak-arm-$(date +%Y%m%d-%H%M%S)"
|
||||||
|
for _gate in RSYNC_ENABLED CONF_SYNC_ENABLED ARR_SYNC_ENABLED; do
|
||||||
|
_arm_conf_var "$_gate" "true" "$_master_conf" || ARM_OK=false
|
||||||
|
done
|
||||||
|
# Tier 1 is now open, so say what that actually turned on rather than leaving it implied.
|
||||||
|
echo " rsync tier 2 gates were left as configured — check them before the first run"
|
||||||
|
unset _gate
|
||||||
|
fi
|
||||||
|
unset _master_conf
|
||||||
|
fi
|
||||||
|
|
||||||
# ── Step 10: Push master.conf to all listed hosts ─────────────────────────────────────────────
|
# ── Step 10: Push master.conf to all listed hosts ─────────────────────────────────────────────
|
||||||
# SSH is now established and all partners have the plugin installed.
|
# SSH is now established and all partners have the plugin installed.
|
||||||
# Push the authoritative master.conf so every listed host is in sync immediately.
|
# Push the authoritative master.conf so every listed host is in sync immediately.
|
||||||
@@ -784,6 +864,7 @@ echo " Step 9 — Arr bootstrap: $( [[ "$SKIP_ARR_SYNC" == true || "$ONBOAR
|
|||||||
echo " Step 9b — Webhook setup: $(_skip "$SKIP_WEBHOOK_SETUP" "$WEBHOOK_SETUP_OK")"
|
echo " Step 9b — Webhook setup: $(_skip "$SKIP_WEBHOOK_SETUP" "$WEBHOOK_SETUP_OK")"
|
||||||
echo " Step 9c — Media seed: $( [[ "$SKIP_MEDIA_SEED" == true ]] && echo "skipped" || echo "${MEDIA_SEED_COUNT}/${#DAILY_SYNC_SHARES[@]} shares $(_ok "$MEDIA_SEED_OK")" )"
|
echo " Step 9c — Media seed: $( [[ "$SKIP_MEDIA_SEED" == true ]] && echo "skipped" || echo "${MEDIA_SEED_COUNT}/${#DAILY_SYNC_SHARES[@]} shares $(_ok "$MEDIA_SEED_OK")" )"
|
||||||
echo " Step 9d — Webhook listener: $(_skip "$SKIP_WEBHOOK_LISTENER" "$WEBHOOK_LISTENER_OK")"
|
echo " Step 9d — Webhook listener: $(_skip "$SKIP_WEBHOOK_LISTENER" "$WEBHOOK_LISTENER_OK")"
|
||||||
|
echo " Step 9e — Arm sync gates: $( [[ "$SKIP_ARM" == true ]] && echo "skipped (--no-arm)" || { [[ "$ONBOARD_OK" == false ]] && echo "skipped" || echo "$(_ok "$ARM_OK")"; } )"
|
||||||
echo " Step 10 — Conf push: $( [[ "$ONBOARD_OK" == false ]] && echo "skipped" || echo "$(_ok "$MASTER_PUSH_OK")" )"
|
echo " Step 10 — Conf push: $( [[ "$ONBOARD_OK" == false ]] && echo "skipped" || echo "$(_ok "$MASTER_PUSH_OK")" )"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user