Einstieg in das LMC API Scripting

Forum zur LANCOM Management Cloud (LMC)

Moderator: Lancom-Systems Moderatoren

Antworten
lna
Beiträge: 178
Registriert: 11 Dez 2024, 20:50

Einstieg in das LMC API Scripting

Beitrag von lna »

Alles was in der LMC UI klickbar und alles was dort sichtbar ist, ist auch über die API verfügbar.
Diese Aktionen und Daten können auch für externe Automatisierung oder Monitoring genutzt werden.

Da sich die vorhandene LMC API Doku eher an Programmierer richtet hier mal der Versuch eines einfachen Einstiegs:

1. Anlegen eines API Keys:
Der normale LMC Anmeldeworkflow ist eher für menschliche Benutzer ausgelegt: Benutzername, Passwort, OTP oder ein ähnlicher Login über einen externen Identity Provider.
Für eine Softwareschnittstelle ist das Tokenhandling etwas umständlich, dafür legen wir zunächst einen API Key an.
API-Keys gibt es aktuell nur in Verbindung mit Benutzerkonten. Ihr erstellt also entweder in einem bestehenden Benutzer einen API-Key, oder legt eine "api@..." Mailadresse an und ladet diese auf das Projekt oder die Organisation ein.

Dann geht's in das Benutzerprofil, (oben rechts > Mein Profil > API Keys > (+) Neuen API Key erstellen)
Name vergeben, Konto auswählen (entweder alle Projekte auf die der Benutzer berechtigt ist, oder ein spezifisches Projekt)
Gültigkeitsdauer (default 1 Jahr)
im Nächsten schritt wird der generierte Key angezeigt. --> Key sichern, dieser wird von der LMC nur noch zensiert, aber nie wieder vollständig angezeigt.

Screenshot 2026-06-12 160935.png

In den Projektadministratoren wird nun auch angezeigt, dass ein einzelner Admin einen API-Key mit Zugriff auf dieses Projekt besitzt:
Administratoren.jpg
Mit diesem API Key kann man sich nun gegenüber der LMC authentifizieren. Alle Aktionen die gemacht werden, werden mit derselben Berechtigung durchgeführt, die auch der Benutzer auf das Projekt hat, dem der API Key zugewiesen ist.

Dazu wird dem HTTP Request einfach der Authorization Header mit dem API-Key hinzugefügt.

Code: Alles auswählen


ticket="Forumtutorial-basic-request"
author="lna"
apikey="h13r w1rd d0ch w0hl n1ch75 63h31m35 573h3n"

s = requests.Session()


s.headers.update({
    'User-Agent': f'API Script {ticket} by {author} with python-requests/{requests.__version__}',
    'Authorization': f'LMC-API-KEY {apikey}' # for API Secret Key Authentication uncomment this line
})
Lesezugriffe werden wie bei der Benutzeranmeldung nicht geloggt, aber Schreibzugriffe tauchen im Log auf. Da ich früher in meinen Scripten eine Benutzeranmeldung simuliert habe, habe ich mir angewöhnt, den User-Agent String ebenfalls zu editieren, damit ich unterscheiden kann ob eine Aktion per API oder Webinterface ausgeführt wird.
Per API-Key Auth ist dies direkt im Log ersichtlich.


Jetzt haben wir die Anmeldung, wissen aber noch nicht viel damit anzufangen.
In der LMC wird alles über eine UUID adressiert.

Wenn wir ein spezifisches Element haben wollen, müssen wir zunächst die UUID kennen.

Für den Einstieg nehmen wir uns diese einfach aus der URL im Browserfenster.

In meinem Projekt habe ich einen Accesspoint. Wenn ich den Accesspoint über die Geräteliste aufrufe bekomme ich folgende URL in der Adresszeile des Browsers:

Code: Alles auswählen

https://cloud.lancom.de/project/938a5c62-2e75-43bc-927e-538b6c5aebca/devices/1f7f81d1-4ccd-4a77-9f0f-55ce49291b99/overview?info-tab=base-info
                                ^[         Projekt UUID            ]        ^[            Device UUID           ]
Wir nehmen das erstmal als gegeben und schauen mal, ob wir der API ein paar Informationen zu diesem Gerät entlocken können.
Dafür nehme ich mir die beiden UUIDs als Variable vor

Code: Alles auswählen

