kurioses Problem mit ServiceCalls

Antworten
isnoguter
Beiträge: 79
Registriert: 23 Jul 2014, 07:03

kurioses Problem mit ServiceCalls

Beitrag von isnoguter »

Hallo zusammen,

ich habe ein kurioses Problem bzw. einen Bug, bei dem ich nicht weiter komme.

Ausgangspunkt ist das Paket o4i_firefox-esr. Die Propertys von o4i_firefox-esr werden mit einem weiteren Paket (Name: topqw) via ServiceCall verändert. Konkret trage ich den Namen eines Zertifikates in die Property von o4i_firefox-esr ein und setze es auf update.

Das hat bis jetzt auch ohne Probleme funktioniert. Heute habe ich aufgrund von neuen Zertifikaten die Propertys von topqw geändert. Leider werden in die Propertys von o4i_firefox-esr nicht die neuen, sondern die alten Zertifikate eingetragen.

Weder in der control-Datei, noch in den Propertys von o4i_firefox-esr oder topqw steht noch etwas vom alten Zertifikat. Die Propertys in opsi-configed - Depot-Konfiguration habe ich mehrfach geprüft. Dort gibt es das alte Zertifikat nicht mehr.

Ich habe Clients getestet, auf denen das alte Zertifikat nie installiert war, und trotzdem wird es in die Propertys von o4i_firefox-esr eingetragen.

In einem weiteren Test habe ich das Paket o4i_firefox-esr unter dem neuen Namen o4i_firefox-esr2 installiert und die Propertys mit meinem Paket topqw ändern lassen. Das hat funktioniert.

Fazit: Ändere ich mit dem gleichen Paket / der gleichen Funktion die Propertys von o4i_firefox-esr, wird das alte Zertifikat eingetragen. Ändere ich die Propertys von o4i_firefox-esr2, funktioniert alles wie gewünscht.

Für mich sieht es so aus, als ob irgendwo etwas gecacht oder gespeichert ist. Hat jemand eine Idee zu diesem kuriosen Problem? Der Server läuft bereits auf 4.3.

Viele Grüße
Benutzeravatar
j.schneider
uib-Team
Beiträge: 1819
Registriert: 29 Mai 2008, 15:14

Re: kurioses Problem mit ServiceCalls

Beitrag von j.schneider »

Hallo,

sehr seltsam.
Können wir dazu einmal den Skript-Auszug haben, mit dem die Properties gesetzt werden?

Grüße
Jan Schneider
isnoguter
Beiträge: 79
Registriert: 23 Jul 2014, 07:03

Re: kurioses Problem mit ServiceCalls

Beitrag von isnoguter »

Ich muss meinen ersten Post etwas korrigieren. Es wird nicht nur der alte Zertifikatsname eingetragen, sondern alle Zertifikatsnamen, die in der Vergangenheit schon mal genutzt wurden.

Mir ist heute wieder eingefallen, was ich mir damals bei der Erstellung meiner Funktion gedacht habe. Die Funktion setzt nicht nur Propertys, sie prüft auch welche Werte gerade in der Property stehen, damit es nicht zu doppelten Einträgen kommt. Außerdem werden die Standardpropertys ausgelesen, wenn der ResultString [] ist.

Hier ein Teil der Funktion:

Code: Alles auswählen

Set $ResultList$ = getReturnListFromSection("opsiServiceCall_productPropertyState_getObjects")
Set $ResultString$ = takestring(0, $ResultList$)

if $ResultString$ = "[]"
	comment "got no value for Client, trying to get default value"
	Set $ResultList$ = getReturnListFromSection("opsiServiceCall_productProperty_getObjects")
	Set $ResultString$ = takestring(0, $ResultList$)
	if $ResultString$ = "[]"
		LogError "got no information from Service"
		isFatalError
	endif
endif
if not(jsonIsValid($ResultString$))
	LogError "got no valid json from Service"
	isFatalError
endif
if not(jsonIsArray($ResultString$))
	LogError "got no json Array from Service"
	isFatalError
endif

