Thursday, April 17, 2014

script to kill a processes after 12 hours of run and send an e-mail with the resultant process List

'program to kill the process after 12 hours and send an e-mail with the process list other than the killed processes

'Below variable holds the process name as you see in the task manager
processName = "iexplore.exe"
'Below varaible holds the time range which can hold the values such as "h" for hours, "n" for minutes
timerange = "h"
'Below varaible kills the process with the time bound in relation with the timerange i.e., hours or minutes
killtime = 12
'From address, make sure the from address has rights to send an e-mail.
emailFrom = "xyz@abc.com"
'send an e-mail to primary recipent
emailTo = "asdf@abc.com"
'send an e-mail to secondary recipent
emailCC = "ghjkl@abc.com"
strComputer = "."
flag = 0
Set wshNetwork = WScript.CreateObject( "WScript.Network" )
strComputerName = wshNetwork.ComputerName

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '" &processName& "'")

For Each objProcess in colProcessList
          dtmProcessCreationDate = objProcess.CreationDate
          WMIDateStringToDate = CDate(Mid(dtmProcessCreationDate, 5, 2) & "/" & _
     Mid(dtmProcessCreationDate, 7, 2) & "/" & Left(dtmProcessCreationDate, 4) _
         & " " & Mid (dtmProcessCreationDate, 9, 2) & ":" & _
             Mid(dtmProcessCreationDate, 11, 2) & ":" & Mid(dtmProcessCreationDate, _
                 13, 2))
          timeElapsed = DateDiff(timerange,WMIDateStringToDate,now)
          'WScript.Echo objProcess.Caption
          'WScript.Echo WMIDateStringToDate
          'WScript.Echo Now
          'WScript.Echo "Time Elapsed:" & timeElapsed
         
          If timeElapsed > killtime Then
    preturn = objProcess.Terminate()
          If preturn = 0 Then
          pstatus = "Successful kill of the process:"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If
          If preturn = 2 Then
          pstatus = "Access Denied"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If
          If preturn = 3 Then
          pstatus = "Insufficient Privilege"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If
          If preturn = 8 Then
          pstatus = "Unknown Failure"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If
          If preturn = 9 Then
          pstatus = "Path Not Found"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If
          If preturn = 21 Then
          pstatus = "Invalid Parameter"
                   pid = objProcess.ProcessId
                   filepath = writeprocess()
          Call sendmail(pstatus,pid,filepath)
          End If          
    End If
    
Next

Function writeprocess()
                   strProcessList = "" 

                   strProcessList = "<HTML>" &vbNewLine & "<BODY>" & "<TABLE border=" & "1" & " style="& "width:400px & " & ">" & "<TH>" & "ProcessName" & "</TH>" & "<TH>" & "ProcessOwner" & "</TH>" & "<TH>" & "ProcessID" & "</TH>" & vbNewLine

                   Set colProcessList = objWMIService.ExecQuery _
          ("Select * from Win32_Process Where Name <> '" & processName & "'")
   
                   For Each objProcess in colProcessList

                   Return = objProcess.GetOwner(strNameOfUser)
          If Return <> 0 Then
          strNameOfUser = "Unable to Fetch Owner info:" & Return
           'WScript.Echo "Could not get owner info for process " & objProcess.Name & VBNewLine & "Error = " & Return
          Else 
          'Wscript.Echo "Process " & objProcess.Name & " is owned by " & "\" & strNameOfUser & "."
          End If
          strProcessList = strProcessList & "<TR>" & vbNewLine
          strProcessList = strProcessList & "<TD>" & objProcess.Caption & "</TD>"
          strProcessList = strProcessList & "<TD>" & strNameOfUser & "</TD>"
          strProcessList = strProcessList & "<TD>" & objProcess.ProcessId & "</TD>"
          'strProcessList = strProcessList & objProcess.Caption & vbTab & strNameOfUser & vbTab & objProcess.PageFileUsage & vbNewLine
          strProcessList = strProcessList & "</TR>" & vbNewLine 
                   Next

                   strProcessList = strProcessList & "</TABLE></BODY>" &vbNewLine & "</HTML>" &vbNewLine
                   Dim objFSO 'As FileSystemObject
                   Dim objTextFile 'As Object
    
                    Const ForReading = 1
           Const ForWriting = 2
                    Const ForAppending = 8
    
                     Set objFSO = CreateObject("Scripting.FileSystemObject")
                     currentDirectory = objFSO.GetAbsolutePathName(".")
                     filePath = currentDirectory & "\processlist.html"
                     Set objTextFile = objFSO.CreateTextFile(filePath,2,True)
                     ' Write a line.
                     objTextFile.Write (strProcessList)
                     objTextFile.Close

                     'WScript.Echo strProcessList
                   writeprocess = filePath

