Module: check_mk
Branch: master
Commit: d50dcd32cb06577c8b94cb92e4da68ec80f3bb09
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d50dcd32cb0657…
Author: Andreas Boesl <ab(a)mathias-kettner.de>
Date: Tue May 17 15:00:45 2016 +0200
3533 rds_licenses: Monitors used remote desktop licenses
This checks works with the data reported by the windows agent plugin rds_licenses.vbs.
---
.werks/3533 | 9 ++++
ChangeLog | 1 +
agents/windows/plugins/rds_licenses.vbs | 70 ++++++++++++++++++++++++
checkman/rds_licenses | 17 ++++++
checks/rds_licenses | 89 +++++++++++++++++++++++++++++++
web/plugins/wato/check_parameters.py | 12 +++++
6 files changed, 198 insertions(+)
diff --git a/.werks/3533 b/.werks/3533
new file mode 100644
index 0000000..6e2b89a
--- /dev/null
+++ b/.werks/3533
@@ -0,0 +1,9 @@
+Title: rds_licenses: Monitors used remote desktop licenses
+Level: 1
+Component: checks
+Compatible: compat
+Version: 1.2.9i1
+Date: 1463489923
+Class: feature
+
+This checks works with the data reported by the windows agent plugin rds_licenses.vbs.
diff --git a/ChangeLog b/ChangeLog
index 800972b..01e85be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -79,6 +79,7 @@
* 3432 oracle_tablespaces: now autoextend can be ignored
* 3132 skype, skype.data_proxy, skype.edge, skype.edge_auth, skype.mcu,
skype.mediation_server, skype.mobile, skype.sip_stack: added new checks to monitor a Skype
For Business installation
* 3133 windows agent: support for rotated log files and for reading new files from
the first line...
+ * 3533 rds_licenses: Monitors used remote desktop licenses...
* 3073 FIX: windows agent: relative paths to mrpe scripts are now treated as relative
to the agent installation directory...
* 3061 FIX: mk_jolokia: Fixed debugging of the agent plugin
* 3074 FIX: windows agent: fixed incorrect values for 32-bit performance counters
diff --git a/agents/windows/plugins/rds_licenses.vbs
b/agents/windows/plugins/rds_licenses.vbs
new file mode 100644
index 0000000..85feceb
--- /dev/null
+++ b/agents/windows/plugins/rds_licenses.vbs
@@ -0,0 +1,70 @@
+'----------------------------------------------------------------------------
+' Script to generate TS Per-Device license usage report.
+' Requires Administrator privilege on the license server.
+' Works only with WS08 TS License Server, as there is no WMI
+' interface for TS Licensing on earlier versions.
+'----------------------------------------------------------------------------
+
+' The entire argument block is currently not configurable via WATO
+SET Args = WScript.Arguments
+NameSpace = "root\cimv2"
+ClassName = "Win32_TSIssuedLicense"
+IF Args.Length > 2 THEN
+ Help
+ WSCRIPT.QUIT(1)
+END IF
+
+IF Args.Length = 1 THEN
+ Help
+ WSCRIPT.QUIT(1)
+END IF
+
+IF Args.Length = 2 THEN
+ ' Checking if Server Name has been provided
+ CompResult = strComp(Args(0), "-server",1)
+ IF CompResult = 0 THEN
+ ServerName = Args(1)
+ ELSE
+ Help
+ WSCRIPT.QUIT(1)
+ END IF
+ELSE
+ ' if argc.length = 0, no arg supplied
+ ServerName = "."
+END IF
+
+GeneratePerDeviceReport
+WSCRIPT.QUIT
+
+'----------------------------------------------------------------------------
+' FUNCTIONS
+'----------------------------------------------------------------------------
+SUB Help()
+ WSCRIPT.StdErr.Write("Usage: GeneratePerDeviceReport.vbs [-Server
ServerName]\n")
+ WSCRIPT.StdErr.Write(" If no ServerName is provided, then report
generation\n")
+ WSCRIPT.StdErr.Write(" is attempted at host machine\n")
+END SUB
+
+SUB GeneratePerDeviceReport()
+ Err.Clear
+ Set ObjWMIService = GetObject("winmgmts:\\" & ServerName &
"\" & NameSpace )
+ IF ERR.NUMBER <> 0 THEN
+ WSCRIPT.StdErr.Write("Unable to connect to the Namespace")
+ WSCRIPT.QUIT(2)
+ END IF
+ Set ObjectSet = ObjWMIService.ExecQuery ("Select * from
Win32_TSLicenseKeyPack")
+ ReportCountBefore = ObjectSet.Count
+ ' No Reports are present
+ IF ObjectSet.Count = 0 THEN
+ WSCRIPT.StdErr.Write("No license key packs found")
+ WScript.Quit(5)
+ END IF
+ WSCRIPT.ECHO "<<<rds_licenses:sep(44)>>>"
+ WSCRIPT.ECHO
"KeyPackId,Description,KeyPackType,ProductType,ProductVersion,ProductVersionID,TotalLicenses,IssuedLicenses,AvailableLicenses,ExpirationDate,TypeAndModel"
+ FOR EACH ObjectClass IN ObjectSet
+ WSCRIPT.ECHO ObjectClass.KeyPackId & "," &
ObjectClass.Description & "," & ObjectClass.KeyPackType &
"," & ObjectClass.ProductType & "," &
ObjectClass.ProductVersion & "," & ObjectClass.ProductVersionID &
"," & ObjectClass.TotalLicenses & "," &
ObjectClass.IssuedLicenses & "," & ObjectClass.AvailableLicenses &
"," & ObjectClass.ExpirationDate
+ NEXT
+END SUB
+
+
+
diff --git a/checkman/rds_licenses b/checkman/rds_licenses
new file mode 100644
index 0000000..cfc51ff
--- /dev/null
+++ b/checkman/rds_licenses
@@ -0,0 +1,17 @@
+title: Remote desktop licenses
+agents: windows
+catalog: os/windows
+license: GPL
+distribution: check_mk
+description:
+ This check monitors the number of used remote desktiop licenses on Windows
+ 2008 servers. You need the plugin {rds_licenses.vbs} to be installed
+ on your windows agent. The service will go crit if all licenses are used up.
+ You can configure levels for absolute and percentual used licenses.
+
+inventory:
+ One service per license type will be created.
+
+perfdata:
+ The license usage, together with it's warn and crit levels
+
diff --git a/checks/rds_licenses b/checks/rds_licenses
new file mode 100644
index 0000000..a2506ec
--- /dev/null
+++ b/checks/rds_licenses
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2016 mk(a)mathias-kettner.de |
+# +------------------------------------------------------------------+
+#
+# This file is part of Check_MK.
+# The official homepage is at
http://mathias-kettner.de/check_mk.
+#
+# check_mk is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation in version 2. check_mk is distributed
+# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
+# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more de-
+# tails. You should have received a copy of the GNU General Public
+# License along with GNU Make; see the file COPYING. If not, write
+# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301 USA.
+
+
+# <<<rds_licenses:sep(44)>>>
+#
KeyPackId,Description,KeyPackType,ProductType,ProductVersion,ProductVersionID,TotalLicenses,IssuedLi...
+# 13,A02-6.00-S,4,0,Windows Server 2008 oder Windows Server 2008
R2,2,-1,100,-1,20380119031407.000000-000
+# 2,A02-5.00-EX,6,3,Windows 2000 Server,0,-1,0,-1,20351231230000.000000-000
+# 3,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,250,250,0,20230209121549.000000-000
+# 14,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,1050,731,319,20380101081108.000000-000
+# 16,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,50,23,27,20380101150128.000000-000
+# 17,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,50,18,32,20380101110453.000000-000
+# 18,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,65,22,43,20380101083530.000000-000
+# 19,A02-6.00-S,2,0,Windows Server 2008 oder Windows Server 2008
R2,2,600,0,600,20380101083248.000000-000
+
+
+# Insert any new keys here
+#
https://msdn.microsoft.com/en-us/library/aa383803%28v=vs.85%29.aspx#propert…
+rds_licenses_product_versionid_map = {
+ "4": "Windows Server 2012",
+ "3": "Windows Server 2008 R2",
+ "2": "Windows Server 2008"
+#1 Not supported.
+#0 Not supported.
+}
+
+def parse_rds_licenses(info):
+ parsed = {}
+ headers = info[0]
+ for line in info[1:]:
+ data = dict(zip(headers, line))
+ version_id = data.get("ProductVersionID")
+ if version_id not in rds_licenses_product_versionid_map:
+ continue
+ version = rds_licenses_product_versionid_map[version_id]
+ parsed.setdefault(version, [])
+ parsed[version].append(data)
+ return parsed
+
+def inventory_rds_licenses(parsed):
+ for key in parsed:
+ yield key, None
+
+def check_rds_licenses(item, params, parsed):
+ license_pack = parsed.get(item)
+ if not license_pack:
+ return
+
+ total = 0
+ used = 0
+ for pack in license_pack:
+ pack_total = int(pack.get("TotalLicenses"))
+ pack_avail = int(pack.get("AvailableLicenses"))
+ total += pack_total
+ used += pack_total - pack_avail
+
+ return license_check_levels(total, used, params)
+
+check_info['rds_licenses'] = {
+ 'parse_function' : parse_rds_licenses,
+ 'inventory_function' : inventory_rds_licenses,
+ 'check_function' : check_rds_licenses,
+ 'service_description' : "RDS Licenses %s",
+ 'group' : "rds_licenses",
+ 'has_perfdata' : True,
+}
diff --git a/web/plugins/wato/check_parameters.py b/web/plugins/wato/check_parameters.py
index d85c82a..b8d77dd 100644
--- a/web/plugins/wato/check_parameters.py
+++ b/web/plugins/wato/check_parameters.py
@@ -815,6 +815,18 @@ register_check_parameters(
register_check_parameters(
subgroup_applications,
+ "rds_licenses",
+ _("Number of used Remote Desktop Licenses"),
+ vs_license,
+ TextAscii(
+ title = _("ID of the license, e.g. <tt>Windows Server 2008
R2</tt>"),
+ allow_empty = False,
+ ),
+ "first"
+)
+
+register_check_parameters(
+ subgroup_applications,
"citrix_sessions",
_("Citrix Terminal Server Sessions"),
Dictionary(