#!/usr/bin/env bash set -euo pipefail if [[ $# -ne 1 ]]; then echo "usage: $0 /tmp/typhon-aci.env" >&2 exit 1 fi ENV_FILE="$1" if [[ ! -f "$ENV_FILE" ]]; then echo "missing env file: $ENV_FILE" >&2 exit 1 fi set -a # shellcheck source=/dev/null source "$ENV_FILE" set +a : "${ACI_EMAIL:?ACI_EMAIL is required}" : "${ACI_PASSWORD:?ACI_PASSWORD is required}" export POLL_INTERVAL_SECONDS="${POLL_INTERVAL_SECONDS:-10}" export REQUEST_TIMEOUT_MS="${REQUEST_TIMEOUT_MS:-10000}" export LISTEN_PORT="${LISTEN_PORT:-9108}" export LOG_LEVEL="${LOG_LEVEL:-info}" LOG_FILE="/tmp/typhon-manual-smoke.log" METRICS_FILE="/tmp/typhon-manual-smoke.metrics" cleanup() { if [[ -n "${APP_PID:-}" ]]; then kill "$APP_PID" 2>/dev/null || true wait "$APP_PID" 2>/dev/null || true fi } trap cleanup EXIT npm run dev >"$LOG_FILE" 2>&1 & APP_PID=$! for _ in {1..60}; do if curl -fsS "http://127.0.0.1:${LISTEN_PORT}/healthz" >/dev/null 2>&1; then curl -fsS "http://127.0.0.1:${LISTEN_PORT}/metrics" >"$METRICS_FILE" if rg -q '^typhon_up 1$' "$METRICS_FILE"; then break fi fi sleep 1 done curl -fsS "http://127.0.0.1:${LISTEN_PORT}/metrics" >"$METRICS_FILE" echo "=== Required metrics ===" rg -n "^typhon_up|^typhon_build_info|^typhon_poll_errors_total|^typhon_temperature_celsius|^typhon_relative_humidity_percent|^typhon_vpd_kpa|^typhon_fan_speed_level" "$METRICS_FILE" -S || true echo if rg -q '^typhon_up 1$' "$METRICS_FILE"; then TEMP_LINE="$(rg '^typhon_temperature_celsius' "$METRICS_FILE" -n -S | head -n 1 || true)" HUMID_LINE="$(rg '^typhon_relative_humidity_percent' "$METRICS_FILE" -n -S | head -n 1 || true)" VPD_LINE="$(rg '^typhon_vpd_kpa' "$METRICS_FILE" -n -S | head -n 1 || true)" echo "=== Current climate ===" [[ -n "$TEMP_LINE" ]] && echo "$TEMP_LINE" [[ -n "$HUMID_LINE" ]] && echo "$HUMID_LINE" [[ -n "$VPD_LINE" ]] && echo "$VPD_LINE" else echo "warning: typhon_up did not reach 1 during smoke window" fi echo echo "=== Recent app log lines ===" tail -n 60 "$LOG_FILE" echo echo "manual smoke complete" echo "metrics: $METRICS_FILE" echo "logs: $LOG_FILE"