End Function

Function sendmail(processStatus,ProcessId,filePath)

   Set objMessage = CreateObject("CDO.Message")
                             objMessage.From = emailFrom
                             objMessage.To = emailTo
                             objMessage.Cc = emailCC
                             objMessage.Configuration.Fields.Item _
                             ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
                             objMessage.Configuration.Fields.Item _
                             ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.abc.com"
                             objMessage.Configuration.Fields.Item _
                             ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 8181
                             objMessage.Configuration.Fields.Update

                             objMessage.Subject = processStatus & " for the process " & processName & " with Process ID " & ProcessId
                             mailbody = "Process List other than IE from ProcessPool is enclosed" & vbNewLine
                             objMessage.AddAttachment filePath
                             objMessage.TextBody = mailbody
                             objMessage.Send
End Function

Wednesday, April 16, 2014

Nagios : Add services into service group : Shell script

#!/bin/bash
#Author : Ranjith Kumar R
#Date    : 16th April 2014
#Purpose : Add services into the nagios service group.

echo "Please enter service group name"

read svcgroup

while read server


do

servername=`echo $server | cut -d';' -f1`

OUTPUT=`find /usr/local/nagios -name "$servername"_DB.cfg | grep -i $servername`
RESULT=`echo $?`

if [ "$RESULT" -eq "0" ]; then

OUTPUT1=`cat $OUTPUT | grep -i "$svcgroup" | grep "service_description" | awk '{print $2}' > /tmp/svcgroup.txt`

RESULT1=`echo $?`

if [ "$RESULT1" -eq "0" ]; then

echo "success" > /dev/null

fi
fi

while read service

do

startlinenum=`grep -nr -A 2 -B 14 """$service""" "$OUTPUT" | grep "servicegroups" | cut -d'-' -f1 | head -1`

if [ "$startlinenum" == "" ]; then

continue

fi

format=`echo "$startlinenum"s/DBservices/DBservices,$svcgroup/`

sed "$format" $OUTPUT > "$OUTPUT".temp

mv  "$OUTPUT".temp "$OUTPUT"


done < /tmp/svcgroup.txt
done < /usr/local/nagios/libexec/tools/devicelist

rm -rf /tmp/svcgroup.txt

Tuesday, April 15, 2014

To Send an e-mail for the active account in AD users to reset there Password every 14th, 7th and 1st day of password expiry or password age.

'Account used to run script needs read access to Domain.
'Any standard Domain User account should work.

'Set the following variables
MyDomain = "domain.com"
'MyDN = "OU=xyz Users,DC=domain,DC=com"
OutputFile = "C:\Passwordnotify\passAge.csv"

Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
MyDN = strDNSDomain
'Wscript.Echo MyDN
'Do not modify below this line
Const SEC_IN_DAY = 86400
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
Const ADS_SCOPE_SUBTREE = 2

Set objDomainNT = GetObject("WinNT://" & MyDomain)
intMaxPwdAge = objDomainNT.Get("MaxPasswordAge") / SEC_IN_DAY
'Wscript.Echo "Max password age:" & intMaxPwdAge
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = _
    "Select Name, distinguishedName from 'LDAP://" & MyDN & _
    "' Where objectClass='user' AND objectClass <> 'computer'"  
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

