Idoit.search
-
Hallo!
Vielleicht eine einfache Frage, aber ich komme im Moment nicht weiter. Aber wozu gibt es hier so viele Gurus.
Ich möchte aus meiner Datenbank über API alle Objekte erhalten, die ein bestimmtes Attribut aufweisen. Ganz konkret suche ich im Moment alle Layer-3-Netze (objTypeID=31) mit einer bestimmten Netzadresse. Über die Client-Suche geht das mit der Abfrage Netz mit Suffix="11.22.60.128 / 25".
Ich habe es mit dem API-Call idoit.search versucht, aber ich finde keine Query-Doku, die das ermöglicht. Alles was mir bislang gelang ist, hinter q Abfragen auf den Titel oder Kategorien zu machen, aber nicht auf bestimmte relevante Attribute.
Im Prinzip müsste es irgendwie heißen (die anderen Felder für 'method', 'version' usw. lasse ich hier weg):
"objTypeID" : "31", "address_with_suffix" : "11.22.60.128 / 25",
-
Hi,
so in der Art sieht der Aufruf aus:
call('idoit.search, array( 'apikey' => '1234567890', 'q' => '11.22.60.128 / 25' ));
Mit dem "q" übergibst du den Suchstring.
Du bekommst dann ein Array mit den Ergebnissen zurück, das du dann weiterverarbeiten kannst. Die Suche funktioniert prinzipiell wie die Suche oben rechts in i-doit selber. Die Suche ist global und geht über nahezu alle Felder.
Hast du mal in die Doku mit Beispielen geschaut? Die ist super in der Knowledge Base versteckt -> https://kb.i-doit.com/download/attachments/7831613/i-doit%20JSON-RPC%201.8.3.pdf?version=1&modificationDate=1488357023614&api=v2
Auf Seite 26 findest du die Informationen zur Suche.
Lieben Gruß und einen schönen Abend
Christian -
Hallo Christian,
danke für Deine schnelle Antwort. Das hatte ich schon versucht und auch die Doku kenne ich.
Leider liefert die Anfrage nichts zurück, es sei denn ich verwende den Suchbegriff "11.22.60.128 / 25" auch in der Bezeichnung. Es ist vielleicht sinnvoll die IP-Liste auch in der Bezeichnung anzugeben, aber nicht zwingend erforderlich. Auch kann im Titel ja ein Tippfehler vorhanden sein, oder die Schreibweise leicht variieren (z.B. "11.22.60.128/25" oder "11 . 22 . 60 . 128 /25". Der Fantasie des Erfassers sind ja bekanntermaßen keine Grenzen gesetzt ;)), so dass die Suche wieder nichts findet.
Darum will ich ja nach einem tatsächlichen Attribut suchen.
Dies ist meine Abfrage:
{ "method" : "idoit.search", "params" : { "q" : "11.22.60.128 / 25", "apikey" : "123456789" }, "version" : "2.0", "id" : 42 }
Dies ist das Ergebnis:
{
"jsonrpc": "2.0",
"result": [],
"id": 42
} -
Die Suche nach "11.22.60.128 / 25" schlägt fehl, weil Basisadresse und CIDR-Suffix in der Datenbank in zwei verschiedenen Datenfeldern stehen. Interessanterweise schlägt auch die Suche nach "11.22.60.128" (bzw. ein bei mir existierendes Subnetz) fehl. Die Spalte ist anscheinend/vermutlich nicht im Suchindex erfasst. Was geht, ist die Suche nach "11.22.60.129". Also der ersten zu vergebenen Adresse, denn dafür gibt es ein indiziertes Datenfeld. Hier wird dann aber auch die Maschine zurückgeliefert, der die IP-Adresse evtl. zugewiesen wurde. Weiter tauchen evtl. archivierte oder gelöschte Objekte auf. Dies ist sonst nicht der Fall bei der API, aber ich weiß nicht, wie sich 'idoit.search' da verhält. Hier muss man also jedenfalls auch noch filtern.
Ein anderer Weg wäre, sich zunächst alle Layer3-Objekte zusammen mit der Kategorie "C__CATS__NET" zu holen und sich dann das passende Objekt heraus zu suchen. Das ist vielleicht die stabilere Lösung, da die Volltextsuche immer wieder eine Baustelle ist.
-
Ja, die Lösung mittels Loop über alle Layer-3 zu machen hatte ich auch schon gedacht. Allerdings fand ich das recht umständlich.
Die Client-Suche bietet das ja über das Suchfeld und "Net with suffix". Nur über die API geht es wohl nicht direkt.
Ich mache das dann über den Loop aller Layer-3-Objekte.
Danke für Deine Unterstützung. -
Ich muss leider mitteilen, dass eine Schleife über alle Layer-3 und dann jeweils eine Abfrage auf den CIDR-Block zwar funktioniert, aber inaktzeptabel langsam ist.
Bei derzeit ca. 150 Layern läuft die Task fast 2 Minuten (sicher auch von äußeren Parametern wie Netzwerkgeschwindigkeit abhängig).
Hat vielleicht noch jemand eine Idee wie man die im Suchfeld des Online-Clients vorhandene Abfrage auf "Net with suffix" hier umsetzen kann?
-
Hier empfiehlt es sich, für das Holen der Kategorie C__CATS__NET das Bulk-Request Feature von JSON-RPC zu benutzen. Das sollte bei 150 Layer-3 Netzen deutlich unter einer Sekunde dauern.
Wenn es wirklich schnell gehen soll, dann müsste man einen Report erzeugen, der die notwendigen Informationen für Layer-3 Netze bereit stellt und sich den mit der API holen. -
Derzeit hole ich erst die Liste aller Layer-3 und hole dann für jeden einzelnen mit C__CATS__NET die Details. Und das dauert…
Bei mir dauert die Routine bei der ich den Namen kenne 1,5 Sekunden (der komplette Code macht natürlich mehr, nicht nur das Layer-3-Objekt öffnen).
Wenn ich nur den CIDR-Block kenne und darum über alle Layer-3 laufen muss, um den passenden zu finden, dauert es 102 Sekunden."Bulk request" sagt mir in diesem Zusammenhang nichts. Hast Du evtl. ein Code-Beispiel wie man den aufsetzt?
-
Bulk oder Batch Requests werden hier spezifiziert. Die Idee ist, pro HTTP Roundtrip nicht nur einen Request abzusetzen, sondern Hunderte in einer Liste. Dann bekommt man auch eine Liste mit Ergebnissen zurück. Irgendwo bei 500 sollte man Schluss machen, darüber wird es wieder langsamer. Benjamin Heisig implementiert so etwas z.B. in seinem PHP client.
-
Cool, danke. Ich probiere das mal aus.
Ich wollte mich nochmal melden. Mit Bulk-Request ist die Abfrage nun auf akzeptable 3,6 Sekunden geschrumpft. Super und vielen Dank nochmal fürs Stubsen in die richtige Richtung.