<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small">All, I've started using the servicecheck function to restart services more extensively lately. However, I encountered a department which needs to shut down a monitored service during a maintenance window, and the servicecheck would restart it. Thus, I created a 'noservicecheck' item in the client-local.cfg process. Hope you find it useful enough to add to next PS version.</span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small"><br></span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small">Tim Williams</span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small">Virginia Commonwealth University Computing Center</span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small"><br></span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif;font-size:small">Here is a section to add to the XymonPSClient.doc help file:</span></div><div class="gmail_default"><h2 style="margin:2pt 0in 0.0001pt;line-height:107%;break-after:avoid;font-size:13pt;font-family:"Calibri Light",sans-serif;color:rgb(46,116,181);font-weight:normal"><span lang="EN-GB">noservicecheck</span></h2>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">noservicecheck:SERVICENAME:DAYOFWEEK:STARTHOUR:DURATION</span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">Checks if a specified Windows Service
servicecheck exists and suppresses it during the specified Maintenance Window.
Window can span multiple days, as specified by Duration, but would terminate if
script is restarted after initiation day/hour.</span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">SERVICENAME – name of the service to check
for a ‘servicecheck’ statement. </span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">DAYOFWEEK – numeric day of the week, where
Sunday = 0, Monday = 1, etc.</span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">STARTHOUR – military hour to start the
Maintenance Window, 0 for midnight up to 23</span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">DURATION – how long in hours a servicecheck
should not institute a restart</span></p><p class="MsoNormal" style="margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">Examples:</span></p>

<p class="MsoNormal" style="text-indent:0.5in;margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">servicecheck:Sophos
Message Router:10</span></p>

<p class="MsoNormal" style="text-indent:0.5in;margin:0in 0in 8pt;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">noservicecheck:Sophos
Message Router:0:5:1 </span></p>

