koopa-admin-log/scripts/login-health/install-login-health.sh

137 lines
4.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# Install koopa-login-health:
# - ~/.local/bin/koopa-login-health (show + collect)
# - user systemd timer → collect every 5 min (fresh snapshot)
# - bashrc hook → show only (no probes on login; never blocks shell)
#
# On koopa as hernani:
# cd ~/src/koopa/koopa-admin-log
# ./scripts/login-health/install-login-health.sh
set -euo pipefail
ROOT=$(cd "$(dirname "$0")" && pwd)
REPO_ROOT=$(cd "$ROOT/../.." && pwd)
SRC="$ROOT/koopa-login-health.sh"
UNIT_SRC_DIR="$REPO_ROOT/configs/systemd/user"
BIN_DIR="${HOME}/.local/bin"
DEST="$BIN_DIR/koopa-login-health"
BASHRC="${HOME}/.bashrc"
UNIT_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user"
MARKER_BEGIN="# >>> koopa-login-health (koopa-admin-log) >>>"
MARKER_END="# <<< koopa-login-health (koopa-admin-log) <<<"
if [ ! -f "$SRC" ]; then
echo "missing $SRC" >&2
exit 1
fi
# Login: ONLY show snapshot. Never collect. Instant cat; always continue.
HOOK_BODY=$(cat <<'HOOK'
# Best-effort: print last health snapshot. MUST NOT break login. MUST NOT probe.
# Skip: KOOPA_SKIP_HEALTH=1
# Refresh is the user timer koopa-login-health.timer (not this hook).
__koopa_lh() {
[ -n "${KOOPA_SKIP_HEALTH:-}" ] && return 0
case $- in *i*) ;; *) return 0 ;; esac
_b="${HOME}/.local/bin/koopa-login-health"
[ -x "$_b" ] || return 0
if [ -z "${SSH_CONNECTION:-}" ] && [ -z "${SSH_TTY:-}" ]; then
[ "${SHLVL:-1}" -le 2 ] 2>/dev/null || return 0
fi
# show only — no collect; 2s wall cap is enough to cat a few KB
if command -v timeout >/dev/null 2>&1; then
timeout -k 1s 2s env KOOPA_HEALTH_FROM_LOGIN=1 "$_b" show </dev/null >/dev/tty 2>/dev/null \
|| timeout -k 1s 2s env KOOPA_HEALTH_FROM_LOGIN=1 "$_b" show </dev/null 2>/dev/null \
|| true
else
env KOOPA_HEALTH_FROM_LOGIN=1 "$_b" show </dev/null 2>/dev/null || true
fi
return 0
}
set +e
__koopa_lh || true
unset -f __koopa_lh 2>/dev/null || true
HOOK
)
mkdir -p "$BIN_DIR" "$UNIT_DIR"
install -m 0755 "$SRC" "$DEST"
echo "installed $DEST"
for u in koopa-login-health.service koopa-login-health.timer; do
if [ ! -f "$UNIT_SRC_DIR/$u" ]; then
echo "missing unit $UNIT_SRC_DIR/$u" >&2
exit 1
fi
install -m 0644 "$UNIT_SRC_DIR/$u" "$UNIT_DIR/$u"
echo "installed $UNIT_DIR/$u"
done
touch "$BASHRC"
if grep -qF "$MARKER_BEGIN" "$BASHRC" 2>/dev/null; then
tmp=$(mktemp)
awk -v b="$MARKER_BEGIN" -v e="$MARKER_END" '
$0 == b {skip=1; next}
$0 == e {skip=0; next}
!skip {print}
' "$BASHRC" >"$tmp"
mv "$tmp" "$BASHRC"
echo "removed previous bashrc hook"
fi
{
echo ""
echo "$MARKER_BEGIN"
printf '%s\n' "$HOOK_BODY"
echo "$MARKER_END"
} >>"$BASHRC"
echo "installed bashrc hook (show-only; no probes on login)"
hook_tmp=$(mktemp)
{
echo "$MARKER_BEGIN"
printf '%s\n' "$HOOK_BODY"
echo "$MARKER_END"
} >"$hook_tmp"
if ! bash -n "$hook_tmp" || ! bash -n "$BASHRC"; then
echo "ERROR: bashrc syntax check failed — removing hook" >&2
tmp=$(mktemp)
awk -v b="$MARKER_BEGIN" -v e="$MARKER_END" '
$0 == b {skip=1; next}
$0 == e {skip=0; next}
!skip {print}
' "$BASHRC" >"$tmp"
mv "$tmp" "$BASHRC"
rm -f "$hook_tmp"
exit 1
fi
rm -f "$hook_tmp"
echo "bash -n OK"
if ! echo ":$PATH:" | grep -q ":$BIN_DIR:"; then
if ! grep -q '\.local/bin' "$BASHRC" 2>/dev/null; then
echo "export PATH=\"\$HOME/.local/bin:\$PATH\"" >>"$BASHRC"
echo "appended PATH += ~/.local/bin"
fi
fi
# Enable timer + first collect (needs lingering for boot without login)
systemctl --user daemon-reload
systemctl --user enable --now koopa-login-health.timer
systemctl --user start koopa-login-health.service || true
echo "timer: $(systemctl --user is-enabled koopa-login-health.timer 2>/dev/null || echo unknown)"
systemctl --user list-timers koopa-login-health.timer --no-pager 2>/dev/null || true
# linger so timer runs without interactive session
if command -v loginctl >/dev/null 2>&1; then
if [ "$(loginctl show-user "$USER" -p Linger --value 2>/dev/null || echo no)" != "yes" ]; then
echo "NOTE: enable linger so the timer runs after reboot without login:"
echo " sudo loginctl enable-linger $USER"
else
echo "linger already enabled for $USER"
fi
fi
echo "smoke show (FROM_LOGIN):"
KOOPA_HEALTH_FROM_LOGIN=1 "$DEST" show -q || true
echo "done. Login cats snapshot only; collect runs every 5 min via systemd --user."