87 lines
2.8 KiB
Bash
Executable File
87 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
NODE_BIN="${NODE_BIN:-/opt/homebrew/opt/node@24/bin/node}"
|
|
SCRIPT="${MEMIND_AGENT_RUN_GUARD_SCRIPT:-$ROOT/scripts/agent-run-guard.mjs}"
|
|
LABEL="${MEMIND_AGENT_RUN_GUARD_LABEL:-cn.tkmind.memind-agent-run-guard}"
|
|
PLIST="$HOME/Library/LaunchAgents/${LABEL}.plist"
|
|
LOG="${MEMIND_AGENT_RUN_GUARD_LOG:-$HOME/Library/Logs/memind-agent-run-guard.log}"
|
|
GUI="gui/$(id -u)"
|
|
INTERVAL="${MEMIND_AGENT_RUN_GUARD_INTERVAL_SECONDS:-60}"
|
|
START="${MEMIND_AGENT_RUN_GUARD_START:-1}"
|
|
|
|
mkdir -p "$HOME/Library/LaunchAgents" "$(dirname "$LOG")"
|
|
|
|
if [[ ! -x "$NODE_BIN" ]]; then
|
|
NODE_BIN="$(command -v node)"
|
|
fi
|
|
if [[ ! -f "$SCRIPT" ]]; then
|
|
echo "agent run guard script not found: $SCRIPT" >&2
|
|
exit 1
|
|
fi
|
|
|
|
cat > "$PLIST" <<EOF
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>Label</key>
|
|
<string>$LABEL</string>
|
|
<key>ProgramArguments</key>
|
|
<array>
|
|
<string>$NODE_BIN</string>
|
|
<string>$SCRIPT</string>
|
|
<string>--apply</string>
|
|
</array>
|
|
<key>WorkingDirectory</key>
|
|
<string>$ROOT</string>
|
|
<key>StartInterval</key>
|
|
<integer>$INTERVAL</integer>
|
|
<key>RunAtLoad</key>
|
|
<true/>
|
|
<key>StandardOutPath</key>
|
|
<string>$LOG</string>
|
|
<key>StandardErrorPath</key>
|
|
<string>$LOG</string>
|
|
<key>EnvironmentVariables</key>
|
|
<dict>
|
|
<key>PATH</key>
|
|
<string>/opt/homebrew/bin:/opt/homebrew/opt/node@24/bin:/usr/local/bin:/usr/bin:/bin</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_ENABLED</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_ENABLED:-1}</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_FAILED_WINDOW_MS</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_FAILED_WINDOW_MS:-600000}</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_MAX_RECENT_FAILURES</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_MAX_RECENT_FAILURES:-3}</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_MAX_PENDING_AGE_MS</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_MAX_PENDING_AGE_MS:-300000}</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_MAX_PENDING_COUNT</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_MAX_PENDING_COUNT:-10}</string>
|
|
<key>MEMIND_AGENT_RUN_GUARD_MAX_RUNNING_AGE_MS</key>
|
|
<string>${MEMIND_AGENT_RUN_GUARD_MAX_RUNNING_AGE_MS:-900000}</string>
|
|
</dict>
|
|
</dict>
|
|
</plist>
|
|
EOF
|
|
|
|
plutil -lint "$PLIST"
|
|
launchctl bootout "$GUI/$LABEL" 2>/dev/null || true
|
|
launchctl bootstrap "$GUI" "$PLIST"
|
|
|
|
if [[ "$START" == "1" || "$START" == "true" || "$START" == "yes" ]]; then
|
|
launchctl enable "$GUI/$LABEL"
|
|
launchctl kickstart -k "$GUI/$LABEL"
|
|
state="started"
|
|
else
|
|
launchctl disable "$GUI/$LABEL" 2>/dev/null || true
|
|
state="installed-disabled"
|
|
fi
|
|
|
|
echo "installed $PLIST"
|
|
echo "state: $state"
|
|
echo "script: $SCRIPT"
|
|
echo "interval_seconds: $INTERVAL"
|
|
echo "log: $LOG"
|
|
echo "manual stop: launchctl bootout $GUI/$LABEL"
|