Seite 1 von 1
opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 10:06
von WolleKette
Hallo,
ich habe jetzt OPSI Version 4.2 installiert und versuche mich eben in opsi-python einzuarbeiten und bin am verzweifeln!
Ich kann mit folgendem Code auf den Server zugreifen und z. B. eine Liste der Hosts abrufen.
Code: Alles auswählen
b = JSONRPCBackend(address="https://.....:4447/rpc", username="...", password="...")
result = b.host_getObjects()
Soweit das Positive, um mal nicht gleich mit Jammern anzufangen.
Aber darüber hinaus geht nix mehr. Die Dokumentation zu
host_getObjects() besagt, dass die Methode mehrere Argumente haben kann.
Aber egal, was ich angebe, es gibt eine Fehlermeldung. Im allgemeinen Handbuch zu OPSI 4.2 gibt es im Kapitel
5.3.4. Tools for opsi API access: opsi-admin & opsi interface page ein Beispiel, wie man mittels Filter die Ausgabe einschränken kann. Im interaktiven opsi-admin funktioniert das auch und liefert meinen Rechner zurück:
In Python dagegen sieht's so aus:
Code: Alles auswählen
result = b.host_getObjects(None, '{"id":"wolle.neutron.lan"}')
=> TypeError: host_getObjects() takes from 1 to 2 positional arguments but 3 were given
result = b.host_getObjects('{"id":"wolle.neutron.lan"}')
=> opsicommon.exceptions.OpsiRpcError: Opsi rpc error: Backend bad value error: Class <class 'opsicommon.objects.Host'> has no attribute '{"id":"wolle.neutron.lan"}' (error on server)
Kann mir irgend Jemand einen Tip geben, wie das funktionieren soll?
Mal nebenbei bemerkt: Eine Auflistung von Methoden stellt keine API-Dokumentation dar!

Wenigstens ein Beispiel hier und da wäre hilfreich.
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 14:58
von fkalweit
Hallo,
wenn man opsi-utils installiert hat, dann finden sich unter /usr/share/opsi-utils/opsi-python-examples/ Beispiele wie man die opsi Methoden mit python benutzt.
Viele Grüße
Fabian
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 15:38
von WolleKette
Hallo Fabian,
stimmt. Zwei Beispielprogramme sind dort vorhanden. Aber leider keins, was mich interessiert.
Mich würde beispielsweise das mit dem Filter interessieren, der bei vielen Funktionen vorkommt. Oder noch spannender, wie die Syntax der query bei getData() aussieht.
host_getObjects(attributes=[], **filter)
getData(query)
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 16:05
von fkalweit
Hallo,
da ist auch ein Beispiel mit Filter:
Code: Alles auswählen
from OPSI.Backend.BackendManager import BackendManager
with BackendManager() as backend:
print(backend.backend_info())
# Create Opsi clients
for i in range(0,4):
backend.host_createOpsiClient(id=f"test-client-{i}.domain.local", description=f"Test client {i}")
clients = backend.host_getObjects(type="OpsiClient")
for client in clients:
print(client.id)
Hier werden zu erst clients angelegt und dann von allen host-Objekte mit dem type "OpsiClient die id ausgegeben.
Ein Host-Objekt mit einer bestimmt id kann man sich dann so geben lassen:
Viele Grüße
Fabian
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 16:51
von WolleKette
Ah ja. Auf die Idee, ein beliebiges Property als named argument zu verwenden, bin ich nicht gekommen.
Somit geht also auch beispielsweise backend.host_getObjects(hardwareAddress='00:0c:29:f1:5f:02')
Und jetzt mal mit ganz viel Intuition:
Das OpsiClient-Objekt hat eine setDescription / setNotes Methode, mit der ich die Werte ändern kann.
Und dann habe ich mit etwas Suche die backend.host_updateObjects() Methode gefunden. Und es hat funktioniert
Für alle, die mitlesen...
Code: Alles auswählen
from OPSI.Backend.JSONRPC import JSONRPCBackend
b = JSONRPCBackend(address="https://.......:4447/rpc", username=".....", password=".....")
client = b.host_getObjects(id="opsi-win10x64.neutron.lan")[0]
client.setNotes('Hier steht was neues')
b.host_updateObjects(client)
Das erinnert mich ein bisschen an die Text-Adventures früher.
Da brauchte man auch viel Intuition und Geduld bei der Suche um ans Ziel zu kommen.
Vielen Dank auf jeden Fall für die Unterstützung
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 28 Sep 2022, 17:08
von WolleKette
Aber vielleicht kannst du oder jemand anderes mir bei meinem eigentlichen Problem helfen.
Eigentlich möchte ich nämlich eine Liste der Clients, bei denen mindestens ein Produkt auf Setup steht. Und mit dabei dann natürlich auch gleich, wie viele Produkte das jeweils sind bzw. welche. Ziel ist die Integration der Daten in ein System zur Rechnerüberwachung (CheckMK)
Das habe ich inzwischen "Zu Fuß" hinbekommen. Aber dafür sind dann mehrere backend-Aufrufe hintereinander notwendig, was entsprechend lang dauert.
Hier meine Lösung:
Code: Alles auswählen
from OPSI.Backend.JSONRPC import JSONRPCBackend
b = JSONRPCBackend(address="https://.....:4447/rpc", username=".....", password="......")
# Alle Clients, die bei mindestens einem Product ActionRequest=setup haben
setup_clients = b.getClientsWithActionRequest('setup')
for client in sorted(setup_clients):
installed_products = b.getInstalledProductIds_list(client)
outdated_products = []
for prod in installed_products:
stat = b.getProductInstallationStatus_hash(prod, client)
if stat.actionRequest == 'setup':
outdated_products.append(prod)
print(f' {client:30} {len(outdated_products)} product(s) outdated. {outdated_products}')
Das liefert dann eine schöne Liste
client1 : 1 product(s) outdated. ['firefox']
client2 : 1 product(s) outdated. ['firefox']
client3 : 2 product(s) outdated. ['firefox', 'teamdrive']
client4 : 6 product(s) outdated. ['check_mk', 'firefox', 'google-chrome-for-business', 'javavm', 'notepad_pp', 'tortoisesvn']
...
Aber ich denke, dass müsste auch einfacher gehen.
Re: opsi-python: Hilfe zu host_getObjects mit Filter
Verfasst: 20 Okt 2022, 09:36
von n.doerrer
Es gibt auch noch die Methode
productOnClient_getObjects
Diese liefert mit einem einzelnen Call alles zurück, was gesucht ist. Für jedes Produkt-Client-Paar, was installiert ist, oder mal war bekommt man damit den gesetzten "actionRequest", "installationStatus" und einiges mehr. Man kann auch beim Aufruf direkt filtern.
Hier die Api-Doku dazu (wenn auch nicht wirklich vollständig...)
https://docs.opsi.org/python-docs/pytho ... getObjects