Beispiele der lokalen API¶
Jeder Aufruf der lokalen Schnittstelle des Agenten, mit dem curl-Befehl und
der Antwort, die der Agent gab. Die Aufrufe liefen auf dem Labor-Gateway gegen
cproto-v0.2.0-rc.2. Die Zusammenfassung der Schnittstelle steht unter
Referenz der lokalen API.
Werte ersetzt. Jeder Befehl dieser Seite wurde unverändert in eine Shell
auf dem Labor-Gateway eingefügt. Statuscodes, Fehlercodes, Header und die Form
jeder Antwort sind echt. Die Profilversion (42), die ETags, die Hashes und der
Zeitstempel sind ersetzt; Listen sind gekürzt. Die Header Date und
Content-Length sind weggelassen.
Kurzablauf¶
Für Software, die über die API bestätigt statt über die Markierungsdatei (die Datei ist empfohlen, siehe Zwei Wege zu bestätigen):
- Pakete abrufen:
GET /v1/profile/packages, dann den Inhalt jedes Pakets mitGET /v1/profile/packages/{id}(Die Paketliste, Ein Paket). Merken Sie sichprofile_version. - Auf eine Änderung warten:
GET /v1/events?profile_version=PROFILE_VERSIONantwortet mit200und der neuen Version, wenn sich die Konfiguration ändert, oder nach 60 Sekunden mit204; fragen Sie dann erneut (Auf eine Änderung warten). Bei200gibt es eine neue Konfiguration: Rufen Sie sie ab (Schritt 1) und bestätigen Sie sie (Schritt 3). - Bestätigen: Sobald ein Paket angewendet ist,
POST /v1/profile/packages/{id}/ackmit{"profile_version": PROFILE_VERSION, "applied": true}(Ein Paket bestätigen), mit der Version, die Sie abgerufen haben. Ein ack mit einer älteren Version bekommt409: Rufen Sie neu ab. Sind alle Pakete bestätigt, sendet der Agentconfirmed.
Führen Sie die Befehle auf dem Gateway als root oder als Mitglied der Gruppe
bootstrap-agent aus (siehe Transport und Zugriff).
Der Agent antwortet mit einer Zeile JSON; | jq . gibt sie eingerückt aus, ein
Feld pro Zeile, und jq -r reduziert sie auf einen Wert. Auf dem Labor-Gateway
war jq installiert. Wo es fehlt, rückt | python3 -m json.tool ebenfalls ein.
Aufrufe, die private Schlüssel ausgeben, stehen am Ende dieser Seite
Das ganze Profil und die Pakete mit Zugangsdaten enthalten private Schlüssel. Sie stehen nur unter Aufrufe, die Geheimnisse liefern, hinter einer Warnung. Alles davor gibt kein Geheimnis aus.
Status¶
{
"interface_version": 1,
"interface_minor_version": 6,
"agent_version": "cproto-v0.2.0-rc.2",
"state": "ready",
"attestation_mode": "tpm",
"profile_version": 42,
"last_checkin": "2026-01-01T12:00:00Z",
"tpm_transient_avail": 3,
"tpm_loaded_sessions": 0,
"tpm_transient_capacity": 3,
"tpm_transient_used": 0,
"identity_cert_state": "not_configured",
"auth_mode": "tpm",
"auth_mode_source": "server",
"activation": "listen",
"profile_ready_marker": "/etc/iot-config/profile-ready"
}
Nur ein Feld:
last_error_code fehlt oben, weil es keinen gab. Die Felder sind unter
Zustand erklärt.
Die Paketliste¶
Die Liste nennt jedes Paket mit Version, Hash und ob es bestätigt ist. Den Inhalt enthält sie nie:
{
"profile_version": 42,
"packages": [
{
"id": "check_in_interval_seconds",
"version": 42,
"sha256": "EXAMPLE-HASH-BASE64=",
"acked": true
},
{
"id": "log_level",
"version": 42,
"sha256": "EXAMPLE-HASH-BASE64=",
"acked": true
}
]
}
Die Liste des Labor-Gateways hatte sechs Pakete; zwei sind gezeigt.
Warum der Hash so aussieht. sha256 ist die SHA-256 des Paketinhalts in
Base64 (44 Zeichen, endet auf =), so wie die Plattform sie sendet.
?pretty=1 ergänzt denselben Hash in Hex als sha256_hex (64 Zeichen), zum
Vergleich mit sha256sum. Es rückt nicht ein; das macht jq:
curl -s --unix-socket /run/bootstrap-agent/api.sock 'http://localhost/v1/profile/packages?pretty=1' | jq -r '.packages[] | "\(.id) \(.sha256_hex)"'
Ein Paket ohne Geheimnisse¶
Die Antwort ist der Inhalt des Pakets ohne Umschlag: ein String, eine Zahl oder ein Objekt. Diese beiden Pakete enthalten kein Geheimnis:
curl -s --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile/packages/log_level | jq .
curl -s --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile/packages/check_in_interval_seconds | jq .
Welche Pakete Geheimnisse enthalten, hängt von Ihrem Template ab; auf dem
Labor-Gateway waren es target-credential (der Broker-Zugang mit seinem
privaten Schlüssel) und target-connection. Lesen Sie diese nur wie unter
Aufrufe, die Geheimnisse liefern.
Ein Paket, das es nicht gibt (-i gibt Statuszeile und Header aus):
curl -s -i --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile/packages/does-not-exist
Nichts geändert: 304¶
Senden Sie das ETag Ihrer letzten Antwort in If-None-Match. Solange die
Konfiguration gleich ist, lautet die Antwort 304 ohne Body. Die erste Zeile
liest das aktuelle ETag:
E=$(curl -s -I --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile/packages | sed -n 's/^[Ee][Tt]ag: //p' | tr -d '\r')
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -H "If-None-Match: $E" http://localhost/v1/profile/packages
Ein Paket bestätigen¶
Das überlassen Sie normalerweise der Bestätigungsmarkierung, siehe
Zwei Wege zu bestätigen. Jeder Aufruf unten
ändert den Zustand des Pakets auf dem Gateway. Die erste Zeile liest die
aktuelle Profilversion in PV; die Aufrufe verwenden sie:
PV=$(curl -s --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/status | jq -r .profile_version)
Vermerkt. Mit der aktuellen Version und applied: true lautet die Antwort
204 ohne Body:
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d "{\"profile_version\":$PV,\"applied\":true}" http://localhost/v1/profile/packages/log_level/ack
Ohne applied. Die Antwort ist ebenfalls 204, und der Aufruf gilt als
applied: false: Das Paket steht danach mit "acked": false in der Paketliste.
Senden Sie den Aufruf darüber erneut, um es wieder zu bestätigen.
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d "{\"profile_version\":$PV}" http://localhost/v1/profile/packages/log_level/ack
Fehlerhafter Body: 400.
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d '{' http://localhost/v1/profile/packages/log_level/ack
Alte Version: 409. Die Version wird vor dem Paket geprüft, daher bekommt
auch ein unbekanntes Paket mit alter Version 409:
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d '{"profile_version":1,"applied":true}' http://localhost/v1/profile/packages/log_level/ack
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d '{"profile_version":1,"applied":true}' http://localhost/v1/profile/packages/nope/ack
Unbekanntes Paket mit aktueller Version: 404.
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X POST -d "{\"profile_version\":$PV,\"applied\":true}" http://localhost/v1/profile/packages/nope/ack
Auf eine Änderung warten¶
Mit der aktuellen Version wartet der Aufruf. Ändert sich nichts, antwortet
er nach 60 Sekunden mit 204 ohne Body; fragen Sie dann erneut. PV ist
gesetzt wie unter Ein Paket bestätigen.
curl -s -i --unix-socket /run/bootstrap-agent/api.sock "http://localhost/v1/events?profile_version=$PV"
Mit einer alten Version antwortet er sofort mit der aktuellen:
curl -s --unix-socket /run/bootstrap-agent/api.sock 'http://localhost/v1/events?profile_version=1' | jq .
Unbekannter Pfad oder unbekannte Methode¶
Ein unbekannter Pfad und eine Methode, die ein Pfad nicht annimmt, bekommen
404, nicht 405:
curl -s -i --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/nope
curl -s -i --unix-socket /run/bootstrap-agent/api.sock -X DELETE http://localhost/v1/status
POST /v1/status und GET /v1/profile/packages/{id}/ack antworten genauso
mit 404.
Aufrufe, die Geheimnisse liefern¶
Gibt private Schlüssel aus. Nicht kopieren, nicht in Tickets oder Chats einfügen.
GET /v1/profile liefert die ganze Konfiguration, und
GET /v1/profile/packages/{id} den Inhalt eines Pakets. Bei einem Paket mit
Zugangsdaten, auf dem Labor-Gateway target-credential, ist das der private
Schlüssel des Broker-Zugangs im Klartext. ?pretty=1 verbirgt ihn nicht.
Senden Sie stattdessen die Paketliste, wenn Sie Ausgaben
weitergeben.
Um das Profil zu prüfen, ohne seinen Inhalt zu sehen, lesen Sie nur die Header oder nur die Paketnamen:
curl -s -I --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile
curl -s --unix-socket /run/bootstrap-agent/api.sock http://localhost/v1/profile | jq -r '.packages[].id'
HTTP/1.1 200 OK
Content-Type: application/json
Etag: "EXAMPLE-ETAG"
X-Profile-Version: 42
check_in_interval_seconds
log_level
target-credential
Der vollständige Body und der Inhalt eines Pakets mit Zugangsdaten stehen nicht auf dieser Seite. Ihre Form, mit erfundenen Werten, steht unter Referenz der lokalen API. Lesen Sie sie nur aus Ihrer eigenen Software, die sie braucht.