OnErrorResumeNext

Set FSO = CreateObject("Scripting.FileSystemObject")
'Set oFile=fso.GetFile(OutputFile)
'If Err.Number = 0 Then
'   Set AFileStream = FSO.OpenTextFile(OutputFile,2)    
'Else
    Set AFileStream = FSO.CreateTextFile(OutputFile,2)    
'End If

AFileStream.WriteLine "Name" & VbTab & "Password Status" & VbTab & "Last Change" & _
VbTab & "Expiration Date"

DoUntil objRecordSet.EOF

If (InStr(objRecordSet.Fields("Name").Value, "SystemMailbox") = 1) Then
    objRecordSet.MoveNext
Else
    ldapStr = "LDAP://" & objRecordSet.Fields("distinguishedName").Value
    'Wscript.Echo "Ldap String:" & ldapStr
    Set objUserLDAP = GetObject(ldapStr)
    intCurrentValue = objUserLDAP.Get("userAccountControl")

    If intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
        'Do nothing
    Else
        dtmValue = objUserLDAP.PasswordLastChanged
        'Wscript.Echo "Last Password Cahange:" & dtmValue
        intTimeInterval = int(now - dtmValue)
        
        If intTimeInterval >= intMaxPwdAge Then
            PassExpStatus = "Expired"
        Else
            PassExpStatus = "Active"
            IntTimeIntervalDiff  = intMaxPwdAge - intTimeInterval
            'Set a message string to on how to reset the password.
            'Send an e-mail to reset the password for 14,7 and 1 day respectively.
            mailbody = "Password expiry Notification" & VbNewline _
            & "This email was auto generated by a Domain.COM exchange organization to alert you on your password expiry. Please follow one of the below procedures to change your password on time." & vbNewLine _
            & "=============================instructions=====================" & vbNewLine _
            & "The steps to change are as follows."    & VbNewline _
            & "Method1:Computer" & VbNewLine _
            & "Step1: Once logged into the computer, press Ctrl+Alt+Del simultaneously(Ensure no programs are opened after logged in to computer)." & vbnewline _
            & "Step2:Click on Change a Password." & VbNewline _
            & "Step3: Enter the old password and type new password and confirm it again." & VbNewline _
            & "Step4 :Click OK and logoff and login to the computer with the new password" & VbNewline & vbNewLine _
            & "OR Method2: Webmail Step1:Login to webmail https://mail.domain.com/owa" & VbNewline _
            & "Step2:In Outlook Web App, click Options > See All Options" & VbNewline _
            & "Step3:click on Change your password Enter old password, new password and confirm it again" & VbNewline _
            & "Step4:Click on Save Step5:Logout and login with the new password to webmail" & vbNewLine    _
            & "==========================end of details==================" & vbNewLine
            
            If IntTimeIntervalDiff = 14then
            Set objMessage = CreateObject("CDO.Message")
            objMessage.From = "noreply.PwdNotification@domain.com"
            objMessage.To = objUserLDAP.mail 
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.com"
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 8181
            objMessage.Configuration.Fields.Update

            objMessage.Subject = "your windows password will expire in "& intTimeInterval & "days."
            objMessage.TextBody = mailbody
            objMessage.Send
            EndIf
            
            If intTimeIntervalDiff = 7then
            Set objMessage = CreateObject("CDO.Message")
            objMessage.From = "noreply.PwdNotification@domain.com"
            objMessage.To = objUserLDAP.mail
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.com"
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 8181
            objMessage.Configuration.Fields.Update

            objMessage.Subject = "your windows password will expire in "& intTimeInterval & "days."
            mailbody = str
            objMessage.Send
            EndIf
            
            If intTimeIntervalDiff = 99then
            Set objMessage = CreateObject("CDO.Message")
            objMessage.From = "noreply.PwdNotification@domain.com"
            objMessage.To = objUserLDAP.mail
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.com"
            objMessage.Configuration.Fields.Item _
            ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 8181
            objMessage.Configuration.Fields.Update

            objMessage.Subject = "your windows password will expire in "& intTimeInterval & "days."
            objMessage.TextBody = mailbody
            objMessage.Send
            EndIf
        EndIf

        PassLastChangeDate = DateValue(dtmValue)
        PassExpDate = DateValue(dtmValue + intMaxPwdAge)
        AFileStream.WriteLine objRecordSet.Fields("Name").Value & VbTab & PassExpStatus & _
        VbTab & PassLastChangeDate & VbTab & PassExpDate &VbTab & objUserLDAP.mail &VbTab & intTimeIntervalDiff
        'Wscript.Echo objUserLDAP.mail
    EndIf
