I have a need to review a web pages contents to find out if a particular service is running. The only identifier which specifies if the service is active or not is a HTML Label, so there is no string on the page to read.
Is there a known script which can read a HTML object in the source and return whether the string contains "Running" to prtg?
Article Comments
Thank you Dariusz,
I have added the pages source to pastebin: https://pastebin.com/2xs5wEH6
I've set it to be active for a week...
The object we are looking for is label id="status" found in div id="container-content-source". We want to identify the string within the tags. If ="Running", everything is OK. If ="Completed", service is not active and must be reviewed.
However, as I have been digging through the source, I discovered the div id="container-content-source" object is entirely dynamic and doesn't exist in the actual HTML file source but only in the active source in the web browser.
Regards, Gary
May, 2017 - Permalink
Hi Gary,
Please try the following script in PowerShell first. It should result in:
<prtg>
<result>
<channel>HTTP Status Code</channel>
<value>200</value>
<float>0</float>
<unit>CustomUnit</unit>
<customunit>HTTP</customunit>
</result>
<text>Keyword "Running" found, as expected!</text>
</prtg>
Afterwards just add the Custom Sensor to the following directory on your PRTG Core Server or/and your Remote Probes Server: C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\. Add a "EXE/Script Advanced Sensor" in PRTG and use the following parameters:
| -url "<URL-TO-THE-WEBSITE>" |
| -keyword "<KEYWORD TO LOOK FOR (Default: Running)>" |
The script:
# ____ ____ ____________
# / __ \/ __ \/_ __/ ____/
# / /_/ / /_/ / / / / / __
# / ____/ _, _/ / / / /_/ /
#/_/ /_/ |_| /_/ \____/
# NETWORK MONITOR
#-------------------
#(c) 2017 Dariusz Gorka, Paessler AG
#
# Checks certain website for keyword.
#
# Parameter "-url" for the URL of the website
# Parameter "-keyword" for the keyword that has to be available
param(
$url="http://my-computer/test.html",
$keyword="Running"
)
$regex_status = "(<label id=.status. class=.pull-right.*.>)(.*)(</label>\s+</div>\s+<div class=.content-source-statistics.>)"
$site = Invoke-WebRequest -Uri $url -UseBasicParsing
$site_content = $site.Content
$site_statuscode = $site.StatusCode
$site_result = $site_content -match $regex_status
$site_result = $matches[2]
if($site_result -eq $keyword){
$keyword_found = $true
} else {
$keyword_found = $false
}
Write-Host @"
<prtg>
<result>
<channel>HTTP Status Code</channel>
<value>$site_statuscode</value>
<float>0</float>
<unit>CustomUnit</unit>
<customunit>HTTP</customunit>
</result>
"@
if($keyword_found){
Write-Host @"
<text>Keyword "$keyword" found, as expected!</text>
"@
} else {
Write-Host @"
<text>Keyword not found, found "$site_result" instead!</text>
<error>1</error>
"@
}
Write-Host "</prtg>"
Best regards
May, 2017 - Permalink
Hi Dariusz,
I really appreciate your help here.
When running the script in Powershell, it breaks with the following error:
Cannot index into a null array. At U:\Scripting\Scripts\PRTG-Find-Web-page-keyword.ps1:28 char:1 + $site_result = $matches[2] + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArray
I assume this is because the query is unable to pick up the $regex_status value on the page, possibly? Could this be down to the content being dynamic?
Regards, Gary
May, 2017 - Permalink
Hi Dariusz,
When calling $site.content outside of the running script, it returns 20,000 lines of numbers that appear to be pretty random, like below:
60 33 68 79 67 84 89 80 69 32 72 84 77 76 32 80 85 66 76 73 ...
I guess this is why $Matches ends up empty as $site_result = $site_content -match $regex_status does not find the string in the content.
Any ideas why this may be?
Thanks and Regards, Gary
May, 2017 - Permalink
Hi Gary,
What kind of site is this? Is it a normal HTML/PHP Site or some Java application? The thousands lines of numbers indicates that PRTG queried some kind of file or executable instead of a normal webpage.
What exact URL are you using in the "-url" parameter?
May, 2017 - Permalink
Hi Dariusz,
The URL is http://localhost:50505/aspire/files/home.html - running powershell on the local server. It is a third party tool we use. It does use Javascript and the under lying service uses Java.
Regards, Gary
May, 2017 - Permalink
Hi Gary,
Then I am afraid that there is no possibility to monitor the status via the Java Application. :(
Perhaps the software offers some kind of API in XML/JSON?
May, 2017 - Permalink
Thanks Dariusz, I'll see if we can do something on those lines. Your help is greatly appreciated.
Regards, Gary
May, 2017 - Permalink
Hi Gary,
I can write you a small script which is exactly doing what you want. For this purpose, please upload the sourcecode of the website to Pastebin or any other code-paste service.
Best regards.
May, 2017 - Permalink