<p class="MsoNormal" style="margin:0in 0in 8pt 0.5in;text-indent:0.5in;line-height:107%;font-size:11pt;font-family:Calibri,sans-serif"><span lang="EN-GB">(no
restart starting first scan after Sunday 5AM to first scan after 6AM)</span></p></div><div class="gmail_default"><font face="verdana, sans-serif"><b>Here are the revisions in XymonClient.PS1:</b></font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><b>Add</b> following to declared variables about line 48:  </font></div><div class="gmail_default"><font face="verdana, sans-serif">     $MaintChecks = @{}</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><b>Add</b> line to function XymonClientConfig($cfglines) for new item to be recognized:</font></div><div class="gmail_default"><font face="verdana, sans-serif">    -or $l -match '^noservicecheck:' `</font></div><div class="gmail_default"><span style="font-family:verdana,sans-serif"><br></span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif"><b>Replace</b> 'servicecheck' function:</span>  <font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><br></div><div class="gmail_default"><div class="gmail_default">function XymonServiceCheck</div><div class="gmail_default">{</div><div class="gmail_default">    WriteLog "Executing XymonServiceCheck"</div><div class="gmail_default">    if ($script:clientlocalcfg_entries -ne $null)</div><div class="gmail_default">    {</div><div class="gmail_default">       $servicecfgs = @($script:clientlocalcfg_entries.keys | where { $_ -match '^servicecheck' })</div><div class="gmail_default">            foreach ($service in $servicecfgs)</div><div class="gmail_default">            {</div><div class="gmail_default">                # parameter should be 'servicecheck:<servicename>:<duration>'</div><div class="gmail_default">                $checkparams = $service -split ':'</div><div class="gmail_default">                # validation</div><div class="gmail_default">                if ($checkparams.length -ne 3)</div><div class="gmail_default">                {</div><div class="gmail_default">                    WriteLog "ERROR: not enough parameters (should be servicecheck:<servicename>:<duration>) - $checkparams[1]"</div><div class="gmail_default">                    continue</div><div class="gmail_default">                }</div><div class="gmail_default">                else</div><div class="gmail_default">                {</div><div class="gmail_default">                    $duration = $checkparams[2] -as [int]</div><div class="gmail_default">                    if ($checkparams[1] -eq '' -or $duration -eq $null)</div><div class="gmail_default">                    {</div><div class="gmail_default">                        WriteLog "ERROR: config error (should be servicecheck:<servicename>:<duration>) - $checkparams[1]"</div><div class="gmail_default">                        continue</div><div class="gmail_default">                    }</div><div class="gmail_default">                }</div><div class="gmail_default">                # check for maintenance window</div><div class="gmail_default">                  $serviceexclds = @($script:clientlocalcfg_entries.keys | where { $_ -match '^noservicecheck' })</div><div class="gmail_default">                    foreach ($maintservice in $serviceexclds)</div><div class="gmail_default">                    {</div><div class="gmail_default">                    # parameter should be 'noservicecheck:<servicename>:<numeric day of week Sun=0>:<military start hour>:<duration in Hours>'</div><div class="gmail_default">                  $checkMparams = $maintservice -split ':'</div><div class="gmail_default">                  if ($checkparams[1] -eq $checkMparams[1]){</div><div class="gmail_default">                     # validation of number of parameters</div><div class="gmail_default">                    if ($checkMparams.length -ne 5)</div><div class="gmail_default">                    {</div><div class="gmail_default">                        WriteLog ("ERROR: not enough parameters (noservicecheck:<servicename>:<numeric day of week Sun=0>:<military start hour>:<duration Hrs> {0}" -f $checkMparams[1])</div><div class="gmail_default">                        continue</div><div class="gmail_default">                    }</div><div class="gmail_default">                    else</div><div class="gmail_default">                    {</div><div class="gmail_default">                    # get values</div><div class="gmail_default">                        $MaintDay = $checkMparams[2] -as [int]</div><div class="gmail_default">                            if($MaintDay -eq 0){$MaintWeekDay = "Sunday"}</div><div class="gmail_default">                            if($MaintDay -eq 1){$MaintWeekDay = "Monday"}</div><div class="gmail_default">                            if($MaintDay -eq 2){$MaintWeekDay = "Tuesday"}</div><div class="gmail_default">                            if($MaintDay -eq 3){$MaintWeekDay = "Wednesday"}</div><div class="gmail_default">                            if($MaintDay -eq 4){$MaintWeekDay = "Thursday"}</div><div class="gmail_default">                            if($MaintDay -eq 5){$MaintWeekDay = "Friday"}</div><div class="gmail_default">                            if($MaintDay -eq 6){$MaintWeekDay = "Saturday"}</div><div class="gmail_default">                        $MaintStartHour = $checkMparams[3] -as [int]</div><div class="gmail_default">                        $MaintDuration = $checkMparams[4] -as [int]</div><div class="gmail_default">                    # validation of basic values</div><div class="gmail_default">                        if ($checkMparams[1] -eq '' -or $MaintDuration -eq $null -or ($MaintDay -inotin 0..6) -or ($MaintStartHour -inotin 0..23))</div><div class="gmail_default">                        {</div><div class="gmail_default">                            WriteLog ("ERROR: config error (noservicecheck:<servicename>:<numeric day of week Sun=0>:<military start hour>:<duration Hrs>) {0}" -f $checkMparams[1])</div><div class="gmail_default">                            continue</div><div class="gmail_default">                        }</div><div class="gmail_default">                    }</div><div class="gmail_default">                    </div><div class="gmail_default">                        if (((get-date).DayofWeek -eq $MaintWeekDay) -and ((get-date).Hour -eq $MaintStartHour) ) { </div><div class="gmail_default">                            if ($script:MaintChecks.ContainsKey($checkMparams[1])) {</div><div class="gmail_default">                                $MaintWindowEnd = $script:MaintChecks[$checkMparams[1]].AddHours($MaintDuration)</div><div class="gmail_default">                                if ((get-date) -lt $MaintWindowEnd){</div><div class="gmail_default">                                    WriteLog (" Maintenance: Skipping Service Check until after $($MaintWindowEnd) for {0}" -f $checkMparams[1])</div><div class="gmail_default">                                    continue</div><div class="gmail_default">                                }Else{</div><div class="gmail_default">                                clear.variable $script:MaintChecks</div><div class="gmail_default">                                }</div><div class="gmail_default">                            }</div><div class="gmail_default">                            else{</div><div class="gmail_default">                             WriteLog ("Not seen this NoServiceCheck before, starting Maintenance Window now for {0}" -f $checkMparams[1])</div><div class="gmail_default">                             $hourTop = (get-date).Minute</div><div class="gmail_default">                             $script:MaintChecks[$checkMparams[1]] = (get-date).AddMinutes(-($hourTop))</div><div class="gmail_default">                             continue</div><div class="gmail_default">                            }</div><div class="gmail_default">                         }</div><div class="gmail_default">                    # end of maintenance hold   </div><div class="gmail_default">                }</div><div class="gmail_default">                WriteLog ("Checking service {0}" -f $checkparams[1])</div><div class="gmail_default"><br></div><div class="gmail_default">                $winsrv = Get-Service -Name $checkparams[1]</div><div class="gmail_default">                if ($winsrv.Status -eq 'Stopped')</div><div class="gmail_default">                {</div><div class="gmail_default">                    writeLog ("!! Service {0} is stopped" -f $checkparams[1])</div><div class="gmail_default">                    if ($script:ServiceChecks.ContainsKey($checkparams[1]))</div><div class="gmail_default">                    {</div><div class="gmail_default">                        $restarttime = $script:ServiceChecks[$checkparams[1]].AddSeconds($duration)</div><div class="gmail_default">                        writeLog "Seen this service before; restart time is $restarttime"</div><div class="gmail_default">                        if ($restarttime -lt (get-date))</div><div class="gmail_default">                        {</div><div class="gmail_default">                            writeLog (" -> Starting service {0}" -f $checkparams[1])</div><div class="gmail_default">                            $winsrv.Start()</div><div class="gmail_default">                        }</div><div class="gmail_default">                    }</div><div class="gmail_default">                    else</div><div class="gmail_default">                    {</div><div class="gmail_default">                        writeLog "Not seen this service before, setting restart time -1 hour"</div><div class="gmail_default">                        $script:ServiceChecks[$checkparams[1]] = (get-date).AddHours(-1)</div><div class="gmail_default">                    }</div><div class="gmail_default">                }</div><div class="gmail_default">                elseif ('StartPending', 'Running' -contains $winsrv.Status)</div><div class="gmail_default">                {</div><div class="gmail_default">                    writeLog "  -Service is running, updating last seen time"</div><div class="gmail_default">                    $script:ServiceChecks[$checkparams[1]] = get-date</div><div class="gmail_default">                }</div><div class="gmail_default">            }</div><div class="gmail_default">        }</div><div class="gmail_default">    }</div><div class="gmail_default">}</div><div><br></div></div><div class="gmail_default"><br></div><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"></div></div></div></div></div></div></div></div></div></div></div></div></div>