projectuuid="938a5c62-2e75-43bc-927e-538b6c5aebca"
deviceuuid="1f7f81d1-4ccd-4a77-9f0f-55ce49291b99"
Mit diesen Werten kann ich jetzt zum Beispiel den Devices Service abfragen und aus dem zurückgegebenen JSON die Werte ziehen die mich interessieren.

Code: Alles auswählen

url = f"{CLOUD_BASE_URL}/cloud-service-devices/accounts/{projectuuid}/devices-table?id={deviceuuid}"
method = "get"

# Funktion aufrufen
device_data = make_request(method, url, s, json_data=None,max_retries=3, rate_limit=0.5)

#prjson(device_data)  

print(f"Name   = {device_data[0]['status']['name']}")
print(f"Model  = {device_data[0]['status']['model']}")
print(f"Serial = {device_data[0]['status']['serial']}")

print_runtime()
print_callcount()


==>
Name   = LX-6500Ehotsp
Model  = LANCOM LX-6500E
Serial = 4006805616100030
Execution time: 0.8733 seconds
Number of API-Calls: 1
Woher weiß ich dass es den Endpunkt gibt? Entweder wir finden ihn in der API Dokumentation des entsprechenden Services (https://cloud.lancom.de/cloud-service-devices/api-docs/) oder wir haben in der Browserkonsole gesehen dass die LMC UI ihn verwendet und anschließend in den API-Docs sichergestellt, dass es ein öffentlich freigegebener (dokumentierter) Endpunkt ist.

Dass ich Name, Modell und Seriennummer zurück bekomme sehe ich entweder, wenn ich mir in meinem script das komplette Rückgabe JSON ausgeben lasse, oder wenn ich ebenfalls in der API-Dokumentation suche.

Code: Alles auswählen

[
  {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "licensingApiVersion": "string",
    "firmwareState": "ERROR",
    "firmwareUpdateMode": "LMC",
    "siteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "siteName": "string",
    "licenseAllocationPending": true,
    "status": {
      "name": "string",
      "model": "string",
      "type": "ROUTER",
      "serial": "string",
      "serialPreconfig": "string",
      "ip": "string",
      "fwLabel": "string",
      "fwMajor": 1,
      "fwMinor": 0,
      "fwBuild": 0,
      "hwMask": 0,
      "heartbeatState": "ACTIVE",
      "claimingDate": "2026-06-12T15:14:31.950Z",
      "firmwarePreferenceState": "FW_PREF_UNDEFINED",
      "firstHeartbeatDate": "2026-06-12T15:14:31.950Z",
      "lastHeartbeatDate": "2026-06-12T15:14:31.950Z",
      "recoveryMode": true,
      "lifecycle": {
        "status": "SHIPPING",
        "eosDate": "2026-06-12T15:14:31.950Z",
        "eolDate": "2026-06-12T15:14:31.950Z"
      }
    },
    "config": {
      "state": "OUTDATED_CHANGED",
      "category": "CURRENT"
    },
    "deviceLicense": {
      "licensed": true,
      "expiring": true,
      "expiringAt": "2026-06-12T15:14:31.950Z",
      "errorStatus": 0,
      "reason": "string",
      "state": "ACTIVE"
    },
    "ufLicense": {
      "state": "UNKNOWN",
      "level": "UNKNOWN",
      "allocatedAt": "2026-06-12T15:14:31.950Z",
      "supportedFirmware": true,
      "migrated": true,
      "supportsContainer": true
    },
    "ufPrepaidLicense": {
      "level": "DEMO",
      "allocatedAt": "2026-06-12T15:14:31.950Z",
      "expiringAt": "2026-06-12T15:14:31.950Z"
    },
    "stacked": true,
    "stackUnitCount": 0,
    "customFields": [
      {
        "fieldId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "value": "string"
      }
    ],
    "actions": {
      "MERGE": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
    "alerting": {
      "alerts": [
        "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      ],
      "hasAlert": true,
      "isMuted": true
    },
    "offlineOnHold": true
  }
]
hier das vollständige script zum selbst ausprobieren - nur den eigenen api-key sowie die eigene projekt und geräte uuids hinterlegen.
lmc-basic.txt

Gibt es wünsche zu komplexeren Themen, die wir uns gemeinsam ansehen sollten?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Lukas
Antworten