A few days ago, I spoke before a small group of people about what I’d been doing with the Orion SDK. I mentioned that I had created a Spider-Orion script that I use to navigate to every page in my install. When I mentioned this script several people asked where it was published. The short answer – here.
Now most of my Orion SDK scripts are “one-shots.” These are quick blips that are used once (saved) and then forgotten. This is one such script. I wrote it, but never formalized it (good commenting, converting it to a function, writing better error trapping, etc.), which I try to do with most scripts that I publish. I was encouraged by this class that I spoke to that making it formalized was far less important than making it available.
I felt rather sheepish, but decided that they are right. So here’s my script. It’s commented out fairly well, but if you have any questions, please feel free to ask. I don’t mind responding to comments.
# Spider-Orion.ps1
###########################################################################################################
# Purpose: Spider SolarWinds Orion Site
if ( -not ( Get-Command -Name Connect-Swis -ErrorAction SilentlyContinue ) )
{
# Requires that Orion SDK be installed
Add-PSSnapin -Name SwisSnapin -ErrorAction Stop
}
$Hostname = "localhost" # Hostname (or IP) of the SolarWinds Server
$Username = "guest"
$Password = "orion"
$SecPass = ConvertTo-SecureString -String $Password -AsPlainText -Force
$Creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username, $SecPass
# Connect to the SolarWinds Information Service (SWIS)
$Swis = Connect-Swis -Hostname $Hostname -Credential $Creds
# Query the server for all Managed Entities (nodes, interfaces, volumes, applications, etc.) and their "parent" (Ancestor) objects.
$SWQL = "SELECT DetailsURL, AncestorDetailsUrls FROM System.ManagedEntity"
Write-Host "Getting Managed Entities"
$ManagedEntities = Get-SwisData -SwisConnection $Swis -Query $SWQL
Write-Host "Found $( $ManagedEntities.Count ) entities"
$Swis.Close()
Remove-Variable -Name Swis -ErrorAction SilentlyContinue
# Get all entity lists
Write-Host "Collapsing DetailsUrl"
$LinkList = $ManagedEntities.DetailsUrl
# add any ancestors
Write-Host "Collapsing AncestorDetailsUrls"
$LinkList += $ManagedEntities.AncestorDetailsUrls
# make the list unique (no duplicates)
Write-Host "Removing Duplicates"
$UniqueURLs = $LinkList | Select-Object -Unique
Write-Host "$( $UniqueURLs.Count ) Unique URLs"
# create empty report
$Report = @()
# counters
$i = 0; $iCount = $UniqueUrls.Count
ForEach ( $Url in $UniqueURLs )
{
Write-Progress -Activity "Crawling $hostname" -CurrentOperation "Getting $Url" -Status "Link $( $i + 1) of $iCount" -PercentComplete ( ( $i / $iCount ) * 100 )
# if the URL already contains a ?,
if ( $Url -like "*?*" )
{
# then we just need to append the parameters
$FullUrl = "http://$( $hostname )$( $Url )&AccountID=$( $Username )&Password=$( $Password )"
}
else
{
# otherwise we need to put in the parameterization
$FullUrl = "http://$( $hostname )$( $Url )?AccountID=$( $Username )&Password=$( $Password )"
}
# Make a call to the web page
Write-Host "Making Web Call to $FullUrl"
$Results = Invoke-WebRequest -Uri $FullUrl
# Create a reporting item and capture some relevant information
$ReportItem = New-Object -TypeName PSObject -Property @{ Server = $Hostname; Url = $Url; FullUrl = $FullUrl; PageTitle = $Results.ParsedHtml.title; Status = $Results.StatusDescription; }
# add it to the report
$Report += $ReportItem
# increment the counter
$i++
}
Write-Progress -Activity "Crawling $hostname" -Completed
# return the report
$Report
Nice, I can see using this to potentially capture hubble stats in order to identify slow views or page errors/optimization data.