3ba6d6784c
Adds scripts/bridged-launchd-wrapper.sh so the launchd-run daemon still gets WORKER_GITEA_TOKEN/AI_GATEWAY_TOKEN by execing through a login shell (launchd never sources secrets.sh itself). bridged now logs at startup which required token env vars (derived from each profile's tokenEnv/gitTokenEnv, not a hand-written list) resolved or are MISSING, by name only. Fills in the real paths in deploy/dev.ltms.bridged.plist for this host and points it at the wrapper. scripts/redeploy-bridged.sh now detects a loaded launchd agent and uses launchctl unload/load instead of a raw kill+nohup, because a bare SIGTERM exits this JVM at 143 (measured) which KeepAlive.SuccessfulExit=false reads as a crash and would race the script's own restart; --check reports installed/loaded state and stays read-only.
33 lines
1.8 KiB
Bash
Executable File
33 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# CB-594 — the only reason this file exists: launchd does not run a login shell.
|
|
#
|
|
# WORKER_GITEA_TOKEN and AI_GATEWAY_TOKEN live in ${SHARED_ENV}/tools/secrets.sh, sourced only by a
|
|
# LOGIN shell (.zprofile/.zshrc etc). launchd execs a job's ProgramArguments directly — no shell, no
|
|
# profile, nothing sourced (the plist's own PATH comment documents the same gap one variable over).
|
|
# A daemon started that way boots fine and looks healthy; the failure is invisible until a worker
|
|
# tries to open a PR (WORKER_GITEA_TOKEN empty) or a gateway profile gets a 401 (AI_GATEWAY_TOKEN
|
|
# empty) — hours later, with nothing tying the two together (CB-591, CLAUDE.md "Redeploying the
|
|
# daemon"). Bridged now also logs which required secret names resolved at startup (see
|
|
# Bridged.reportRequiredSecrets), but that log line can only tell the truth if the tokens had a
|
|
# chance to be sourced in the first place — which is this script's entire job.
|
|
#
|
|
# So: launchd execs THIS script instead of java directly. This script execs a login shell
|
|
# ('zsh -l'), which sources secrets.sh, and that shell execs the real command in its place — one
|
|
# process throughout (exec, not a subshell fork), so launchd's PID tracking, KeepAlive, and
|
|
# StandardOut/ErrorPath all still see the one process they expect.
|
|
#
|
|
# The plist passes the full command as THIS script's own arguments, e.g.:
|
|
# ProgramArguments = [ .../bridged-launchd-wrapper.sh, /path/to/java, -jar, /path/to/bridged.jar,
|
|
# bridged.yaml ]
|
|
# so the wrapper stays generic and the actual command lives in exactly one place (the plist), not
|
|
# duplicated here.
|
|
set -euo pipefail
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
echo "bridged-launchd-wrapper.sh: no command given — check the plist's ProgramArguments" >&2
|
|
exit 2
|
|
fi
|
|
|
|
exec /bin/zsh -lc 'exec "$@"' -- "$@"
|