@@ -60,21 +60,88 @@ echo " OpenClaw message: Send warning via OpenClaw itself"
|
60 | 60 | echo "Enter your phone number for alerts (or leave blank to skip):" |
61 | 61 | read -r PHONE_NUMBER |
62 | 62 | |
63 | | -# Update service file |
64 | | -SERVICE_FILE="$SCRIPT_DIR/systemd/openclaw-auth-monitor.service" |
65 | | -if [ -n "$NTFY_TOPIC" ]; then |
66 | | - sed -i "s|# Environment=NOTIFY_NTFY=.*|Environment=NOTIFY_NTFY=$NTFY_TOPIC|" "$SERVICE_FILE" |
67 | | -fi |
68 | | -if [ -n "$PHONE_NUMBER" ]; then |
69 | | - sed -i "s|# Environment=NOTIFY_PHONE=.*|Environment=NOTIFY_PHONE=$PHONE_NUMBER|" "$SERVICE_FILE" |
70 | | -fi |
71 | | - |
72 | 63 | # Install systemd units |
| 64 | +SERVICE_TEMPLATE="$SCRIPT_DIR/systemd/openclaw-auth-monitor.service" |
| 65 | +SYSTEMD_USER_DIR="$HOME/.config/systemd/user" |
| 66 | +SERVICE_TARGET="$SYSTEMD_USER_DIR/openclaw-auth-monitor.service" |
| 67 | +TIMER_TARGET="$SYSTEMD_USER_DIR/openclaw-auth-monitor.timer" |
| 68 | +AUTH_MONITOR_PATH="$SCRIPT_DIR/auth-monitor.sh" |
| 69 | + |
73 | 70 | echo "" |
74 | 71 | echo "Installing systemd timer..." |
75 | | -mkdir -p ~/.config/systemd/user |
76 | | -cp "$SCRIPT_DIR/systemd/openclaw-auth-monitor.service" ~/.config/systemd/user/ |
77 | | -cp "$SCRIPT_DIR/systemd/openclaw-auth-monitor.timer" ~/.config/systemd/user/ |
| 72 | +mkdir -p "$SYSTEMD_USER_DIR" |
| 73 | + |
| 74 | +SERVICE_TEMP="$(mktemp "$SYSTEMD_USER_DIR/openclaw-auth-monitor.service.XXXXXX")" |
| 75 | +SERVICE_RENDERED="" |
| 76 | +cleanup_service_temp() { |
| 77 | + rm -f "$SERVICE_TEMP" "$SERVICE_RENDERED" |
| 78 | +} |
| 79 | +trap cleanup_service_temp EXIT |
| 80 | +SERVICE_RENDERED="$(mktemp "$SYSTEMD_USER_DIR/openclaw-auth-monitor.service.rendered.XXXXXX")" |
| 81 | + |
| 82 | +cp "$SERVICE_TEMPLATE" "$SERVICE_TEMP" |
| 83 | + |
| 84 | +systemd_quote_arg() { |
| 85 | +local value="$1" |
| 86 | + value="${value//\\/\\\\}" |
| 87 | + value="${value//%/%%}" |
| 88 | + value="${value//\$/\$\$}" |
| 89 | + value="${value//\"/\\\"}" |
| 90 | +printf '"%s"' "$value" |
| 91 | +} |
| 92 | + |
| 93 | +render_environment_line() { |
| 94 | +local key="$1" |
| 95 | +local placeholder="$2" |
| 96 | +local value="$3" |
| 97 | + |
| 98 | +if [ -n "$value" ]; then |
| 99 | +printf 'Environment=%s=%s' "$key" "$value" |
| 100 | +else |
| 101 | +printf '# Environment=%s=%s' "$key" "$placeholder" |
| 102 | +fi |
| 103 | +} |
| 104 | + |
| 105 | +RENDERED_EXEC_START="ExecStart=$(systemd_quote_arg "$AUTH_MONITOR_PATH")" |
| 106 | +RENDERED_NTFY_LINE="$(render_environment_line "NOTIFY_NTFY" "openclaw-alerts" "$NTFY_TOPIC")" |
| 107 | +RENDERED_PHONE_LINE="$(render_environment_line "NOTIFY_PHONE" "+1234567890" "$PHONE_NUMBER")" |
| 108 | +FOUND_EXEC_START=0 |
| 109 | +FOUND_NTFY=0 |
| 110 | +FOUND_PHONE=0 |
| 111 | + |
| 112 | +while IFS= read -r line || [ -n "$line" ]; do |
| 113 | +if [[ "$line" =~ ^[[:space:]]*ExecStart=.*$ ]]; then |
| 114 | +printf '%s\n' "$RENDERED_EXEC_START" |
| 115 | + FOUND_EXEC_START=1 |
| 116 | +elif [[ "$line" =~ ^[[:space:]]*#?[[:space:]]*Environment=NOTIFY_NTFY=.*$ ]]; then |
| 117 | +printf '%s\n' "$RENDERED_NTFY_LINE" |
| 118 | + FOUND_NTFY=1 |
| 119 | +elif [[ "$line" =~ ^[[:space:]]*#?[[:space:]]*Environment=NOTIFY_PHONE=.*$ ]]; then |
| 120 | +printf '%s\n' "$RENDERED_PHONE_LINE" |
| 121 | + FOUND_PHONE=1 |
| 122 | +else |
| 123 | +printf '%s\n' "$line" |
| 124 | +fi |
| 125 | +done < "$SERVICE_TEMP" > "$SERVICE_RENDERED" |
| 126 | + |
| 127 | +if [ "$FOUND_EXEC_START" -ne 1 ]; then |
| 128 | +echo "ERROR: ExecStart line not found in $SERVICE_TEMPLATE" >&2 |
| 129 | +exit 1 |
| 130 | +fi |
| 131 | +if [ "$FOUND_NTFY" -ne 1 ]; then |
| 132 | +echo "ERROR: NOTIFY_NTFY placeholder not found in $SERVICE_TEMPLATE" >&2 |
| 133 | +exit 1 |
| 134 | +fi |
| 135 | +if [ "$FOUND_PHONE" -ne 1 ]; then |
| 136 | +echo "ERROR: NOTIFY_PHONE placeholder not found in $SERVICE_TEMPLATE" >&2 |
| 137 | +exit 1 |
| 138 | +fi |
| 139 | + |
| 140 | +mv "$SERVICE_RENDERED" "$SERVICE_TEMP" |
| 141 | + |
| 142 | +mv "$SERVICE_TEMP" "$SERVICE_TARGET" |
| 143 | +trap - EXIT |
| 144 | +cp "$SCRIPT_DIR/systemd/openclaw-auth-monitor.timer" "$TIMER_TARGET" |
78 | 145 | systemctl --user daemon-reload |
79 | 146 | systemctl --user enable --now openclaw-auth-monitor.timer |
80 | 147 | |
|