137 lines
4.2 KiB
Bash
137 lines
4.2 KiB
Bash
#!/usr/bin/env bash
|
|
# tools/seed_node.sh
|
|
# Railiance Seed — kick off biogenesis on a blank (or nearly blank) host.
|
|
#
|
|
# Responsibilities:
|
|
# - Ensure minimal prerequisites (curl, git, jq)
|
|
# - Discover metadata (panspermia.json or env vars)
|
|
# - Clone or update the parent repo (default: railiance-bootstrap)
|
|
# - Run furnishing (idempotent) to align housekeeping
|
|
# - (Optional) handoff to further bootstrap steps
|
|
#
|
|
# Usage examples:
|
|
# ./tools/seed_node.sh
|
|
# REPO_URL=https://git.example.com/org/railiance-bootstrap.git ./tools/seed_node.sh
|
|
# ./tools/seed_node.sh --repo-dir /srv/railiance --branch main
|
|
#
|
|
# Notes:
|
|
# - No secrets are written or echoed by this script.
|
|
# - Git authentication relies on your environment (SSH keys or credential helper).
|
|
|
|
set -euo pipefail
|
|
|
|
# --------- defaults & flags ----------
|
|
REPO_DIR="${REPO_DIR:-railiance-bootstrap}"
|
|
BRANCH="${BRANCH:-main}"
|
|
META_PATH="${META_PATH:-}" # optional explicit path to panspermia.json
|
|
QUIET=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--repo-dir) REPO_DIR="${2:?}"; shift 2 ;;
|
|
--branch) BRANCH="${2:?}"; shift 2 ;;
|
|
--meta) META_PATH="${2:?}"; shift 2 ;;
|
|
-q|--quiet) QUIET=true; shift ;;
|
|
-h|--help)
|
|
sed -n '1,120p' "$0" | sed -n '1,/^set -euo pipefail/p'
|
|
exit 0 ;;
|
|
*) echo "Unknown arg: $1" >&2; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
log() { $QUIET || echo "$@"; }
|
|
|
|
need() {
|
|
command -v "$1" >/dev/null 2>&1 && return 0
|
|
log "[*] Installing $1 ..."
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
sudo apt-get update -y && sudo apt-get install -y "$1"
|
|
elif command -v dnf >/dev/null 2>&1; then
|
|
sudo dnf install -y "$1"
|
|
elif command -v yum >/dev/null 2>&1; then
|
|
sudo yum install -y "$1"
|
|
else
|
|
echo "ERROR: package manager not found to install $1" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# prerequisites
|
|
need curl
|
|
need git
|
|
command -v jq >/dev/null 2>&1 || need jq
|
|
|
|
# --------- discover metadata ----------
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
DEFAULT_META="${SCRIPT_DIR}/../panspermia.json"
|
|
|
|
REPO_URL="${REPO_URL:-}"
|
|
if [[ -z "${REPO_URL}" ]]; then
|
|
# read metadata file (explicit > default > none)
|
|
SRC_META=""
|
|
if [[ -n "${META_PATH}" && -f "${META_PATH}" ]]; then
|
|
SRC_META="${META_PATH}"
|
|
elif [[ -f "${DEFAULT_META}" ]]; then
|
|
SRC_META="${DEFAULT_META}"
|
|
fi
|
|
|
|
if [[ -n "${SRC_META}" ]]; then
|
|
log "[=] Using metadata: ${SRC_META}"
|
|
REPO_URL="$(jq -r '.parent_body.repo_url // empty' "${SRC_META}")"
|
|
BRANCH_FROM_META="$(jq -r '.parent_body.branch // empty' "${SRC_META}")" || true
|
|
if [[ -n "${BRANCH_FROM_META}" ]]; then BRANCH="${BRANCH_FROM_META}"; fi
|
|
fi
|
|
fi
|
|
|
|
if [[ -z "${REPO_URL}" ]]; then
|
|
echo "ERROR: No REPO_URL provided and no panspermia metadata found." >&2
|
|
echo "Provide one of:" >&2
|
|
echo " - env REPO_URL=https://git.example.com/org/railiance-bootstrap.git" >&2
|
|
echo " - or a panspermia.json with .parent_body.repo_url" >&2
|
|
exit 1
|
|
fi
|
|
|
|
log "[*] Target repo: ${REPO_URL} (branch: ${BRANCH})"
|
|
log "[*] Local dir : ${REPO_DIR}"
|
|
|
|
# --------- clone or update ----------
|
|
if [[ -d "${REPO_DIR}/.git" ]]; then
|
|
log "[=] Repo dir exists. Fetching updates ..."
|
|
(
|
|
cd "${REPO_DIR}"
|
|
git remote -v
|
|
git fetch --all --tags
|
|
git checkout "${BRANCH}"
|
|
git pull --ff-only origin "${BRANCH}" || true
|
|
)
|
|
else
|
|
log "[+] Cloning repository ..."
|
|
git clone --branch "${BRANCH}" "${REPO_URL}" "${REPO_DIR}"
|
|
fi
|
|
|
|
# --------- furnishing ----------
|
|
if [[ -x "${REPO_DIR}/tools/furnish_railiance_repo.sh" ]]; then
|
|
log "[*] Running furnishing script (idempotent) ..."
|
|
bash "${REPO_DIR}/tools/furnish_railiance_repo.sh"
|
|
else
|
|
log "[!] Furnishing script not found at ${REPO_DIR}/tools/furnish_railiance_repo.sh — skipping."
|
|
fi
|
|
|
|
# --------- placeholder for next steps ----------
|
|
cat <<'NEXT'
|
|
|
|
[✓] Seed completed.
|
|
|
|
Next steps (manual, for now):
|
|
1) Review the repo at $REPO_DIR
|
|
2) Configure host inventory and credentials (kept local, never committed)
|
|
3) Run the initial bootstrap playbook (e.g., ansible/bootstrap.yml)
|
|
4) Prepare GitOps operator (ArgoCD/Flux) pointing to this repo
|
|
|
|
Hints:
|
|
- To use SSH instead of HTTPS, set REPO_URL=git@your-gitea:org/railiance-bootstrap.git
|
|
- If using HTTPS, set up 'git config --global credential.helper cache|store'
|
|
- For air-gapped: copy a Spore bundle, extract, then run this seed script
|
|
|
|
NEXT
|