Hallo Leute,
ich bin gerade dabei mit ein bisschen mit der Network API zu spielen um eine Änderung (update) im Netzwerk durchzuführen. Laut Doku in der aktuellen API sollte das eigentlich auch funktionieren, jedoch sieht es in der Realität mal wieder etwas anderes aus.
Benutze zur Zeit die Offizielle Network Version 10.0.162. Laut Doku in meiner UDM-SE https://<IP-UDM-SE>/unifi-api/network#tag/Networks/operation/updateNetwork sollte das funktionieren anhand des Beispiels.
https://<IP-UDM>/proxy/network/integration/v1/sites/{siteId}/networks/{networkId}
{
"management": "GATEWAY",
"name": "Default Network",
"enabled": true,
"vlanId": 2,
"dhcpGuarding": {
"trustedDhcpServerIpAddresses": [
"string"
]
},
"isolationEnabled": true,
"cellularBackupEnabled": true,
"zoneId": "c3920607-5069-4ac3-ba10-00754e7a8e8b",
"internetAccessEnabled": true,
"mdnsForwardingEnabled": true,
"ipv4Configuration": {
"autoScaleEnabled": true,
"hostIpAddress": "string",
"prefixLength": 8,
"additionalHostIpSubnets": [
"string"
],
"dhcpConfiguration": {
"mode": "string"
},
"natOutboundIpAddressConfiguration": [
{
"type": "string",
"wanInterfaceId": "66f1c7be-b693-4397-8a78-3cdb1f810f79"
}
]
},
"ipv6Configuration": {
"interfaceType": "string",
"clientAddressAssignment": {
"dhcpConfiguration": {
"ipAddressSuffixRange": {
"start": "string",
"stop": "string"
},
"leaseTimeSeconds": 31536000
},
"slaacEnabled": true
},
"routerAdvertisement": {
"priority": "LOW"
},
"dnsServerIpAddressesOverride": [
"string"
],
"additionalHostIpSubnets": [
"string"
]
}
}
Display More
Was ich möchte, ich will gern nur eine Einstellung "internetAccessEnabled": true durch ein Script oder durch meinen ioBroker bei einem bestimmten Ereignis auf false ändern, damit die UDM automatisch den Internet Zugriff mittels Firewall sperrt. Sobald das Häkchen entfernt wird, wird entsprechend eine Firewall Regel erstellt, die den Internet zugriff blockt.
Nach zwei Tagen rum probieren mit Postman ist dann endlich der Groschen gefallen warum der Post Befehl (mit dem Programm Postman durchgeführt) mit verschiedenen versuchen immer wieder fehlschlug. Die Lösung ist relativ einfach, wenn man das nicht übersieht. Man geht ja davon aus, dass die bereits Programmierte Konfiguration vollständig ist und einem nicht irgendwelche Konfigurationen unterschlagen werden.
In meinem Beispiel ist natürlich DHCP konfiguriert und ein Adressraum von 11 Geräten (10.90.1.50 - 10.90.1.60) Reserviert. Wenn ich mir aber die Daten mit dem GET aus meiner UDM auslese sieht es so aus.
{
"management": "GATEWAY",
"id": "88a86000-0000-0000-0000-2ed9c3d20000",
"name": "90 | Test-LAN",
"enabled": true,
"vlanId": 90,
"metadata": {
"origin": "USER_DEFINED"
},
"isolationEnabled": false,
"cellularBackupEnabled": true,
"zoneId": "f178000-0000-0000-0000-5e8fa6e90000",
"internetAccessEnabled": true,
"mdnsForwardingEnabled": false,
"ipv4Configuration": {
"autoScaleEnabled": false,
"hostIpAddress": "10.90.1.10",
"prefixLength": 24,
"dhcpConfiguration": {
"mode": "SERVER",
"ipAddressRange": {},
"dnsServerIpAddressesOverride": [
"10.9.9.15"
],
"leaseTimeSeconds": 86400,
"domainName": "meinedomain.net",
"pingConflictDetectionEnabled": true,
"option43Value": "10.15.1.1"
},
"natOutboundIpAddressConfiguration": [
{
"type": "AUTO",
"wanInterfaceId": "98b80000-0000-0000-0000-704e67470000",
"ipAddressSelectionMode": "MAIN"
}
]
}
}
Display More
Bei mir ist DHCP für IP6 ist nicht aktiviert, somit auch nicht vorhanden und kann somit weggelassen werden. Laut dem Beispiel aus der API oben muss man die ID unterhalb des Gateway und den Metadaten Block komplett entfernen. Soweit so gut, also die Daten wie im Beispiel geändert und mittels PUT versucht die Daten zurückzuspielen. Was jedoch so nicht klappt, was mir erst hinterher aufgefallen ist. Nachdem ich einiges ausprobiert habe und verschiedene Fehler bekomme habe.
Wenn man sich die Rohdaten von meinem Testnetzwerk genau ansieht fällt auf, das bei der IPv4 DHCP Konfiguration der Adressbereich leer ist "ipAddressRange": {} das meckert er auch an (wenn man die Fehlermeldung mal aufmerksam lesen würde
). Manchmal sieht man halt den Wald vor lauter Bäumen nicht
. Erst als ich mir das Beispiel von der Doku genauer angesehen ist mir aufgefallen, das unter der IPv6 Konfiguration im Abschnitt der DHCP Konfiguration die korrekte Einstellung für IP Range vorgegeben wird, dies jedoch komplett bei der IPv4 Konfiguration fehlt.
Der Abschnitt müsste also richtig lauten:
"dhcpConfiguration": {
"ipAddressSuffixRange": {
"start": "string",
"stop": "string"
},
"leaseTimeSeconds": 31536000
},
Also müsste mein Kompletter Block für die Änderung durch PUT so aussehen.
{
"management": "GATEWAY",
"name": "90 | Test-LAN"",
"enabled": true,
"vlanId": 90,
"isolationEnabled": false,
"cellularBackupEnabled": true,
"zoneId": "f1780000-0000-0000-00000-5e8fa6e90000",
"internetAccessEnabled": false,
"mdnsForwardingEnabled": false,
"ipv4Configuration": {
"autoScaleEnabled": false,
"hostIpAddress": "10.90.1.10",
"prefixLength": 24,
"dhcpConfiguration": {
"mode": "SERVER",
"ipAddressRange": {
"start": "10.90.1.50",
"stop": "10.90.1.60"
},
"dnsServerIpAddressesOverride": [
"10.9.9.15"
],
"leaseTimeSeconds": 86400,
"domainName": "meinedomain.net",
"pingConflictDetectionEnabled": true,
"option43Value": "10.15.1.1"
},
"natOutboundIpAddressConfiguration": [
{
"type": "AUTO",
"wanInterfaceId": "98b80000-0000-0000-0000-704e67470000",
"ipAddressSelectionMode": "MAIN"
}
]
}
}
Display More
Danach wir die Konfiguration und der geänderte Punkt "internetAccessEnabled": false übernommen, die entsprechende Firewall Regel eingerichtet und dem Netzwerk das Internet gesperrt.
Warum ich jetzt das ganze hier so ausführlich geschrieben habe? Zu allererst ist die API eine sehr nützliche Erweiterung und viele möchten gern z.B. durch HAOS oder ioBroker bestimmte Einstelllungen automatisiert vornehmen lassen (so wie ich auch) und zum zweiten, viele Scheitern bei der Umsetzung ihres Vorhabens, weil man kaum vernünftige Infos zum richtigen vorgehen mit derAPI findet. Wie man auch an meinem Beispiel sieht, sie auch noch Fehlerhaft bzw. noch nicht komplett ist.
Die Frage ist jetzt ist es Teil eines Bug und sollte man das melden oder liegt es daran, das es noch lückenhaft ist oder schlicht und ergreifend vergessen worden ist? Laut der Change Log für die Aktuelle Beta zu Network ist da auch was von der API zu lesen. Vielleicht hat jemand die aktuelle Beta am Start und könnte mal bei seiner Konfiguration schauen ob da der IP Range auch leer ausgelesen wird.