'******************************************************************************* ' Script de redemarrage d un service Windows via NRPE + Fichier Log ' Projet de supervision : NAGIOS / CENTREON ' ' Romain Pichard - 19/12/2007 ' ' Commande a ajouter dans nrpe.cfg : ' command[eventhandler_restart_winservice]=cscript //nologo "C:\Program Files\Nagios NRPE Agent\bin\eventhandler_restart_winservice.vbs" $ARG1$ $ARG2$ $ARG3$ $ARG4$ ' ' Pour lancer cette commande en auto, créer une commande "Event Handler" sous Nagios. '******************************************************************************* Option Explicit '############################################################################### '# Constantes '############################################################################### 'Pour la creation du fichier (premier enregistrement) Const ForWriting = 2 'Pour la reecriture dans le fichier préalablement cree Const ForAppending = 8 'Temps d attente entre le StopService et le StartService Const intSleep = 2000 '############################################################################### '# Variables globales '############################################################################### 'Declaration du chemin pour le fichier log Dim PathLogFile PathLogFile = "C:\Program Files\Nagios NRPE Agent\bin\restart_winservice.log" '############################################################################### '# Procedure de definition des arguments NRPE '############################################################################### Sub DeclareArgNrpe(ByRef ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp) 'On definit chacun des 4 arguments transmis par NRPE ArgServiceName = Wscript.Arguments(0) ArgServiceState = Wscript.Arguments(1) ArgServiceStateType = Wscript.Arguments(2) ArgServiceAttemp = Wscript.Arguments(3) 'WScript.Echo "Arguments NRPE : " & ArgServiceName & " - " & ArgServiceState & " - " & ArgServiceStateType & " - " & ArgServiceAttemp End Sub '############################################################################### '# Procedure de controle du service Windows '############################################################################### Sub CheckService (ByRef ArgServiceName, ArgServiceState, boolStartService, boolRestartService, errReturn, objService, WinServiceState) Dim CheckCaseService Dim strComputer Dim objWMIService Dim colService 'WScript.Echo ArgServiceName 'WScript.Echo ArgServiceState strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colService = objWMIService.ExecQuery("Select * from Win32_Service where Name='" & ArgServiceName & "' ") 'Boucle de test For Each objService in colService 'Test de coherence entre ArgServiceName et objService.Name pour optimisation. Si <> alors on sort de la procedure. If ArgServiceName <> objService.Name Then Exit Sub Else 'On definit l etat du service Windows (ici, il s agit de l etat donne par Windows et non Centreon) WinServiceState = objService.State 'WScript.Echo WinServiceState CheckCaseService = True Select Case CheckCaseService 'Si ArgServiceState = "CRITICAL" AND objService.State = "Stopped" alors le service doit etre demarre Case ArgServiceState = "CRITICAL" AND WinServiceState = "Stopped" WScript.Echo "Case OK" Call StartService(boolStartService, errReturn, objService) Exit Sub 'Si le couple Nagios / Centreon remonte l'information suivante : ArgServiceState = "CRITICAL" alors que objService.State = "Running", le service doit tout de meme etre redemarre Case ArgServiceState = "CRITICAL" AND WinServiceState = "Running" WScript.Echo "Case 2 OK" Call RestartService(boolRestartService, errReturn, objService) Exit Sub Case ArgServiceState = "UNKNOWN" AND WinServiceState = "Stopped" WScript.Echo "Case 3 OK" Call StartService(boolStartService, errReturn, objService) Exit Sub Case ArgServiceState = "UNKNOWN" AND WinServiceState = "Running" WScript.Echo "Case 4 OK" Call RestartService(boolRestartService, errReturn, objService) Exit Sub 'On verifie que le couple Nagios / Centreon remonte les bonnes informations et si ce n est pas le cas on demarre le service // PEUT ETRE SUPPRIME Case ArgServiceState = "OK" AND WinServiceState = "Stopped" WScript.Echo "Case 5 OK" Call StartService(boolStartService, errReturn, objService) Exit Sub 'Dans notre cas, on exclu toute action si ArgServiceState = "OK" AND objService.State = "Running" car il s agit de l objectif a atteindre End Select End If Next End Sub '############################################################################### '# Procedure de demarrage du service '############################################################################### Sub StartService(ByRef boolStartService, errReturn, objService) boolStartService = 1 'On demarre le service et si erreur alors errReturn = 1 sinon errReturn = 0 errReturn = objService.StartService() End Sub '############################################################################### '# Procedure de redemarrage du service // STOP Arret du service ? '############################################################################### Sub RestartService(ByRef boolRestartService, errReturn, objService) boolRestartService = 1 'Pour redemarrer un service Windows on doit tout d abord l arreter puis le demarrer, l action restart n existe pas errReturn = objService.StopService() 'Temps de pause avant de demarrer le service WSCript.Sleep intSleep errReturn = objService.StartService() End Sub '############################################################################### '# Procedure d enregistrement dans le fichier log '############################################################################### Sub RecordLogFile(ByRef ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, objService) 'Creation de l'objet FSO Set objFSO = CreateObject("Scripting.FileSystemObject") 'Verification de la presence du fichier log If objFSO.FileExists(PathLogFile) Then 'Si le fichier existe on appelle la procedure ReWriteLogFile 'WScript.Echo "Le fichier existe : " & PathLogFile Call ReWriteLogFile(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, objService) Else 'Si le fichier n existe pas on appelle la procedure WriteLogFile 'WScript.Echo "Le fichier n'exite pas encore" Call WriteLogFile(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, objService) End If End Sub '############################################################################### '# Procedure d ecriture dans le fichier log (premier enregistrement) '############################################################################### Sub WriteLogFile(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, WinServiceState) 'Creation du fichier de type fichier texte au chemin definit par PathLogFile (variable globale) Set objLogFile = objFSO.CreateTextFile(PathLogFile) 'Fermeture du fichier log precedemment cree objLogFile.Close 'Ouverture du fichier log puis enregistrement de l'entete Set objLogFile = objFSO.OpenTextFile(PathLogFile, ForWriting) With objLogFile .writeLine "Date&Heure;NomService;WinServiceState;Action.errReturn;ServiceState;ServiceStateType;ServiceAttemp" .writeLine End With 'Fermeture du fichier log objLogFile.Close 'Appel de la procedure ReWriteLogFile pour enregistrer les arguments NRPE + Details de l action effectuee Call ReWriteLogFile(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, WinServiceState) End Sub '############################################################################### '# Procedure de reecriture dans le fichier log '############################################################################### Sub ReWriteLogFile(ByRef ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, WinServiceState) Dim Action 'Test du booleen 'Si le booleen boolStartService = 1 alors on inscrit Start dans le fichier de log (action = demarrage du service) If boolStartService = 1 Then Action = "Start" 'Si le booleen boolreStartService = 1 alors on inscrit Restart dans le fichier de log (action = redemarrage du service) ElseIf boolRestartService = 1 Then Action = "Restart" Else Action = "NoAction" errReturn = 0 End If 'Ouverture du fichier log puis enregistrement des arguments NRPE + Details de l action effectuee Set objLogFile = objFSO.OpenTextFile(PathLogFile, ForAppending) With objLogFile .writeLine Now & ";" & ArgServiceName & ";" & WinServiceState & ";" & Action & ";" & errReturn & ";" & ArgServiceState & ";" & ArgServiceStateType & ";" & ArgServiceAttemp End With 'Fermeture du fichier log objLogFile.Close End Sub '############################################################################### '# Procedure principale '############################################################################### Sub Main() 'Declaration des arguments NRPE Dim ArgServiceName Dim ArgServiceState Dim ArgServiceStateType Dim ArgServiceAttemp 'Declaration des variables : controle de l etat du service Windows et de ou des actions menees Dim WinServiceState 'Declaration des objets Dim objService Dim objFSO Dim objLogFile 'Declaration des booleen Dim boolStartService Dim boolRestartService 'Declaration de la variable de gestion d erreurs, (Exemples : 0 = NoPB; <> 0 = PB) Dim errReturn 'Appels des procedures Call DeclareArgNrpe(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp) Call CheckService(ArgServiceName, ArgServiceState, boolStartService, boolRestartService, errReturn, objService, WinServiceState) Call RecordLogFile(ArgServiceName, ArgServiceState, ArgServiceStateType, ArgServiceAttemp, boolStartService, boolRestartService, errReturn, objFSO, objLogFile, WinServiceState) End Sub '############################################################################### '# Debut du programme '############################################################################### Call Main 'WScript.Sleep 10000 'Wscript.Quit 0