Bash · 2681 bytes Raw Blame History
1 #!/usr/bin/env bash
2 set -euo pipefail
3
4 SOCKET_PATH="${GARCARD_SPRINT04_SOCKET:-${PWD}/target/garcard-sprint04.sock}"
5 BACKEND="${GARCARD_SPRINT04_BACKEND:-stub}"
6 RESTART_LOOPS="${GARCARD_SPRINT04_RESTART_LOOPS:-3}"
7 PKCHECK_LOOPS="${GARCARD_SPRINT04_PKCHECK_LOOPS:-2}"
8 ACTION_ID="${GARCARD_SPRINT04_ACTION_ID:-com.mesonbuild.install.run}"
9 LOG_FILE="${GARCARD_SPRINT04_LOG:-${PWD}/target/garcard-sprint04.log}"
10
11 if command -v garcard >/dev/null 2>&1; then
12 DAEMON_CMD=(garcard daemon)
13 else
14 DAEMON_CMD=(cargo run -q -p garcard -- daemon)
15 fi
16
17 if command -v garcardctl >/dev/null 2>&1; then
18 CTL_CMD=(garcardctl)
19 else
20 CTL_CMD=(cargo run -q -p garcardctl --)
21 fi
22
23 DAEMON_PID=0
24
25 run_ctl() {
26 GARCARD_SOCKET="${SOCKET_PATH}" "${CTL_CMD[@]}" "$@"
27 }
28
29 wait_for_daemon() {
30 local tries=100
31 while (( tries > 0 )); do
32 if run_ctl ping >/dev/null 2>&1; then
33 return 0
34 fi
35 sleep 0.2
36 tries=$((tries - 1))
37 done
38 echo "daemon did not become ready in time"
39 return 1
40 }
41
42 start_daemon() {
43 GARCARD_SOCKET="${SOCKET_PATH}" \
44 GARCARD_AGENT_BACKEND="${BACKEND}" \
45 "${DAEMON_CMD[@]}" >>"${LOG_FILE}" 2>&1 &
46 DAEMON_PID=$!
47 wait_for_daemon
48 }
49
50 stop_daemon() {
51 if [[ "${DAEMON_PID}" -gt 0 ]] && kill -0 "${DAEMON_PID}" 2>/dev/null; then
52 run_ctl quit >/dev/null 2>&1 || true
53 wait "${DAEMON_PID}" 2>/dev/null || true
54 fi
55 DAEMON_PID=0
56 }
57
58 cleanup() {
59 stop_daemon
60 rm -f "${SOCKET_PATH}"
61 }
62 trap cleanup EXIT
63
64 echo "Sprint 04 validation"
65 echo " socket: ${SOCKET_PATH}"
66 echo " backend: ${BACKEND}"
67 echo " log: ${LOG_FILE}"
68
69 mkdir -p "$(dirname "${SOCKET_PATH}")"
70 mkdir -p "$(dirname "${LOG_FILE}")"
71 rm -f "${SOCKET_PATH}" "${LOG_FILE}"
72 start_daemon
73
74 echo "[1/4] Baseline daemon health"
75 run_ctl ping
76 run_ctl status
77 run_ctl auth-summary
78
79 echo "[2/4] Restart resilience loop (${RESTART_LOOPS} iterations)"
80 for i in $(seq 1 "${RESTART_LOOPS}"); do
81 echo " iteration ${i}: stop/start daemon"
82 run_ctl quit >/dev/null
83 wait "${DAEMON_PID}" 2>/dev/null || true
84 DAEMON_PID=0
85 start_daemon
86 run_ctl ping >/dev/null
87 done
88
89 echo "[3/4] Post-restart health"
90 run_ctl status
91 run_ctl auth-summary
92
93 echo "[4/4] Optional interactive auth loop"
94 if [[ "${BACKEND}" == "polkit" ]] && command -v pkcheck >/dev/null 2>&1; then
95 echo " running ${PKCHECK_LOOPS} pkcheck attempts for action ${ACTION_ID}"
96 for i in $(seq 1 "${PKCHECK_LOOPS}"); do
97 set +e
98 pkcheck --allow-user-interaction --process "$$" --action-id "${ACTION_ID}"
99 rc=$?
100 set -e
101 echo " pkcheck[${i}] rc=${rc}"
102 run_ctl auth-summary || true
103 done
104 else
105 echo " skipped (requires BACKEND=polkit and pkcheck installed)"
106 fi
107
108 echo "Validation complete. Log output:"
109 echo " ${LOG_FILE}"