opsi-python: Hilfe zu host_getObjects mit Filter

Antworten
WolleKette
Beiträge: 61
Registriert: 12 Nov 2013, 15:19

opsi-python: Hilfe zu host_getObjects mit Filter

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

Code: Alles auswählen

host_getObjects(attributes=[], **filter)
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:

Code: Alles auswählen

method host_getObjects [] {"id":"wolle.neutron.lan"}
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.
Benutzeravatar
fkalweit
uib-Team
Beiträge: 176
Registriert: 23 Okt 2020, 16:14

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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
WolleKette
Beiträge: 61
Registriert: 12 Nov 2013, 15:19

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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)
Benutzeravatar
fkalweit
uib-Team
Beiträge: 176
Registriert: 23 Okt 2020, 16:14

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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:

Code: Alles auswählen

backend.host_getObjects(id="myclient.uib.de")
Viele Grüße
Fabian
WolleKette
Beiträge: 61
Registriert: 12 Nov 2013, 15:19

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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. :lol:

Vielen Dank auf jeden Fall für die Unterstützung
WolleKette
Beiträge: 61
Registriert: 12 Nov 2013, 15:19

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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.
Benutzeravatar
n.doerrer
uib-Team
Beiträge: 267
Registriert: 23 Okt 2020, 16:11

Re: opsi-python: Hilfe zu host_getObjects mit Filter

Beitrag 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
Antworten