objRecordSet.MoveNext
EndIf
Loop
AFileStream.Close

Friday, January 31, 2014

To restart a windows service from Linux server

To restart a windows service from Linux server follow the below reference link(s):

http://lifehacker.com/5575671/restart-windows-services-from-your-linux-pc
http://www.lylebackenroth.com/blog/2010/06/29/manage-windows-remotely-from-a-linux-command-line-interface/
http://monitoringtt.blogspot.in/2013/02/restarting-windows-services-from-linux.html

example as below:

[root@sserver-nag-cent-d1 ~]# net rpc service stop bits -I sserver-tst-slp1.server.com -U server/username%password
..
bits service is stopped.
[root@xxxxxxx ~]# wmic -U DomainName/Username%Password //ServerName.com "select name,state from Win32_Service where Name='bits'"
CLASS: Win32_Service
Name|State
BITS|Stopped
[root@xxxxxxx ~]# net rpc service start bits -I ServerName.com -U DomainName/Username%Password
.
Successfully started service: bits
[root@xxxxxxx ~]# wmic -U DomainName/Username%Password //ServerName.com "select name,state from Win32_Service where Name='bits'"
CLASS: Win32_Service
Name|State
BITS|Running

Tuesday, September 24, 2013

Restart a service checking a pattern in the event log

Restart a service checking a pattern in the event log and sending an e-mail to the xxxx@xxxx.com.

                                                                     
                                                                     
                                                                     
                                             

' ----- ExeScript Options Begin -----
' ScriptType: window,activescript,administrator
' DestDirectory: current
' CommandLine: -c 112 -p "3 / 10" -l Application -e "1 / 10"
' Icon: default
' 32Bit: yes
' Author: Babu Dhinakaran S
' ----- ExeScript Options End -----
'On Error Resume Next
Dim subStr
Dim Return1,Return2
Const CONVERT_TO_LOCAL_TIME = True
Dim strServiceName
Dim eCode
Dim patternMatch
Dim logFile
Dim aeCode, apatternMatch, alogFile
Dim dtmStartDate
Dim Flag

aeCode = Wscript.Arguments.Item(0)
eCode = CInt(Wscript.Arguments.Item(1))
apatternMatch = Wscript.Arguments.Item(2)
patternMatch = Wscript.Arguments.Item(3)
alogFile = Wscript.Arguments.Item(4)
logFile = Wscript.Arguments.Item(5)
aerrorPattern = Wscript.Arguments.Item(6)
errorPattern = Wscript.Arguments.Item(7)

'Wscript.Echo "aeCode"&aeCode
'Wscript.Echo "eCode"&eCode
'Wscript.Echo "apatternMatch"&apatternMatch
'Wscript.Echo "alogFile"&alogFile
'Wscript.Echo "logFile"&logFile
'Wscript.Echo "aerrorPattern"&aerrorPattern
'Wscript.Echo "errorPattern"&errorPattern

