From 167c204db263c9bddffb790cd84da66fa2ab5123 Mon Sep 17 00:00:00 2001 From: Felix Pahlow Date: Mon, 19 Mar 2018 12:19:28 +0100 Subject: [PATCH] Munin ILIAS plugin: First release --- .../example-graphs/ilias_sessions-day.png | Bin 0 -> 18997 bytes plugins/ilias/ilias_ | 267 +++++++++++++----- 2 files changed, 201 insertions(+), 66 deletions(-) create mode 100644 plugins/ilias/example-graphs/ilias_sessions-day.png mode change 100644 => 100755 plugins/ilias/ilias_ diff --git a/plugins/ilias/example-graphs/ilias_sessions-day.png b/plugins/ilias/example-graphs/ilias_sessions-day.png new file mode 100644 index 0000000000000000000000000000000000000000..f53b11dfc77b3c96074fbce7e85343f46dcb6574 GIT binary patch literal 18997 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

ujh|&HqRQGoRjZh$YHpi~{jr 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 KT-G@yGywp5EY(i{ literal 0 HcmV?d00001 diff --git a/plugins/ilias/ilias_ b/plugins/ilias/ilias_ old mode 100644 new mode 100755 index dc41d8d0..39bf1367 --- a/plugins/ilias/ilias_ +++ b/plugins/ilias/ilias_ @@ -1,119 +1,254 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- -# The Plugin needs the following configuration settings -#[ilias_*] -#env.ildbuser ilias -#env.ildbpassword youriliaspasword -#env.ildb ilias +""" +: << =cut -#%# family=auto -#%# capabilities=autoconf suggest +=head1 NAME + +ilias - Munin plugin to monitor L open source +learning management system + +=head1 DESCRIPTION + +Reads session and user statistcs from any ILIAS MySQLdb database. + +https://ilias.de/ | http://gallery.munin-monitoring.org/contrib/cms-index.html + +This plugin requires python3 and python3-mysqldb. + +There is a check for the the filename suffix _ (from the symlink) in place +to decide which value to output. Symlink the file for each value you want +displayed +example: + ln -s /usr/local/munin_plugins/ilias_ /etc/munin/plugins/ilias_sessions + +In order to get precise results, please ensure your MySQL server has the same +time as your ILIAS application server. Timezone does not matter. + +=head1 CONFIGURATION + +The plugin needs the following configuration settings e.g. in +/etc/munin/plugin-conf.d/ilias.conf + + [ilias_*] + env.ildbuser ilias + env.ildbpassword youriliaspasword + env.ildb ilias + env.ildbhost localhost + env.ildbport 3306 + + +=head1 AUTHOR + +Copyright 2016 Pascal Seeland + +Copyright 2018 L + (L) + +=head1 LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +provided that the above copyright notice(s) and this permission notice +appear in all copies of the Software and that both the above copyright +notice(s) and this permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE +LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization of the +copyright holder. + +=head1 CONTRIBUTE + +Find this plugin on L + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf suggest + +=head1 VERSION + + 1.0 + +=head1 CHANGELOG + +=head2 1.0 - 2018/03/19 + + first release + +=cut +""" import os import sys -import MySQLdb -import _mysql +import pkgutil + + class ILIAS(): - title = "ILIAS session" - args = "--base 1000 -l 0" - vlabel = "ilias" - category = "ilias" + pluginname = sys.argv[0].split('_')[1] def __init__(self): self.con = None self.user = os.environ.get('ildbuser', 'root') self.pw = os.environ.get('ildbpassword', '') - self.ildb = os.environ.get('ildb','ilias') + self.ildb = os.environ.get('ildb', 'ilias') + self.ildbhost = os.environ.get('ildbhost', 'localhost') + self.ildbport = int(os.environ.get('ildbport', 3306)) + + def db_modules_available(self): + return pkgutil.find_loader("MySQLdb") + + def get_connection(self): + import MySQLdb + return MySQLdb.connect(host=self.ildbhost, + port=self.ildbport, + user=self.user, + passwd=self.pw, + db=self.ildb) def connectdb(self): - self.con = MySQLdb.connect("localhost", self.user, self.pw,self.ildb) - self.pluginname = sys.argv[0].split('_')[1] + self.con = self.get_connection() - - def config_sessions(self): + def config_sessions(self): print("graph_title ILIAS Session") + print("graph_info Number of active ILIAS user sessions") print("graph_vlabel ilsessions") - print("graph_category ILIAS") + print("graph_category cms") print("ilsessions.label ilSessions") + print("ilsessions.min 0") + print("ilsessions.draw AREA") def execute_sessions(self): cursor = self.con.cursor() - cursor.execute("select count(user_id) from usr_session where `expires` > UNIX_TIMESTAMP( NOW( ) ) AND user_id != 0") + cursor.execute( + "SELECT COUNT( user_id ) " + "FROM usr_session " + "WHERE `expires` > UNIX_TIMESTAMP( NOW( ) ) AND user_id != 0" + ) usrs = cursor.fetchone()[0] - print("ilsessions %s"%(usrs)) + print("ilsessions.value %s" % (usrs)) + def config_5minavg(self): + print("graph_title ILIAS 5 avg") + print("graph_info ILIAS sessions created or " + "updated during the last 5 minutes") + print("graph_vlabel il5minavg") + print("graph_category cms") + print("il5minavg.label 5 min Count") + print("il5minavg.min 0") + print("il5minavg.draw AREA") - def config_10minavg(self): - print("graph_title ILIAS 10 avg") - print("graph_vlabel il10minavg") - print("graph_category ILIAS") - print("il10minavg.label 10 min Count") - - def execute_10minavg(self): + def execute_5minavg(self): cursor = self.con.cursor() - cursor.execute("select count(user_id) from usr_session where 10 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0") + cursor.execute( + "SELECT COUNT( user_id ) " + "FROM usr_session " + "WHERE 5 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0" + ) usrs = cursor.fetchone()[0] - print("il10minavg %s"%(usrs)) + print("il5minavg.value %s" % (usrs)) - def config_60minavg(self): + def config_60minavg(self): print("graph_title ILIAS 60 avg") + print("graph_info ILIAS sessions created or " + "updated during the last 60 minutes") print("graph_vlabel il60minavg") - print("graph_category ILIAS") + print("graph_category cms") print("il60minavg.label 60 min Count") + print("il60minavg.min 0") + print("il60minavg.draw AREA") def execute_60minavg(self): cursor = self.con.cursor() - cursor.execute("select count(user_id) from usr_session where 60 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0") + cursor.execute( + "SELECT COUNT( user_id ) " + "FROM usr_session " + "WHERE 60 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0" + ) usrs = cursor.fetchone()[0] - print("il60minavg %s"%(usrs)) + print("il60minavg.value %s" % (usrs)) - def config_total1day(self): + def config_total1day(self): print("graph_title Users in 24h") + print("graph_info ILIAS users logging in during last 24h") print("graph_vlabel iltotal1day") - print("graph_category ILIAS") + print("graph_category cms") print("iltotal1day.label User/24h") + print("iltotal1day.min 0") + print("iltotal1day.draw AREA") def execute_total1day(self): cursor = self.con.cursor() - cursor.execute("select count(usr_id) FROM `usr_data` WHERE last_login >= DATE_SUB( NOW( ) , INTERVAL 1 DAY )") + cursor.execute( + "SELECT COUNT( usr_id ) " + "FROM `usr_data` " + "WHERE last_login >= DATE_SUB( NOW( ) , INTERVAL 1 DAY )") usrs = cursor.fetchone()[0] - print("iltotal1day %s"%(usrs)) - + print("iltotal1day.value %s" % (usrs)) def run(self): - cmd = ((len(sys.argv) > 1) and sys.argv[1] or None) or "execute" + cmd = ((len(sys.argv) > 1) and sys.argv[1]) or "execute" function = None - if cmd == "execute": - function = "execute" - elif cmd == "config": + + if cmd == "config": function = "config" - if function != None: - self.connectdb() - try: - func = getattr(self, "%s_%s"%(function,self.pluginname)) - except AttributeError: - print 'function not found "%s" (%s)' % ("config_%s"%self.pluginname, "self") + elif cmd == "suggest": + print("sessions") + print("5minavg") + print("60minavg") + print("total1day") + elif cmd == "autoconf": + if not self.db_modules_available(): + print("no (Please install the MySQLdb python3 module)") else: - func() + try: + con = self.get_connection() + cursor = con.cursor() + cursor.execute("SELECT COUNT( component ) " + "FROM il_pluginslot") + con.close() + except _mysql.Error as e: + print("no (Error %d: %s - Database configuration missing?)" + % (e.args[0], e.args[1])) + else: + print("yes") + else: + function = "execute" + + if function is not None: + if not self.db_modules_available(): + print("U (Please install the MySQLdb python3 module)") + else: + self.connectdb() + try: + func = getattr(self, "%s_%s" % (function, self.pluginname)) + except AttributeError: + print('function not found "%s" (%s)' % + ("config_%s" % self.pluginname, "self")) + else: + func() + if self.con: self.con.close() - if cmd == "suggest": - print ("sessions") - print ("10minavg") - print ("60minavg") - print ("total1day") - if cmd == "autoconf": - try: - con = MySQLdb.connect("localhost", self.user, self.pw,self.ildb) - cursor = con.cursor() - cursor.execute("SELECT count(component) FROM il_pluginslot") - except _mysql.Error, e: - print "no (Error %d: %s)" % (e.args[0], e.args[1]) - else: - print "yes" + sys.exit(0) if __name__ == "__main__": ILIAS().run() - \ No newline at end of file +