forked from heavy-duty/rig
92 lines
3.5 KiB
Bash
92 lines
3.5 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# rig forgejo-runner status — what is this box's Forgejo runner registered to?
|
||
|
|
# Read-only: reports what is already on the box. No credential, no network call.
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
HERE="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
|
||
|
|
# shellcheck source=SCRIPTDIR/lib/forgejo-runner-config.sh
|
||
|
|
. "$HERE/lib/forgejo-runner-config.sh"
|
||
|
|
|
||
|
|
log() { printf 'rig-forgejo-runner: %s\n' "$*"; }
|
||
|
|
warn() { printf 'rig-forgejo-runner: WARNING: %s\n' "$*" >&2; }
|
||
|
|
die() { printf 'rig-forgejo-runner: ERROR: %s\n' "$1" >&2; exit "${2:-1}"; }
|
||
|
|
|
||
|
|
usage() {
|
||
|
|
cat <<'EOF'
|
||
|
|
usage: rig forgejo-runner status [--user <name>]
|
||
|
|
|
||
|
|
--user <name> unprivileged service user (default: the tenant user `ci`
|
||
|
|
when it exists, else forgejo-runner)
|
||
|
|
|
||
|
|
Prints the Forgejo instance this box's runner is registered to, its runner
|
||
|
|
name, the labels rig recorded when it registered, the install directory, and
|
||
|
|
the systemd unit and its state.
|
||
|
|
|
||
|
|
Reads only the runner's own on-disk config — no token, no network call. The
|
||
|
|
registration secret that config holds is never printed. Exits 1 when no runner
|
||
|
|
is installed.
|
||
|
|
EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
# --- args (validated before the root check, so errors are testable) ---------
|
||
|
|
RUNNER_USER=""
|
||
|
|
while [ $# -gt 0 ]; do
|
||
|
|
case "$1" in
|
||
|
|
--user)
|
||
|
|
[ $# -ge 2 ] || die "--user needs a value" 2
|
||
|
|
RUNNER_USER="$2"; shift 2 ;;
|
||
|
|
-h|--help) usage; exit 0 ;;
|
||
|
|
*) die "unknown flag: $1" 2 ;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ -z "$RUNNER_USER" ]; then
|
||
|
|
if id -u ci >/dev/null 2>&1; then RUNNER_USER="ci"; else RUNNER_USER="forgejo-runner"; fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# --- validation ------------------------------------------------------------
|
||
|
|
[ "$RUNNER_USER" != "root" ] || die "runner user must not be root" 2
|
||
|
|
|
||
|
|
# --- guards ----------------------------------------------------------------
|
||
|
|
[ "$(id -u)" -eq 0 ] || die "must run as root"
|
||
|
|
|
||
|
|
id -u "$RUNNER_USER" >/dev/null 2>&1 \
|
||
|
|
|| die "no runner installed (no ${RUNNER_USER} user on this box)"
|
||
|
|
USER_HOME="$(getent passwd "$RUNNER_USER" | cut -d: -f6)"
|
||
|
|
RUNNER_DIR="$USER_HOME/forgejo-runner"
|
||
|
|
[ -e "$RUNNER_DIR/.runner" ] \
|
||
|
|
|| die "no runner registered in ${RUNNER_DIR}"
|
||
|
|
|
||
|
|
# --- read the runner's own config -------------------------------------------
|
||
|
|
INSTANCE="$(forgejo_runner_instance "$RUNNER_DIR")"
|
||
|
|
RUNNER_NAME="$(forgejo_runner_name "$RUNNER_DIR")"
|
||
|
|
|
||
|
|
if [ -r "$RUNNER_DIR/.rig-labels" ]; then
|
||
|
|
LABELS="$(cat "$RUNNER_DIR/.rig-labels")"
|
||
|
|
else
|
||
|
|
LABELS="(not recorded on this box — see the instance's Actions > Runners)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
UNIT=/etc/systemd/system/forgejo-runner.service
|
||
|
|
if [ -e "$UNIT" ]; then
|
||
|
|
STATE="$(systemctl is-active forgejo-runner 2>/dev/null || true)"
|
||
|
|
SERVICE="forgejo-runner.service (${STATE:-unknown})"
|
||
|
|
else
|
||
|
|
SERVICE="(not installed as a service)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
log "instance: ${INSTANCE:-unknown}"
|
||
|
|
log "name: ${RUNNER_NAME:-unknown}"
|
||
|
|
log "labels: ${LABELS}"
|
||
|
|
log "dir: ${RUNNER_DIR}"
|
||
|
|
log "service: ${SERVICE}"
|
||
|
|
|
||
|
|
# status is the only command an operator runs when nothing is obviously wrong,
|
||
|
|
# which makes it the right place to notice a mode that drifted. It reports and
|
||
|
|
# does not fix: converging state is `install`'s job, and a read-only verb that
|
||
|
|
# quietly writes is a worse surprise than a loud warning.
|
||
|
|
MODE="$(stat -c '%a' "$RUNNER_DIR/.runner" 2>/dev/null || true)"
|
||
|
|
if [ -n "$MODE" ] && [ "$MODE" != "$FORGEJO_RUNNER_FILE_MODE" ]; then
|
||
|
|
warn ".runner is mode ${MODE}, not ${FORGEJO_RUNNER_FILE_MODE} — it holds this runner's registration secret, and every account on this box can read it. Re-run 'rig forgejo-runner install --instance ${INSTANCE:-<url>}' to converge the mode."
|
||
|
|
fi
|