If aeCode = "-c" and apatternMatch = "-p" and alogFile = "-l" and aerrorPattern = "-e" Then
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 fileName = "C:\Program Files\NSClient++\scripts\" & logFile & "_ "& ecode & ".txt"
 fileName2 = "C:\Program Files\NSClient++\scripts\" & logFile & "_ "& ecode & "_flag"&".txt"
 'Wscript.Echo "FileName:" & fileName

 'The Below File or fileName variable holds the TimeStamp of the EventLog

 If objFSO.FileExists(fileName) Then
  'Wscript.Echo "File Exists"
  Set objTextFile = objFSO.OpenTextFile(fileName, 1)
  Do Until objTextFile.AtEndOfStream
  dtmStartDate = objTextFile.Readline
  'Wscript.Echo " DtmStartDate:" & dtmStartDate
  
  Loop

 Else 
  Set objTextFile = objFSO.CreateTextFile(fileName, true)
  Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
  dtmStartDate.SetVarDate (CDate (now))
  'Wscript.Echo "File Doesn't exists create one"
  objTextFile.WriteLine(dtmStartDate)
  'Wscript.Echo " DtmStartDate:" & dtmStartDate
  'objTextFile.Close()
 End If


 'The below file holds the Flag value and initially the flag is set to 0 stating there were no error found

 If objFSO.FileExists(fileName2) Then
  'Wscript.Echo "File Exists"
  Set objTextFile1 = objFSO.OpenTextFile(fileName2, 1)
  Do Until objTextFile1.AtEndOfStream
  flag = CInt(objTextFile1.Readline)
  'Wscript.Echo "File Exists:" & flag
  
  Loop

 Else 
  Set objTextFile1 = objFSO.CreateTextFile(fileName2, true)
  'Wscript.Echo "File Doesn't exists create one and set falg to 0"
  objTextFile1.WriteLine("0")
  'objTextFile1.Close()
 End If



 strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate,(Security)}!\\" _
  & strComputer & "\root\cimv2")
 'Set the event code in the below WMI Query such as 112 or 113

 Set colEvents = objWMIService.ExecQuery _
  ("Select * from Win32_NTLogEvent Where Logfile = '" & logFile & "' and " & " TimeWritten > ' " & dtmStartDate & " ' and EventCode=" & eCode & "") 
  
  

 'Wscript.Echo logFile
 'Wscript.Echo eCode
 'Wscript.Echo dtmStartDate
 If Err.Number <> 0 Then

  'WScript.Echo "Error: " & Err.Number
  'WScript.Echo "Error (Hex): " & Hex(Err.Number)
  'WScript.Echo "Source: " &  Err.Source
  'WScript.Echo "Description: " &  Err.Description
  Err.Clear
  Wscript.Echo "Unable to Access the remote Server"
  Wscript.Quit(3)
 
    Else
      

  
   If flag = 0 Then 
   
     For each objEvent in colEvents
   'Wscript.Echo "Category: " & objEvent.Category
   'Wscript.Echo "Computer Name: " & objEvent.ComputerName
   'Wscript.Echo "Event Code: " & objEvent.EventCode
   'Wscript.Echo "Message: " & objEvent.Message

    subStr = objEvent.Message
    'Wscript.Echo "Message:" & subStr
   'Wscript.Echo "Record Number: " & objEvent.RecordNumber
   'Wscript.Echo "Source Name: " & objEvent.SourceName
   'Wscript.Echo "Time Written: " & objEvent.TimeWritten
   'Wscript.Echo "Event Type: " & objEvent.Type
   'Wscript.Echo "User: " & objEvent.User
   'Wscript.Echo objEvent.LogFile

   'Prepare a regular expression object
    strServiceName = objEvent.SourceName
    dateWritten = objEvent.TimeWritten
    'Wscript.Echo "Date Written:" & dateWritten
   
   
    Set myRegExp = New RegExp 
    myRegExp.IgnoreCase = True
    myRegExp.Global = True
     myRegExp.Pattern = errorPattern
   'Wscript.Echo "errorPattern:" & errorPattern
   ' Echo for each match
    Set myMatches = myRegExp.Execute(subStr)
    If myMatches.count > 0 Then
           
         
    'Wscript.Echo "Service will be restarted:" &strServiceName 
   
    'Set the New Time Stamp 
    Set objTextFile = objFSO.CreateTextFile(fileName, true)
    'Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
    'dtmStartDate.SetVarDate (dateWritten)
    'Wscript.Echo "ErrorPattern Date:" & dateWritten
    objTextFile.WriteLine(dateWritten)
    'objTextFile.Close()
   
    'Set the New Flag 1 if a match is found for errorPattern
    Set objTextFile1 = objFSO.CreateTextFile(fileName2, true)
    'Wscript.Echo "File Doesn't exists create one"
    objTextFile1.WriteLine("1")
    'objTextFile1.Close()
       Wscript.Echo "System has entered in CRITICAL State of /10"
    'For Each myMatch in myMatches
    '  Wscript.Echo myMatch.Value, "Found Match"
    '  Wscript.Echo "---------------------------------------------------------------"
    ' Next 
    Wscript.Quit(2)
    
         Else 
    'don't do anything let it to loop till the match
    
   End If
   Next
       Wscript.Echo "System has not entered in CRITICAL State of /10"
    Wscript.Quit(0)
          End If 
    
          If flag = 1 Then 
    
     For each objEvent in colEvents
    'Wscript.Echo "Category: " & objEvent.Category
    'Wscript.Echo "Computer Name: " & objEvent.ComputerName
    'Wscript.Echo "Event Code: " & objEvent.EventCode
    'Wscript.Echo "Message: " & objEvent.Message

    subStr = objEvent.Message
    'Wscript.Echo "Message:" & subStr
    'Wscript.Echo "Record Number: " & objEvent.RecordNumber
    'Wscript.Echo "Source Name: " & objEvent.SourceName
    'Wscript.Echo "Time Written: " & objEvent.TimeWritten
    'Wscript.Echo "Event Type: " & objEvent.Type
    'Wscript.Echo "User: " & objEvent.User
    'Wscript.Echo objEvent.LogFile

    'Prepare a regular expression object
    strServiceName = objEvent.SourceName
    dateWritten = objEvent.TimeWritten
    'Wscript.Echo "Date Written:" & dateWritten
   
    Set myRegExp = New RegExp 
    myRegExp.IgnoreCase = True
    myRegExp.Global = True
    myRegExp.Pattern = patternMatch
    'Wscript.Echo "Pattern Match:" & patternMatch
    ' Echo for each match
    Set myMatches = myRegExp.Execute(subStr)
       If myMatches.count > 0 Then
                        
    'Set the New Time Stamp 
    Set objTextFile = objFSO.CreateTextFile(fileName, true)
    'Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
    'dtmStartDate.SetVarDate (dateWritten)
    'Wscript.Echo "Pattern Date:" & dateWritten
    objTextFile.WriteLine(dateWritten)
    'objTextFile.Close()
   
    'Set the New Flag 0 if a match is found for patternMatch
    Set objTextFile1 = objFSO.CreateTextFile(fileName2, true)
    objTextFile1.WriteLine("0")
    'objTextFile1.Close()
    
    'For Each myMatch in myMatches
     'Wscript.Echo myMatch.Value, "Found Match"
     'Wscript.Echo "---------------------------------------------------------------"
     'Next 
       
    'Restart the Service and Send an successful or unsccessful message accordingly
    Set objMessage = CreateObject("CDO.Message")
    objMessage.From = "no-reply@cmcmarkets.com" 
    objMessage.To = "b.dhinakaran@cmcmarkets.com" 
    objMessage.Cc = "t.welsh@cmcmarkets.com"
    objMessage.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objMessage.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.cmc.local"
    objMessage.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objMessage.Configuration.Fields.Update

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
     Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='" & strServiceName & "'") 
           
     If Err.Number <> 0 Then

      'WScript.Echo "Error: " & Err.Number
      'WScript.Echo "Error (Hex): " & Hex(Err.Number)
      'WScript.Echo "Source: " &  Err.Source
      'WScript.Echo "Description: " &  Err.Description
      Err.Clear
      objMessage.Subject = "Unable to invoke object to restart the service:" & strServiceName
      mailbody = "Please check to why this was not restarted automatically or manually restart the Service"
      objMessage.TextBody = mailbody
      objMessage.Send
      Wscript.Quit(3)

     Else
      'Stop Service
      For Each objService in colListOfServices
       Return1 = objService.StopService()
         If Return1 <> 0 Then
          'Wscript.Echo "Failed to Stop the Service and the Error code = " & Return1                                  
          objMessage.Subject = "Service didn't respond for Stop Signal:" & strServiceName
          mailbody = "Please check to why this was not restarted automatically or manually restart the Service"
          objMessage.TextBody = mailbody
          objMessage.Send
          Wscript.Quit(2)
         End If       
      Next

     Wscript.Sleep(20000)        'Sleep for 20 seconds before starting a service.

      'Start Service

      For Each objService in colListOfServices
       Return2 = objService.StartService()
         If Return2 <> 0 Then
          Wscript.Echo "Failed to Start the Service and the Error code = " & Return2 
          objMessage.Subject = "Service didn't respond for Start Signal after the Stop:" & strServiceName
          mailbody = "Please check to why this was not restarted automatically or manually restart the Service"
          objMessage.TextBody = mailbody
          objMessage.Send
          Wscript.Quit(2)
         Else
        
             WScript.Echo "Successful Restart of Service:" & strServiceName
          objMessage.Subject = "Successful Restart of Service:" & strServiceName
          mailbody = "Successful Restart of Service"
          objMessage.TextBody = mailbody
          objMessage.Send
         Wscript.Quit(0)

         End If

      Next
              
     End If
     
     
         Else 
        'Wscript.Echo "System has entered in CRITICAL State of /10"
     'Wscript.Quit(2) 
    
   End If
   Next
   Wscript.Echo "System has entered in CRITICAL State of /10"
   Wscript.Quit(2)
   End If
       
       
      
  End If

