POST Server mit Installationscode verbinden
/api/v1/agent/install-codes/redeem
Legt den gebundenen Server, Profil, Gruppen und einen Geräteschlüssel aus dem lokal erzeugten Schlüsselhash atomar an oder verbindet sie. Identische Anfragen können sicher fortgesetzt werden; der private Geräteschlüssel kann eine gespeicherte Verbindung nach Ablauf des Codes wiederaufnehmen.
Auf dieser Seite
Zugriff und Rechte
Legt den gebundenen Server, Profil, Gruppen und einen Geräteschlüssel aus dem lokal erzeugten Schlüsselhash atomar an oder verbindet sie. Identische Anfragen können sicher fortgesetzt werden; der private Geräteschlüssel kann eine gespeicherte Verbindung nach Ablauf des Codes wiederaufnehmen.
agentInstallCode
Parameter und Header
Keine Pfad-, Query- oder zusätzlichen Anfrageheader-Parameter.
Anfragekörper
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | AgentInstallClaim | Ja | — |
| $.installation_id | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.name | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.platform | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.architecture | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.system_drive | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.key_prefix | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.key_hash | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.version | string | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.expected_account_id | string | Nein | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.setup_targets | array<object>; {"minItems":2,"maxItems":200} | Nein | Automatisch erkannte Ziele für System, lokale Daten-Dateisysteme, Systemdatenträger und die zum Backend geroutete Netzwerkschnittstelle. Boot-, temporäre, Container- und Netzwerkdateisysteme sind ausgeschlossen. Eigene Profile bleiben unverändert. |
| $.setup_targets[] | object | Ja | — |
| $.setup_targets[].address | string | Nein | — |
| $.setup_targets[].family | string | Nein | — |
| $.setup_targets[].id | string | Ja | UUID dieser Ressource. Bewahren Sie die zurückgegebene Kennung für weitere Operationen auf. |
| $.setup_targets[].kind | string | Ja | Ressourcenart oder Messwerttyp aus den angegebenen Werten. |
| $.setup_targets[].label | string; {"maxLength":128,"minLength":1} | Ja | Anzeigename der Komponente. |
| $.setup_targets[].local_ref | string | Nein | — |
| $.setup_targets[].name | string | Nein | Lesbarer Ressourcenname. Beachten Sie die angegebene Längengrenze. |
| $.setup_targets[].path | string; {"maxLength":1024} | Nein | — |
| $.setup_targets[].port | integer | Nein | — |
| $.setup_targets[].project | string | Nein | — |
| $.setup_targets[].protocol | string | Nein | — |
| $.setup_targets[].text_languages | object | Nein | — |
| $.setup_targets[].timeout_seconds | integer | Nein | — |
| $.setup_targets[].translations | object; {"additionalProperties":false} | Nein | — |
| $.setup_targets[].translations.de | object | Nein | — |
| $.setup_targets[].translations.en | object | Nein | — |
| $.setup_targets[].transport | string | Nein | — |
| $.setup_targets[].filesystem_identity | string; {"maxLength":256} | Nein | Vom Agenten gemeldete Volumeidentität. Unverändert beibehalten, damit ein Ersatzvolume nicht die Historie eines anderen Volumes fortsetzt. |
| $.setup_targets[].disk_identity | string; {"maxLength":256} | Nein | — |
| $.system_inventory | object; {"additionalProperties":false} | Nein | — |
| $.system_inventory.version | integer; {"enum":[1]} | Ja | — |
| $.system_inventory.disks_known | boolean | Ja | — |
| $.system_inventory.disks | array<object; {"additionalProperties":false}>; {"maxItems":200} | Ja | — |
| $.system_inventory.disks[] | object; {"additionalProperties":false} | Ja | — |
| $.system_inventory.disks[].component_id | string; {"maxLength":192} | Ja | — |
| $.system_inventory.disks[].path | string; {"maxLength":1024} | Ja | — |
| $.system_inventory.disks[].label | string; {"maxLength":128} | Ja | — |
| $.system_inventory.disks[].identity | string; {"maxLength":256} | Ja | — |
| $.system_inventory.swap_active | boolean | null | Ja | — |
| $.system_inventory.process_count_available | boolean | Ja | — |
| $.system_inventory.disk_io | LogicalDiskIOInventory | null | Nein | — |
| $.system_inventory.disk_io (anyOf 1) | LogicalDiskIOInventory | Nein | — |
| $.system_inventory.disk_io (anyOf 1).complete | boolean | Ja | — |
| $.system_inventory.disk_io (anyOf 1).disk_count_known | boolean | Ja | — |
| $.system_inventory.disk_io (anyOf 1).disk_count | integer; {"minimum":0,"maximum":200} | Ja | — |
| $.system_inventory.disk_io (anyOf 1).source_count | integer; {"minimum":0,"maximum":1024} | Ja | — |
| $.system_inventory.disk_io (anyOf 1).source_set | string; {"maxLength":64} | Ja | — |
| $.system_inventory.disk_io (anyOf 2) | null | Nein | — |
| $.system_inventory.health | ServerHealthInventory | null | Nein | — |
| $.system_inventory.health (anyOf 1) | ServerHealthInventory | Nein | — |
| $.system_inventory.health (anyOf 1).version | integer; {"const":1} | Ja | — |
| $.system_inventory.health (anyOf 1).sources | array<ServerHealthSource>; {"maxItems":1200} | Ja | — |
| $.system_inventory.health (anyOf 1).sources[] | ServerHealthSource | Ja | — |
| $.system_inventory.health (anyOf 1).sources[].component | ServerComponent | Ja | — |
| $.system_inventory.health (anyOf 1).sources[].component.address | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.family | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.id | string | Ja | UUID dieser Ressource. Bewahren Sie die zurückgegebene Kennung für weitere Operationen auf. |
| $.system_inventory.health (anyOf 1).sources[].component.kind | string | Ja | Ressourcenart oder Messwerttyp aus den angegebenen Werten. |
| $.system_inventory.health (anyOf 1).sources[].component.label | string | Ja | Anzeigename der Komponente. |
| $.system_inventory.health (anyOf 1).sources[].component.local_ref | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.name | string | Nein | Lesbarer Ressourcenname. Beachten Sie die angegebene Längengrenze. |
| $.system_inventory.health (anyOf 1).sources[].component.path | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.port | integer | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.project | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.protocol | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.text_languages | object | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.timeout_seconds | integer | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.translations | object; {"additionalProperties":false} | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.translations.de | object | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.translations.en | object | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.transport | string | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].component.filesystem_identity | string; {"maxLength":256} | Nein | Vom Agenten gemeldete Volumeidentität. Unverändert beibehalten, damit ein Ersatzvolume nicht die Historie eines anderen Volumes fortsetzt. |
| $.system_inventory.health (anyOf 1).sources[].component.disk_identity | string; {"maxLength":256} | Nein | — |
| $.system_inventory.health (anyOf 1).sources[].group | string; {"enum":["cpu_diagnostics_v1","disk_operations_v1","disk_latency_v1","network_errors_v1","swap_traffic_v1","psi_v1","filesystem_capacity_v1","filesystem_inodes_v1","filesystem_health_v1","oom_v1","storage_health_v1"]} | Ja | — |
| $.system_inventory.health (anyOf 1).sources[].status | string; {"enum":["ready","unsupported","permission_denied","failed"]} | Ja | — |
| $.system_inventory.health (anyOf 1).sources[].minimum_interval_seconds | integer; {"minimum":1,"maximum":86400} | Ja | — |
| $.system_inventory.health (anyOf 2) | null | Nein | — |
Antworten
application/json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | AgentInstallReceipt | Ja | — |
| $.account_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.workspace_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.device_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.key_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.replayed | boolean | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
application/json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | AgentInstallReceipt | Ja | — |
| $.account_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.workspace_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.device_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.key_id | string; {"format":"uuid"} | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| $.replayed | boolean | Ja | Installationseinstellung oder vom Gerät gemeldeter Wert. |
| Stabile Fehlercodes |
|---|
| invalid_install |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| forbidden |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| not_found |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| install_used |
| revision_conflict |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| invalid_install |
| platform_mismatch |
| unsupported_parameter |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| creation_quota |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
| Stabile Fehlercodes |
|---|
| unavailable |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
Wiederholungen und asynchrone Aufträge
Für diese Änderung gibt es keine allgemeine Wiederholungsgarantie. Prüfen Sie bei unklarer Antwort den betroffenen Eintrag, bevor Sie es erneut versuchen. Beachten Sie Wartezeiten aus Retry-After und fordern Sie abgelaufene Anmelde- oder Aktionscodes neu an.
Anfragebeispiele
Ersetzen Sie Demokennungen, Zeitstempel und Platzhalter durch eigene Werte. Behalten Sie bei Wiederholungen Kennungen, Zeit und Inhalt bei. Diese Beispiele führen auf der Seite keine Anfragen aus.
Halten Sie Anmeldelinks, Codes, Cookies und Schlüssel privat. Schreiben Sie sie nicht in Logs und teilen Sie sie nicht in Hilfeanfragen.
curl --fail-with-body --request POST 'https://metribeacon.com/api/v1/agent/install-codes/redeem' --header 'Accept: application/json' --header 'Authorization: Bearer INSTALL_CODE' --header 'Content-Type: application/json' --data '{"installation_id":"22222222-2222-4222-8222-222222222222","name":"web-01","platform":"linux","architecture":"amd64","system_drive":"/","key_prefix":"aaaaaaaaaaaa","key_hash":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","version":"vRELEASE"}'import urllib.request
headers = {'Accept': 'application/json', 'Authorization': 'Bearer INSTALL_CODE', 'Content-Type': 'application/json'}
request = urllib.request.Request('https://metribeacon.com/api/v1/agent/install-codes/redeem', headers=headers, method='POST', data='{"installation_id":"22222222-2222-4222-8222-222222222222","name":"web-01","platform":"linux","architecture":"amd64","system_drive":"/","key_prefix":"aaaaaaaaaaaa","key_hash":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","version":"vRELEASE"}'.encode())
with urllib.request.urlopen(request) as response:
print(response.read().decode())
const response = await fetch("https://metribeacon.com/api/v1/agent/install-codes/redeem", {"method": "POST", "headers": {"Accept": "application/json", "Authorization": "Bearer INSTALL_CODE", "Content-Type": "application/json"}, "body": "{\"installation_id\":\"22222222-2222-4222-8222-222222222222\",\"name\":\"web-01\",\"platform\":\"linux\",\"architecture\":\"amd64\",\"system_drive\":\"/\",\"key_prefix\":\"aaaaaaaaaaaa\",\"key_hash\":\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"version\":\"vRELEASE\"}"});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());
package main
import ("fmt"; "io"; "net/http"; "strings")
func main() {
req, err := http.NewRequest("POST", "https://metribeacon.com/api/v1/agent/install-codes/redeem", strings.NewReader("{\"installation_id\":\"22222222-2222-4222-8222-222222222222\",\"name\":\"web-01\",\"platform\":\"linux\",\"architecture\":\"amd64\",\"system_drive\":\"/\",\"key_prefix\":\"aaaaaaaaaaaa\",\"key_hash\":\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"version\":\"vRELEASE\"}")); if err != nil { panic(err) }
req.Header.Set("Accept","application/json")
req.Header.Set("Authorization","Bearer INSTALL_CODE")
req.Header.Set("Content-Type","application/json")
response, err := http.DefaultClient.Do(req); if err != nil { panic(err) }; defer response.Body.Close(); data, err := io.ReadAll(response.Body); if err != nil { panic(err) }; fmt.Printf("HTTP %d\n%s\n", response.StatusCode, data)
}
Verwandte Anleitungen
- HTTP-API, OAuth und MCP
Finden Sie die Nutzer-API-Endpunkte mit Rechten, Feldern, Beispielen und Antwortformaten.
- POST Einmaligen Server-Installationscode erstellen
Im Browser freigegebener Zehn-Minuten-Code für diesen Arbeitsbereich und das gewählte Profil. Erst beim Einlösen entsteht ein Monitor; Bearbeitungsrechte sind erforderlich. Gespeichert wird nur der Codehash.
- GET Fortschritt der automatischen Servereinrichtung lesen
Meldet den Eingang des ersten Lebenszeichens und ausgewählter Messwerte nach der Verbindung. Der ausstellende Browser kann den Fortschritt auch nach Ablauf des Codes lesen.
- DELETE Unbenutzten Installationscode widerrufen
Widerruft einen unbenutzten Code. Bereits verbundene Server und ihre Geräteschlüssel werden über die vorhandenen Monitor- und Schlüsselschnittstellen verwaltet.