Endlosschleife durch unvorhersebaren neutstart

Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

Hallo zusammen,

ich stehe vor folgendem Problem. Ich versuche mit Hilfe von OPSI und AutoIT eine Software zu installieren. Diese startet aber unvorhersehbar neu. Auf manchen Clients einmal auf manchen gar nicht auf anderen bis zu 3 mal.

Nun ist es so, dass OPSI durch den Neustart keine Rückmeldung bekommt, dass das Paket erfolgreich installiert wurden ist und startet die Installation beim nächsten Herunterfahren oder Booten erneut. Dies geht immer so weiter.

Der Parameter /LetThemGo hilft da leider auch nicht, da in diesem Fall beim Herunterfahren der Rechner direkt herunterfährt, bevor das Paket installiert werden kann. Je nach Client kann ich hier auch keine feste Zeit vergeben, da dies sehr stark variiert.

Rebootflags habe ich mir auch schon angeschaut. Bringt mich hier allerdings auch nicht weiter...

Jemand eine gute Idee? Bin über jede Hilfe glücklich :-)
Benutzeravatar
SisterOfMercy
Beiträge: 1556
Registriert: 22 Jun 2012, 19:18

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von SisterOfMercy »

Try to find out exactly what it is doing and then try to disable that.
For instance, maybe it is installing microsoft visual c++ runtime 2012 and restarting. If it is possible to disable a check for that visual c++ runtime then you could install the needed runtime yourself, either in the same product or as a different product. Of course you would have to set a dependency for that product.

Edit this file:
\\opsi\opsi_workbench\$ProductId$\OPSI\control
and add this:

Code: Alles auswählen

[ProductDependency]
action: setup
requiredProduct: microsoft-vc-runtime-2010
requiredStatus: installed
requirementType: before
Rebootflags can work, but you would have to have a bit more control of the product.

Code: Alles auswählen

comment "handle Rebootflag"
Set $RebootFlag$ = GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\winst] RebootFlag")
if not (($RebootFlag$ = "1") or ($RebootFlag$ = "2") or ($RebootFlag$ = "3"))
	Set $RebootFlag$ = "1"
	Registry_SaveRebootFlag /32bit
endif

if ($RebootFlag$ = "1")
	if FileExists("%ScriptPath%\delsub3264.ins")
		comment "Start uninstall sub section"
		Sub "%ScriptPath%\delsub3264.ins"
	endif
endif

if ($RebootFlag$ = "1") or ($RebootFlag$ = "2")
	comment "installing"
	if ($INST_SystemType$ = "x86 System") 
		Message "Installing " + $ProductId$ + "..."
		comment "Start setup program"
		Winbatch_install_32 /32Bit /WaitForProcessEnding "stupidprogram.exe"
		Sub_check_exitcode
		comment "Patch Registry"
		Registry_install /32Bit
		Registry_install_AllProfiles /AllNTUserDats
		comment "Create shortcuts"
		LinkFolder_install
	endif

	if ($INST_SystemType$ = "64 Bit System") 
		Message "Installing " + $ProductId$ + "..."
		comment "Start setup program"
		Winbatch_install_64 /64Bit /WaitForProcessEnding "stupidprogram.exe"
		Sub_check_exitcode
		comment "Patch Registry"
		Registry_install /32Bit
		Registry_install_AllProfiles /AllNTUserDats
		comment "Create shortcuts"
		LinkFolder_install
	endif
	
	comment "handle Rebootflag"
	Set $RebootFlag$ = "3"
	Registry_SaveRebootFlag /32bit
	ExitWindows /ImmediateReboot
endif	

if ($RebootFlag$ = "3")
	if ($INST_SystemType$ = "x86 System") 
		comment "Copy files"
		Files_install_32 /32Bit
		Files_install_AllProfiles /AllNtUserProfiles	
	endif

	if ($INST_SystemType$ = "64 Bit System") 
		comment "Copy files"
		Files_install_64 /64Bit
		Files_install_AllProfiles /AllNtUserProfiles	
	endif

	comment "handle Rebootflag"
	Set $RebootFlag$ = "0"
	Registry_SaveRebootFlag /32bit
endif

[Registry_SaveRebootFlag]
openkey [HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\winst]
set "RebootFlag" = "$RebootFlag$"
What it the program you're trying to install?
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!
Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

Okay dann komme ich dem Wunsch mal nach auf Deutsch zu antworten :-)
Naja das ist schwierig, weil ich nicht wirklich weiß was alles im Hintergrund installiert wird. Die Software ist eine Spezialsoftware.

