#!/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 ] --user 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:-}' to converge the mode." fi