Community
    • Categories
    • Recent
    • Popular
    • Users
    • Search
    • Register
    • Login

    Ändern von Feldern einer eigenen Kategorie über die API

    Scheduled Pinned Locked Moved Betrieb
    7 Posts 3 Posters 649 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N Offline
      nklein
      last edited by

      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

      1 Reply Last reply Reply Quote 0
      • F Offline
        franknagel
        last edited by

        Hallo,

        Sie müssen die verrückten Attributnamen wie z.B. "f_text_c_1491804201857" benutzen.

        Viele Grüße,
        Frank Nagel

        1 Reply Last reply Reply Quote 0
        • N Offline
          nklein
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • N Offline
            nklein
            last edited by

            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:"-")

            1 Reply Last reply Reply Quote 0
            • bheisigB Offline
              bheisig i-doit Team
              last edited by

              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

              1 Reply Last reply Reply Quote 0
              • F Offline
                franknagel
                last edited by

                @bheisig:

                1. 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.

                1 Reply Last reply Reply Quote 0
                • bheisigB Offline
                  bheisig i-doit Team
                  last edited by

                  Stimmt. Mein Wissen beruhte auf einer älteren Version. Das Verhalten wurde zwischenzeitlich umgestellt. Danke für die Korrektur.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post