[opsiServiceCall_productPropertyState_getObjects]
"method": "productPropertyState_getObjects"
"params": [
	"[]",
	'{"productId":"o4i_firefox-esr","objectId":"%hostId%","propertyId":"$PolicyName$"}'
	]
	
[opsiServiceCall_productProperty_getObjects]
"method": "productPropertyState_getObjects"
"params": [
	"[]",
	'{"productId":"o4i_firefox-esr","propertyId":"$PolicyName$"}'
	]
	
Meine Funktion wird in common.opsiinc über importLib "lib_functions.opsiinc" eingebunden. Bei setup sehe ich dazu leider keine Einträge im Log. Deshalb habe ich die Funktion direkt in das setup-Skript kopiert. Zwischenfrage: Wo kann ich die Log-Einträge einer eingebundenen Funktion sehen?

Mir ist dann im Log aufgefallen, das der ServiceCall opsiServiceCall_productProperty_getObjects aus meinem Skript die Propertys aller Clients anzeigt, auf dem o4i_firefox-esr installiert ist. Eigentlich will ich aber nur die Standardwerte des Pakets haben.

Code: Alles auswählen

(5652)    [5] [2024-01-11 07:43:59.782] [lra_topqw]     comment: got no value for Client, trying to get default value
(5653)    [6] [2024-01-11 07:43:59.783] [lra_topqw]          "method": "productPropertyState_getObjects"
(5654)    [6] [2024-01-11 07:43:59.793] [lra_topqw]       HTTPSender Post succeeded
(5655)    [6] [2024-01-11 07:43:59.793] [lra_topqw]       Server-FQDN: 10.1.211.13 Server-IP: 10.1.211.13
(5656)    [6] [2024-01-11 07:43:59.793] [lra_topqw]       JSON Bench for productPropertyState_getObjects "params":[[],{"propertyId":"policy_certificates"," Start: 07:43:59:783 Time: 00:00:00:010
(5657)    [6] [2024-01-11 07:43:59.798] [lra_topqw]       JSON result: [{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates;nb2003.domain.de","values":["ImportEnterpriseRoots"],"productId":"o4i_firefox-esr","objectId":"nb2003.domain.de","type":"ProductPropertyState"},{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates;nb2018.domain.de","values":["ImportEnterpriseRoots","\\\\\\\\link01\\\\opsi_cert2\\\\NetscalerNeu.cer","\\\\\\\\link01\\\\opsi_cert1\\\\CNFTTHLV-ServerCertificationAuthority2.crt"],"productId":"o4i_firefox-esr","objectId":"nb2018.domain.de","type":"ProductPropertyState"},{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates; ............
(5658)    [6] [2024-01-11 07:43:59.804] [lra_topqw]       The value of the variable "$ResultString$" is now: "[{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates;nb2003.domain.de","values":["ImportEnterpriseRoots"],"productId":"o4i_firefox-esr","objectId":"nb2003.domain.de","type":"ProductPropertyState"},{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates;nb2018.domain.de","values":["ImportEnterpriseRoots","\\\\\\\\link01\\\\opsi_cert2\\\\NetscalerNeu.cer","\\\\\\\\link01\\\\opsi_cert1\\\\CNFTTHLV-ServerCertificationAuthority2.crt"],"productId":"o4i_firefox-esr","objectId":"nb2018.domain.de","type":"ProductPropertyState"},{"propertyId":"policy_certificates","ident":"o4i_firefox-esr;policy_certificates;nb2030.domain.de","values":[],"productId":"o4i_firefox-esr" ............
(5659)    [6] [2024-01-11 07:43:59.804] [lra_topqw]     If
(5660)    [6] [2024-01-11 07:43:59.804] [lra_topqw]       $ResultString$ = "[]"   <<< result false
(5661)    [6] [2024-01-11 07:43:59.804] [lra_topqw]     Then
(5662)    [6] [2024-01-11 07:43:59.805] [lra_topqw]     EndIf
(5663)    [6] [2024-01-11 07:43:59.805] [lra_topqw]   EndIf
(5664)    [6] [2024-01-11 07:43:59.805] [lra_topqw]   If
(5665)    [6] [2024-01-11 07:43:59.807] [lra_topqw]     not(jsonIsValid($ResultString$))   <<< result false
(5666)    [6] [2024-01-11 07:43:59.807] [lra_topqw]   Then
(5667)    [6] [2024-01-11 07:43:59.807] [lra_topqw]   EndIf
(5668)    [6] [2024-01-11 07:43:59.807] [lra_topqw]   If
(5669)    [6] [2024-01-11 07:43:59.810] [lra_topqw]     not(jsonIsArray($ResultString$))   <<< result false
(5670)    [6] [2024-01-11 07:43:59.810] [lra_topqw]   Then
(5671)    [6] [2024-01-11 07:43:59.810] [lra_topqw]   EndIf
Wenn ich den aus meiner Sicht gleichen Befehl auf der Kommandozeile ausführe, kommt das richtige Ergebnis.

Code: Alles auswählen

opsi-admin -d method productProperty_getObjects [] '{"productId":"o4i_firefox-esr","propertyId":"policy_certificates"}'
[
    {
        "description": "Configure certificates\nSettings:\nImportEnterpriseRoots = read certificates from the system certificate store\nImport Certificates /var/lib/opsi/depot/o4i_firefox-esr/custom/certificates e.g. \"Custom.crt\"\nImport Certificates from UNC path e.g. \"\\\\\\\\server\\\\certificates\\\\Name.crt\"",
        "possibleValues": [
            "Custom.crt",
            "ImportEnterpriseRoots",
            "\\\\server\\certificates\\Name.crt"
        ],
        "defaultValues": [],
        "editable": true,
        "multiValue": true,
        "productId": "o4i_firefox-esr",
        "productVersion": "115.6.0",
        "packageVersion": "5",
        "propertyId": "policy_certificates",
        "type": "UnicodeProductProperty",
        "ident": "o4i_firefox-esr;115.6.0;5;policy_certificates"
    }
]
Meine Funktion ist schon ein paar Jahre alt und es gab auch nie Probleme. Evtl. ist das erst jetzt nach dem Update auf Opsi 4.3 aufgetreten und ich habe es erst gemerkt, nachdem ich die neuen Zertifikate eingetragen habe.

Viele Grüße
Benutzeravatar
n.doerrer
uib-Team
Beiträge: 267
Registriert: 23 Okt 2020, 16:11

Re: kurioses Problem mit ServiceCalls

Beitrag von n.doerrer »

Um im opsi-script.log informationen über aus anderen Dateien importierte funktionen zu bekommen, gibt es den Config "opsi-script.global.debug-lib" siehe https://docs.opsi.org/opsi-docs-de/4.3/ ... pt-configs

Wichtig ist hier der Unterschied zwischen productProperty_getObjects und productPropertyState_getObjects.
ProductProperty-Objekte sind die allgemeingültige Grundlage. ProductPropertyState-Objekte sind spezifisch für einen host (Client oder Depot).
Ich bin zuversichtlich, dass productPropertyState_getObjects per opsi-admin die gleichen Ergebnisse produziert wie per opsi-script.

In dem Log-Ausschnitt unten wird productPropertyState_getObjects scheinbar ohne eine Einschränkung auf einen spezifischen Host gerufen, weshalb die Objekte für alle Hosts zurückgegeben werden.

Ich habe eine Vermutung woran das Problem liegen könnte. Unter opsi 4.2 hat productPropertyState_getObjects gar nicht wirklich nur die productPropertyState Objekte des ausgewählten Hosts zurückgegeben, sondern falls kein entsprechendes Objekt vorhanden war, das entsprechende Objekt des zugeordneten Depots durchgereicht. Analoges Verhalten kann man unter opsi 4.3 bekommen, indem stattdessen productPropertyState_getValues genutzt wird.

Allerdings möchte ich noch ergänzen, dass es problematisch sein kann, aus einem opsi-Paket heraus, die Backend-Daten für ein anderes opsi-Paket zu verändern (schwierige Handhabe verschiedener Depots, Probleme im WAN-Modus, etc.). Solche Dinge sind sauberer auf server-Seite zu lösen (Skript/opsi-cli-Plugin/opsi-configed/opsi-webgui)
Antworten