sabato 12 luglio 2008

Start/Shutdown SAP

Da qualche mese in azienda siamo alle prese con SAP, l'ERP dell'omonima casa tedesca SAP AG. Mondo nuovo per noi abituati a lavorare in ambito Microsoft che ha richiesto non poco tempo dedicato allo studio da parte del team impegnatp nello sviluppo e nella personalizzazione della soluzione che gravita attorno la tecnologia SAP.
In modo particolare per il sottoscritto (Developer prestato al ramo sistemistico ed infrastrutturale) e' stata una sfida riuscire ad automatizzare l'avvio e l'accensione dei servizi altrimenti avviabili attarverso la mmc di amministrazione del prodotto (quindi manualmente, e di conseguenza non molto comodo). Come ben sapranno tutti coloro che, per un motivo o per un'altro, devono spegnere SAP (perche' magari devono effettuare un backup della macchina virtuale su cui e' installato, o perche' devono effettuare un banalissimo aggiornamento di Microsoft Windows) possono capire la necessita' di un sistema che permetta di automatizzare i processi di accensione/spegnimento delle varie istanze del prodotto, poiche' il Database di SAP pare essere molto delicato (stando a quanto detto dal tecnico che che ha installato il prodotto presso la nostra azienda) e, come dire... suscettibile ad un arresto o riavvio di Windows senza aver preso le necessarie precauzioni (shutdown delle istanze, per l'appunto).

Ebbene studiando un po' la documentazione SAP (molto scarsa dal punto di vista dei comandi disponibili per la shell), sono riuscito a trovare un comando che, lanciato da command shell, permette spegnimento ed accensione dell'istanza di SAP desiderata: sapcontrol.exe.

Di seguito il comando da utilizzare per lo spegnimento di un'istanza

D:\usr\sap\DEV\DVEBMGS02\exe\sapcontrol.exe -user -function Shutdown -format script -nr

ed il comando per l'accensione

D:\usr\sap\DEV\DVEBMGS02\exe\sapcontrol.exe -user -function Start -format script -nr

per completare l'automatismo occorre solo verificare che l'istanza si sia arrestata per poi spegnere la macchina. A questo scopo ho scritto uno script, in vbscript che attende lo spegnimento dell'istanza selezionata prima di terminare la sua esecuzione:


Option Explicit
Dim wso

set wso = CreateObject( "WSCript.Shell")

Dim InstanceNumber
InstanceNumber = WScript.Arguments(0)

Dim ServiceAccount
ServiceAccount = WScript.Arguments(1)

Dim Password
Password = WScript.Arguments(2)

Dim Status, ExitCode

ExitCode = Shutdown(InstanceNumber, ServiceAccount, Password)

if ExitCode = 0 Then
Dim Stopped
Stopped = false

do while Not Stopped
Status = GetStatus( InstanceNumber, ServiceAccount, Password)

if Status = "Stopped" Then
Stopped = true
elseif Status = "NotFound" then
exit Do
else
WScript.Sleep 5000
end if

Loop

WScript.StdOut.WriteLine Status

else

WScript.StdOut.WriteLine "Error Shutting down " & InstanceNumber

end if

set wso = nothing


function Shutdown( instanceNumber, serviceAccount, password)
Dim oExec

set oExec = wso.Exec( "D:\usr\sap\DEV\DVEBMGS02\exe\sapcontrol.exe -user " & service Account & " " & password & " -function GetProcessList -format script -nr " & instanceNumber)

do while oEXec.Status = 0
WScript.Sleep 100
Loop

Shutdown = oExec.ExitCode
set oExec = nothing
end function

function GetStatus( instanceNumber, serviceAccount, password)
Dim Line, Result
Dim oExec

Result = "NotFound"

set oExec = wso.Exec( "D:\usr\sap\DEV\DVEBMGS02\exe\sapcontrol.exe -user " & service Account & " " & password & " -function GetProcessList -format script -nr " & instanceNumber)

do while oEXec.Status = 0
WScript.Sleep 100
Loop

do while not oExec.StdOut.AtEndOfStream
Line = oExec.StdOut.ReadLine

if InStr( Line, "0 textstatus:") then
Result = Right( Line, len(Line) - 14)
Exit do
end if

Loop

GetStatus = Result

set oExec = nothing

end function


Questo e' tutto, spero lo script vi sia utile cosi' come lo e' per il sottoscritto. Alla prossima. :)