Custom alerts page using stored procedure and report
HOWTO - Create a Spiffy WAP MAP with Network Atlas
If you have Solarwinds Network Performance Monitor [NPM] tool and more than a few Wifi Thin Access Points in your environment, I'll bet you've been tempted at some point to create a "WAP MAP" using the Network Atlas map maker, but were then frustrated when Network Atlas was unable to access any of the variables (SQL fields) that might be interesting.
If only you had a few of these:
You could have a one of these...
Oh bother! What to do, what to do, what to do...??
Well, now there's a solution. With a little bit of time, the Orion NPM Admin Guide, and some super-secret tinkering under-the-hood, you too can create your very own WAP MAP just like mine! Here's how...
Using Network Atlas
Well, first things first... if you're a newbie to NPM you might not even know what Network Atlas is or how it could be useful. Network Atlas is a program that comes with Orion though you have to download it the very first time you use it and install it on your system. Consult your Orion NPM Admin guide for the location.The Network Atlas program allows you to create custom maps which detail the various resources in your environment complete with live information such as Status, Uptime, Bitrate, or whatever else is important to you about an item, which can then be displayed on any Orion page. Simply edit the page, select one of the "Map" applets to add to your page, then edit the Map Applet and choose the map you created. Voila! One nifty new map to display!
Here's an example of one of ours:
In our environment we have maps which detail our network backbone, our critical servers and services, the key infrastructure of our various sites, etc. While the Network Atlas program is a little clumsy to use (it really is, I'm just sayin...) if you put some time and effort into getting to know it (and its quirks) it can produce some cool and useful maps for you to use in your NOC. Once you have the Network Atlas tool installed and have had a chance to play around with it a bit, you're ready to begin. Basically, when you add an object to the map, you can incorporate some special variables (aka "Properties") associated with the monitored object class (type) into the caption associated with the item. If you get clever about it, you can build up some pretty sophisticated maps.
I will assume from this point you're familiar with the program and/or know where and how to read the Admin Guide.
Sooner or later however, you will undoubtedly want to do something more advanced at which point you'll discover just precisely where the "edges" are in the program-- meaning where it stops being helpful. For all its usefulness, Network Atlas has a few warts and limitations, some minor, some more serious. For example, one minor thing you can't do is mix the text styles contained within a single label. It won't let you, say, edit the label to make a big title with smaller sized details all in one label. But of course, you can cheat a little and add a second label-- a generic label-- and then edit that to create the title and then use the original label to assign the details. Optionally you might assign a custom hyperlink to the title label, such as the URL which corresponds to the WAP Controller's page for that WAP device-- which is exactly what we did-- but of course you can choose whatever URL makes sense for you.
The "real" label, meaning the one which is associated with the object itself. You can recognize it by the tiny, thin line running from the label to the object itself. You can edit the "real" label to include specially-formatted variable strings which correspond to various details of interest. When the map is finally rendered in Orion, the variables will be replaced with the "live" data corresponding to that object. For instance, if you're working with a NODE object, you might use the "${NodeName}" and "${IP_Address}" variables to fill in the name of the node and it's address, and so on. You can consult the Admin Guide for a list of variables which are available for use in the Network Atlas. In this way you can add all sorts of useful information related to the object to your map. What you can't do though, unlike in a number of other areas in Orion, is retrieve information that is not contained in the base table for the particular object type (e.g., Node, Interface, etc.) Network Atlas does not support the use of custom SQL variable types. So if the information you want is stored in some other table, you're out-of-luck.
In our case, I wanted to create a WAP MAP to illustrate our WiFi environment to show the number of clients and the I/O bit rate for the individual WAP devices. The trouble is, we use "Thin" Access Point devices which are managed by a central WAP Controller. In setting up Orion to monitor the WAP environment, Orion realizes that the WAP controller is a WAP controller and then goes on to discover the various thin Access Points hiding behind it. So far, so good. Unfortunately, as a result, there are no specific nodes in Orion which correspond to the individual WAP's themselves which makes them difficult to use in Network Atlas. Even if you create ICMP stand-in devices, all you really get is "Availability" (via ICMP / Ping)-- which is only mildly interesting and probably not worth all the trouble.
As it happens, Orion DOES, in fact, have good, solid, interesting information about the WAP devices but keeps all that WiFi goodness stashed away in a different table which you can't access from the Network Atlas. If you pull up a database tool though, and start digging through the Solarwinds Orion database, you'll eventually discover two tables that seem like they could be useful. The first one, cleverly called "Nodes", keeps information about-- Nodes, go figure. The second one called, somewhat cryptically, "Wireless_AccessPoints"-- might take you an extra moment to work out what it's for...
If only there was a way to get at that information. If only Network Atlas could somehow be convinced to use SQL variables...
It turns out, if you're willing to be sneaky, there IS a way...
Here's the secret!
1. CREATE STAND-IN WAP DEVICES WITH "ADD NODE"
What you want to do first is create some stand-in nodes for each of your thin WAP devices-- Yeah, I know I said it wasn't worth it before, but that was then, and this is now-- and we have a plan now-- we're gonna need 'em for placeholders. So go ahead and add them and make certain the IP Addresses are all set correctly. Use the normal "Add a Node" activity in the Orion NPM web site to add the nodes. All you need to do is set them up as "ICMP" style nodes. Although, if you can set them up some other way (i.e., SNMP) to get more information so much the better. Then go find your newly-added devices in the Nodes table and verify they have the IP Address ("IP_Address" field) you expect. Each WAP device should already have a corresponding entry in the Wireless_AccessPoints table, so look them over and verify that the IP Addresses are entered correctly for each device in both tables. Also note to yourself that the address column in the Nodes table is named "IP_Address" whereas the column in the Wireless_AccessPoints table is "IPAddress". The difference seems minor but it's very important since we'll be using those columns later to tie ("Join") together the two tables. (Get a DBA to help you at this point if you're not sure about how to access the tables directly in the database, or aren't sure what a database "Join" is).
2. CREATE YOUR MAP IN NETWORK ATLAS
Use Network Atlas to create your map. In our case, I started with an image of our building map to use as a background. Then I placed "dots" on the bitmap along with circles that correspond to the range-radius of the WAP device-- there's no rocket science to it though, it's just that I have walked the floor many times with a hand-held WiFi meter and so I have a pretty good idea of where the hot and cold spots are. I just drew the circles according to my best guesses. You're welcome to be more scientific about it if you like.
Then look down the left side and find your WAP device placeholders and drop them onto the map wherever you want them to be. You can see how I did it in the large screenshot at the top. I've also annotated a close-up view of one just below so you can see better how it's constructed.
Then add a plain-vanilla label nearby (assuming you want a large title and smaller details) to suit your preferences. You can edit the titles with variable instances if you like, "${NodeName}" and "${IP_Address}" might be interesting ones. You can consult the list in the Admin guide or else search online, if you wish, to find others.If you have the "Advanced Alert Creator" tool that comes with Orion, most of the variables it can generate for your object type will also work here just fine. Edit the labels to suit your preference. When you get around to adding the details, that's when we'll take our next step.
Below I've included a close-up of a label in the process of being edited showing examples for how the variables can be incorporated into the text.
3. CREATE CUSTOM NODE PROPERTIES FOR WAP DEVICES
What we're going to do is trick the database into copying the information from the Wireless_AccessPoints table into the Nodes table whenever it gets written to or updated. But before we can do that, we'll need a place to store that data in the Nodes table. We can easily add fields to the Nodes table using the Custom Property manager, which can be found in the Admin area of the ORION NPM web site. You'll want to add the following custom properties. The order doesn't really matter, except that if you ever look them up in the database table directly, they will be in whatever order you added them, so if that matters to you, then take that into account and enter them accordingly. Likewise, the names can be whatever you want but will be used in writing the trigger and will become the variable names you'll use in the Network Atlas, so again choose accordingly. (You can see an example of their usage in the screenshot above).
Property Name | Property Type | Description |
---|---|---|
WAP_Clients | Integer Number | Number of Client Sessions Attached to the WAP Device |
WAP_InBps | Floating Point Number | Input Bitrate of the WAP Device |
WAP_OutBps | Floating Point Number | Output Bitrate of the WAP Device |
WAP_InPps | Floating Point Number | Input Packets per Second of the WAP Device |
WAP_OutPps | Floating Point Number | Output Packets per Second of the WAP Device |
Here's some screenshots to help you with adding your custom properties:
1. Go to the "Manage Custom Properties" page and press "Add Custom Property"
2. Select the Object Type for the property. (This selects the underlying table into which to add the field corresponding to the new property)
3. Enter the Custom Property Name, Description and Data Type
4. Skip this step, you don't need to assign any values
5. Repeat the above for each new property required.
(Reminder: "WAP_Clients", "WAP_InBps", "WAP_OutBps", "WAP_InPps", "WAP_OutPps")
4. CREATE A DATABASE CUSTOM TRIGGER TO COPY REQUIRED FIELDS
The secret to making all of this work lies in the creation of a custom trigger in the Orion database which will automagically copy the information from the Wireless_AccessPoints table over to the Nodes table whenever it gets added or updated. Once the fields are copied into the Nodes table, they will then be available as "Custom Property" variables for use in Network Atlas (and anywhere else that permits the use of Custom Property variables, such as Email Notifications, etc.). The type of trigger we'll be writing is called a "Trigger on INSERT, UPDATE or DELETE" style. Don't worry, we won't be DELETING anything, but we will be using the INSERT and UPDATE hooks it offers to copy the various fields from the Wireless_AccessPoints table to the Custom Property fields we just created in the Nodes table. Once created, the trigger will fire (do it's thing) whenever data is written into the Wireless_AccessPoints table-- no matter how it gets written there. Which means, that once it gets created and takes effect, we won't have to do *anything* else, it will all just work, as if by magic. Whenever the normal, usual Orion NPM process(es) updates the Wireless_AccessPoints table-- however it does that now-- the custom fields in the Nodes table will also get updated as a side-effect. (Note that if you ever update Orion such that the database gets re-installed, you may need to re-enter the trigger to restore the functionality).
If you're at all, even just a little bit, nervous about working directly with your database, get a DBA type person to help you out. (Or, if you can't locate a DBA, maybe there's someone else in the office who's gullible er, willing-- that you could pin it on if it all goes horribly wrong...) Oh, and now would probably be a good time to warn you to backup your database before doing this-- and that I'm not responsible if it destroys your data, grows hair on your palms, or brings back your ex-wife...
Here's what we did:
USE SolarWindsOrion IF EXISTS (SELECT name FROM sysobjects WHERE name = 'trigg_Insert' AND type = 'TR') DROP TRIGGER trigg_Insert GO CREATE TRIGGER trigg_Insert ON Wireless_AccessPoints FOR INSERT, UPDATE AS Begin DECLARE @Action as char(1); SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) THEN 'U' -- Set Action to Updated. WHEN EXISTS(SELECT * FROM INSERTED) THEN 'I' -- Set Action to Insert. END) if @Action in( 'I' , 'U') BEGIN update N set [WAP_Clients] = [Clients], [WAP_InBps] = [InBps], [WAP_OutBps] = [OutBps], [WAP_InPps] = [InPps], [WAP_OutPps] = [OutPps] ---select * from inserted i join Nodes N on N.IP_address = i.ipaddress END END
Be aware that the database name for your database might be (and probably IS) different!!! So double-check the database names and such just to be sure. Also notice that the names of the fields are exactly the same as the names of the Custom Properties that we created above. So spelling and punctuation matters! Make sure everything matches before you're submit the query. When you're ready, enter the above Trigger code into the database (as a query is fine), and it will take effect immediately. Every time Orion updates the WAP information stored in the Wireless_AccessPoints table, it will automagically be updated in the Nodes table too. Pretty cool, huh?
So now you can use the Custom Properties we created earlier in the Network Atlas as live variables which will contain the WAP device information, and you can go impress your boss with your spiffy new WAP MAP!
You never know, he just might even give you a raise!
(Hey, you know, it could happen...)
If you have comments, suggestions or questions, I'm happy to hear 'em. If your ex-wife really does come back, don't forget, I warned ya!!
John Whitten
Google Maps Integration
Alert on Nodes that stopped responding to SNMP
Devices_and_Objects.OrionReport
Event summary. Filtered. NPM10.6
Create A FIFA Twitter Feed In Your Orion Web Console
Create A FIFA Twitter Feed In Your Orion Web Console
1 Edit your page
Click ‘Customize Page’ from the page you intend to add this resource to…
2 Add the resource
Identify the column of the page you want to add the resource to and click the “+” button. This will let you search your available resource types to add to the page. (450 pixels is the recommended width for viewing this resource but it will scale to your configured width)
3 Select the resource
In the Search field, type “Custom HTML”. When you check the box next to the resource, the resource will add to the “Selected Resources:” column. After you confirm that the resource is listed as a “Selected Resource”, click the “Add Selected Resources” button at the bottom-right of the frame.
4 Add the resource to the view
After you have confirmed that the resource is added the desired column, click the “Done” button at the bottom-left of the page. This will apply the new resource to your view.
5 Edit the resource on the view
Confirm the resource added to the view the way you expected it to and click the “Edit” button.
6 Add the code
Create a custom Title. For ours, we used “FIFA World Cup 2014 | Brasil”.
Then add the following Code to the body of the resource and click the “Submit” button…
<a class="twitter-timeline" href="https://twitter.com/FIFAWorldCup" data-widget-id="477096557016141825">Tweets by @FIFAWorldCup</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
7 Confirm the Resource
After submitting your changes, you should see a resource with the “@FIFAWorldCup” Twitter feed.
Create a FIFA Twitter Feed in your Orion Web Console | Loop1 Systems, Inc.
Loop1 Systems: SolarWinds Training and Professional Services
- LinkedIN: Loop1 Systems
- Facebook: Loop1 Systems
- Twitter: @Loop1Systems
Adding Live Weather to the "Worldwide Map" Resource
Adding Live Weather to the "Worldwide Map" Resource
Summary: This will allow you to add live weather to the worldwide map based on the OpenWeatherMap project (free).
Limitations: The map must be on a page where your can insert HTML/JavaScript. This will probably break during future releases.
Notes: If you want to change the height of your map you must do it within the HTML resource.
Preview:
Step 1: Get the id of your map element, to do this go to a page where you've inserted the map (don't go to the map page itself). Once there view the source of the page (Ctrl + U in most browsers) and search for the map element (Ctrl + F), search for 'id="worldmap' (without the single quotes but with the double quote). Make note of your map ID, in this case 753.
Step 2: Add a HTML resource to the page with the map on it that you would like to modify. To do this go to "Customize Page" >>> "Add Resource To Column X" >>> "Custom HTML".
Step 3: Paste the contents of the attached file into the Custom HTML resource you just added to the page. Make sure you update the file with your map ID you found in step 1 and change others settings you would like to.
Adding a Rajant device to Solarwinds NPM
SCOPE
This document is applicable to all Rajant devices that need to be added to the Solarwinds NPM
VISION
To have a uniformed procedure of adding a Rajant device to Solarwinds NPM
Requirements
The following may be required when adding a Rajant device to Solarwinds NPM
Hardware
Server where existing Solarwinds NPM is deployed
Software
Universal Device Poller, which is installed with Solarwinds NPM
SNMPWALK utility which is installed with Solarwinds NPM
OVERVIEW
As of this writing, the version of Solarwinds in use is V10.5, and the Solarwinds MIB database file was updated on the 13 June 2014.
The Solarwinds MIB database does not contain any information for the Rajant devices
The Rajant devices do not have MIB-II mgmt. information embedded to be able to provide information to Solarwinds, and for Solarwinds to perform an automatic discovery of the devices
The Rajant device use SNMP version 2 with a community string of public. This is not changeable
As result of these restrictions, adding a Rajant device to Solarwinds NPM is a manual process, which this document will cover and show how it is done.
The Rajant enterprise OID is iso.org.dod.internet.private.enterprises.rajantCorporation (1.3.6.1.4.1.34861), which we will be using to create custom pollers for the devices
Procedure
Phase 1
Adding the Rajant device to Solarwinds NPM
The Rajant device will be added to the Solarwinds NPM, either by means of a manual entry or a network discovery. In both instances the devices will be added via ICMP only and not via SNMP as the SNMP poll to the device will fail. One the device has been added the polling method will need to be changed manually to SNMP for every Rajant device on the network.
Adding a device manually
- Add device by clicking settings > Add a Node
- Type the IP address of the device in the IP address field
- Select the polling method to Status Only: ICMP
- Click Next
- Rename the device to something meaningful if necessary
- Click OK, ADD NODE
- Click OK after the device was added
- In node management, find the device that was added and select the checkbox
- Click Edit Properties
- Change polling method to SNMP
- Check SNMP version and port are correct and tick “Allow 64 bit Counters”
- Type in public in the community string field
- Click submit
- Click OK on the error dialog when the credentials are not validated
- Adding of the Rajant device is now complete
Phase 2
Adding Specific Pollers
The Rajant device has now been added to the Solarwinds application, which will be able to provide availability stats only, and show up and down time. For more advanced statistics, one would need to add Universal Device Pollers, specifying an OID to poll to provide these stats.
In this example we will add the device serial number. In order for us to be able to do this, we will need to know which OID will provide this information. In the rajant-mib file, each OID is described with regards to what information will be provided when polled. In this case we will use 1.3.6.1.4.1.34861.1.1 to get the serial number of the device as per the rajant-mib file
system OBJECT-IDENTITY
STATUS current
DESCRIPTION "System status"
::= { rajantCorporation 1 }
serialNumber OBJECT-IDENTITY
STATUS current
DESCRIPTION "Hardware serial number"
::= { system 1 }
To add a universal device poller, one will need to work directly on the server where the application was installed and use the universal device poller application
Adding a universal device poller
- Open the universal device poller application in the Solarwinds program group
- The application will then open
- Click on “New Universal Device Poller” and wait for the dialog box to come up
- In the OID field type in the OID for the specific statistic that information is required for 1.3.6.1.4.1.34861.1.1
- Provide a name for the poller
- Provide a description for the poller
- Click advanced options
- Set MIB value type to Raw Value
- Set Format to Text
- Set SNMP get type to GET
- Set Polling type to Node
- Click Finish
Phase 3
Assign the poller to the added device
The specific poller has been added to Solarwinds NPM, and in order for it to be used, it needs to be assigned to a device or multiple devices.
Assigning a poller to a device
- Click on Assign Pollers and select the poller to use and click next
- Find and select the device to assign the poller to and click finish. To find the device easier, the “Group by” dropdown option may be used
- The poller is now assigned and the information will be presented on the node details in Solarwinds
CLOSURE
This concludes the procedure on adding a Rajant device to Solarwinds; however, this procedure may be used for any device that is known to have their own specific MIB file and is not limited to Rajant only.
To add more pollers for specific statistics, Phase 2 and Phase 3 need to be repeated, and the Specific OID will be provided for in the Rajant MIB file
rajant-mib
--
-- Rajant BreadCrumb MIB
--
RAJANT-CORPORATION-MIB DEFINITIONS ::= BEGIN
--
-- Import well known definitions from standard MIBs
--
IMPORTS
MODULE-IDENTITY, OBJECT-IDENTITY, enterprises, OBJECT-TYPE, Unsigned32, TimeTicks, IpAddress, Integer32, Counter64
FROM SNMPv2-SMI;
--
-- MIB meta data
--
rajantCorporation MODULE-IDENTITY
LAST-UPDATED "201308200000Z"
ORGANIZATION "Rajant Corporation"
CONTACT-INFO "Omitted"
DESCRIPTION "Rajant Corporation MIB"
--
-- Rajant's unique Enterprise ID (OID)
--
::= { enterprises 34861 }
system OBJECT-IDENTITY
STATUS current
DESCRIPTION "System status"
::= { rajantCorporation 1 }
instamesh OBJECT-IDENTITY
STATUS current
DESCRIPTION "Instamesh status"
::= { rajantCorporation 2 }
wireless OBJECT-IDENTITY
STATUS current
DESCRIPTION "Wireless interfaces"
::= { rajantCorporation 3 }
serialNumber OBJECT-IDENTITY
STATUS current
DESCRIPTION "Hardware serial number"
::= { system 1 }
systemTemperature OBJECT-IDENTITY
STATUS current
DESCRIPTION "System temperature"
::= { system 2 }
freeMemory OBJECT-IDENTITY
STATUS current
DESCRIPTION "Free memory"
::= { system 3 }
idle OBJECT-IDENTITY
STATUS current
DESCRIPTION "Idle"
::= { system 4 }
uptime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Uptime"
::= { system 5 }
instameshArpDropped OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of dropped ARP requests"
::= { instamesh 1 }
instameshArpRequests OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of ARP requests"
::= { instamesh 2 }
instameshArpRequestsAnswered OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of answered ARP requests"
::= { instamesh 3 }
instameshArpRequestsUnicasted OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of unicast ARP requests"
::= { instamesh 4 }
instameshArpTotal OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of all ARP requests"
::= { instamesh 5 }
instameshFloodsDropped OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of dropped flood packets"
::= { instamesh 6 }
instameshPacketsDropped OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of dropped packets"
::= { instamesh 7 }
instameshPacketsMulticast OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of multicast packets"
::= { instamesh 8 }
instameshPacketsReceived OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of received packets"
::= { instamesh 9 }
instameshPacketsSent OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of sent packets"
::= { instamesh 10 }
instameshSourceFloodsDropped OBJECT-IDENTITY
STATUS current
DESCRIPTION "Number of dropped source flood packets"
::= { instamesh 11 }
instameshTimeWaited OBJECT-IDENTITY
STATUS current
DESCRIPTION "Time spent on waiting"
::= { instamesh 12 }
-- Wireless interfaces
-- The code below needs some serious refactoring
wlan0 OBJECT-IDENTITY
STATUS current
DESCRIPTION "Wireless interface wlan0"
::= { wireless 1 }
wlan0name OBJECT-IDENTITY
STATUS current
DESCRIPTION "Interface name"
::= { wlan0 1 }
wlan0frequency OBJECT-IDENTITY
STATUS current
DESCRIPTION "Operating frequency"
::= { wlan0 2 }
wlan0noise OBJECT-IDENTITY
STATUS current
DESCRIPTION "Noise level"
::= { wlan0 3 }
wlan0channelActiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel active time"
::= { wlan0 4 }
wlan0channelBusyTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel busy time"
::= { wlan0 5 }
wlan0channelReceiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel receive time"
::= { wlan0 6 }
wlan0channelTransmitTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel transmit time"
::= { wlan0 7 }
wlan1 OBJECT-IDENTITY
STATUS current
DESCRIPTION "Wireless interface wlan1"
::= { wireless 2 }
wlan1name OBJECT-IDENTITY
STATUS current
DESCRIPTION "Interface name"
::= { wlan1 1 }
wlan1frequency OBJECT-IDENTITY
STATUS current
DESCRIPTION "Operating frequency"
::= { wlan1 2 }
wlan1noise OBJECT-IDENTITY
STATUS current
DESCRIPTION "Noise level"
::= { wlan1 3 }
wlan1channelActiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel active time"
::= { wlan1 4 }
wlan1channelBusyTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel busy time"
::= { wlan1 5 }
wlan1channelReceiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel receive time"
::= { wlan1 6 }
wlan1channelTransmitTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel transmit time"
::= { wlan1 7 }
wlan2 OBJECT-IDENTITY
STATUS current
DESCRIPTION "Wireless interface wlan2"
::= { wireless 3 }
wlan2name OBJECT-IDENTITY
STATUS current
DESCRIPTION "Interface name"
::= { wlan2 1 }
wlan2frequency OBJECT-IDENTITY
STATUS current
DESCRIPTION "Operating frequency"
::= { wlan2 2 }
wlan2noise OBJECT-IDENTITY
STATUS current
DESCRIPTION "Noise level"
::= { wlan2 3 }
wlan2channelActiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel active time"
::= { wlan2 4 }
wlan2channelBusyTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel busy time"
::= { wlan2 5 }
wlan2channelReceiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel receive time"
::= { wlan2 6 }
wlan2channelTransmitTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel transmit time"
::= { wlan2 7 }
wlan3 OBJECT-IDENTITY
STATUS current
DESCRIPTION "Wireless interface wlan3"
::= { wireless 4 }
wlan3name OBJECT-IDENTITY
STATUS current
DESCRIPTION "Interface name"
::= { wlan3 1 }
wlan3frequency OBJECT-IDENTITY
STATUS current
DESCRIPTION "Operating frequency"
::= { wlan3 2 }
wlan3noise OBJECT-IDENTITY
STATUS current
DESCRIPTION "Noise level"
::= { wlan3 3 }
wlan3channelActiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel active time"
::= { wlan3 4 }
wlan3channelBusyTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel busy time"
::= { wlan3 5 }
wlan3channelReceiveTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel receive time"
::= { wlan3 6 }
wlan3channelTransmitTime OBJECT-IDENTITY
STATUS current
DESCRIPTION "Channel transmit time"
::= { wlan3 7 }
END
Google Maps in Orion NPM - How to Video
I've made some changes to the original Google Maps that I introduced about this time last year. This version provides a status icon on the map for each unique latitude and longitude value in the database. I'm leaving the old one up as it is better for environments where a large number of sites exist, and would simply be too cluttered with a status icon at each site.
Prerequisites:
1) Obtain Google API Key for Maps v3
2) Create and populate Custom Properties:
- Country
- City
- Latitude
- Longitude
Installation:
Copy files to the c:\inetpub\SolarWinds\Orion\GoogleMap\
Update your connection string and API key
Create a view in NPM using the Custom HTML resource, configure iFrame
See the movie (how to install the mod):
Solarwinds Google Maps Integration - Loop1 Systems - YouTube
Read the book (asp files, readme, notes on GitHub):
https://gist.github.com/BarefootAtomic/a396a12541ff97a2ce1f
Enjoy!
Andrew LaGrone
Loop1 Systems, Inc
XMPP Command Line Client
Node Downtime Reports
We’ve prepared two reports within Report Writer to report on node downtime:
- Node Down Time Report – shows outage duration for each node when and how long it was down
- Summarized Node Down Report – summarize node outage duration for each node
These reports will work with or without view limitations applied.
Feedback most appreciated.
My Juniper UnDPs (EX, SRX, SA, ScreenOS)
Add “Search for Nodes" element in every Solarwinds Webpages header with ‘hit’ Enter enabled
I have added some codes in “C:\inetpub\SolarWinds\Orion\Controls\PageHeader.ascx” which adds the 'Search for Nodes' element on every SolarWinds webpages in the page header.
In order to prevent form resubmission message popup when page is refreshed I try to use “onClick” function instead of using the Submit button. The IE and other browsers (Chrome, FF, ..) seem have different way to handle the onClick event, so in IE the “search” will be a button but not submit button, in other browsers it will be text.
Also, you can just type in the search criteria and hit ‘enter’ then the search will execute (search by node name by default)
The codes are:
<div style="font-family:arial;color:#FFFFFF;font-size:10pt;font-weight:bold;padding-top:3px;">
<form id="MySearchForm" name="MySearchForm" onSubmit="returnfalse;"
>
Find <input id="MySearchText" name="MySearchText" type="text" size="10" style="font-size:10pt;" onkeypress="var searchStr = MySearchText.value; var propertyStr = MySearchProperty.value; if(event.keyCode==13 && searchStr!=''){window.open('/Orion/NetPerfMon/Resources/NodeSearchResults.aspx?'+'Property='+propertyStr+'&SearchText='+searchStr);}"/> By
<select id="MySearchProperty" name="MySearchProperty" size="1" style="width:100px;font-size:10pt;">
<option value="Caption">Node Name</option>
<option value="IP_Address">IP Address</option>
</select>
<![if !IE]>
<a id="mySearchLink" onClick="var searchStr = MySearchText.value; var propertyStr = MySearchProperty.value; if(searchStr==''){alert('Node name or IP must be filled out!');} else {window.open('/Orion/NetPerfMon/Resources/NodeSearchResults.aspx?'+'Property='+propertyStr+'&SearchText='+searchStr);}">
Search</a>
<![endif]>
<!--[if IE]>
<button id="mySearchButton" onClick="var searchStr = MySearchText.value; var propertyStr = MySearchProperty.value; if(searchStr==''){alert('Node name or IP must be filled out!');} else {window.open('/Orion/NetPerfMon/Resources/NodeSearchResults.aspx?'+'Property='+propertyStr+'&SearchText='+searchStr);}">
Search</button>
<![endif]-->
</form>
</div>
I have tested the code in IE, FF & Chrome, same results from FF & Chrome, but not IE:
Firefox V17 and Chrome V27
when press enter with empty search string, page refreshed only
when press enter with non-empty search string, page refreshed and results opened in a new page
when click “Search” text with empty search string, alert message displayed, not refresh page
when click “Search” text with non-empty search string, results opened in a new page and not refresh page
IE 9,
when press enter with empty search string, alert message and page refreshed
when press enter with non-empty search string, page refreshed and results opened in a new page
when click “Search” button with empty search string, alert message displayed AND refresh page
when click “Search” button with non-empty search string, results opened in a new page and refresh page
I notice it will take a bit longer to load the webpages when you first to load pages after making the changes, but it will be back to “normal” after a few loads. (Not sure why, may be refresh the caches?)
Hope this is useful.
PLEASE MAKE BACKUPS BEFORE YOU CHANGE THE FILE.
PLEASE TEST THE CODES BEFORE APPLY TO LIVE SYSTEM.
USE THE CODES AT YOUR OWN RISK AND FEEL FREE TO MODIFY THEM.
Thanks
update:
================================
add onSubmit="returnfalse;" in <form Tag>, now when press "Enter", page NOT refresh any more in IE and others, also NOT refresh when click Search Button in IE. BUT in IE when press Enter, search result page open twice, not in other browsers. Why? any help? Thanks
update: 23/07/2013
================================
fixed issue above.
seems IE handles "Enter" key press as submit button clicked, to stop this:
added return false; in <input> tag:
<input id="MySearchText" name="MySearchText" type="text" size="10" style="font-size:10pt;" onkeypress="var searchStr = MySearchText.value; var propertyStr = MySearchProperty.value; if(event.keyCode==13 && searchStr!=''){window.open('/Orion/NetPerfMon/Resources/NodeSearchResults.aspx?'+'Property='+propertyStr+'&SearchText='+searchStr);return false;}"/>
update: 24/07/2013
================================
Found a bug in my code:
when you go to page "Admin -> Settings -> SAM Settings -> Browse for Component Monitor", the radio buttons selection not working, see screenshot below
Cause: my codes conflict with code in that page. To see the source code:
The page uses Java scripts to select radio button. In the script, document.form(0) refer to my search form rather than the original one.
Fix: REMOVE <form></form> Tags from my code.
<form id="MySearchForm" name="MySearchForm" onSubmit="returnfalse;"
>
</form>
update: 02/08/2013
================================
I uploaded modified PageHeader.ascx (NPM version 10.4). Please test. Thanks
Cisco GSS.UnDP
Copy Google Maps to new WorldMaps in NPM 10.6
We have managed to combine the Old Google maps and new World Map resource to use a single data set. this means we can use both maps depending on each users preference.
The following SQL can be used to populate the new WorldMaps resource from an existing installation of the google maps plugin.
insert into WorldMapPoints
select 'Orion.Nodes', nodeid, latitude, longitude
from nodes;
You must first ensure that every node has a long and lat, as the google map only needs this setting once per City
You can then alter the SQL of the Google Maps Plugin to look at the same data table so you can run both maps side by side
SELECT CASE
WHEN Status=2 THEN 5
WHEN Status=3 THEN 4
WHEN Status=12 THEN 3
WHEN Status=1 THEN 2
WHEN Status=9 THEN 1
WHEN Status=0 THEN 0
ELSE Status END AS Rank, NodeID,StatusLED,City,Caption, WorldMapPoints.Latitude, WorldMapPoints.Longitude
from Nodes
INNER JOIN WorldMapPoints ON Nodes.Nodeid = WorldMapPoints.InstanceID
where WorldMapPoints.Latitude IS NOT NULL AND WorldMapPoints.Longitude IS NOT NULL
AND City IS NOT NULL
order by Rank asc, city asc
Having Changed the sql in the GoogleMap.aspx and GoogleMapSiteMap.aspx you can then delete the logitude and latitude custom properties and manage the location of nodes for both maps using the GUI for new World Map resource
Some Things Solarwinds Admins Can't Live Without
Here are some SQL queries as doing weekly Solarwinds Maintenance and creating custom alerts that we as an MSP can't live without. I will most likely update this often but here are some I store in my evernote for now but I will update this frequently when i start looking through everything I use.
This first one isn't a SQL query but good for everyone use FoE to know:
cd C:\Program Files\SolarWinds\FoE\r2\bin\
nfpktfltr getstate
The failover should be set to Filter and the active should be PassThru
The nfpktfltr has a lot of good options to play with including forcing a set for filter or passthru in emergencies
Checking Ghost or Unknown Interfaces
selectInterfaceName,Nodes.CaptionfromInterfaces
innerjoinNodesonNodes.NodeID=Interfaces.NodeID
whereInterfaces.Status=0
Checking Nodes Not in Groups
where
not Caption in(
SELECTdistinctFullName
FROM ContainerMemberSnapshots
where EntityDisplayName ='Node'
)
Checking Total Number of Elements for Custom Value
LEFTjoinVolumesonVolumes.NodeID=Nodes.NodeID
LEFTjoinInterfacesonInterfaces.NodeID=Nodes.NodeID
LEFTJOINAPM_ApplicationonAPM_Application.NodeID=Nodes.NodeID
whereCustom= 'somethinghere'
Getting IP list for Weekly Sonar Discovery by polling engine
where
ObjectSubType ='SNMP'
andEngineID =_Engine ID Here_
andStatus<>'9
To get a list of your current engines with their ID number just simply run
selectEngineID,ServerName,IP fromEngines
Cleaning up bad hardware alerts manually
SET@NodeID =_NODE ID HERE_
DELETEFROMAPM_HardwareInfo WHERE NodeID =@NodeID
DELETEFROMAPM_HardwareCategoryStatus WHERE NodeID =@NodeID
DELETEFROMAPM_HardwareItem WHERE NodeID =@NodeID
Alerting Variables for Statistical Data
innerjoinAPM_DynamicEvidence_DetailData d on c.ID =d.ColumnSchemaID andc.ComponentID = ${ComponentID}
wherec.ThresholdWarning < d.NumericData groupby c.ID,c.Name} isinWARNING at
${SQL:selectMAX(d.NumericData)from APM_DynamicEvidenceColumnSchema c
innerjoinAPM_DynamicEvidence_DetailData d onc.ID =d.ColumnSchemaID andc.ComponentID = ${ComponentID}
where c.ThresholdWarning <d.NumericData groupbyc.ID,c.Name }
Alerting URL on HTTP Components that is being pulled
This can be used to get any of the values simply changing the [Key] condition to whatever your looking for. Also make sure you set your component type in your trigger condition to 6 to avoid non-http applications sending this alert off.
${SQL:selectValue fromAPM_ComponentSetting
where [Key] ='Url'and ComponentID ='${ComponentID}'}
That's all I can muster at the moment while trying to get some work done but I will try to update this as often as possible.
Opengear Console Server Extended Pollers
Opengear Console Servers (CM4xxx, SD40xx, IM42xx, IMG4xxx, IM72xx, ACM5xxx, ACM55xx) using firmware 3.11.0 or newer
Manufacturer Opengear Inc.
Refer to OG-STATUSv2-MIB for OID details: Opengear SNMP MIBs
This UnDP file contains the following Poller groups:
- Opengear Alarm Log (Extended)
- Opengear Auto-Response Check Devices (Extended)
- Opengear Auto-Response Checks (Extended)
- Opengear Cell Modem (Extended)
- Opengear Current Alarms (Extended)
- Opengear EMD (Extended)
- Opengear EMD DIO (Extended)
- Opengear EMD Humidity (Extended)
- Opengear EMD Temerature (Extended)
- Opengear RPC Outlets (Extended)
- Opengear RPCs (Extended)
- Opengear Serial Port (Extended)
- Opengear Serial User (Extended)
- Opengear Web User (Extended)
When the UnDP file is imported via the Universal Device Poller (Start -> Solarwinds Orion -> Universal Device Poller) you can select either the Poller groups which specifically interest you or at a finer level the individual Pollers.
Universal Device Poller groups break down as follows:
- Opengear Alarm Log (Extended)
ogAlarmCheck
- ogAlarmCurrentValue
- ogAlarmDevice
- ogAlarmEventId
- ogAlarmInstance
- ogAlarmName
- ogAlarmPreviousValue
- ogAlarmState
- ogAlarmSummary
- ogAlarmTime
- ogAlarmType
- ogAlarmUser
- Opengear Auto-Response Check Devices (Extended)
ogCheckDeviceTable
- Opengear Auto-Response Checks (Extended)
ogCheckName
- ogCheckRepeatTimeout
- ogCheckResetTimeout
- ogCheckResolveActions
- ogCheckTriggerActions
- ogCheckType
- Opengear Cell Modem (Extended)
ogCellModem3gRssi
- ogCellModem4gRssi
- ogCellModemApn
- ogCellModemConnected
- ogCellModemCounter
- ogCellModemModel
- ogCellModemNetwork
- ogCellModemRadioTechnology
- ogCellModemRegistered
- ogCellModemSelectedSimCard
- ogCellModemSessionTime
- ogCellModemTemperature
- ogCellModemTower
- ogCellModemVendor
- Opengear Current Alarms (Extended)
ogCurrentAlarmCheck
- ogCurrentAlarmCurrentValue
- ogCurrentAlarmDevice
- ogCurrentAlarmEventId
- ogCurrentAlarmInstance
- ogCurrentAlarmName
- ogCurrentAlarmPreviousValue
- ogCurrentAlarmState
- ogCurrentAlarmSummary
- ogCurrentAlarmTime
- ogCurrentAlarmTriggerValue
- ogCurrentAlarmType
- ogCurrentAlarmUser
- Opengear EMD (Extended)
ogEmdConnectType
- ogEmdDescription
- ogEmdDioInputTotal
- ogEmdEnabled
- ogEmdHumidityTotal
- ogEmdLogEnabled
- ogEmdName
- ogEmdTemperatureTotal
- Opengear EMD DIO (Extended)
ogEmdDioTable
- Opengear EMD Humidity (Extended)
ogEmdHumidityTable
- Opengear EMD Temerature (Extended)
ogEmdTemperatureTable
- Opengear RPC Outlets (Extended)
ogRpcOutletTable
- Opengear RPCs (Extended)
ogRpcConnectType
- ogRpcCounter
- ogRpcDescription
- ogRpcInputCurrent
- ogRpcInputFrequency
- ogRpcInputVoltage
- ogRpcLogEnabled
- ogRpcMaxTemperature
- ogRpcName
- ogRpcOutletTotal
- ogRpcType
- Opengear Serial Port (Extended)
ogSerialPortCTS
- ogSerialPortDataBits
- ogSerialPortDCD
- ogSerialPortDSR
- ogSerialPortDTR
- ogSerialPortFlowControl
- ogSerialPortLabel
- ogSerialPortLogLevel
- ogSerialPortMode
- ogSerialPortParity
- ogSerialPortRTS
- ogSerialPortRxBytes
- ogSerialPortSpeed
- ogSerialPortStopBits
- ogSerialPortTxBytes
- Opengear Serial User (Extended)
ogSerialUserLabel
- ogSerialUserName
- ogSerialUserPort
- ogSerialUserStartTime
- Opengear Web User (Extended)
ogWebUserName
- ogWebUserSourceAddress
- ogWebUserSourcePort
- ogWebUserStartTime
Once again refer to the MIBs for descriptions: Opengear SNMP MIBs
Some Things Solarwinds Admins Can't Live Without
Here are some SQL queries as doing weekly Solarwinds Maintenance and creating custom alerts that we as an MSP can't live without. I will most likely update this often but here are some I store in my evernote for now but I will update this frequently when i start looking through everything I use.
This first one isn't a SQL query but good for everyone use FoE to know:
cd C:\Program Files\SolarWinds\FoE\r2\bin\
nfpktfltr getstate
The failover should be set to Filter and the active should be PassThru
The nfpktfltr has a lot of good options to play with including forcing a set for filter or passthru in emergencies
Checking Ghost or Unknown Interfaces
selectInterfaceName,Nodes.CaptionfromInterfaces
innerjoinNodesonNodes.NodeID=Interfaces.NodeID
whereInterfaces.Status=0
Checking Nodes Not in Groups
where
not Caption in(
SELECTdistinctFullName
FROM ContainerMemberSnapshots
where EntityDisplayName ='Node'
)
Checking Total Number of Elements for Custom Value
LEFTjoinVolumesonVolumes.NodeID=Nodes.NodeID
LEFTjoinInterfacesonInterfaces.NodeID=Nodes.NodeID
LEFTJOINAPM_ApplicationonAPM_Application.NodeID=Nodes.NodeID
whereCustom= 'somethinghere'
Getting IP list for Weekly Sonar Discovery by polling engine
where
ObjectSubType ='SNMP'
andEngineID =_Engine ID Here_
andStatus<>'9
To get a list of your current engines with their ID number just simply run
selectEngineID,ServerName,IP fromEngines
Cleaning up bad hardware alerts manually
SET@NodeID =_NODE ID HERE_
DELETEFROMAPM_HardwareInfo WHERE NodeID =@NodeID
DELETEFROMAPM_HardwareCategoryStatus WHERE NodeID =@NodeID
DELETEFROMAPM_HardwareItem WHERE NodeID =@NodeID
Alerting Variables for Statistical Data
innerjoinAPM_DynamicEvidence_DetailData d on c.ID =d.ColumnSchemaID andc.ComponentID = ${ComponentID}
wherec.ThresholdWarning < d.NumericData groupby c.ID,c.Name} isinWARNING at
${SQL:selectMAX(d.NumericData)from APM_DynamicEvidenceColumnSchema c
innerjoinAPM_DynamicEvidence_DetailData d onc.ID =d.ColumnSchemaID andc.ComponentID = ${ComponentID}
where c.ThresholdWarning <d.NumericData groupbyc.ID,c.Name }
Alerting URL on HTTP Components that is being pulled
This can be used to get any of the values simply changing the [Key] condition to whatever your looking for. Also make sure you set your component type in your trigger condition to 6 to avoid non-http applications sending this alert off.
${SQL:selectValue fromAPM_ComponentSetting
where [Key] ='Url'and ComponentID ='${ComponentID}'}
That's all I can muster at the moment while trying to get some work done but I will try to update this as often as possible.