Hallo!
Ich möchte eine Route via Api mit Python 3 und requests erstellen:
apikey = 'xxx'
apisecret = 'xxx'
url = 'https://10.0.0.254/api/routes/routes/addroute'
requests.post(url, data=payload, verify=None, auth=(apikey, apisecret))
Payload sieht so aus:
{'route': {'network': '10.0.50.0/24', 'gateway': {'Null4': {'value': 'Null4 - 127.0.0.1', 'selected': 0}, 'Null6': {'value': 'Null6 - ::1', 'selected': 0}, 'VLAN_GW': {'value': 'VLAN_GW - 10.0.0.253', 'selected': 1}, 'WAN_DHCP': {'value': 'WAN_DHCP - 192.168.107.2', 'selected': 0}}, 'descr': 'vlan50', 'disabled': '0'}}
Der Post-Request liefert diese Fehlermeldung zurück:
{"errorMessage":"Error at /usr/local/opnsense/mvc/app/models/OPNsense/Routes/Route.php:59 - Undefined index: (errno=8)"}
Andererseits kann ich via /api/routes/routes/setroute/<uuid>
mit dem identischen Payload eine existierende Route erfolgreich ändern.
Payload basiert auf dem, was /api/routes/routes/getroute
ohne uuid zurückliefert.
Was läuft hier falsch?
Viele Grüße, Thomas
erstellen und bearbeiten sind unterschiedliche endpoints. Auch die Daten schauen leicht anders aus. Add braucht die daten so:
'route': {
'descr': ''
'disabled': '1'
'gateway' : 'Null6'
'network' '::1/128'
}
Danke für die Antwort.
Wenn ich also z.B.
payload = '{"route": {"descr": "vlan40", "disabled": "0", "gateway" : "VLAN_GW", "network": "10.0.40.0/24"}}'
verwende, bekomme ich nur <Response [200]>
zurück. Nichts weiter. Route wird nicht angelegt.
Das Gateway 'VLAN_GW' funktioniert mit per Ui angelegten Routen problemlos.
glaub ich nicht - irgendwas muss im body stehen - und wenn es "{}" ist.
Alles, was ich der response noch entlocken kann, ist:
>>> json.loads(request.text)
{'result': 'failed'}
ja - das ist dann ein anderes problem, denn hier steht der "echte" statuscode.
Den Code dazu findest du hier:
https://github.com/opnsense/core/blob/master/src/opnsense/mvc/app/controllers/OPNsense/Base/ApiMutableModelControllerBase.php#L273
Ich würde mal sagen, du machst da was beim Request falsch, da er offensichtlich nicht in das if rein springt.
Der Request ist mMn Ok:
import json
import requests
apikey = 'xxx'
apisecret = 'xxx'
url = 'https://10.0.0.254/api/routes/routes/addroute'
payload = '{"route":{"descr":"vlan40","disabled":"0","gateway":"VLAN_GW","network":"10.0.40.0/24"}}'
res = requests.post(url, data=payload, verify=None, auth=(apikey, apisecret))
print(res)
print(json.loads(res.text))
<Response [200]>
{'result': 'failed'}
# cat /tmp/gateway_list.json
{"WAN_DHCP":"WAN_DHCP - 192.168.107.2","VLAN_GW":"VLAN_GW - 10.0.0.253","Null4":"Null4 - 127.0.0.1","Null6":"Null6 - ::1"}
Entspricht dem Wiki-Beispiel und verwendet die von dir vorgeschlagene Payload-Struktur.
Die so von Hand im Ui angelegte Route funktioniert.
Was mache ich da falsch? Kann man der Api nicht entlocken, welches Element der Datenstruktur ihr Schluckauf bereitet?
Du benutzt die Bibliothek vermutlich falsch:
http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests
Die Library werde ich hier jetzt aber nicht erklären.
Danke! Problem gelöst, siehe https://forum.opnsense.org/index.php?topic=8718.msg38810#msg38810