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 00000000..f53b11df
Binary files /dev/null and b/plugins/ilias/example-graphs/ilias_sessions-day.png differ
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
+