[SOLVED] Route via Api erstellen

Started by FriendOfCarlotta, May 18, 2018, 03:19:04 PM

Previous topic - Next topic
May 18, 2018, 03:19:04 PM Last Edit: May 19, 2018, 10:09:33 PM by FriendOfCarlotta
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.