Ändern von Feldern einer eigenen Kategorie über die API
-
Hallo,
ich versuche momentan folgendes:
Ich frage mit folgendem Befehl ab, was in meiner selbst erstellten Kategorie an Werten für ein bestimmtes Objekt gesetzt ist:
curl -s -H "Content-Type:application/json" -H "X-RPC-Auth-Session:$session_id" https://$idoitServer/idoit/src/jsonrpc.php \ --data-ascii '{"version": "2.0","params": {"language": "de", "apikey": "'$apikey'", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C", "objID": "'$id'"}, "id": 1, "method": "cmdb.category.read" }' --noproxy $idoitServer -k > json_read_response.tmp
Dabei kommt, sofern ich die Werte bereits von Hand gesetzt habe folgendes heraus:
{"jsonrpc":"2.0","result":[{"id":"1659","objID":"1329862","html_c_1490004458057":null,"f_link_c_1490004450164":"testgruppe","f_popup_c_1490785150354": {"id":"246","title":"normal","const":"SCAN_MODE_NORMAL","title_lang":"normal","identifier":"openvas_scan_mode"},"f_popup_c_1490606309970": {"id":"240","title":"mittel","const":"RISC_LEVEL_MEDIUM","title_lang":"mittel","identifier":"openvas_risc_level"},"f_text_c_1490699768263":null,"f_text_c_149069979 1291":null,"f_popup_c_1491468241437": {"prop_type":"calendar"},"f_text_c_1490699795836":null,"f_text_c_1490699801403":null,"f_text_c_1490699806285":null,"f_text_c_1491804201857":null,"description ":null}],"id":1}
Wie man sieht, sind die Werte SCAN_MODE_NORMAL und RISC_LEVEL_MEDIUM gesetzt.
Allerdings möchte ich Sie nicht von Hand setzen, sondern automatisch erkennen ob Sie fehlen und dann setzen lassen. Daher, wenn ich obigen curl-Befehl nochmal absetze und die Werte nicht bereits per Hand eingetragen habe, kommt folgende response-Nachricht:
{"jsonrpc":"2.0","result": [{"id":"1659","objID":"1329862","html_c_1490004458057":null,"f_link_c_1490004450164":"testgruppe","f_popup_c_1490785150354": [],"f_popup_c_1490606309970":[],"f_text_c_1490699768263":null,"f_text_c_1490699791291":null,"f_popup_c_1491468241437": {"prop_type":"calendar"},"f_text_c_1490699795836":null,"f_text_c_1490699801403":null,"f_text_c_1490699806285":null,"f_text_c_1491804201857":null,"description ":null}],"id":1}
Die Werte sind sind wie gesagt noch nicht gesetzt, also alles ok. Mein Bash-Script merkt das und möchte nun z.B. den Wert
"f_popup_c_1490785150354": {"id":"246","title":"normal","const":"SCAN_MODE_NORMAL","title_lang":"normal","identifier":"openvas_scan_mode"}
mit folgendem Befehl setzen:
curl -s -H "Content-Type:application/json" -H "X-RPC-Auth-Session:$session_id" https://$idoitServer/idoit/src/jsonrpc.php \ --data-ascii '{"version": "2.0","params": {"language": "de", "apikey": "'$apikey'", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C", "objID": "'$id'", "data": { "id":"246", "title":"normal", "const":"SCAN_MODE_NORMAL", "title_lang":"normal", "identifier":"openvas_scan_mode" }}, "id": 1, "method": "cmdb.category.update" }' --noproxy $idoitServer -k
Als Antwort vom Server kommt:
{"jsonrpc":"2.0","result":{"success":true,"message":"Category entry successfully saved"},"id":1}
Und jetzt die Überraschung: Die Werte sind in Idoit nicht gesetzt.
Wo habe ich etwas falsch gemacht?
Gruß,
Niklas Klein
-
Hallo,
Sie müssen die verrückten Attributnamen wie z.B. "f_text_c_1491804201857" benutzen.
Viele Grüße,
Frank Nagel -
Ja, das macht Sinn. Ich habe jetzt den Befehl abgeändert und den Attributnamen mit ins data-Feld genommen:
curl -s -H "Content-Type:application/json" -H "X-RPC-Auth-Session:$session_id" https://$idoitServer/idoit/src/jsonrpc.php \ --data-ascii '{"version": "2.0","params": {"language": "de", "apikey": "'$apikey'", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C", "objID": "'$id'", "data": { "f_popup_c_1490785150354": {"id":"246", "title":"normal", "const":"SCAN_MODE_NORMAL", "title_lang":"normal", "identifier":"openvas_scan_mode" }}}, "id": 1, "method": "cmdb.category.update" }' --noproxy $idoitServer -k
Leider bleibt das Verhalten gleich. Zurück kommt wieder:
{"jsonrpc":"2.0","result":{"success":true,"message":"Category entry successfully saved"},"id":1}
Und die Felder sind weiter unverändert. Die Methode "cmdb.category.update" ist aber soweit korrekt? Es gibt noch "cmdb.object.update" aber damit kann ich, soweit ich das gesehen habe, nur die Daten in der Kategorie "General" bearbeiten.
Ich habe zum Test auch die Werte innerhalb des data-Feldes manipuliert und an die API geschickt:
"data": { "f_popup_c_1490785150354": {"foo":"bar", "fubar":"normal", "const":"NOT_EXISTENT_CONST", "title_kurz":"normal", "identifier":"openwas_scan_mode" }}
Obwohl die Daten ungültig sind, weil diese Felder nicht existieren, bekomme ich die gleiche "success"-Message als Antwort zurück. Dementsprechend kann man auf die Antworten, die die API zurück gibt, in diesem Fall wohl nichts geben. Ich werde mich mal auf die Suche nach einer log-file für die API auf dem Server machen.
-
Ok, ich habe eine Möglichkeit gefunden, es klappt wenn ich statt allen Unterattributen nur eines angebe also z.B den Titel oder die ID:
{"version": "2.0","params": {"language": "de", "apikey": "fqq6cqd50", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C","objID":"1329862", "data": {"f_popup_c_1490785150354":"schonend"}},"id": 1, "method": "cmdb.category.update"}
{"version": "2.0","params": {"language": "de", "apikey": "fqq6cqd50", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C","objID":"1329862", "data": {"f_popup_c_1490785150354":"246"}},"id": 1, "method": "cmdb.category.update"}
Gebe ich mehrere in einem Array an klappt es nicht, obowhl ich bei einem cmdb.category.read auch ein Array zurückbekomme (s. erster Post).
{"version": "2.0","params": {"language": "de", "apikey": "fqq6cqd50", "category": "C__CATG__CUSTOM_FIELDS_OPENVAS_C","objID":"1329862", "data": {"f_link_c_1490004450164":"testgruppe", "f_popup_c_1490785150354":{"id":"246", "title":"normal"}}},"id": 1, "method": "cmdb.category.update"}
Es wird dann sogar der aktuelle Eintrag ersetzt und das Feld zurückgesetzt. (Eintrag:"-")
-
Hallo,
bei der Methode "cmdb.category.update" sollte man die Methodik dahinter kennen: 1) Die mitgegeben Werte werden aktualisiert. 2) Diejenigen, die nicht mitgegeben werden, werden geleert. Soweit der theoretische Anspruch. Sollte das tatsächliche Verhalten davon abweichen, handelt es sich um einen Bug.
Das letzte Beispiel mit dem Array ist nicht valide. i-doit erwartet im Request einen String. Die Response besteht wie erwähnt als einem Array mit id- und title-Attribut.
Viele Grüße
Benjamin -
- Diejenigen, die nicht mitgegeben werden, werden geleert. Soweit der theoretische Anspruch. Sollte das tatsächliche Verhalten davon abweichen, handelt es sich um einen Bug.
Das möchte ich stark bezweifeln. In isys_api_model_cmdb_category.class.php wird update auf sync_wrapper zurückgeführt und dort wird extra ein Merge mit bestehenden Daten durchgeführt, um ein Überschreiben bestehender Daten zu verhindern (Zeile 781). Ich wüsste auch nicht, wo ein solches Verhalten dokumentiert wäre.
-
Stimmt. Mein Wissen beruhte auf einer älteren Version. Das Verhalten wurde zwischenzeitlich umgestellt. Danke für die Korrektur.