==== check_file.vbs ====
' Check files under a given path
' ==============================
'
' based on example scripts found in nsclient++/scripts directory
'
' Author: werner.fuerst@assmann.at 2010-12-21
'
' uses NagiosPlugin.vbs from nsclient++/scripts/lib
' - NagiosPlugin.vbs which came with nsclient++ vers. 0.3.9 (earlier version needed adaptation)
' - compares bounds to double values, so 10 comes after 9 (numeric sorting)
' - bounds definition conforms to nagios plugin guidelines (http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT)
'
' modifications in NSC.ini:
' =========================
'
'
' in [modules]:
' CheckExternalScripts.dll
'
' in [NRPE]:
' allow_arguments=1
' allow_nasty_meta_chars=1
' allowed_hosts=x.x.x.x
'
' in [External Script]:
' allow_arguments=1
' allow_nasty_meta_chars=1
'
' in [Script Wrappings]:
' obsolet, as modifications in wrapperCDbl.vbs are included since version 0.3.9: vbs=cscript.exe //T:30 //NoLogo scripts\lib\wrapperCDbl.vbs %SCRIPT% %ARGS%
'
' in [Wrapped Scripts]:
' check_files=check_files.vbs $ARG1$ $ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$ $ARG7$ $ARG8$ $ARG9$ $ARG10$ $ARG11$ $ARG12$ $ARG13$ $ARG14$
'
'
' nagios usage:
' =============
'
' define command{
' command_name check_nrpe_external
' command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
' }
'
' define service{
' use generic-service
' host_name windowsxx
' service_description Backup DB2
' check_command check_nrpe_external!check_files!/path:"e:\\BACKUP\\DB" /namefilter:"DB2\.DAT" /expectmatch:1 /age:3 /selage:hour /warning:1: /critical:1: /size:9000000000 /weekdays:"2,3"
' }
' give alarm when file DB2.DAT in e:\BACKUP\DB was not written until 3 o clock on Monday or Tuesday (alarm if count is less than 1, so threshold is set to 1:)
'
'
'
' check_command check_nrpe_external!check_files!/path:"d:\\journal" /searchdepth:1 /selage:ignore /warning:30 /critical:40
' give alarm if there are more than 30 files under d:\journal
'
'
' check_command check_nrpe_external!check_files!/path:"T:\\nfs\\interface1" /searchdepth:2 /age:2d /warning:5: /critical:3: /selage:newer /seldat:created
' give alarm if there are fewer than 3 files which are newer than 2 days under t:\nfs\interface1, search only 1 subdir down, use the creation date for comparison
'
'
'
' args:
' =====
'
'
' warning: threshold warning
' alert if x...
' 10 < 0 or > 10, (outside the range of {0 .. 10})
' 10: < 10, (outside {10 .. 8})
' ~:10 > 10, (outside the range of {-8 .. 10})
' 10:20 < 10 or > 20, (outside the range of {10 .. 20})
' @10:20 >= 10 and <= 20, (inside the range of {10 .. 20})
' critical: threshold critical
' namefilter: regular expressionon on which files have to match
' age: files have to be older/newer (see selage) than age
' e.g.: 5d: 5 days, 4h: 4 hours, 10n: 10 Minutes, 90s: 90 seconds
' selage: older/newer/hour/ignore
' older/newer: count only files if the are older/newer
' hour: alert if file is not written until hour
' ignore: count files independent of their age
' searchdepth: search down x subdirs (searchdepth:1 - do not go down in directory hierarchy)
' seldat: modified/created
' modified: date, when file was written
' created: date, when file was created
' size: if file is smaller than given size give a warning
' expectmatch: if less than expectmatch files correspond to namefilter give a warning
' weekdays:
' if selage:hour files have to be written only on weekdays (1:sunday, 2:monday, ...)
' if selage:newer or selage:older and the timeunit of age is d (days), we add as many days to age as the last weekday is back
' e.g.: weekdays:23456 files are written on Monday, Tuesday, Wednesday, Thursday, Friday
'
Const PROGNAME = "check_files"
Const VERSION = "0.1.3"
' ver 0.1.3 2011-10-06
' Comment in header
' ver 0.1.2 2011-06-15
' start with 1 and not with 0 when trying to find the last day when the file should have been written according to weekdays
' fixed some typos in the coments
' ver 0.1.1 2011-01-07
' replaced Testing... with Checking...
Dim verbose
verbose = 0
Dim lastfile
Dim lastdat
Dim lastsize
Dim intdif
Dim warnsize
Dim matchcount
Dim weekdays
Dim ageint
Dim ageunit
Dim agestring
Dim inlevel
' Default settings for script.
threshold_warning = 10
threshold_critical = 20
alias = "default"
agestring = "5d" '5 days
ageint = 5
ageunit = "d"
selage = "newer"
namefilter = ""
searchdepth = 0
seldat = "modified"
size = 0
expectmatch = 0
weekdays = "1,2,3,4,5,6,7"
' Create the NagiosPlugin object
Set np = New NagiosPlugin
' Define what args should be used
np.add_arg "path", "Path", 1
np.add_arg "namefilter", "Filename Filter", 0
np.add_arg "age", "Age", 0
np.add_arg "selage", "newer, older, hour, ignore", 0
np.add_arg "searchdepth", "depth of subdirs to search", 0
np.add_arg "seldat", "modified or created", 0
np.add_arg "size", "size", 0
np.add_arg "warning", "warning threshold", 0
np.add_arg "critical", "critical threshold", 0
np.add_arg "expectmatch", "expect at least x matches", 0
np.add_arg "weekdays", "1,2,3,... 1-Sun 2-Mon 3-Tue...", 0
np.add_arg "alias", "Alias", 0
' If we have no args or arglist contains /help or not all of the required arguments are fulfilled show the usage output,.
If Args.Count < 1 Or Args.Exists("help") Or np.parse_args = 0 Then
WScript.Echo Args.Count
np.Usage
End If
' If we define /warning /critical on commandline it should override the script default.
If Args.Exists("warning") Then threshold_warning = Args("warning")
If Args.Exists("critical") Then threshold_critical = Args("critical")
If Args.Exists("namefilter") Then namefilter = Args("namefilter")
If Args.Exists("age") Then agestring = Args("age")
If Args.Exists("selage") Then selage = Args("selage")
If Args.Exists("searchdepth") Then searchdepth = Cint(Args("searchdepth"))
If Args.Exists("seldat") Then seldat = Args("seldat")
If Args.Exists("size") Then size = CDbl(Args("size"))
If Args.Exists("expectmatch") Then expectmatch = CInt(Args("expectmatch"))
If Args.Exists("weekdays") Then weekdays = Args("weekdays")
If Args.Exists("alias") Then alias = Args("alias")
' Set the msg output to be used (OK/WARNING/CRITICAL/UNKNOWN will be applied automaticly)
np.set_thresholds threshold_warning, threshold_critical
' Set ageint and ageunit
Set reage = New RegExp
reage.IgnoreCase = False
reage.Pattern = "^([0-9]+)([dhns]*)$" 'd: days h:hours n:minutes s:seconds
Set ages = reage.Execute(agestring)
For Each age In ages
pt age & " > " & age.SubMatches(0) & " > " & age.SubMatches(1)
ageint = CInt(age.SubMatches(0))
ageunit = age.SubMatches(1)
If ageunit = "" Then
If selage = "hour" Then
ageunit = "h"
Else
ageunit = "d"
End If
End If
Next
' add some days if this and the days before do not belong to the weekdays
If ageunit="d" And (selage="newer" Or selage="older") Then
date1 = Now()
date00 = DateValue(Now)
' start with 1 and not with 0 when trying to find the last day when the file should have been written according to weekdays
' if a machine is saved only on mondays, and we start with 0, 0 is added to age, and we get an alarm every monday mornung until the copy is started
' if we start with 1, and it is monday, we add 7 to age
' drawback: we add always at least 1 to age (we could count how many weekdays are defined, ...)
For i = 1 To 7
' datex: last day when the file should have been written according to weekdays
datex = SubtractDate(date00,i)
wdnowx = WeekDay(datex)
If Instr(weekdays,wdnowx) Then
' exit for if we found the youngest weekday
Exit For
End If
Next
datex0 = DateValue(datex)
diffd = DateDiff("d",datex0,date00)
ageint = ageint + diffd
End If
intdif=0
matchcount=0
warnsize = 0
' go down the hierarchy, in intdif we get the number of corresponding files
CheckSubdirs Args("path")
' get return code according to intdif files
return_code = np.check_threshold(CDbl(intdif))
last = ""
If Len(namefilter) Then
last = "filter: " & namefilter
End If
' if there was only one file...
If matchcount = 1 Then
last = last & " found one: " & lastfile & " " & lastdat & " " & lastsize
End If
' warning message if file too small or too few of them
message = ""
If warnsize = matchcount And warnsize > 0 Then
If return_code = 0 Then
return_code = 1
End If
message = " TOO SMALL!!! "
End If
If matchcount < expectmatch Then
If return_code = 0 Then
return_code = 1
End If
message = " NOT FOUND!!! "
End If
If selage = "ignore" Then
agemessage = " count: "
ElseIf selage = "newer" Or selage ="older" Then
agemessage = selage & " than " & ageint & " " & ageunit & " : "
ElseIf selage = "hour" Then
agemessage = " written before " & ageint & " o-clock on " & weekdays & " : "
Else
agemessage = selage & ": " & age & " " & ageunit & " "
End If
' for the performance data format warning and critical thresholds (no :@~)
cintw=np.get_threshold_perfdat("warning") 'PerfDat(np.get_threshold("warning"))
cintc=np.get_threshold_perfdat("critical")
' if we watch only a single file we will see the size in the performance data
If expectmatch = 1 and matchcount = 1 Then
perfdata = "size=" & lastsize
Else
perfdata = "count=" & Cint(intdif) & ";" & cintw & ";" & cintc
End If
msg = "Checking " & Replace(Args("path"),"\","/") & " " & last & " " & agemessage & intdif & " w:" & np.get_threshold("warning") & " c: " & np.get_threshold("critical") & " " & message & " |" & perfdata
' Nice Exit with msg and exitcode
np.nagios_exit msg, return_code
Sub CheckSubdirs(StartDir)
Set FSO = CreateObject("Scripting.FileSystemObject")
inlevel = 0
' go down hierarchy
ShowSubfolders FSO.GetFolder(StartDir)
'Clean up
Set FSO = Nothing
End Sub
Sub ShowSubFolders(Folder)
'inlevel: we start with 1, so the startdir has level 1!
inlevel = inlevel + 1
pt "level: " & inlevel & " Folder: " & Folder.Name & " searchdepth: " & searchdepth
If (inlevel > searchdepth) And (searchdepth > 0) Then
' we are too deep!
inlevel = inlevel - 1
pt "level2: " & inlevel & " Folder: " & Folder.Name
Exit sub
End If
pt "level3: " & inlevel & " Folder: " & Folder.Name
ListFiles Folder
If ((inlevel < searchdepth) And (searchdepth > 0)) Or (searchdepth = 0) Then
For Each Subfolder in Folder.SubFolders
' go further down
ShowSubFolders Subfolder
Next
End If
' leave level
inlevel = inlevel - 1
End Sub
Sub ListFiles(Folder)
Set colFiles = Folder.Files
pt "in folder " & Folder.Name
For Each File in colFiles
matched = true
'pt "namefilter: " & namefilter & " len:" & Len(namefilter)
' if we defined a namefilter, use it (regexp!)
If Len(namefilter) > 0 Then
filename = File.Name
'pt "namefilter1: " & filename
Set re = new regexp
re.IgnoreCase = True
re.Pattern = namefilter
'pt "namefilter2: " & namefilter & " len:" & Len(namefilter)
If re.Test(filename) <> true Then
matched = false
End If
End If
' now test the matched files against the age
If matched = true Then
' count the matched files (we warn later if there are fewer the expectmatch files)
matchcount = matchcount + 1
pt "match: " & matchcount & " file: " & File.name
' Date2 can be the DateCreated (backup of old machine, which is not time synchronized, so the created date is the date when the file was backed up to our server)
Date1 = Now()
If seldat = "created" Then
Date2 = File.DateCreated
Else
Date2 = File.DateLastModified
End If
' time difference between file and now
dif = Cint(DateDiff(ageunit,Date2,Date1))
'remember the last file checked (we use it later in the message)
lastfile = File.name
lastdat = Date2
lastsize = File.Size
' remember the count of files which where too small
If CDbl(File.Size) < CDbl(size) Then
warnsize = warnsize + 1
End If
'pt "c0 dif: " & dif & " age: " & age & " selage: " & selage & " seldat: " & seldat
' count the numer of files which are newer/older than given age
If dif < ageint And selage = "newer" Then
intdif = intdif + 1
ElseIf dif > ageint And selage = "older" Then
intdif = intdif + 1
ElseIf selage = "ignore" Then
intdif = intdif + 1
ElseIf selage = "hour" Then
' if selage:hour check if file has been written not after age (here age is the hour)
If isnotolder(File) Then
intdif = intdif + 1
End If
End If
End If
Next
End Sub
Function isnotolder(File)
date1 = Now()
date2 = File.DateLastModified
date00 = DateValue(Now)
date10 = DateValue(Now)
date20 = DateValue(date2)
For i = 0 To 7
' datex: last day when the file should have been written according to weekdays
datex = SubtractDate(date00,i)
'date00 = DateValue(datex)
wdnowx = WeekDay(datex)
If Instr(weekdays,wdnowx) Then
' exit for if we found the youngest weekday
Exit For
End If
Next
' we also need the second youngest weekday, when the file should have been written (is this english?)
date00 = datex
For i = 1 To 7
datex2 = SubtractDate(date00,i)
wdnowx2 = WeekDay(datex2)
If Instr(weekdays,wdnowx2) Then
Exit For
End If
Next
diffdx = DateDiff("d",datex,Now) ' days between expected write date and today
diffh0 = DateDiff("h",date10,Now) ' hours since midnight
diffd = DateDiff("d",date20,datex) ' days between written and expect to be written
diffd2 = DateDiff("d",date20,datex2) ' days between second oldest expected write day and today
diff1 = DateDiff("h",date20,date2) ' hour of write (we currently do not use it)
' we expect the best
iswritten = 1
' today to be written an hour passed: should be written today!
If diffdx = 0 And diffh0 > ageint And diffd > 0 Then
pt "if1: diffdx=0 and diffh0>0ageint and diffd>0: diffdx: " & diffdx & " diffh0: " & diffh0 & " diffd: " & diffd
iswritten = 0
End If
' today to be written an hour not passed: should be written at least on second oldest expected day
If diffdx = 0 And diffh0 <= ageint And diffd2 > 0 Then
pt "if2: diffdx=0 and diffh0<= ageint and diffd2>0: diffdx: " & diffdx & " diffh0: " & diffh0 & " diffd2: " & diffd2
iswritten = 0
End If
' it should have been written on a day before, diffd gives a positive value: expected day passed
If diffdx > 0 And diffd > 0 Then
pt "if3: diffdx>0 and diffd>0 diffdx: " & diffdx & " diffd: " & diffd
iswritten = 0
End If
' older the 7 days!
If diffd > 7 Then
pt "if4: diffd>7 diffd: " & diffd
iswritten = 0
End If
' if none of the bad conditions matched, we still have iswritten=1
isnotolder = iswritten
End Function
Function SubtractDate(datea,ii)
dateb = DateAdd("d",-ii,datea)
SubtractDate = dateb
End Function
Function pt(strMsg)
If verbose = 1 Then
wscript.echo strMsg
End If
End Function
==== check_licences_windows ====
$VAR=cscript /Nologo "C:\Windows\System32\slmgr.vbs" /dlv | Select-String -Pattern "Expiration"
$OUT=($VAR -split " ")[5] / 1440
$RESULT=([math]::Round($OUT))
if ($RESULT -lt "1"){
Write-Output "Critique: La licence a expirée $RESULT jours"
exit 2
}
if ($RESULT -lt "15"){
Write-Output "Critique: La licence expire dans $RESULT jours"
exit 2
}
if ($RESULT -lt "30"){
Write-Output "Warning: La licence expire dans $RESULT jours"
exit 1
}
Write-Output "OK: La licence expire dans $RESULT jours"
exit 0
==== check_win_task ====
# Script name: check_ms_win_tasks.ps1
# Version: v7.06.191031
# Created on: 01/02/2014
# Author: Willem D'Haese
# Purpose: Checks Microsoft Windows enabled scheduled tasks excluding defined folders and task patterns, returning state of tasks
# with name, author, exit code and performance data to Nagios.
# On Github: https://github.com/willemdh/check_ms_win_tasks
# On OutsideIT: https://outsideit.net/check-ms-win-tasks
# Copyright:
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public
# License along with this program. If not, see .
#Requires -Version 2.0
$DebugPreference = 'SilentlyContinue'
$VerbosePreference = 'SilentlyContinue'
$Struct = New-Object -TypeName PSObject -Property @{
Hostname = [string]'localhost'
ExclFolders = [string[]]@()
InclFolders = [string[]]@()
ExclTasks = [string[]]@()
InclTasks = [string[]]@()
ExclAuthors = [string[]]@()
InclAuthors = [string[]]@()
FolderRef = [string]''
AllValidFolders = [string[]]@()
ExitCode = [int]3
Hidden = [int]0
TasksOk = [int]0
TasksNotOk = [int]0
TasksRunning = [int]0
TasksTotal = [int]0
TasksDisabled = [int]0
BadTasks = [object[]]@()
RunningTasks = [object[]]@()
DisabledTasks = [object[]]@()
AlertOnDisabled = [bool]$False
FullPath = [bool]$False
OutputString = [string]'Unknown: Error processing, no data returned.'
WarningTreshold = [int]0
CriticalTreshold = [int]0
LastExec = [bool]$false
}
#region Functions
Function Write-Log {
Param (
[parameter(Mandatory=$True,HelpMessage='Log output')][string]$Log,
[parameter(Mandatory=$True,HelpMessage='Log severity')][ValidateSet('Debug', 'Info', 'Warning', 'Error', 'Unknown')][string]$Severity,
[parameter(Mandatory=$True,HelpMessage='Log message')][string]$Message
)
$Now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss,fff'
$LocalScriptName = Split-Path -Path $myInvocation.ScriptName -Leaf
If ( $Log -eq 'Verbose' ) {
Write-Verbose -Message ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
}
ElseIf ( $Log -eq 'Debug' ) {
Write-Debug -Message ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
}
ElseIf ( $Log -eq 'Output' ) {
Write-Host ('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message)
}
ElseIf ( $Log -match '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?::(?\d+))$' -or $Log -match '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' ) {
$IpOrHost = $log.Split(':')[0]
$Port = $log.Split(':')[1]
If ( $IpOrHost -match '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' ) {
$Ip = $IpOrHost
}
Else {
$Ip = [Net.Dns]::GetHostAddresses($IpOrHost)[0].IPAddressToString
}
Try {
$LocalHostname = ([Net.Dns]::GetHostByName((& "$env:windir\system32\hostname.exe")).HostName).tolower()
$JsonObject = (New-Object -TypeName PSObject |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue logsource -InputObject $LocalHostname |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue hostname -InputObject $LocalHostname |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue scriptname -InputObject $LocalScriptName |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue logtime -InputObject $Now |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue severity_label -InputObject $Severity |
Add-Member -PassThru -NotePropertyName NoteProperty -NotePropertyValue message -InputObject $Message )
If ( $psversiontable.psversion.major -ge 3 ) {
$JsonString = $JsonObject | ConvertTo-Json
$JsonString = $JsonString -replace "`n",' ' -replace "`r",' '
}
Else {
$JsonString = $JsonObject | ConvertTo-Json2
}
$Socket = New-Object -TypeName System.Net.Sockets.TCPClient -ArgumentList ($Ip,$Port)
$Stream = $Socket.GetStream()
$Writer = New-Object -TypeName System.IO.StreamWriter -ArgumentList ($Stream)
$Writer.WriteLine($JsonString)
$Writer.Flush()
$Stream.Close()
$Socket.Close()
}
Catch {
Write-Host ("{0}: {1}: Error: Something went wrong while trying to send message to logserver `"{2}`"." -f $Now, $LocalScriptName, $Log)
}
Write-Verbose -Message ('{0}: {1}: {2}: Ip: {3} Port: {4} JsonString: {5}' -f $Now, $LocalScriptName, $Severity, $Ip, $Port, $JsonString)
}
ElseIf ($Log -match '^((([a-zA-Z]:)|(\\{2}\w+)|(\\{2}(?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}))(\\(\w[\w ]*))*)') {
If (Test-Path -Path $Log -pathType container){
Write-Host ('{0}: {1}: Error: Passed Path is a directory. Please provide a file.' -f $Now, $LocalScriptName)
Exit 1
}
ElseIf (!(Test-Path -Path $Log)) {
Try {
$Null = New-Item -Path $Log -ItemType file -Force
}
Catch {
$Now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss,fff'
Write-Host ("{0}: {1}: Error: Write-Log was unable to find or create the path `"{2}`". Please debug.." -f $Now, $LocalScriptName, $Log)
exit 1
}
}
Try {
('{0}: {1}: {2}: {3}' -f $Now, $LocalScriptName, $Severity, $Message) | Out-File -filepath $Log -Append
}
Catch {
Write-Host ("{0}: {1}: Error: Something went wrong while writing to file `"{2}`". It might be locked." -f $Now, $LocalScriptName, $Log)
}
}
}
Function Initialize-Args {
Param (
[Parameter(Mandatory=$True,HelpMessage='Argument list')]$Args
)
Try {
For ( $i = 0; $i -lt $Args.count; $i++ ) {
$CurrentArg = $Args[$i].ToString()
If ($i -lt $Args.Count-1) {
$Value = $Args[$i+1];
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
$Null = Test-Strings -String $Item
}
}
Else {
$Value = $Args[$i+1];
$Null = Test-Strings -String $Value
}
}
Else {
$Value = ''
}
Switch -regex -casesensitive ($CurrentArg) {
'^(-H|--Hostname)$' {
If ($value -match '^[a-zA-Z.]+') {
If ($Value -ne ([Net.Dns]::GetHostByName((& "$env:windir\system32\hostname.exe")).HostName).tolower() -and $Value -ne 'localhost') {
$Null = & "$env:windir\system32\ping.exe" -n 1 $Value
If($? -eq $true) {
$Struct.Hostname = $Value
$i++
}
Else {
Throw ('Ping to {0} failed! Please provide valid reachable hostname.' -f $Value)
}
}
Else {
$Struct.Hostname = $Value
$i++
}
}
Else {
Throw ("Hostname `"{0}`" does not meet regex requirements." -f $value)
}
}
'^(-EF|--ExclFolders)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
If ($Item -match '^[a-zA-Z0-9\\.]+') {
$Struct.ExclFolders += $Item
}
Else {
Throw ("ExclFolders `"{0}`" does not meet regex requirements." -f $Value)
}
}
}
Else {
If ($Value -match '^[a-zA-Z0-9\\.]+') {
$Struct.ExclFolders = $Value
}
Else {
Throw ("ExclFolders `"{0}`" does not meet regex requirements." -f $value)
}
}
$i++
}
'^(-IF|--InclFolders)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
If ($Item -match '^[a-zA-Z0-9\\.]+') {
$Struct.InclFolders += $Item
}
Else {
Throw ("InclFolders `"{0}`" does not meet regex requirements." -f $value)
}
}
}
Else {
If ($Value -match '^[a-zA-Z0-9\\.]+') {
$Struct.InclFolders = $Value
}
Else {
Throw ("InclFolders `"{0}`" does not meet regex requirements." -f $value)
}
}
$i++
}
'^(-ET|--ExclTasks)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
If ($Item -match '^[a-zA-Z0-9.]+') {
$Struct.ExclTasks += $Item
}
Else {
Throw ("ExclTasks `"{0}`" does not meet regex requirements." -f $value)
}
}
}
Else {
If ($Value -match '^[a-zA-Z0-9.]+') {
$Struct.ExclTasks = $Value
}
Else {
Throw ("ExclTasks `"{0}`" does not meet regex requirements." -f $value)
}
}
$i++
}
'^(-IT|--IncllTasks)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
If ($Item -match '^[a-zA-Z0-9.]+') {
$Struct.InclTasks += $Item
}
Else {
Throw ("InclTasks `"{0}`" does not meet regex requirements." -f $value)
}
}
}
Else {
If ($Value -match '^[a-zA-Z0-9.]+') {
$Struct.InclTasks = $Value
}
Else {
Throw ("InclTasks `"{0}`" does not meet regex requirements." -f $value)
}
}
$i++
}
'^(-EA|--ExclAuthors)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
$Struct.ExclAuthors += $Item
}
}
Else {
$Struct.ExclAuthors = $Value
}
$i++
}
'^(-IA|--InclAuthors)$' {
If ($Value.Count -ge 2) {
ForEach ($Item in $Value) {
$Struct.InclAuthors += $Item
}
}
Else {
$Struct.InclAuthors = $Value
}
$i++
}
'^(-Hid|--Hidden)$' {
If ($value -match '^[0-1]{1}$') {
$Struct.hidden = $Value
}
Else {
Throw ("Method `"{0}`" does not meet regex requirements." -f $value)
}
$i++
}
'^(-w|--Warning)$' {
If (($value -match '^[\d]+$') -and ([int]$value -lt 100)) {
$Struct.WarningTreshold = $value
}
Else {
Throw ('Warning treshold should be numeric and less than 100. Value given is {0}.' -f $value)
}
$i++
}
'^(-c|--Critical)$' {
If (($value -match '^[\d]+$') -and ([int]$value -lt 100)) {
$Struct.CriticalTreshold = $value
}
Else {
Throw ('Critical treshold should be numeric and less than 100. Value given is {0}.' -f $value)
}
$i++
}
'^(-AD|--AlertOnDisabled)$' {
$Struct.AlertOnDisabled = $True
}
'^(-FP|--FullPath)$' {
$Struct.FullPath = $True
}
'^(-h|--Help)$' {
Write-Help
}
'^(-LE|--LastExec)$' {
$Struct.LastExec = $True
}
default {
Throw ('Illegal arguments detected: {0}' -f $_)
}
}
}
}
Catch {
Write-Host ('CRITICAL: Argument: {0} Value: {1} Error: {2}' -f $CurrentArg, $Value, $_)
Exit 2
}
}
Function Test-Strings {
Param ( [Parameter(Mandatory=$True,HelpMessage='String to check')][string]$String )
$BadChars = @("``", '|', ';', "`n")
$BadChars | ForEach-Object {
If ( $String.Contains(('{0}' -f $_)) ) {
Write-Host ("Error: String `"{0}`" contains illegal characters." -f $String)
Exit $Struct.ExitCode
}
}
Return $true
}
Function Get-AllTaskSubFolders {
If ($Struct.ExclFolders){
If ( ! ( Compare-Array -Str $Struct.FolderRef.Name -Patterns $Struct.ExclFolders ) ) {
$Struct.AllValidFolders+=$Struct.FolderRef
}
}
Else {
$Struct.AllValidFolders+=$Struct.FolderRef
}
If ( ( $folders = $Struct.FolderRef.getfolders(1)).count -ge 1) {
ForEach ( $folder in $folders ) {
If ( $Struct.ExclFolders -notcontains $folder.Name ) {
If ( ( $folder.getfolders(1).count -ge 1 ) ) {
$Struct.FolderRef=$folder
Get-AllTaskSubFolders
}
Else {
$Struct.AllValidFolders+=$folder
}
}
}
Return
}
}
Function Find-InclFolders {
$TempValidFolders = $Struct.AllValidFolders
$Struct.AllValidFolders = @()
ForEach ($folder in $TempValidFolders) {
If (Compare-Array -Str $Folder.Name -Patterns $Struct.InclFolders){
$Struct.AllValidFolders += $Folder
}
}
}
Function Compare-Array {
Param(
[Parameter(Mandatory=$True,HelpMessage='String to search')][string]$Str,
[Parameter(Mandatory=$True,HelpMessage='Array to search')][AllowEmptyCollection()][String[]]$Patterns
)
ForEach ( $Pattern in $Patterns ) {
If ( $Str -Match $Pattern ) {
Return $True
}
}
Return $False
}
Function Write-Help {
Write-Host @'
check_ms_win_tasks.ps1: This script is designed to check Windows 2008 or higher scheduled tasks and alert in case tasks
failed in Nagios style output.
Arguments:
-H | --Hostname => Optional hostname of remote system, default is localhost, not yet tested on remote host.
-EF | --ExclFolders => Name of folders to exclude from monitoring.
-IF | --InclFolders => Name of folders to include in monitoring.
-ET | --ExclTasks => Name of task patterns to exclude from monitoring.
-IT | --InclTasks => Name of task patterns to include in monitoring.
-EA | --ExclAuthors => Name of task author patterns to exclude from monitoring.
-IA | --InclAuthors => Name of task author patterns to include in monitoring.
-Hid | --Hidden => Switch to determine if hidden tasks need to be excluded.
-a | --AlertOnDisabled => If any tasks are disabled, throw a CRITICAL alert.
-FP | --FullPath => Displays full path in plugin output
-w | --Warning => Threshold for warning alert. (not yet implemented)
-c | --Critical => Threshold for critical alert. (not yet implemented)
-h | --Help => Print this help output.
-LE | --LastExec => check if last execution is >warn or >critical in hours
'@
Exit $Struct.ExitCode
}
Function Search-Tasks {
Try {
$schedule = New-Object -ComObject('Schedule.Service')
}
Catch {
Write-Host ('Error: Schedule.Service COM Object not found on {0}, which is required by this script.' -f $Struct.Hostname)
Exit 2
}
$Schedule.connect($Struct.Hostname)
$Struct.FolderRef = $Schedule.getfolder('\')
Get-AllTaskSubFolders
If ($Struct.InclFolders){
Find-InclFolders
}
$OutputString = ''
ForEach ($Folder in $Struct.AllValidFolders) {
If (($Tasks = $Folder.GetTasks($Struct.Hidden))) {
foreach ($Author in $Struct.ExclAuthors) {
$Tasks = $Tasks | ? {([xml]($_.xml)).Task.RegistrationInfo.Author -notlike $Author}
}
if ($Struct.InclAuthors) {
$NewTasks = @()
foreach ($Author in $Struct.InclAuthors) {
$newTasks += $Tasks | ? {([xml]($_.xml)).Task.RegistrationInfo.Author -like $Author}
}
$Tasks = $NewTasks | Select * -Unique
}
$Tasks | Select-TaskInfo
}
}
$Struct.TasksTotal = $Struct.TasksOk + $Struct.TasksNotOk + $Struct.TasksRunning
If ( $Struct.TasksNotOk -gt '0' ) {
$OutputString += ('{0} / {1} tasks failed! ' -f $Struct.TasksNotOk, $Struct.TasksTotal)
ForEach ($BadTask in $Struct.BadTasks) {
If ( $Struct.FullPath -eq $False ) {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $BadTask.Name, $BadTask.Author, $BadTask.lasttaskresult, $BadTask.lastruntime)
}
Else {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $BadTask.Path, $BadTask.Author, $BadTask.lasttaskresult, $BadTask.lastruntime)
}
}
If ( $Struct.TasksRunning -gt '0' ) {
$OutputString += ('{0} / {1} tasks still running! ' -f $Struct.TasksRunning, $Struct.TasksTotal)
ForEach ( $RunningTask in $Struct.RunningTasks ) {
If ( $Struct.FullPath -eq $False ) {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $RunningTask.Name, $RunningTask.Author, $RunningTask.lasttaskresult, $RunningTask.lastruntime)
}
Else {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $RunningTask.Path, $RunningTask.Author, $RunningTask.lasttaskresult, $RunningTask.lastruntime)
}
}
}
If (( $Struct.AlertOnDisabled -eq $True ) -and ( $Struct.TasksDisabled -gt 0 )) {
$OutputString += ('{0} / {1} tasks disabled! ' -f $Struct.TasksDisabled, $Struct.TasksTotal)
ForEach ( $DisabledTask in $Struct.DisabledTasks ) {
If ( $Struct.FullPath -eq $False ) {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1}))(Last runtime: {2})}} " -f $DisabledTask.Name, $DisabledTask.Author, $DisabledTask.lastruntime)
}
Else {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Last runtime: {2})}} " -f $DisabledTask.Path, $DisabledTask.Author, $DisabledTask.lastruntime)
}
}
}
$OutputString += " | 'Total Tasks'=$($Struct.TasksTotal) 'OK Tasks'=$($Struct.TasksOk);;;0;$($Struct.TasksTotal) 'Failed Tasks'=$($Struct.TasksNotOk);;1;0;$($Struct.TasksTotal) 'Running Tasks'=$($Struct.TasksRunning);;;0;$($Struct.TasksTotal) 'Disabled Tasks'=$($Struct.TasksDisabled);;;0;$($Struct.TasksTotal)"
$Struct.ExitCode = 2
}
Elseif (( $Struct.AlertOnDisabled -eq $True ) -and ( $Struct.TasksDisabled -gt 0 )) {
$OutputString += ('{0} / {1} tasks disabled! ' -f $Struct.TasksDisabled, $Struct.TasksTotal)
ForEach ( $DisabledTask in $Struct.DisabledTasks ) {
If ( $Struct.FullPath -eq $False ) {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1}))(Last runtime: {2})}} " -f $DisabledTask.Name, $DisabledTask.Author, $RunningTask.lastruntime)
}
Else {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Last runtime: {2})}} " -f $DisabledTask.Path, $DisabledTask.Author, $DisabledTask.lastruntime)
}
}
$OutputString += " | 'Total Tasks'=$($Struct.TasksTotal) 'OK Tasks'=$($Struct.TasksOk);;;0;$($Struct.TasksTotal) 'Failed Tasks'=$($Struct.TasksNotOk);;1;0;$($Struct.TasksTotal) 'Running Tasks'=$($Struct.TasksRunning);;;0;$($Struct.TasksTotal) 'Disabled Tasks'=$($Struct.TasksDisabled);;;0;$($Struct.TasksTotal)"
$Struct.ExitCode = 2
}
Else {
$OutputString += ('{0} / {1} tasks ran successfully. ' -f $Struct.TasksOk, $Struct.TasksTotal)
If ($Struct.TasksRunning -gt '0') {
$OutputString += ('{0} / {1} tasks still running! ' -f $Struct.TasksRunning, $Struct.TasksTotal)
ForEach ($RunningTask in $Struct.RunningTasks) {
If ( $Struct.FullPath -eq $False ) {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $RunningTask.Name, $RunningTask.Author, $RunningTask.lasttaskresult, $RunningTask.lastruntime)
}
Else {
$OutputString += ("{{Taskname: `"{0}`" (Author: {1})(Exitcode: {2})(Last runtime: {3})}} " -f $RunningTask.Path, $RunningTask.Author, $RunningTask.lasttaskresult, $RunningTask.lastruntime)
}
}
}
$OutputString += " | 'Total Tasks'=$($Struct.TasksTotal) 'OK Tasks'=$($Struct.TasksOk);;;0;$($Struct.TasksTotal) 'Failed Tasks'=$($Struct.TasksNotOk);;1;0;$($Struct.TasksTotal) 'Running Tasks'=$($Struct.TasksRunning);;;0;$($Struct.TasksTotal) 'Disabled Tasks'=$($Struct.TasksDisabled);;;0;$($Struct.TasksTotal)"
$Struct.ExitCode = 0
}
Write-Host ('{0}' -f $outputString)
Exit $Struct.ExitCode
}
Function Select-TaskInfo {
Param (
[Parameter(Mandatory=$True,ValueFromPipeline=$True,HelpMessage='Task to process')]$InputObject
)
Process {
$ObjTask = New-Object -TypeName PSCustomObject -Property @{
'Name' = $InputObject.name
'Path' = $InputObject.path
'State' = $InputObject.state
'Enabled' = $InputObject.enabled
'LastRunTime' = $InputObject.lastruntime
'LastTaskResult' = $InputObject.lasttaskresult
'NumberOfMissedRuns' = $InputObject.numberofmissedruns
'NextRunTime' = $InputObject.nextruntime
'Author' = ([xml]$InputObject.xml).Task.RegistrationInfo.Author
'UserId' = ([xml]$InputObject.xml).Task.Principals.Principal.UserID
'Description' = ([xml]$InputObject.xml).Task.RegistrationInfo.Description
'Cmd' = ([xml]$InputObject.xml).Task.Actions.Exec.Command
'Params' = ([xml]$InputObject.xml).Task.Actions.Exec.Arguments
}
#setting up things to handle last execution for now checking unit is hour
If ($Struct.LastExec -eq $true) {
$lastExecWarn = (get-date).addHours(-$Struct.WarningTreshold)
$lastExecCrit = (get-date).addHours(-$Struct.CriticalTreshold)
}
#emit warning if last task execution too old
If ( $ObjTask.LastRunTime -lt $lastExecWarn) {
If ($ObjTask.LastRunTime -lt $lastExecCrit) {
#write-host 'Task ' + $ObjTask.name + ' : CRITICAL'
}
Else {
#write-host 'Task ' + $ObjTask.name + ' : WARNING'
}
If ( ! $Struct.InclTasks ) {
If ( ! ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.ExclTasks ) ) {
$Struct.BadTasks += $ObjTask
$Struct.TasksNotOk += 1
}
}
Else {
If ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.InclTasks ) {
$Struct.BadTasks += $ObjTask
$Struct.TasksNotOk += 1
}
}
}
ElseIf ( $ObjTask.LastTaskResult -eq '0'-or $ObjTask.LastTaskResult -eq '0x00041325' -or $ObjTask.LastTaskResult -eq '0x00041306' -or $ObjTask.LastRunTime -lt (get-date 2000-01-01) -and $ObjTask.Enabled ) {
# 0x00041325 => The Task Scheduler service has asked the task to run
# 0x00041306 => The last run of the task was terminated by the user
If ( ! $Struct.InclTasks ) {
If ( ! ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.ExclTasks ) ) {
$Struct.TasksOk += 1
}
}
Else {
If ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.InclTasks ) {
$Struct.TasksOk += 1
}
}
}
ElseIf ( $ObjTask.LastTaskResult -eq '0x8004131F' -or $ObjTask.LastTaskResult -eq '0x00041301' -or $ObjTask.LastTaskResult -eq '0x800710E0' -and $ObjTask.Enabled ) {
# 0x00041301 => The task is currently running
# 0x8004131F => An instance of this task is already running
# 0x800710E0 => The operator or administrator has refused the request
If ( ! $Struct.InclTasks ) {
If ( ! ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.ExclTasks ) ) {
$Struct.RunningTasks += $ObjTask
$Struct.TasksRunning += 1
}
}
Else {
If ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.InclTasks ) {
$Struct.RunningTasks += $ObjTask
$Struct.TasksRunning += 1
}
}
}
ElseIf ( $ObjTask.Enabled ) {
If ( ! $Struct.InclTasks ) {
If ( ! ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.ExclTasks ) ) {
$Struct.BadTasks += $ObjTask
$Struct.TasksNotOk += 1
}
}
Else {
If ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.InclTasks ) {
$Struct.BadTasks += $ObjTask
$Struct.TasksNotOk += 1
}
}
}
Else {
If ( ! $Struct.InclTasks ) {
If ( ! ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.ExclTasks ) ) {
$Struct.DisabledTasks += $ObjTask
$Struct.TasksDisabled += 1
}
}
Else {
If ( Compare-Array -Str $ObjTask.Name -Patterns $Struct.InclTasks ) {
$Struct.DisabledTasks += $ObjTask
$Struct.TasksDisabled += 1
}
}
}
}
}
#endregion Functions
#region Main
If ( $Args ) {
If ( ! ( $Args[0].ToString()).StartsWith('$') ) {
If ( $Args.count -ge 1 ) {
Initialize-Args -Args $Args
}
}
Else {
Write-Host ('CRITICAL: Seems like something is wrong with your parameters: Args: {0}.' -f $Args)
Exit 2
}
}
Search-Tasks
Write-Host 'UNKNOWN: Script exited in an abnormal way. Please debug...'
Exit $Struct.ExitCode
#endregion Main
==== check_print_server_job ====
# Script to check print queues of printers as they are registered on an MS print server
# It checks for current jobs in each printer and the status is decided by the command line arguments the total jobs statuses have priority over individual printers
#
#
# http://www.opensource.org/licenses/gpl-2.0.php
#
# Copyright (c) George Panou panou.g@gmail.com https://github.com/george-panou
#
#.\check_print_server_jobs.ps1
#Sample call : .\check_print_server_jobs.ps1 3 5 7 10 15
#Command line arguments with default values...
param(
[int] $InfoLevel = 2,
[int] $Warning = 5,
[int] $Critical = 7,
[int] $TotalWarning = 10,
[int] $TotalCritical = 20
)
#Write-Output "You specified: $Arguments"
$Result = @(Get-WMIObject Win32_PerfFormattedData_Spooler_PrintQueue | Select Name, @{Expression={$_.jobs};Label="CurrentJobs"}, TotalJobsPrinted, JobErrors)
$InfoLevel -= 1
$Warning -= 1
$Critical -= 1
$TotalWarning -= 1
$TotalCritical -= 1
$OutputNagios = ""
$nl = [Environment]::NewLine
$flag=0
foreach ( $line in $Result ){
$Name=$line.Name
$Jobs=$line.CurrentJobs
$k=0
$l=0
#Write-Output "$Name"
#check each printer
if($Jobs -gt $Warning -and $Name -ne "_Total"){
$warnOut += "$Name : $Jobs, $nl"
if($flag -lt 2){
$flag=1
}
}
elseif($Jobs -gt $Critical -and $Name -ne "_Total"){
$critOut += "$Name : $Jobs, $nl"
$flag=2
}elseif($Jobs -gt $InfoLevel -and $line.Name -ne "_Total"){
$tmpOut += "$Name : $Jobs, $nl"
}
#check total jobs of the print server
if($Name -eq "_Total" -and $Jobs -gt $TotalWarning){
$tmpOut = "Total : $Jobs, $nl" + $tmpOut
if($flag -lt 2){
$flag=1
}
}elseif($Name -eq "_Total" -and $Jobs -gt $TotalCritical){
$tmpOut = "Total : $Jobs, $nl" + $tmpOut
$flag=2
}
elseif($Name -eq "_Total"){
$tmpOut = "Total : $Jobs, $nl" + $tmpOut
}
}
if ($flag -eq 1){
$tmpOut = "Warning : " + $tmpOut
}
elseif ($flag -eq 2){#
$tmpOut = "Critical : " + $tmpOut
}
else{
$tmpOut = "OK : " + $tmpOut
}
$tmpOut = $tmpOut + $critOut
$tmpOut = $tmpOut + $warnOut
Write-Output "$tmpOut"
exit($flag)
==== check_veeam_eventlogs ====
#
# Script name: check_veeam_eventlogs.ps1
# Version: 1.1
# Created on: 6May2015
# Modified on: 24April2018
# Author: Dallas Haselhorst
# Purpose: Check Veeam Backup success or failure via event logs
# Note: this requires PowerShell, however, it does NOT use the Veeam PowerShell plug-in
#
# Copyright:
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public
# License along with this program. If not, see .
#
# Heavily modified from the original script watch-eventlogs.ps1
# written by Aaron Wurthmann (aaron (AT) wurthmann (DOT) com). Nonetheless, thanks Aaron!
#
# Older versions of NCPA used the following format, i.e. the following line can be copied to the $ARG1$ text box.
# -t '' -P -M 'agent/plugin/check_veeam_eventlogs.ps1//'
# Newer versions of NCPA would use the following format. Note the removal of "agent" and the added "s" to plugin
# -t '' -P -M 'plugins/check_veeam_eventlogs.ps1//'
#
# For testing from the Nagios command line, add './check_ncpa.py -H ' to the above line
# ArgBackupJobName is required.
# *** If your backup job name has special characters or spaces, I would suggest removing them! ***
# ArgLastMinutes should be populated with the time to check in minutes, e.g. 60 (for 1 hour), 120 (for 2 hours),
#
# Old Example
# -t 'TokenPass' -P 5693 -M 'agent/plugin/check_veeam_eventlogs.ps1/Management_VMs/24'
# -- above line would check the last 24 hours of Veeam Backup logs for the job named "Management_VMs"
# New Example
# -t 'TokenPass' -P 5693 -M 'plugins/check_veeam_eventlogs.ps1/TS01/24'
# -- above line would check the last 24 hours of Veeam Backup logs for the job named "TS01"
# Pull in arguments
$ArgLogName = "Veeam Backup" # veeam backup event log
$ArgEntryType = 1,2,3,4 # look for critical, error, warning and informational logs
$ArgProviderName = "Veeam MP"
$ArgEventID = 190 # backup job complete event id
$ArgBackupJobName = $args[0]
$ArgLastHours = $args[1]
if (!$ArgBackupJobName) {
write-host "Sorry... at the very least, I need a backup job name."
write-host "Command line usage: check_veeam_eventlogs.ps1 "
write-host "Nagios NCPA usage: agent/plugin/check_veeam_eventlogs.ps1//"
exit
}
# Setting default values if null
if (!$ArgLastHours) { $ArgLastHours = (24) }
if (!$ArgWarningTH) { $ArgWarningTH = 0 }
if (!$ArgCriticalTH) { $ArgCriticalTH = 0 }
if (!$ArgMaxEntries) { $ArgMaxEntries = 50 }
$CriticalErrorResultCount = 0
$WarningResultCount = 0
$InfoResultCount = 0
$EventTypeLoopCount = 0
$LogNameLoopCount = 0
$ProviderNameLoopCount = 0
$EventIDLoopCount = 0
$Properties='Level','Message','ProviderName','TimeCreated','Id'
$Filter = @{
LogName = $ArgLogName
StartTime = (Get-Date).AddHours(-$ArgLastHours)
}
if($ArgProviderName) { $Filter += @{ProviderName = $ArgProviderName } }
if($ArgEventID) { $Filter += @{Id = $ArgEventID } }
if($ArgEntryType) { $Filter += @{Level = $ArgEntryType } }
# -ea SilentlyContinue gets rid of non-terminating error resulting from zero events
$LogEntries = Get-WinEvent -MaxEvents $ArgMaxEntries -FilterHashtable $Filter -ea SilentlyContinue -Oldest | Select-Object -Property $Properties
if ($LogEntries) {
ForEach ($LogEntry in $LogEntries) {
if ($LogEntry.Message.ToString() -like "*Backup Job `'$ArgBackupJobName`'*")
{
$Level=$LogEntry.Level.ToString()
if (($Level -eq 1) -Or ($Level -eq 2)) # find critical and errors
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$CriticalErrorResultCount++
$CriticalErrorResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$CriticalErrorResults
"@
}
elseif ($Level -eq 3) # find warnings
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$WarningResultCount++
$WarningResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$WarningResults
"@
}
else # all that's left, find info (4) messages
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$InfoResultCount++
$InfoResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$InfoResults
"@
}
}
}
}
$Results= @"
$CriticalErrorResults $WarningResults $InfoResults
"@
if ($ArgEntryType) {
$TypeArray = @("all level","critical","error","warning","informational")
$LevelString = foreach ($Entry in $ArgEntryType) {
if ($ArgEntryType.Count -gt 1) {
$LevelStringBuild = $TypeArray[$Entry]
if ($ArgEntryType.Count -ne $EventTypeLoopCount+1) {
$LevelStringBuild +=","
}
}
else { $LevelStringBuild = $TypeArray[$Entry] }
$EventTypeLoopCount++
$LevelStringBuild
}
}
$LogNameString = foreach ($LogNameEntry in $ArgLogName) {
$LogNameStringBuild += $LogNameEntry
if ($ArgLogName.Count -gt 1 -And $ArgLogName.Count -ne $LogNameLoopCount+1) {
$LogNameStringBuild += ", "
}
$LogNameLoopCount++
}
$ProviderNameString = foreach ($ProviderNameEntry in $ArgProviderName) {
$ProviderNameStringBuild += $ProviderNameEntry
if ($ArgProviderName.Count -gt 1 -And $ArgProviderName.Count -ne $ProviderNameLoopCount+1) {
$ProviderNameStringBuild += ", "
}
$ProviderNameLoopCount++
}
$EventIDString = foreach ($EventIDEntry in $ArgEventID) {
$EventIDStringBuild += "$EventIDEntry"
if ($ArgEventID.Count -gt 1 -And $ArgEventID.Count -ne $EventIDLoopCount+1) {
$EventIDStringBuild += ", "
}
$EventIDLoopCount++
}
If ($CriticalErrorResultCount -gt 0) {
$ResultString += "Backup failed: $CriticalErrorResultCount critical error(s) for backup job $ArgBackupJobName in last $ArgLastHours hours "
$NagiosMetricString += "'Errors'=$CriticalErrorResultCount 'BackupUnknown'=1 "
$ExitCode = 1
}
If ($WarningResultCount -gt 0) {
$ResultString += "Warning: backup job $ArgBackupJobName had $WarningResultCount warning message(s) in the last $ArgLastHours hours "
If ($ExitCode -ne 1) {
$NagiosMetricString += "'BackupUnknown'=1 "
$ExitCode = 1
}
$NagiosMetricString += "'Warnings'=$WarningResultCount "
}
If (($InfoResultCount -lt 1) -And ($ExitCode -ne 1)) {
$ResultString += "Backup failed: backup job $ArgBackupJobName has not run in last $ArgLastHours hours "
$NagiosMetricString += "'BackupNotRun'=1 "
If ($ExitCode -ne 1) { $ExitCode = 1 }
}
If (($InfoResultCount -ge 1) -And ($CriticalErrorResultCount -eq 0 ) -And ($WarningResultCount -eq 0 )){
$ResultString += "OK: backup job $ArgBackupJobName completed successfully in last $ArgLastHours hours "
$NagiosMetricString = "'BackupSuccess'=1 "
$ExitCode = 0
}
write-host $ResultString
write-host $Results
write-host $ResultString"|"$NagiosMetricString
exit $ExitCode
==== check_veeam_eventlogs2 ====
#
# Script name: check_veeam_eventlogs.ps1
# Version: 1.1
# Created on: 6May2015
# Modified on: 24April2018
# Author: Dallas Haselhorst
# Purpose: Check Veeam Backup success or failure via event logs
# Note: this requires PowerShell, however, it does NOT use the Veeam PowerShell plug-in
#
# Copyright:
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public
# License along with this program. If not, see .
#
# Heavily modified from the original script watch-eventlogs.ps1
# written by Aaron Wurthmann (aaron (AT) wurthmann (DOT) com). Nonetheless, thanks Aaron!
#
# Older versions of NCPA used the following format, i.e. the following line can be copied to the $ARG1$ text box.
# -t '' -P -M 'agent/plugin/check_veeam_eventlogs.ps1//'
# Newer versions of NCPA would use the following format. Note the removal of "agent" and the added "s" to plugin
# -t '' -P -M 'plugins/check_veeam_eventlogs.ps1//'
#
# For testing from the Nagios command line, add './check_ncpa.py -H ' to the above line
# ArgBackupJobName is required.
# *** If your backup job name has special characters or spaces, I would suggest removing them! ***
# ArgLastMinutes should be populated with the time to check in minutes, e.g. 60 (for 1 hour), 120 (for 2 hours),
#
# Old Example
# -t 'TokenPass' -P 5693 -M 'agent/plugin/check_veeam_eventlogs.ps1/Management_VMs/24'
# -- above line would check the last 24 hours of Veeam Backup logs for the job named "Management_VMs"
# New Example
# -t 'TokenPass' -P 5693 -M 'plugins/check_veeam_eventlogs.ps1/TS01/24'
# -- above line would check the last 24 hours of Veeam Backup logs for the job named "TS01"
# Pull in arguments
$ArgLogName = "Veeam Backup" # veeam backup event log
$ArgEntryType = 1,2,3,4 # look for critical, error, warning and informational logs
$ArgProviderName = "Veeam MP"
$ArgEventID = 490 # backup Copy job complete event id
$ArgBackupJobName = $args[0]
$ArgLastHours = $args[1]
if (!$ArgBackupJobName) {
write-host "Sorry... at the very least, I need a backup job name."
write-host "Command line usage: check_veeam_eventlogs_bck_copy.ps1 "
write-host "Nagios NCPA usage: agent/plugin/check_veeam_eventlogs_bck_copy.ps1//"
exit
}
# Setting default values if null
if (!$ArgLastHours) { $ArgLastHours = (24) }
if (!$ArgWarningTH) { $ArgWarningTH = 0 }
if (!$ArgCriticalTH) { $ArgCriticalTH = 0 }
if (!$ArgMaxEntries) { $ArgMaxEntries = 50 }
$CriticalErrorResultCount = 0
$WarningResultCount = 0
$InfoResultCount = 0
$EventTypeLoopCount = 0
$LogNameLoopCount = 0
$ProviderNameLoopCount = 0
$EventIDLoopCount = 0
$Properties='Level','Message','ProviderName','TimeCreated','Id'
$Filter = @{
LogName = $ArgLogName
StartTime = (Get-Date).AddHours(-$ArgLastHours)
}
if($ArgProviderName) { $Filter += @{ProviderName = $ArgProviderName } }
if($ArgEventID) { $Filter += @{Id = $ArgEventID } }
if($ArgEntryType) { $Filter += @{Level = $ArgEntryType } }
# -ea SilentlyContinue gets rid of non-terminating error resulting from zero events
$LogEntries = Get-WinEvent -MaxEvents $ArgMaxEntries -FilterHashtable $Filter -ea SilentlyContinue -Oldest | Select-Object -Property $Properties
if ($LogEntries) {
ForEach ($LogEntry in $LogEntries) {
if ($LogEntry.Message.ToString() -like "*Backup Copy Job*`'$ArgBackupJobName`'*")
{
$Level=$LogEntry.Level.ToString()
if (($Level -eq 1) -Or ($Level -eq 2)) # find critical and errors
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$CriticalErrorResultCount++
$CriticalErrorResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$CriticalErrorResults
"@
}
elseif ($Level -eq 3) # find warnings
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$WarningResultCount++
$WarningResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$WarningResults
"@
}
else # all that's left, find info (4) messages
{
$Message=$LogEntry.Message.Substring(0,[System.Math]::Min(180, $LogEntry.Message.Length)).TrimEnd().ToString()
$ProviderName=$LogEntry.ProviderName.ToString()
$TimeCreated=$LogEntry.TimeCreated.ToString()
$Id=$LogEntry.Id.ToString()
$InfoResultCount++
$InfoResults=@"
At: $TimeCreated
Level: $Level
Event ID: $Id
Message: $Message
Source: $ProviderName
$InfoResults
"@
}
}
}
}
$Results= @"
$CriticalErrorResults $WarningResults $InfoResults
"@
if ($ArgEntryType) {
$TypeArray = @("all level","critical","error","warning","informational")
$LevelString = foreach ($Entry in $ArgEntryType) {
if ($ArgEntryType.Count -gt 1) {
$LevelStringBuild = $TypeArray[$Entry]
if ($ArgEntryType.Count -ne $EventTypeLoopCount+1) {
$LevelStringBuild +=","
}
}
else { $LevelStringBuild = $TypeArray[$Entry] }
$EventTypeLoopCount++
$LevelStringBuild
}
}
$LogNameString = foreach ($LogNameEntry in $ArgLogName) {
$LogNameStringBuild += $LogNameEntry
if ($ArgLogName.Count -gt 1 -And $ArgLogName.Count -ne $LogNameLoopCount+1) {
$LogNameStringBuild += ", "
}
$LogNameLoopCount++
}
$ProviderNameString = foreach ($ProviderNameEntry in $ArgProviderName) {
$ProviderNameStringBuild += $ProviderNameEntry
if ($ArgProviderName.Count -gt 1 -And $ArgProviderName.Count -ne $ProviderNameLoopCount+1) {
$ProviderNameStringBuild += ", "
}
$ProviderNameLoopCount++
}
$EventIDString = foreach ($EventIDEntry in $ArgEventID) {
$EventIDStringBuild += "$EventIDEntry"
if ($ArgEventID.Count -gt 1 -And $ArgEventID.Count -ne $EventIDLoopCount+1) {
$EventIDStringBuild += ", "
}
$EventIDLoopCount++
}
If ($CriticalErrorResultCount -gt 0) {
$ResultString += "Backup Copy failed: $CriticalErrorResultCount critical error(s) for backup Copy job $ArgBackupJobName in last $ArgLastHours hours "
$NagiosMetricString += "'Errors'=$CriticalErrorResultCount 'BackupUnknown'=1 "
$ExitCode = 1
}
If ($WarningResultCount -gt 0) {
$ResultString += "Warning: backup Copy job $ArgBackupJobName had $WarningResultCount warning message(s) in the last $ArgLastHours hours "
If ($ExitCode -ne 1) {
$NagiosMetricString += "'BackupUnknown'=1 "
$ExitCode = 1
}
$NagiosMetricString += "'Warnings'=$WarningResultCount "
}
If (($InfoResultCount -lt 1) -And ($ExitCode -ne 1)) {
$ResultString += "Backup Copy failed: backup Copy job $ArgBackupJobName has not run in last $ArgLastHours hours "
$NagiosMetricString += "'BackupNotRun'=1 "
If ($ExitCode -ne 1) { $ExitCode = 1 }
}
If (($InfoResultCount -ge 1) -And ($CriticalErrorResultCount -eq 0 ) -And ($WarningResultCount -eq 0 )){
$ResultString += "OK: backup Copy job $ArgBackupJobName completed successfully in last $ArgLastHours hours "
$NagiosMetricString = "'BackupSuccess'=1 "
$ExitCode = 0
}
write-host $ResultString
write-host $Results
write-host $ResultString"|"$NagiosMetricString
exit $ExitCode
==== check_queue_printer ====
#$WARN = $args[0]
#$CRIT = $args[1]
$VAR=Get-WMIObject Win32_PerfFormattedData_Spooler_PrintQueue |Select Name, @{Expression={$_.jobs};Label="CurrentJobs"}, JobErrors -skip 1
foreach ($ligne in $VAR){
if ($ligne.JobErrors -gt "5"){
Write-Output "Jobs queue en Critical $($ligne.Name), JobErrors $($Ligne.JobErrors)"
exit 2
}
elseif ($ligne.CurrentJobs -gt "500"){
Write-Output "Jobs queue en Critical $($ligne.Name), CurrentJobs $($Ligne.CurrentJobs)"
exit 2
}
elseif ($ligne.JobErrors -gt "10"){
Write-Output "Jobs queue en Warning $($ligne.Name), JobErrors $($ligne.JobErrors)"
exit 1
}
elseif ($ligne.CurrentJobs -gt "250"){
Write-Output "Jobs queue en Warning $($ligne.Name), CurrentJobs $($ligne.CurrentJobs)"
exit 1
}
}
Write-Output "Jobs queue OK"
exit 0
==== check_veeam_status ====
# Arguments $Job = Nom du job $Hrs = Depuis combien de temp en Heures
# le script doit être dans: C:\Program Files\NSClient++\scripts
# Exemple .\check-veeam-backup-status.ps1 "S_VMS" "210"
# Dans le nsclient.ini Ajouter juste en dessous de [/settings/external scripts/scripts]:
# check_veeam_backup= cmd /c echo scripts\\check-veeam-backup-status.ps1 "$ARG1$" "$ARG2$"; exit($lastexitcode) | powershell.exe -command -
$Job = $args[0]
$Hrs = $args[1]
$VAR = Get-VBRBackupSession | Where-Object {$_.OrigJobName -eq "$Job"} | Where-Object {$_.creationtime-gt (Get-Date).AddHours(-"$Hrs")} | Select-Object name, result, creationtime, state | sort creationtime –Descending
if ($VAR -eq $null){
Write-Output "Aucun Jobs trouve dans le delais demande"
exit 1
}
foreach ($ligne in $VAR){
if ($ligne.result = "Success"){
Write-Output "Jobs $Job OK $($ligne.name), result: $($Ligne.result), Date: $($Ligne.creationtime)"
exit 0
}
elseif ($ligne.result = "Failed"){
Write-Output "Jobs $Job CRITICAL $($ligne.Name), result: $($Ligne.result), Date: $($Ligne.creationtime)"
exit 2
}
elseif ($ligne.result = "Warning"){
Write-Output "Jobs $Job Warning $($ligne.Name), result $($ligne.result), Date: $($Ligne.creationtime)"
exit 1
}
}
==== CheckIISAppPoolState ====
# +-------------------------------------------------------------------------------
# | File : CheckIISAppPoolState.ps1
# | Version : 1.0
# | Purpose :
# | Template : PowerShellSupervisionTemplate.ps1 - 1.0
# |
# | Synopsis :
# | Usage : .\CheckIISAppPoolState.ps1 -ApplicationPool "AXXXAPPPOOL"
# | Copyright : STELIA Aerospace © 2016, All Rights Reserved
# +-------------------------------------------------------------------------------
# | Maintenance History
# +-------------------------------------------------------------------------------
# | Name | Date | Version | Description
# +------------------|-------------|-----------|----------------------------------
# | Willy LAROCHE | 2016-08-04 | 1.0 | Initial release
# +-------------------------------------------------------------------------------
# | SCRIPT FUNCTIONS
# +--------------------
# | Main ()
# +-------------------------------------------------------------------------------
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,Position=1)]
[string]$ApplicationPool
)
Add-Type -AssemblyName "System"
# EXIT_CODE returned to Supervision
$EXIT_CODE = 3 # Default value
$RESULT_OK = "OK" # => 0
$RESULT_WARNING = "WARNING" # => 1
$RESULT_CRITICAL = "CRITICAL" # => 2
$RESULT_UNKNOWN = "UNKNOWN" # => 3
# Globals
$global:CurrentExecutionPath = (Get-Location).Path
$global:ScriptName = $MyInvocation.MyCommand.Name
$global:ScriptFile = Get-Item $MyInvocation.MyCommand.Definition
$global:ScriptFilePath = split-path -parent $MyInvocation.MyCommand.Definition
# Other Variables
$global:resultString = $null
#*=============================================================================
#* MAIN SCRIPT BODY
#*=============================================================================
Function Main {
param ()
$result = $RESULT_UNKNOWN # Default value
$status = $RESULT_UNKNOWN
$perfData = $null
try {
[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" ) > $null
$servermanager = [Microsoft.Web.Administration.ServerManager]::OpenRemote("localhost")
if ($servermanager.ApplicationPools.Count -eq 0) {
throw "Application Pool is not found"
}
$appPools = $servermanager.ApplicationPools["$ApplicationPool"]
$iis=get-itemproperty HKLM:\SOFTWARE\Microsoft\InetStp\ | select setupstring
if ($appPools -ne $null) {
$status = $appPools.state
if ($status -eq "Started") {
$result = $RESULT_OK
}
else {
$result = $RESULT_CRITICAL
}
}
$resultString = ("{0}: {1}: {2}" -f $result, $ApplicationPool, $status)
# $perfData = ("'{0}'={1}" -f $CounterName, $counterValue)
# $resultString += " | " + $perfData
write-host $resultString
# $resultString = ("IIS Application Pool '{0}': [{1}] | Status: {2} | {3} " -f $ApplicationPool, $result, $status, $iis.SETUPSTRING)
# write-host $resultString
}
catch {
$resultString = ("Error: {0} ({1}) " -f $_.Exception.Message, $_.Exception.GetType().FullName)
$resultString += ("Detail: {0} " -f $_.Exception.ToString())
write-host $resultString -foreground red
$result = $RESULT_CRITICAL
}
return $result
}
#*=============================================================================
#* Call Main Method
#*=============================================================================
$result_code = Main
switch($result_code){
$RESULT_OK { $EXIT_CODE = 0 }
$RESULT_WARNING { $EXIT_CODE = 1 }
$RESULT_CRITICAL { $EXIT_CODE = 2 }
$RESULT_UNKNOWN { $EXIT_CODE = 3 }
default { $EXIT_CODE = 3 }
}
exit $EXIT_CODE
==== CheckIISCounter ====
# +-------------------------------------------------------------------------------
# | File : CheckIISCounter.ps1
# | Version : 1.0
# | Purpose :
# | Template : PowerShellSupervisionTemplate.ps1 - 1.0
# |
# | Synopsis :
# | Usage : .\CheckIISCounter.ps1 -Server "AXXXAPPPOOL" -Website "IIS_EXXXX" -CounterName "Current Connections" -Warning_value 10 -Critical_value 20
# | Other Counters : "Current Connections"
# | "Bytes Sent/sec"
# | "Bytes Received/sec"
# | "Total Method Requests/sec"
# | "..."
# |
# | Copyright : STELIA Aerospace © 2016, All Rights Reserved
# +-------------------------------------------------------------------------------
# | Maintenance History
# +-------------------------------------------------------------------------------
# | Name | Date | Version | Description
# +------------------|-------------|-----------|----------------------------------
# | Willy LAROCHE | 2016-08-04 | 1.0 | Initial release
# +-------------------------------------------------------------------------------
# | SCRIPT FUNCTIONS
# +--------------------
# | Main ()
# +-------------------------------------------------------------------------------
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$Server,
[Parameter(Mandatory=$True,Position=2)]
[string]$Website,
[Parameter(Mandatory=$True,Position=3)]
[string]$CounterName,
[Parameter(Mandatory=$True,Position=4)]
[int]$Warning_value,
[Parameter(Mandatory=$True,Position=5)]
[int]$Critical_value
)
Add-Type -AssemblyName "System"
# EXIT_CODE returned to Supervision
$EXIT_CODE = 3 # Default value
$RESULT_OK = "OK" # => 0
$RESULT_WARNING = "WARNING" # => 1
$RESULT_CRITICAL = "CRITICAL" # => 2
$RESULT_UNKNOWN = "UNKNOWN" # => 3
# Globals
$global:CurrentExecutionPath = (Get-Location).Path
$global:ScriptName = $MyInvocation.MyCommand.Name
$global:ScriptFile = Get-Item $MyInvocation.MyCommand.Definition
$global:ScriptFilePath = split-path -parent $MyInvocation.MyCommand.Definition
# Other Variables
$global:resultString = $null
#*=============================================================================
#* MAIN SCRIPT BODY
#*=============================================================================
Function Main {
param ()
$result = $RESULT_UNKNOWN # Default value
$perfData = $null
try {
Import-Module WebAdministration
$counter = Get-Counter "\\$Server\Web Service($Website)\$CounterName"
if ($counter -ne $null) {
$counterValue = $counter.CounterSamples.CookedValue
if ($counterValue -gt $Critical_value) {
$result = $RESULT_CRITICAL
}
elseif ($counterValue -gt $Warning_value) {
$result = $RESULT_WARNING
}
else {
$result = $RESULT_OK
}
$resultString = ("{0}: {2}: {3}" -f $result, $Website, $CounterName, $counterValue)
}
$perfData = ("'{0}'={1}" -f $CounterName, $counterValue)
$resultString += " | " + $perfData
write-host $resultString
}
catch {
$resultString = ("Error: {0} ({1}) " -f $_.Exception.Message, $_.Exception.GetType().FullName)
$resultString += ("Detail: {0} " -f $_.Exception.ToString())
write-host $resultString -foreground red
$result = $RESULT_CRITICAL
}
return $result
}
#*=============================================================================
#* Call Main Method
#*=============================================================================
$result_code = Main
switch($result_code){
$RESULT_OK { $EXIT_CODE = 0 }
$RESULT_WARNING { $EXIT_CODE = 1 }
$RESULT_CRITICAL { $EXIT_CODE = 2 }
$RESULT_UNKNOWN { $EXIT_CODE = 3 }
default { $EXIT_CODE = 3 }
}
exit $EXIT_CODE
==== CheckIISWebsiteState ====
# +-------------------------------------------------------------------------------
# | File : CheckIISWebsiteState.ps1
# | Version : 1.0
# | Purpose :
# | Template : PowerShellSupervisionTemplate.ps1 - 1.0
# |
# | Synopsis :
# | Usage : .\CheckIISWebsiteState.ps1 -Website "IIS_EXXX"
# | Copyright : STELIA Aerospace © 2016, All Rights Reserved
# +-------------------------------------------------------------------------------
# | Maintenance History
# +-------------------------------------------------------------------------------
# | Name | Date | Version | Description
# +------------------|-------------|-----------|----------------------------------
# | Willy LAROCHE | 2016-08-04 | 1.0 | Initial release
# +-------------------------------------------------------------------------------
# | SCRIPT FUNCTIONS
# +--------------------
# | Main ()
# +-------------------------------------------------------------------------------
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,Position=1)]
[string]$Website
)
Add-Type -AssemblyName "System"
# EXIT_CODE returned to Supervision
$EXIT_CODE = 3 # Default value
$RESULT_OK = "OK" # => 0
$RESULT_WARNING = "WARNING" # => 1
$RESULT_CRITICAL = "CRITICAL" # => 2
$RESULT_UNKNOWN = "UNKNOWN" # => 3
# Globals
$global:CurrentExecutionPath = (Get-Location).Path
$global:ScriptName = $MyInvocation.MyCommand.Name
$global:ScriptFile = Get-Item $MyInvocation.MyCommand.Definition
$global:ScriptFilePath = split-path -parent $MyInvocation.MyCommand.Definition
# Other Variables
$global:resultString = $null
#*=============================================================================
#* MAIN SCRIPT BODY
#*=============================================================================
Function Main {
param ()
$result = $RESULT_UNKNOWN # Default value
$status = $RESULT_UNKNOWN
$perfData = $null
try {
[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" ) > $null
$servermanager = [Microsoft.Web.Administration.ServerManager]::OpenRemote("localhost")
if ($servermanager.Sites.Count -eq 0) {
throw "Website is not found"
}
$site= $servermanager.Sites["$Website"]
$iis=get-itemproperty HKLM:\SOFTWARE\Microsoft\InetStp\ | select setupstring
if ($site -ne $null) {
$status= $site.State
if ($status -eq "Started") {
$result = $RESULT_OK
}
elseif ($status -eq $null) {
$status = "Website exists but has no state"
$result = $RESULT_CRITICAL
}
else {
$result = $RESULT_CRITICAL
}
}
$resultString = ("{0}: {1}: {2}" -f $result, $Website, $status)
# $perfData = ("'{0}'={1}" -f $CounterName, $counterValue)
# $resultString += " | " + $perfData
# $resultString = ("IIS Website '{0}': [{1}] | Status: {2} | {3} " -f $Website, $result, $status, $iis.SETUPSTRING)
write-host $resultString
}
catch {
$resultString = ("Error: {0} ({1}) " -f $_.Exception.Message, $_.Exception.GetType().FullName)
$resultString += ("Detail: {0} " -f $_.Exception.ToString())
write-host $resultString -foreground red
$result = $RESULT_CRITICAL
}
return $result
}
#*=============================================================================
#* Call Main Method
#*=============================================================================
$result_code = Main
switch($result_code){
$RESULT_OK { $EXIT_CODE = 0 }
$RESULT_WARNING { $EXIT_CODE = 1 }
$RESULT_CRITICAL { $EXIT_CODE = 2 }
$RESULT_UNKNOWN { $EXIT_CODE = 3 }
default { $EXIT_CODE = 3 }
}
exit $EXIT_CODE
==== CollectIISCounter ====
<#
UNKNOWN - not found
OK - connections
warning - current connections greater than warning value
critical - current connection greater than critical value
#>
#requires -runasadministrator
#
# Shell arguments
#
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$server,
[Parameter(Mandatory=$True,Position=2)]
[string]$website,
[Parameter(Mandatory=$True,Position=3)]
[string]$counterName,
[Parameter(Mandatory=$True,Position=4)]
[int]$warning_value,
[Parameter(Mandatory=$True,Position=5)]
[int]$critical_value
)
Set-Variable OK 0 -option Constant
Set-Variable WARNING 1 -option Constant
Set-Variable CRITICAL 2 -option Constant
Set-Variable UNKNOWN 3 -option Constant
#
# ASK STATUS
#
Import-Module WebAdministration
$counter = Get-Counter "\\$server\Web Service($website)\$counterName"
# Nagios output
$resultstring=$counterName + ' UNKNOWN ' + $website + ' not found'
$exit_code = $UNKNOWN
if ($counter -ne $null) {
$counterValue=$counter.CounterSamples.CookedValue
if ($counterValue -gt $critical_value) {
$status_str= 'COUNTER CRITICAL '+ $website + ' '+$counterName+'= '+ $counterValue
$exit_code = $CRITICAL
}
elseif ($counterValue -gt $warning_value) {
$status_str= 'COUNTER WARNING '+ $website +' '+$counterName+' '+ $counterValue
$exit_code = $WARNING
}
else{
$status_str= 'COUNTER OK '+ $website +' '+$counterName+' '+ $counterValue
$exit_code = $OK
}
$perf_data= $counterName+"=" + $counterValue + ';' + $warning_value + ';' + $critical_value + "; "
$resultstring= "$status_str | $perf_data "
}
Write-Host $resultstring
exit $exit_code
==== kill_memory ====
#################
# Charge Memory #
#################
# Variable
$f = "c:\temp\fichier.txt"
$e = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
# Nombre d'ajout du text $e dans le fichier $f
$i=1
do {
Add-Content -Path $f -value $e -Force
$i++
} while ($i -le 15000)
# nombre d'execution du fichier $f
$s=1
do {
start $f
$s++
} while ($s -le 150)
# Recherche et arret du processe notepad.
if ( Get-Process -Name "notepad" )
{ Stop-Process -Name "notepad" }
# principe: executer en masse le fichier.txt pour monter en charge la mémoire virtuel et la liberé par un kill process basique.
# attention une charge trop importante peu faire planter la machine.
# à vos risques est périle.
==== remote_ping.bat ====
@ECHO OFF
SETLOCAL
REM ####### ENSURE ALL REQUIRED INFO IS PRESENT --UNIX VAR--######
@ECHO %1%2%3%4%5%6|FIND "ARG"
IF NOT ERRORLEVEL 1 GOTO MSEOF
REM ####### ENSURE ALL REQUIRED INFO IS PRESENT --WIN VAR--######
IF "%1"=="" GOTO MSEOF
IF "%2"=="" GOTO MSEOF
IF "%3"=="" GOTO MSEOF
IF "%4"=="" GOTO MSEOF
IF "%5"=="" GOTO MSEOF
IF "%6"=="" GOTO MSEOF
REM PAUSE
@ECHO %4 |FIND "%%%"
IF NOT ERRORLEVEL 1 GOTO MSEOF
@ECHO %6 |FIND "%%%"
IF NOT ERRORLEVEL 1 GOTO MSEOF
REM ####### ASSIGN EACH TO A VARIABLE TO REFERENCE IT LATER..######
SET IP=%1
SET PKT=%2
SET WRTA=%3
SET WPL=%4
SET CRTA=%5
SET CPL=%6
REM ######## CAPTURE FRESH DATA TO A FILE #######
REM 20120920 TO AVOID COLLISIONS DURING CONCURRENT CALLS CREATE A SEMI-RANDOM FILE NAME
SET RANDOMFILENAME=%RANDOM%-%1-TMP
@ECHO ->%RANDOMFILENAME%
PING %IP% -n %PKT% >>%RANDOMFILENAME%
REM ######## PICKOUT THE DATA WE NEED FROM THE FILE #######
FOR /F "TOKENS=11 DELIMS= " %%K IN ('findstr /c:"Lost" %RANDOMFILENAME%') DO SET LST=%%K
IF ERRORLEVEL 1 GOTO TIMEOUT
FOR /F "TOKENS=9 DELIMS= " %%K IN ('findstr /c:"Average" %RANDOMFILENAME%') DO SET AVG=%%K
REM PAUSE
DEL /Q %RANDOMFILENAME%
REM ######## TRIM THE VARIABLES...####
SET AVG=%AVG:M=%
SET AVG=%AVG:S=%
:TIMEOUT
SET LST=%LST:(=%
SET LST=%LST:~0,-1%
REM ######## NOW THE FUN STUFF, COMPARE THE WARNING, CRITICAL VALUES..####
IF %LST% GEQ %CPL% GOTO CPL-2
IF %AVG% GEQ %CRTA% GOTO CRTA-2
IF %LST% GEQ %WPL% GOTO WPL-1
IF %AVG% GEQ %WRTA% GOTO WRTA-1
REM PAUSE
GOTO OK-0
:CPL-2
@ECHO REMOTE CONNECTION TO %IP% IS DOWN: LOSS=%LST%%% (%PKT% PKTS)^|rta=%CRTA%;%WRTA% pl=%LST%%%;%WPL%;%CPL%
REM GOTO EOF
@EXIT 2
:CRTA-2
@ECHO REMOTE CONNECTION TO %IP% IS DOWN: LOSS=%LST%%%, AVE=%AVG%ms (%PKT% PKTS)^|rta=%AVG%ms;%WRTA%;%CRTA% pl=%LST%%%;%WPL%;%CPL%
REM GOTO EOF
@EXIT 2
:WPL-1
@ECHO REMOTE CONNECTION TO %IP% IS SLOW: LOSS=%LST%%%, AVE=%AVG%ms (%PKT% PKTS)^|rta=%WRTA%;%CRTA% pl=%LST%%%;%WPL%;%CPL%
REM GOTO EOF
@EXIT 1
:WRTA-1
@ECHO REMOTE CONNECTION TO %IP% IS SLOW: LOSS=%LST%%%, AVE=%AVG%ms (%PKT% PKTS)^|rta=%AVG%ms;%WRTA%;%CRTA% pl=%LST%%%;%WPL%;%CPL%
REM GOTO EOF
@EXIT 1
:OK-0
@ECHO REMOTE CONNECTION TO %IP% IS UP: LOSS=%LST%%%, AVE=%AVG%ms (%PKT% PKTS)^|rta=%AVG%ms;%WRTA%;%CRTA% pl=%LST%%%;%WPL%;%CPL%
REM GOTO EOF
@EXIT 0
:MSEOF
@ECHO USAGE:PING_REMOTE ^ ^^,^ ^,^
@ECHO EXAMPLE: /USR/LOCAL/NAGIOS/LIBEXEC/CHECK_NRPE -H 172.19.48.139 -C PING_REMOTE -T 90 -A 172.19.88.30 65 450,1 700,5 (FROM NAGIOS SVR.)
@ECHO : PING_REMOTE 192.168.0.1 5 200,1 400,10 (FROM A LOCAL WIN WKS WHERE PING_REMOTE.BAT RESIDES)
@ECHO : (WPL\CPL ARE IN PERCENT, WITHOUT THE "%%%" SYMBOL!!)
REM GOTO EOF
@EXIT 0
:EOF
==== Exchange ====
- Exchange-serverCertificate
# Exchange 2013 Server Certificat
#
$status = 0
$descr=""
$date= Get-Date
add-pssnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$GetCrt = Get-ExchangeCertificate | Where-Object {$_.Status -ne "Valid"}
foreach ( $item in $GetCrt ){
$status = 2
#$NameCrt = $item.DnsNameList
$NameCrt = $item.Subject
$NameCrt2 = $NameCrt.Punycode
$DateCrt = $item.NotAfter
$ValidCrt = $item.Status
$descr = "$descr Certificat: $NameCrt (Due Date: $DateCrt) ,`n"
if ($DateCrt -lt $date ){
$status = 1
}
}
switch ($status)
{
0 {"OK: Tous les certificats sont valides."}
1 {"CRITICAL: Certificat expire: `n $descr"; $status =2}
2 {"CRTICIAL: Certificat '$NameCrt' invalide "}
}
exit $status
- Exchange-serverComponentHealth
# Exchange 2013 Server Component Health Check
#
Param(
[string]$ExchServ
)
$status = 0
add-pssnapin Microsoft.Exchange.Management.PowerShell.SnapIn
#Get-ServerComponentState -Identity $ExchServ | Where-Object { $_.State -ne "Active" } | Where-Object { $_.Component -ne "ForwardSyncDaemon" } | Where-Object { $_.Component -ne "ProvisioningRps" }
$SSE2 = Get-ServerComponentState -Identity $ExchServ | Where-Object { $_.State -ne "Active" } | Where-Object { $_.Component -ne "ForwardSyncDaemon" } | Where-Object { $_.Component -ne "ProvisioningRps" }
Get-ServerComponentState -Identity $ExchServ | Where-Object { $_.State -ne "Active" } | Where-Object { $_.Component -ne "ForwardSyncDaemon" } | Where-Object { $_.Component -ne "ProvisioningRps" } | Export-Csv -Path C:\Temp\LogExch\TempSRVC.csv -Delimiter ";"
$SSE223 = $SSE2.State
$ImptpsCSV = Import-Csv -Path C:\Temp\LogExch\TempSRVC.csv -Delimiter ";"
if ( $SSE223 -eq "Inactive" ) {
# At least one health check is inactive
$status=2
foreach ( $Srvc in $ImptpsCSV ){
$Name = $Srvc.Component}
$desc = "$Name checks is KO"
}
if ($status -eq "2") {
Write-Host "CRITICAL: $desc"
} elseif ($status -eq "0") {
Write-Host "All Service Active for $ExchServ"
}
exit $status
- Exchange-serverDB
# Exchange 2013 Server DB
#
<#Param(
[string]$ServerExch
)
#>
$status = 0
$descr = ""
add-pssnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$GetDB = Get-MailboxDatabase | Where-Object {$_.IsValid -ne "True"}
foreach ( $item in $GetDB ){
$status = 2
$ID = $Item.Name
$descr = "$descr DB: $ID is not Valid ,"
}
if ( $status -ne 0 ) {
Write-Host "CRITICAL: $descr"
}
else {
Write-Host "OK: Toutes les bases sont valides."
}
exit $status
- Exchange-serverPoolIIS
# Exchange 2013 Server Pool IIS
#
Param(
[string]$ExchServ
)
$status = 0
add-pssnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Invoke-Command -ComputerName $ExchServ -ScriptBlock {
$POOL = Get-WebAppPoolState | select ItemXPath,Value | Where-Object { $_.Value -ne "Started" } | Where-Object { $_.ItemXPath -ne "/system.applicationHost/applicationPools/add[@name='.NET v4.5']" } | Where-Object { $_.ItemXPath -ne "/system.applicationHost/applicationPools/add[@name='.NET v4.5 Classic']" }
Clear-Content c:\temp\ResultPoolIIS.txt -ErrorAction SilentlyContinue
if ( $POOL -ne $Null ){
Add-Content -Path c:\temp\ResultPoolIIS.txt -Value "Nom du pool:" }
foreach ( $item in $POOL ) {
$item1 = $item.ItemXPath
$Name = ($item1.split("'")[1])
Add-Content -Path c:\temp\ResultPoolIIS.txt -Value "$Name"
}
}
$PoolLog = Get-Content -Path "\\$ExchServ\C$\temp\ResultPoolIIS.txt" -ErrorAction SilentlyContinue
if ( $PoolLog -ne $Null ) {
$status =2
Write-Host "CRITICAL: Pool problematique sur le serveur $ExchServ : $PoolLog"
}
else {
Write-Host "OK: Pas de Pool problematique sur le serveur $ExchServ"
}
exit $status