OPNsense Forum
International Forums => German - Deutsch => Topic started by: FriendOfCarlotta on May 18, 2018, 03:19:04 pm
-
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