Else  
Wscript.Echo "Follow the Syntax: example: eventlog -c EventCode -p Pattern_to_Match_in_the_message_to_service_restart -l logfile_Application_System -e errorPattern_to_Match _in_then_message_to_trigger_an_alarm"  
End If  

Tuesday, July 30, 2013

Microsoft Exchange Queue monitoring Plugin for Nagios

# Test Queue Health
# Developed by Babu Dhinakaran S
# To execute from within NSClient++
#
#NSClient 0.4.1.90
#[/settings/external scripts/scripts]
#ps2 = cmd /c echo scripts\\test.ps1 | PowerShell.exe -command -

# On the check_nrpe command include the -t 30, since it takes some time to load the Exchange cmdlet's.

#Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

#Add-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.E2010



[int[]]$NagiosStatus = "3"
$NagiosDescription = ""
$key = New-Object System.Collections.ArrayList
$value = New-Object System.Collections.ArrayList
$getpos = New-Object System.Collections.ArrayList
$i=0

[String[]]$scontent = ""
[String[]]$shcontent = ""
[String[]]$otcontent = ""

#$Queue = Get-Queue -server test.test.COM


               
ForEach ($Queue in Get-Queue -Server test.test.COM)
{            
                     # ForEach Queue Handle the Identity and Message Count
                     $kv=$Queue.Identity
                     $vv=$Queue.MessageCount
                     $r_key = $key.Add("$kv")
                     $r_value = $value.Add("$vv")
}

 #Write-Host "Before Any Operation:"
