====== lsmon.vbs ======
^ Author | [[ goldfndr@gmail.com | Richard Finegold ]] |
^ Compatibility | Xymon or Big Brother |
^ Requirements | VBScript and BBWin and lsmon.exe on client |
^ Download | None |
^ Last Update | 2010-02-25 |
===== Description =====
This reports (and optionally graphs) licenses used by Sentinel RMS (formerly known as SentinelLM). For example, [[http://www.csiberkeley.com/products_SAP.html|SAP2000]], [[http://www.structurepoint.org/soft/soft_profile.asp?l_family_id=38/|spColumn]] and its predecessor PCAColumn, some versions of Eagle Point, old versions of Haestad Methods (pre-Bentley).
* Simple check for server: ''lservnt.exe'' is present
* Simple check for client: ''lshost'' or ''lsforcehost'' environment variable on client that points to server
* Simple software check: ''WlmAdmin.exe'' is present on server or client
===== Installation =====
=== Client side ===
* Check for presence of ''lsmon.exe'', it might be in ''C:\Program Files\Rainbow Technologies\SentinelLM\7.2.0\English\Delivery\Admin.net\Win32\'' or it might be elsewhere. If you can't find it, contact the vendor responsible for WlmAdmin or lservnt.
* Copy lsmon.vbs (below) to your BBWin's ''ext'' folder and customize the path to ''lsmon.exe''.
* Edit your BBWin's ''etc/bbwin.cfg'' file:
* Add a line in the ''externals'' section:
* If the externals agent was disabled in the ''bbwin'' section (e.g. commented out or deleted), enable:
=== Server side ===
* Add the following to $BBHOME/etc/hobbitgraph.sh
[lsmon]
FNPATTERN lsmon.(.*).rrd
TITLE SafeNet Utilization
YAXIS Percent Used
DEF:in@RRDIDX@=@RRDFN@:pct:AVERAGE
LINE1:in@RRDIDX@#@COLOR@:@RRDPARAM@ Percent
GPRINT:in@RRDIDX@:LAST: \: %5.1lf (cur)
GPRINT:in@RRDIDX@:MAX: \: %5.1lf (max)
GPRINT:in@RRDIDX@:MIN: \: %5.1lf (min)
GPRINT:in@RRDIDX@:AVERAGE: \: %5.2lf (avg)\n
[lsmon1]
FNPATTERN lsmon.(.*).rrd
TITLE SafeNet Utilization
YAXIS Used
DEF:in@RRDIDX@=@RRDFN@:used:AVERAGE
LINE1:in@RRDIDX@#@COLOR@:@RRDPARAM@ Used
GPRINT:in@RRDIDX@:LAST: %3.1lf (cur)
GPRINT:in@RRDIDX@:MAX: %3.1lf (max)
GPRINT:in@RRDIDX@:MIN: %3.1lf (min)
GPRINT:in@RRDIDX@:AVERAGE: %3.2lf (avg)\n
* In $BBHOME/etc/hobbitserver.cfg, add the following to the existing ''TEST2RRD'' and ''GRAPHS'' lines:
TEST2RRD="[...],lsmon"
GRAPHS="[...],lsmon:lsmon|lsmon1"
* In $BBHOME/etc/hobbitlaunch.cfg, in the ''[rrdstatus]'' section:
* If it has ''--extra-tests'' and ''--extra-script'', add '',lsmon'' to the ''--extra-tests'' parameter, and merge the following code with your --extra-script's script.
* If it doesn't have ''--extra-tests'' or ''--extra-script'', use the following ''extra-rrd.sh'' script and add the following to the CMD:
--extra-tests=lsmon --extra-script=$BBHOME/ext/extra-rrd.sh
#!/bin/sh
# extra-rrd.sh
# Input parameters: Hostname, testname (column), and messagefile
HOSTNAME="$1"
TESTNAME="$2"
FNAME="$3"
if [ "$TESTNAME" = "lsmon" ]; then
#echo "$HOSTNAME $TESTNAME $FNAME" >> /tmp/extra-rrd-run.log
#go with disk ordering: percent then used
echo "DS:pct:GAUGE:600:0:100"
echo "DS:used:GAUGE:600:0:U"
sed -n '/Feature/p;/nreserved/p' $FNAME \
| sed 's/.*: //;s/\"//g;s/ *$//' \
| sed '$!N;$!N;$!N;s/\n/:/g'\
| while read line; do
#Not sure why, but on my machine there are hidden characters after feature name
#feature here is name-version
feature=`echo "$line" | sed 's/:[0-9]*:[0-9]*$//' | sed 's/[[:space:]]*:/-/'``
used=`echo "$line" | sed 's/^[^:]*:[^:]*://;s/:.*//'`
avail=`echo "$line" | sed 's/.*://'`
total=$(( used + avail ))
pct=$(( used * 100 / total ))
echo "$TESTNAME.$feature.rrd"
echo "$pct:$used"
done
fi
===== Source =====
==== lsmon.vbs ====
Option Explicit
const LSMONEXE="C:\Program Files\BBWin\ext\lsmon.exe"
Dim TimerStart : TimerStart = Timer
Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("WScript.Shell")
const dbg=False
Phase 1
WSH.Run "cmd.exe /c echo . | """ & LSMONEXE & """ > lsmon.txt", 0, 1
Phase 2
With FSO.OpenTextFile("lsmon.txt", 1)
Dim a : a = .ReadLine : a = Split(.ReadAll, vbCRLF)
.Close
End With
Phase 3
'These are filtering from the first part (overall license characteristics).
'Note that 8.x and 7.2 have a space in front of each line, 7.0 does not.
Dim i : for each i in Array("License type", " License Version" _
, " Able to issue", " commuter licenses", "Additive/exclusive" _
, " Application-server locking", "App-server locking" _
, "Held licenses", "Soft limit on users" _
, "License start", "Sharing limit")
a = Filter(a, i, False)
next
for each i in Array(" locking code", " Local request")
a = Filter(a, i, False)
next
Phase 4
'These are filtering from the details (each user token)
for each i in Array("Reserved tokens", "Reserved Tokens", "Available reserv" _
, "X display name", ": DefaultGrp")
a = Filter(a, i, False)
next
Phase 5
'This strips the last line
for each i in Array("Press Enter", "Hit Enter to continue")
a = Filter(a, i, False)
next
Phase 6
'These change the output on a 7.0 lsmon.exe from combined lines to pure NCV
'And compensate for 7.2's tab
for i = 0 to UBound(a) - 1
Dim n : n = Instr(a(i), "Feature version")
If n > 5 Then
a(i) = Left(a(i), n - 3) & vbCRLF & Mid(a(i), n)
a(i) = Replace(a(i), vbTab & ":", vbTab & " :")
End If
n = Instr(a(i), "Available unreserved")
If n > 5 Then
a(i) = Left(a(i), n - 3) & vbCRLF & Mid(a(i), n)
a(i) = Replace(a(i), vbTab & ":", vbTab & " :")
End If
n = Instr(a(i), "Feature name " & vbTab & vbTab)
if n = 2 then
a(i) = Replace(a(i), " :", ":")
end if
next
Phase 7
'This concatenates the output, putting an
between each feature
'Note that 8.x outputs "Feature name" at top, 7.x outputs "Commuter License Allowed"
a = Replace(Join(a, vbCRLF), vbCRLF & " ", vbCRLF) 'Strip space at 8.x's line beginning
a = Replace(a, vbCRLF & vbCRLF & "Feature name " _
, vbCRLF & "
" & vbCRLF & vbCRLF & "Feature name ")
a = Replace(a, vbCRLF & vbCRLF & "Commuter License Allowed " _
, vbCRLF & "
" & vbCRLF & vbCRLF & "Commuter License Allowed ")
WriteStatus "lsmon", "green", "lsmon", a
'######################################################################
'Write out the status; depends on FSO and WSH; will use TimerStart if available for duration
Sub WriteStatus(column, color, quickie, line)
'Why so long? Assume that client might collect file while writing, so make temp file and rename it.
'######################################################################
Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("WScript.Shell")
Dim HKLMSoft : HKLMSoft="HKLM\SOFTWARE"
if WSH.Environment("SYSTEM")("PROCESSOR_ARCHITECTURE") <> "x86" then HKLMSoft = HKLMSoft & "\Wow6432Node"
Const LEAKYMAX = 8500, BBWinreg = "\BBWin\tmpPath"
Const Questreg = "\Quest Software\BigBrother\bbnt\ExternalPath\"
'On error resume next
'Assume that, if BBWin is installed, they're using it; if not then they're using Quest BB client.
Dim colfn, src : colfn = "" : colfn = WSH.RegRead(HKLMSoft & BBWinreg) : src = "bbwin"
If "" = colfn then : colfn = WSH.RegRead(HKLMSoft & Questreg) : src = "" : end if
If "" = colfn then Exit Sub 'Abort if nothing in the registry for location.
colfn = colfn & "\" & column 'Add the column name to make it a real colfile.
Dim tmpfn : tmpfn = colfn & ".$$$" 'Temporary file; use temporary name for safety!
If FSO.FileExists(tmpfn) Then WScript.Quit 183 'Bail out if already there (i.e. previous stuck)
Phase "Status1"
On Error Resume Next
With FSO.CreateTextFile(tmpfn, True)
if err then WScript.Quit err 'Bail out if unable to create file.
if Len(line) > LEAKYMAX and src = "bbwin" then _
.Write "status " & WSH.RegRead(HKLMSoft & "\BBWin\hostname") & "." & column & " "
.WriteLine color & " " & WeekdayName(Weekday(Now),True) & " " _
& Mid(Now,1,InStr(Now," ")-1) & " " & TimeValue(Now) _
& " [" & WSH.Environment("Process")("COMPUTERNAME") & "] " & quickie
.WriteLine line
.Write "" & WScript.ScriptName & " (modified " & CDate(CLng( _
FSO.GetFile(WScript.ScriptFullName).DateLastModified))
if not IsNull(TimerStart) then .Write "; run time " & Timer - TimerStart & "s" 'midnight bug
.Write ")"
.Close
End With
'***********************************************************
'Rename file so client will see it (taking care to remove any unprocessed file first)
'Or send directly with bbwincmd.exe if over 8kB
'***********************************************************
Phase "Status2"
on error goto 0
'wscript.echo len(line)
if Len(line) > LEAKYMAX and src = "bbwin" then
Dim XML : Set XML = CreateObject("Microsoft.XMLDOM") 'Requires MSIE 5 or later
If XML.Load(WSH.RegRead(HKLMSoft & "\BBWin\etcPath") & "\bbwin.cfg") then
Phase "Status2XML"
Dim x : for each x in XML.SelectNodes("//configuration/bbwin/setting[@name='bbdisplay']")
WSH.Run "..\bin\bbwincmd.exe " & x.Attributes.GetNamedItem("value").Value _
& " uploadmessage """ & tmpfn & """", 1, True
next
Else
WScript.Echo "Error parsing " & WSH.RegRead(HKLMSoft & "\BBWin\etcPath") & "\bbwin.cfg"
End If
FSO.DeleteFile tmpfn
else
if FSO.FileExists(colfn) then FSO.DeleteFile(colfn)
FSO.MoveFile tmpfn, colfn
end if
End Sub
'######################################################################
'If the script gets stuck, we can use Process Explorer to examine its environment
'######################################################################
Sub Phase(n)
if dbg then wscript.echo n
CreateObject("WScript.Shell").Environment("Process")("P-" & WScript.ScriptName) = n
End Sub
===== Known Bugs and Issues =====
* This filters out a lot of lines from the lsmon output that I felt weren't valuable. Customize the array(s) as you see fit.
* It leaves behind a ''lsmon.txt'' file. I felt this was easier if troubleshooting is needed, but feel free to tidy up.
* I have it working with lsmon.exe 8.0.5 and 7.2.0 and 7.0.0. Each formats somewhat differently (7.0 combines some lines; 7.2 and 8.0 use leading spaces; 7.2 uses a tab in Feature name, 8.0 does not) so there might be other versions that doesn't behave as expected.
===== To Do =====
* Change color to clear if "No licensed features"
* Change color for expiration: yellow if already expired (presume don't care), red if near expiration
===== Credits =====
===== Changelog =====
* **2010-04-28**
* WriteStatus: If lengthy status (over 8500) and using BBWin, run via BBWinCmd to avoid handle leak
* WriteStatus: If TimerStart is set at beginning of script, report run time at bottom
* **2010-03-01**
* Modified for lsmon.exe version 7.0 and 7.2
* Minor code improvements: setting for lsmon.exe, lessened long lines
* **2010-02-25**
* Initial release