Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bridges/_dispatch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
# bridge_start_hint <env>
# bridge_stop_hint <env>
# bridge_is_ready — return 0 when the bridge has its credentials
# bridge_session_sender_command — optional command for Homeboy session sends
#
# Optional:
# bridge_update_launchd — local launchd refresh (mac launchd-using
Expand Down
7 changes: 7 additions & 0 deletions bridges/roadie.sh
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,13 @@ roadie_bin() {
command -v roadie 2>/dev/null || printf '%s\n' roadie
}

bridge_session_sender_command() { printf '%s send\n' "$(roadie_bin)"; }

bridge_session_sender_env() {
printf 'Environment=ROADIE_SERVICE_TOKEN_FILE=%s\n' "$(_roadie_send_token_file)"
[ -z "${ROADIE_LOCK_PORT:-}" ] || printf 'Environment=ROADIE_LOCK_PORT=%s\n' "$ROADIE_LOCK_PORT"
}

# ============================================================================
# Node preflight (the pinned release needs Node >= ROADIE_MIN_NODE_MAJOR)
# ============================================================================
Expand Down
33 changes: 29 additions & 4 deletions services/homeboy-daemon.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,19 @@ homeboy_daemon_service_applicable() {
}

homeboy_daemon_render_systemd_service() {
local bin
local bin sender sender_env sender_dir path
bin="$(homeboy_service_bin)"
sender=""
sender_env=""
sender_dir=""
if declare -F bridge_session_sender_command >/dev/null 2>&1; then
sender="$(bridge_session_sender_command)"
if [ -n "$sender" ]; then
sender_dir="$(dirname "${sender%% *}")"
declare -F bridge_session_sender_env >/dev/null 2>&1 && sender_env="$(bridge_session_sender_env)"
fi
fi
path="$(dirname "$bin")${sender_dir:+:$sender_dir}:/usr/local/bin:/usr/bin:/bin"
cat <<EOF
[Unit]
Description=Homeboy daemon (wp-coding-agents)
Expand All @@ -44,7 +55,10 @@ Type=simple
User=$SERVICE_USER
WorkingDirectory=$SERVICE_HOME
Environment=HOME=$SERVICE_HOME$(homeboy_data_dir_systemd_env)
Environment=PATH=$(dirname "$bin"):/usr/local/bin:/usr/bin:/bin
Environment=PATH=$path
${sender:+Environment=HOMEBOY_SESSION_SEND_COMMAND=$sender
}${sender_env:+$sender_env
}
ExecStart=$bin daemon serve
Restart=always
RestartSec=10
Expand Down Expand Up @@ -213,7 +227,7 @@ homeboy_data_dir_migrate() {

homeboy_daemon_service_reconcile() {
homeboy_daemon_service_applicable || return 0
local unit unit_path
local unit unit_path rendered changed=false
unit="$(homeboy_daemon_unit_name)"
unit_path="$(homeboy_daemon_unit_path)"

Expand All @@ -227,14 +241,25 @@ homeboy_daemon_service_reconcile() {
return 0
fi

_smart_update_systemd_unit "$unit_path" "$(homeboy_daemon_render_systemd_service)" "$unit"
rendered="$(homeboy_daemon_render_systemd_service)"
cmp -s <(printf '%s\n' "$rendered") "$unit_path" || changed=true
_smart_update_systemd_unit "$unit_path" "$rendered" "$unit"
[ "${DRY_RUN:-false}" = true ] && return 0
systemctl enable "$unit" >/dev/null 2>&1 || true
if ! systemctl is-active --quiet "$unit"; then
homeboy_daemon_adopt_unsupervised
systemctl start "$unit"
return 0
fi
if [ "$changed" = true ]; then
if homeboy_daemon_idle; then
log " Homeboy daemon: restarting idle daemon onto the updated unit"
systemctl restart "$unit"
else
warn " Homeboy daemon: updated unit will take effect after restart; daemon has jobs in flight"
fi
return 0
fi
homeboy_daemon_converge_binary
}

Expand Down
9 changes: 9 additions & 0 deletions tests/homeboy-daemon-service.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,16 @@ WP_CODING_AGENTS_HOMEBOY_MANAGED_BIN="$TMP/prefix/wp-coding-agents/bin/homeboy"
mkdir -p "$SERVICE_HOME" "$HOMEBOY_DAEMON_SYSTEMD_DIR" "$(dirname "$WP_CODING_AGENTS_HOMEBOY_MANAGED_BIN")"

# --- Rendering ---------------------------------------------------------------
bridge_load roadie
ROADIE_SYSTEM_PREFIX="$TMP/roadie-prefix"
ROADIE_LOCK_PORT=29988
unit="$(homeboy_daemon_render_systemd_service)"
grep -qx "Environment=HOMEBOY_SESSION_SEND_COMMAND=$ROADIE_SYSTEM_PREFIX/bin/roadie send" <<< "$unit" || fail "unit does not carry the bridge session sender"
grep -qx "Environment=ROADIE_SERVICE_TOKEN_FILE=/etc/wp-coding-agents/roadie/send-token" <<< "$unit" || fail "unit does not carry sender authentication"
grep -q "PATH=.*$ROADIE_SYSTEM_PREFIX/bin" <<< "$unit" || fail "sender binary directory is not on PATH"
unset -f bridge_session_sender_command bridge_session_sender_env
unit="$(homeboy_daemon_render_systemd_service)"
! grep -q '^Environment=HOMEBOY_SESSION_SEND_COMMAND=' <<< "$unit" || fail "unit sets a sender without a bridge"
grep -qx "User=wpagent" <<< "$unit" || fail "unit does not run as the service user"
grep -qx "Environment=HOME=$SERVICE_HOME" <<< "$unit" || fail "unit HOME is not the service home"
grep -qx "ExecStart=$WP_CODING_AGENTS_HOMEBOY_MANAGED_BIN daemon serve" <<< "$unit" || fail "unit does not serve the managed binary in the foreground"
Expand Down
Loading