# Altaro Backup Monitoring
#-------------------
# ------------------
param(
[string]$ComputerName
)
$ret = Invoke-Command -ComputerName $ComputerName -ScriptBlock {
$Yesterday = ((Get-Date) - (New-TimeSpan -Day 1))
[int]$retvalue = 0
try {
$Geteventlog = (Get-WinEvent -ErrorAction Stop -FilterHashtable @{LogName='Application';StartTime=$Yesterday;Id=5000,5005,5007,5002})
} catch {
$_.Exception.GetType().FullName
$Geteventlog_Success = "0"
}
for($i = 0 ; $i -le $Geteventlog_Success.Length; $i++){
$Id = $Geteventlog_Success[$i].Id
$Message = $Geteventlog_Success[$i].Message
Switch ($Id) {
"5007" { Write-Host "2:Backups NOT OK"
$retvalue = 2;
Exit 2}
"5000" { Write-Host "0:Backups OK"
$retvalue = 0;
}
"5001" {
Write-Host "1:Backup Completed With Warnings"
$retvalue = 1
Exit 1
}
"5002" { Write-Host "2:Backups NOT OK"
$retvalue = 2;
Exit 2 }
"5005" { Write-Host "0:Backups OK"
$retvalue = 0;}
"0" { Write-Host "2:No Backups Last 24 hours"; $retvalue = 2; Exit 2}
}
}
return $retvalue
}
This Always gives me back "Backups not OK" but the state stays on up and not DOWN of the sensor. When a backup fails i need the sensor to go down.
Article Comments
Hi,
I changed this towards and Advanced sensor. And then it works. Only one small issue now.. When it goes in to result 0 i get the error channel is not defined...
# Altaro Backup Monitoring
#-------------------
# ------------------
param(
[string]$ComputerName
)
$ret = Invoke-Command -ComputerName $ComputerName -ScriptBlock {
$Yesterday = ((Get-Date) - (New-TimeSpan -Day 1))
try {
$Geteventlog_Success = (Get-WinEvent -ErrorAction Stop -FilterHashtable @{LogName='Application';StartTime=$Yesterday;Id=5000,5005,5007,5002})
} catch {
$_.Exception.GetType().FullName
$Geteventlog_Success = "0"
}
for($i = 0 ; $i -le $Geteventlog_Success.Length; $i++){
$Id = $Geteventlog_Success[$i].Id
$Message = $Geteventlog_Success[$i].Message
Switch ($Id) {
"5007" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 2
}
"5002" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 2 }
"5001" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<error>2</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 1
}
"5000" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<result>0</result>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 0
}
"5005" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 0
}
"0" {
write-host "<prtg>"
write-host "<channel>Backup</channel>"
write-host "<error>1</error>"
write-host "<text>No Backups last 24 hours</text>"
write-host "</prtg>"
}
}
}
}
Mar, 2020 - Permalink
Hi Bart,
Please note that you defined a channel but no result. However, if you want to transmit only a error state, you don't need to enter a certain channel since the error state is always for the entire Sensor.
In addition, I mentioned that you entered "2" in "5001". Please note this is no valid error state. For more detailed information, please take a look at this article.
Mar, 2020 - Permalink
I tried to change this towards an simple EXE sensor.
# Altaro Backup Monitoring
#-------------------
# ------------------
param(
[string]$ComputerName
)
$ret = Invoke-Command -ComputerName "S-TEC-MGMT" -ScriptBlock {
$Yesterday = ((Get-Date) - (New-TimeSpan -Day 1))
try {
$Geteventlog_Success = (Get-WinEvent -ErrorAction Stop -FilterHashtable @{LogName='Application';StartTime=$Yesterday;Id=5000,5001,5005,5007,5002})
} catch {
$_.Exception.GetType().FullName
$Geteventlog_Success = "0"
}
for($i = 0 ; $i -le $Geteventlog_Success.Length; $i++){
$Id = $Geteventlog_Success[$i].Id
$Message = $Geteventlog_Success[$i].Message
Switch ($Id) {
"5007" {
write-host 2:$Message
Exit 2
}
"5002" {
write-host 2:$Message
Exit 2
}
"5001" {
write-host 1:$Message
Exit 1
}
"0" {
write-host 2:$Message
Exit 2
}
default {
write-host 0:$Message
Exit 0
}
}
}
}
But now it does not Exit with 1 ? and PRTG says the sensor is up ? And i want to display a warning. Error 5001 is triggerd.
Mar, 2020 - Permalink
Hi Bart,
Please note that you set the IDs in the Switch clause in quotes. As a result, powershell interprets it as a string and not as a integer. Therefore, the default clause is always triggered.
Mar, 2020 - Permalink
So i Decided to do a complete overhaul of the script and the functionality is OK. But i have 1 question with baffles me at this time because i can not seem to understand the way PRTG handels EXIT 1 and error values.
Situation. Lets say the backup has a warning ( Event log ID: 5001) -> Exit 1 -> But The sensor in PRTG says Down. Is theire a way that i can tell PRTG when it exits with 1 it only displays a warning and not the value "Down" ?
# Altaro Backup Monitoring
#-------------------
# ------------------
param(
[string]$ComputerName
)
$ret = Invoke-Command -ComputerName S-TEC-MGMT -ScriptBlock {
$Yesterday = ((Get-Date) - (New-TimeSpan -Day 1))
try {
$Geteventlog_Success = (Get-WinEvent -ErrorAction Stop -FilterHashtable @{LogName='Application';StartTime=$Yesterday;Id=5000,5001,5005,5007,5002})
}
catch {
$_.Exception.GetType().FullName
$Geteventlog_Success = 0
}
$array_Successfull = @()
$array_Failed = @()
$array_FailedOffsite = @()
$array_Warning = @()
$array_SuccessfullOffsite = @()
for($i = 0 ; $i -le $Geteventlog_Success.Length; $i++){
$Id = $Geteventlog_Success[$i].Id
Switch ($Id) {
5007 {
$array_FailedOffsite += $Geteventlog_Success[$i]
}
5002 {
$array_Failed += $Geteventlog_Success[$i]
}
5001 {
$array_Warning += $Geteventlog_Success[$i]
}
5005 {
$array_SuccessfullOffsite += $Geteventlog_Success[$i]
}
5000 {
$array_Successfull += $Geteventlog_Success[$i]
}
0 {
write-host "<prtg>"
write-host "<error>1</error>"
write-host "<text>No Backups for the last 24 hours</text>"
write-host "</prtg>"
Exit 2
}
}
}
if($array_FailedOffsite -ne " "){
for ($j = 0; $j -le $array_FailedOffsite.Length; $j++){
$Id2 = $array_FailedOffsite[$j].Id
$Message = $array_FailedOffsite[$j].Message
if ($Id2 = 5007) {
write-host "<prtg>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 2
}
}
}
if($array_Failed -ne " "){
for ($k = 0; $k -le $array_Failed.Length; $k++){
$Id3 = $array_Failed[$k].Id
$Message = $array_Failed[$k].Message
if ($Id3 = 5002) {
write-host "<prtg>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 2
}
}
}
if($array_Warning -ne " "){
for ($l = 0; $l -le $array_Warning.Length; $l++){
$Id4 = $array_Warning[$l].Id
$Message = $array_Warning[$l].Message
if ($Id4 = 5001) {
write-host "<prtg>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 1
}
}
}
if($array_Successfull -ne " "){
for ($m = 0; $m -le $array_SuccessfullOffsite.Length; $m++){
$Id5 = $array_SuccessfullOffsite[$m].Id
$Message = $array_SuccessfullOffsite[$m].Message
if ($Id5 = 5005) {
write-host "<prtg>"
write-host "<error>1</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 0
}
}
}
if($array_Successfull -ne " " ) {
for ($n = 0; $n -le $array_Successfull.Length; $n++){
$Id6 = $array_Successfull[$n].Id
$Message = $array_Successfull[$n].Message
if ($Id6 = 5000) {
write-host "<prtg>"
write-host "<error>0</error>"
write-host "<text>$Message</text>"
write-host "</prtg>"
Exit 0
}
}
}
}
Mar, 2020 - Permalink
Hi Bart,
The exit codes are only for the normal EXE/Script Sensor and not for the EXE/Script Advanced Sensor. If you want to trigger a warning in the advanced Sensor, you can use the "<Warning>" option. For example
Write-host "<prtg>"
Write-Host "<result>"
Write-Host "<channel>First channel</channel>"
Write-Host "<value>10</value>"
write-host "<Warning>1</Warning>"
Write-Host "</result>"
write-host "</prtg>"
Mar, 2020 - Permalink
is it also possible to pass through variables ?
So we can still see what failed in the sensor details ?
Like:
write-host "<prtg>"
Write-Host "<result>"
Write-Host "<channel>Backuo</channel>"
Write-Host "<value>10</value>"
write-host "<Warning>1</Warning>"
Write-Host "</result>"
Write-Host "<text>$Message</text>"
write-host "</prtg>"
Mar, 2020 - Permalink
Hi Bart,
Yes this is possible. I added this option to my example here:
$message="Place your text here"
write-host "<prtg>"
Write-Host "<result>"
Write-Host "<channel>First channel</channel>"
Write-Host "<value>10</value>"
write-host "<Warning>1</Warning>"
Write-Host "</result>"
write-host "<Text>$message</Text>"
write-host "</prtg>"
Mar, 2020 - Permalink
Hi BartTechne,
Did you also assign corresponding limits in the Sensor?
Mar, 2020 - Permalink