#!/usr/bin/env bash # Meldet Installations-Meilensteine/Fehlschlaege an anode (device_installation_events, # siehe Migration 0025 in provisioning-server) - ausschliesslich fuer die eigene # Fehlersuche/Betriebsentwicklung gedacht ("Gold wert" fuer den Support, Nutzer-Wunsch # 01.09.2026 nach dem ersten echten Hardware-Test), noch NICHT zwangslaeufig auf der # Kunden-Oberflaeche sichtbar - das ist eine separate, noch offene Entscheidung. # # Rein melde-basiert und best effort: das Geraet hat waehrend der Installation noch # kein agent_secret (das entsteht erst ganz am Ende in backend_postinstall()), deshalb # device_fingerprint als Nachweis statt eines Service-Tokens (siehe # InstallationEventRequest/device_fingerprint_matches() serverseitig - gleiches # Vertrauensniveau wie /api/v1/activate selbst). Ein Fehlschlag beim Melden selbst # (Netzwerk gerade weg, Server nicht erreichbar, Geraet noch nicht aktiviert) darf die # eigentliche Installation NIE aufhalten - deshalb "|| true" ueberall, kein "set -e"- # Abbruch moeglich, keine Rueckgabewert-Pruefung durch die Aufrufer noetig. tuxflotte_report_installation_event() { local event_type="$1" local detail="${2:-}" local response_file="/run/tuxflotte/server/response.json" local hardware_file="/run/tuxflotte/hardware/hardware.json" local network_state="/run/tuxflotte/network/state.env" [[ -r "${response_file}" && -r "${hardware_file}" && -r "${network_state}" ]] || return 0 local device_id device_fingerprint server_url payload device_id="$(jq --raw-output '.device.id // empty' "${response_file}" 2>/dev/null)" device_fingerprint="$(jq --raw-output '.identity.device_fingerprint // empty' "${hardware_file}" 2>/dev/null)" [[ -n "${device_id}" && -n "${device_fingerprint}" ]] || return 0 # shellcheck disable=SC1090 source "${network_state}" 2>/dev/null || return 0 server_url="${TUXFLOTTE_SERVER_URL%/health}" [[ -n "${server_url}" ]] || return 0 payload="$( jq --null-input \ --arg device_fingerprint "${device_fingerprint}" \ --arg event_type "${event_type}" \ --arg detail "${detail}" \ '{ device_fingerprint: $device_fingerprint, event_type: $event_type, detail: (if $detail == "" then null else $detail end) }' 2>/dev/null )" [[ -n "${payload}" ]] || return 0 curl \ --silent \ --show-error \ --fail \ --location \ --max-time 5 \ --header 'Content-Type: application/json' \ --data-binary "${payload}" \ "${server_url}/api/v1/devices/${device_id}/installation-events" \ >/dev/null 2>&1 || true }