#Write-Host $key
#Write-Host $value

ForEach ($scontent in $key)
{
            if ($scontent.contains("Submission"))
            {
#           Write-Host "removed Submission"
#           Write-Host "$i th Position:" $i
            break
            }
      $i++
}

#Process the submission queue and remove it from the ArrayList
[int[]]$sub_val = $value[$i]
if ($sub_val -gt "10")
{
# Format the output for Nagios
    if ($NagiosDescription -ne "")   
         {
        $NagiosDescription = $NagiosDescription + ", "                
            }
        $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                                
        # Set the status to failed.
        $NagiosStatus = "2"
}
elseif ($sub_val -gt "6")
{
    if ($NagiosDescription -ne "")   
         {
        $NagiosDescription = $NagiosDescription + ", "                
            }
        $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                               
        # Don't lower the status level if we already have a critical event
        if ($NagiosStatus -ne "2")
            {
           $NagiosStatus = "1"
            }
                               
}
$key.RemoveRange($i,1)
$value.RemoveRange($i,1)

#Write-Host "After Submission Operation:"
#Write-Host $key
#Write-Host $value

$i=0
ForEach ($shcontent in $key)
{
if ($shcontent.contains("Shadow"))
{
#Write-Host "Removed Shadow"

      #Process the Shadow queue and remove it from the ArrayList
      #Write-Host "Value of value:" $value[$i]
      [int[]]$shadow_value = $value[$i]
     
      if ( $shadow_value -gt "3" )
      {
      # Format the output for Nagios
      if ($NagiosDescription -ne "")   
                  {
                  $NagiosDescription = $NagiosDescription + ", "                
                  }
            $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                               
        # Set the status to failed.
        $NagiosStatus = "2"
      }
      elseif ($shadow_value -gt "2")
      {
      if ($NagiosDescription -ne "")   
            {
            $NagiosDescription = $NagiosDescription + ", "                
            }
            $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                               
        # Don't lower the status level if we already have a critical event
        if ($NagiosStatus -ne "2")
            {
           $NagiosStatus = "1"
            }
                               
      }
$r_getops = $getpos.Add("$i")

#$key.RemoveRange($i,1)
#$value.RemoveRange($i,1)

}
$i = $i + 1
}

