CLI pentru heartbeat metadata-only al mini PC gateway-ului. Dry-run implicit; heartbeat real doar cu --send-heartbeat.
M8.9 provides the first heartbeat CLI stub for mini PC gateways. Dry-run is default. Real heartbeat is opt-in via --send-heartbeat and sends metadata only. No secrets, camera passwords, stream links, media, billing or camera actions are included.
#!/usr/bin/env bash
set -euo pipefail
API_BASE_URL="${DERIOX_GUARD_API_BASE_URL:-https://guard.deriox.ro}"
HEARTBEAT_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat"
POLICY_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat-policy"
VERSION="m8.9-heartbeat-cli-stub"
MODE="dry-run"
GATEWAY_UUID="${DERIOX_GUARD_GATEWAY_UUID:-}"
GATEWAY_NAME="${DERIOX_GUARD_GATEWAY_NAME:-Deriox Guard Mini PC}"
CAMERA_COUNT="0"
QUEUE_COUNT="0"
while [ $# -gt 0 ]; do
case "$1" in
--send-heartbeat) MODE="send-heartbeat"; shift ;;
--show-payload) MODE="show-payload"; shift ;;
--policy) MODE="policy"; shift ;;
--gateway-uuid) GATEWAY_UUID="${2:-}"; shift 2 ;;
--gateway-name) GATEWAY_NAME="${2:-}"; shift 2 ;;
--camera-count) CAMERA_COUNT="${2:-0}"; shift 2 ;;
--queue-count) QUEUE_COUNT="${2:-0}"; shift 2 ;;
--api-base-url) API_BASE_URL="${2:-}"; HEARTBEAT_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat"; POLICY_ENDPOINT="${API_BASE_URL}/api/gateway/mini-pc/heartbeat-policy"; shift 2 ;;
--help|-h)
echo "Deriox Guard Heartbeat CLI - ${VERSION}"
echo ""
echo "Dry-run:"
echo " ./deriox-guard-heartbeat-cli.sh --gateway-uuid \"GW-...\""
echo ""
echo "Payload preview:"
echo " ./deriox-guard-heartbeat-cli.sh --show-payload --gateway-uuid \"GW-...\""
echo ""
echo "Trimite heartbeat metadata-only:"
echo " ./deriox-guard-heartbeat-cli.sh --send-heartbeat --gateway-uuid \"GW-...\""
echo ""
echo "Heartbeat policy:"
echo " ./deriox-guard-heartbeat-cli.sh --policy"
exit 0
;;
*)
echo "Argument necunoscut: $1"
echo "Rulează cu --help"
exit 1
;;
esac
done
detect_os() {
if command -v lsb_release >/dev/null 2>&1; then
lsb_release -ds 2>/dev/null | tr -d '"'
elif [ -f /etc/os-release ]; then
. /etc/os-release
echo "${PRETTY_NAME:-Linux}"
else
echo "Linux"
fi
}
uptime_seconds() {
if [ -r /proc/uptime ]; then
awk '{print int($1)}' /proc/uptime
else
echo 0
fi
}
LOCAL_IP="$(hostname -I 2>/dev/null | awk '{print $1}' || true)"
OS_LABEL="$(detect_os)"
UPTIME="$(uptime_seconds)"
payload() {
cat <<JSON
{
"gateway_uuid": "${GATEWAY_UUID}",
"gateway_name": "${GATEWAY_NAME}",
"software_version": "${VERSION}",
"os_label": "${OS_LABEL}",
"local_ip_hint": "${LOCAL_IP}",
"camera_count_reported": ${CAMERA_COUNT},
"queue_count": ${QUEUE_COUNT},
"uptime_seconds": ${UPTIME},
"security": {
"outbound_only": true,
"metadata_only": true,
"camera_password_included": false,
"stream_link_included": false,
"media_included": false,
"billing_enabled": false,
"camera_actions_enabled": false
}
}
JSON
}
echo "=================================================="
echo "Deriox Guard Heartbeat CLI - ${VERSION}"
echo "=================================================="
echo "Mode: ${MODE}"
echo "API: ${API_BASE_URL}"
echo "Gateway UUID: ${GATEWAY_UUID:-necompletat}"
echo "OS: ${OS_LABEL}"
echo "Security: metadata-only, no camera passwords, no streams, no media, no billing"
echo ""
case "$MODE" in
dry-run)
echo "Dry-run. Nu trimit nimic către server."
echo "Pentru payload: --show-payload"
echo "Pentru heartbeat real metadata-only: --send-heartbeat --gateway-uuid \"GW-...\""
;;
show-payload)
if [ -z "$GATEWAY_UUID" ]; then
echo "EROARE: --gateway-uuid este necesar pentru payload."
exit 1
fi
payload
;;
policy)
if ! command -v curl >/dev/null 2>&1; then
echo "EROARE: curl nu este instalat."
exit 1
fi
curl -fsSL "$POLICY_ENDPOINT"
echo ""
;;
send-heartbeat)
if [ -z "$GATEWAY_UUID" ]; then
echo "EROARE: --gateway-uuid este necesar pentru heartbeat."
exit 1
fi
if ! command -v curl >/dev/null 2>&1; then
echo "EROARE: curl nu este instalat."
exit 1
fi
echo "Trimit heartbeat metadata-only..."
payload | curl -fsSL -X POST "$HEARTBEAT_ENDPOINT" -H "Content-Type: application/json" --data-binary @-
echo ""
;;
esac