Rebootflags machen dann ja nur Sinn, wenn ich die benötigte Software zuvor installiere oder?

Eine andere Idee wäre die Rückmeldung an OPSI zu umgehen und den Status "Installed" manuell zu senden. Ist dies möglich?

Da ich durch das AutoIT Skript sowieso keine adäquate Rückmeldung bekomme ob die Installation wirklich erfolgreich war, hätte ich keine Nachteile dadurch.

Desten Dank für die schnelle Antwort!
Benutzeravatar
SisterOfMercy
Beiträge: 1556
Registriert: 22 Jun 2012, 19:18

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von SisterOfMercy »

Cdn hat geschrieben:Okay dann komme ich dem Wunsch mal nach auf Deutsch zu antworten :-)
Naja das ist schwierig, weil ich nicht wirklich weiß was alles im Hintergrund installiert wird. Die Software ist eine Spezialsoftware.
"special"... you mean retarded? ;-)
Already tried to unpack the installation files? If you can at least find out the dependencies, maybe you can make it so all clients have to reboot the same number of times.
Cdn hat geschrieben:Eine andere Idee wäre die Rückmeldung an OPSI zu umgehen und den Status "Installed" manuell zu senden. Ist dies möglich?
Yes, that's possible. I don't know if both servicecalls are needed, but I think this worked.

Code: Alles auswählen

[actions]
	opsiServiceCall_setProductActionRequest
	opsiServiceCall_setProductInstallationStatus

[opsiServiceCall_setProductActionRequest]
 "method": "setProductActionRequest"
 "params": [
            "$ProductId$",
            "%HostID%",
            "none"
           ]

[opsiServiceCall_setProductInstallationStatus]
 "method": "setProductInstallationStatus"
 "params": [
            "$ProductId$",
            "%HostID%",
            "installed"
           ]
Cdn hat geschrieben: Da ich durch das AutoIT Skript sowieso keine adäquate Rückmeldung bekomme ob die Installation wirklich erfolgreich war, hätte ich keine Nachteile dadurch.
Oh, yeah. I keep forgetting about AutoIt, and I was thinking about AutoHotKey.
Somebody has created a bot for an idle game (clicker heroes) in AutoHotKey. This has image recognition. I haven't tried it, but maybe very nasty installs can be scripted with AutoHotKey, with that image recognition.
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!
Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

Ja veraltet nicht unbedingt, aber nicht gerade "schön" geschrieben. Aupacken bringt nicht viel, da das Ganze gar nicht gepackt ist aber aus 10.000 Einzeldateien besteht.

Na die Idee die du da in den Raum geworfen hast mit dem bot könnte ganz insteressant sein. Hast du da weitere Informationen?

Ich habe hier im Forum gerade eben folgendes gefunden:

Code: Alles auswählen

comment "Setting Office (older version) to not_installed"
   DefVar $UninstallProductId$
   DefVar $InstallationStatus$
   DefVar $ActionRequest$
   DefVar $ClientId$
   DefVar $DnsDomainName$
   DefStringList $ServiceResult$
   
   Set $InstallationStatus$ = 'installed'
   Set $ActionRequest$ = 'none'
   Set $ServiceResult$ = getReturnListFromSection('opsiServiceCall_getDomain')
   Set $DnsDomainName$ = takestring(0, $ServiceResult$)
   Set $ClientId$ = lower(EnvVar("COMPUTERNAME")) + "." + $DnsDomainName$
   
   Set $UninstallProductId$ = 'experimental'
   opsiServiceCall_setProductInstallationStatus
   opsiServiceCall_setActionRequestStatus

[opsiServiceCall_getDomain]
"method": "getDomain"
"params": [
          ]

[opsiServiceCall_setProductInstallationStatus]
"method": "setProductInstallationStatus"
"params": [
           "$UninstallProductId$",
           "$ClientId$",
           "$InstallationStatus$"
          ]

[opsiServiceCall_setActionRequestStatus]
"method": "setProductActionRequest"
"params": [
           "$UninstallProductId$",
           "$ClientId$",
           "$ActionRequest$"
          ]
erhalte hier aber eine Fehlermeldung im Skript wegen der Zeile die danach kommt:
EDIT: Funktioniert jetzt. Fehler gefunden ;-)
Section opsiServiceCall_setActionRequestStatus (Command in line 113): Files copy ":" expected
andré
Beiträge: 329
Registriert: 07 Jan 2014, 10:48

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von andré »