#key length calculation
# write a subroutine to calculate string lenght
Function flength ([String[]]$skey)
{
ForEach ( $content in $skey )
{
$len = $len + 1
}
return $len - 1
}

ForEach ( $pos in $getpos )
{

# if the range is not null, call subroutine to calculate the length of key and get the position to delete it.
$kl = flength $key

if ( $pos -gt $kl )
      {
      $key.RemoveRange($kl,1)
      $value.RemoveRange($kl,1)
      break
      }
     
else
      {
      $key.RemoveRange($pos,1)
      $value.RemoveRange($pos,1)
      }
}

     
#Write-Host "After Shadow Operation:"
#Write-Host $key
#Write-Host $value

$i=0
ForEach ($otcontent in $key)
{

#Process the Other queue
[int[]]$ot_value = $value[$i]
if ($ot_value -gt "10")
{
# Format the output for Nagios
    if ($NagiosDescription -ne "")   
         {
        $NagiosDescription = $NagiosDescription + ", "                
            }
        $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                               
        # Set the status to failed.
        $NagiosStatus = "2"
}
elseif ($ot_value -gt "5")
{
    if ($NagiosDescription -ne "")   
         {
        $NagiosDescription = $NagiosDescription + ", "                 
            }
        $NagiosDescription = $NagiosDescription + $key[$i] + " queue has " + $value[$i] + " messages"
                                               
        # Don't lower the status level if we already have a critical event
        if ($NagiosStatus -ne "2")
            {
           $NagiosStatus = "1"
            }
                               
}
$i = $i + 1
}
# Output, what level should we tell our caller?
if ($NagiosStatus -eq "2") {
                Write-Host "CRITICAL: " $NagiosDescription
                        exit 2
} elseif ($NagiosStatus -eq "1") {
                Write-Host "WARNING: " $NagiosDescription
                        exit 1
} else {
                Write-Host "OK: All mail queues within limits."
                        exit 0
}

#Write-Host $key and $value
#Write-Host "After all Operation:"
#Write-Host $key

#Write-Host $value