Was du auch machen kannst, ist einfach zu Beginn des Skriptes einen Parameter hochzuzählen und den in die Registry zu schreiben. Wenn der einen bestimmten Wert hat, brichst du ab. Zumindest kannst du damit die Bootschleife unterbrechen, evtl kannst du den Erfolg der Installation manuell prüfen, indem du checken lässt, ob alle Dateien daliegen, die daliegen sollen. Ich habe ein Paket gebaut, das Windows-Updates über das WSUS Offline-Update installiert und da es da manchmal Updates gibt, die immer wieder installiert werden, habe ich die erlaubten Neustarts auf 10 beschränkt.

Edit: Weil mir das gerade einfällt: RebootFlag kannst du u.U. zusätzlich brauchen.

Geht ungefähr so:

Code: Alles auswählen

Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")

; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
	Set $Start_Flag$ = "0"
	Registry_SaveStartFlag
	LogError "Zu viele Neustarts."
	isFatalError
endif


if not ($Start_Flag$ = "10" )
	; zähle das Start_Flag nach oben
	Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
	Registry_SaveStartFlag

else
	; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
	; als Fehlercode wird das Start_flag auf 20 gesetzt
	Set $Start_Flag$ = "20"
	Registry_SaveStartFlag
	ExitWindows /ImmediateReboot
endif

; alles gewünschte ausführen





[Registry_SaveStartFlag]
openKey [$WinstRegKey$]
set "StartFlag" = "$Start_Flag$"

Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

andré hat geschrieben:Was du auch machen kannst, ist einfach zu Beginn des Skriptes einen Parameter hochzuzählen und den in die Registry zu schreiben. Wenn der einen bestimmten Wert hat, brichst du ab. Zumindest kannst du damit die Bootschleife unterbrechen, evtl kannst du den Erfolg der Installation manuell prüfen, indem du checken lässt, ob alle Dateien daliegen, die daliegen sollen. Ich habe ein Paket gebaut, das Windows-Updates über das WSUS Offline-Update installiert und da es da manchmal Updates gibt, die immer wieder installiert werden, habe ich die erlaubten Neustarts auf 10 beschränkt.

Edit: Weil mir das gerade einfällt: RebootFlag kannst du u.U. zusätzlich brauchen.

Geht ungefähr so:

Code: Alles auswählen

Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")

; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
	Set $Start_Flag$ = "0"
	Registry_SaveStartFlag
	LogError "Zu viele Neustarts."
	isFatalError
endif


if not ($Start_Flag$ = "10" )
	; zähle das Start_Flag nach oben
	Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
	Registry_SaveStartFlag

else
	; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
	; als Fehlercode wird das Start_flag auf 20 gesetzt
	Set $Start_Flag$ = "20"
	Registry_SaveStartFlag
	ExitWindows /ImmediateReboot
endif

; alles gewünschte ausführen





[Registry_SaveStartFlag]
openKey [$WinstRegKey$]
set "StartFlag" = "$Start_Flag$"

Danke für die Anregung. Da ist mir noch was anderes eingefallen: Könnte ich nicht einfach nachschauen ob eine exe Datei in einer bestimmten Version vorliegt und die Installation dann erfolgreich abgeschlossen ist? Das würde doch Sinn machen :-)

Man kann wohl mit getFileInfoMap die Dateiversion auslesen, wie dies genau funktioniert habe ich allerdings noch nicht verstanden. Ich müsste dann ja das Pendant zu isFatalError haben um falls die Dateiversion vorhanden ist den Setup abzubrechen und ein Installed success zu erreichen.
andré
Beiträge: 329
Registriert: 07 Jan 2014, 10:48

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von andré »

Das Gegenteil von isFatalError ist standardmäßig gegeben.

Du kannst unter

Code: Alles auswählen

;alles gewünschte ausführen
so vorgehen, dass du die Datei prüfst (müsstest du mal im Handbuch schauen, das kenne ich jetzt auch nicht aus dem Kopf), dann entscheidest du, dass alles gut ging, oder eben nicht. Wenn es gut ging, wird das StartFlag zurück auf 0 gesetzt, da ja die Installation vorbei ist. Am besten ist wohl, wenn du mehrere Dateien prüfst, und/oder die Dateien, die als letztes kopiert werden, weil dann die wahrscheinlichkeit höher ist, dass der Rest auch kopiert wurde.

Könnte dann so aussehen:

Code: Alles auswählen

Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")

; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
   Set $Start_Flag$ = "0"
   Registry_SaveStartFlag
   LogError "Zu viele Neustarts."
   isFatalError
endif


if not ($Start_Flag$ = "10" )
   ; zähle das Start_Flag nach oben
   Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
   Registry_SaveStartFlag
else
   ; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
   ; als Fehlercode wird das Start_flag auf 20 gesetzt
   Set $Start_Flag$ = "20"
   Registry_SaveStartFlag
   ExitWindows /ImmediateReboot
endif

;alles gewünschte ausführen
Files_alle_Dateien_kopieren

; Wenn die gewünschte Datei vorhanden ist
; alternativ kann nach dem Kopiervorgang eine Aktion durchgeführt werden, die die Versionsnummer prüft. 
; Dann wird bspw ein if ($Version$ = "gewünschte Versionsnummer") abgefragt, statt die Existenz eines Files.
if (FileExists($die_letzte_kopierte_datei))
	Set $Start_Flag$ = "0"
   Registry_SaveStartFlag
   Comment "Installation erfolgreich"
; wenn die gewünschte Datei nicht vorhanden ist
else 
    logError "Die gewünschte Datei war noch nicht dabei. Reboot und dann Neubeginn des Skripts"
    ExitWindows /ImmediateReboot
endif
Wenn das Skript standardmäßig einen Reboot benötigt, würde ich noch einen if-Block um das bisherige Skript drumherum machen.
Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

andré hat geschrieben:Das Gegenteil von isFatalError ist standardmäßig gegeben.

Du kannst unter

Code: Alles auswählen

;alles gewünschte ausführen
so vorgehen, dass du die Datei prüfst (müsstest du mal im Handbuch schauen, das kenne ich jetzt auch nicht aus dem Kopf), dann entscheidest du, dass alles gut ging, oder eben nicht. Wenn es gut ging, wird das StartFlag zurück auf 0 gesetzt, da ja die Installation vorbei ist. Am besten ist wohl, wenn du mehrere Dateien prüfst, und/oder die Dateien, die als letztes kopiert werden, weil dann die wahrscheinlichkeit höher ist, dass der Rest auch kopiert wurde.

Könnte dann so aussehen:

Code: Alles auswählen

Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")

; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
   Set $Start_Flag$ = "0"
   Registry_SaveStartFlag
   LogError "Zu viele Neustarts."
   isFatalError
endif


if not ($Start_Flag$ = "10" )
   ; zähle das Start_Flag nach oben
   Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
   Registry_SaveStartFlag
else
   ; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
   ; als Fehlercode wird das Start_flag auf 20 gesetzt
   Set $Start_Flag$ = "20"
   Registry_SaveStartFlag
   ExitWindows /ImmediateReboot
endif

;alles gewünschte ausführen
Files_alle_Dateien_kopieren

; Wenn die gewünschte Datei vorhanden ist
; alternativ kann nach dem Kopiervorgang eine Aktion durchgeführt werden, die die Versionsnummer prüft. 
; Dann wird bspw ein if ($Version$ = "gewünschte Versionsnummer") abgefragt, statt die Existenz eines Files.
if (FileExists($die_letzte_kopierte_datei))
	Set $Start_Flag$ = "0"
   Registry_SaveStartFlag
   Comment "Installation erfolgreich"
; wenn die gewünschte Datei nicht vorhanden ist
else 
    logError "Die gewünschte Datei war noch nicht dabei. Reboot und dann Neubeginn des Skripts"
    ExitWindows /ImmediateReboot
endif
Wenn das Skript standardmäßig einen Reboot benötigt, würde ich noch einen if-Block um das bisherige Skript drumherum machen.
Ach Perfekt André besten Dank dafür. Habe nur noch ein Problem:
Ich bräuchte wie du schon gesagt hast einen Block für den ersten Neustart.

Code: Alles auswählen

if ($Flag$ = "0")
klappt leider nicht, da hierfür der Wert ja erst einmal auf 0 gesetzt werden muss. ..opsi.org/winst gibt es aber noch gar nicht... Und RebootFlag entsprechend auch nicht..
Sonst sollte es laufen denke ich ;-)
Cdn
Beiträge: 178
Registriert: 27 Okt 2013, 19:44

Re: Endlosschleife durch unvorhersebaren neutstart

Beitrag von Cdn »

Jemand eine Idee dazu? Denke hier muss auch noch eine Fallunterscheidung eingebaut werden für den Registrystring, falls es ein 64 Bit System ist, sollte es ja GetRegistryStringValue64 heißen richtig?
Antworten