From 051ee8eae78f53ee3becdbfcc73b3378a50cdaa5 Mon Sep 17 00:00:00 2001 From: Pascal Seeland Date: Fri, 1 Jan 2016 00:00:00 +0100 Subject: [PATCH 1/3] Add Munin ILIAS plugin --- plugins/ilias/ilias_ | 119 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 plugins/ilias/ilias_ diff --git a/plugins/ilias/ilias_ b/plugins/ilias/ilias_ new file mode 100644 index 00000000..dc41d8d0 --- /dev/null +++ b/plugins/ilias/ilias_ @@ -0,0 +1,119 @@ +#!/usr/bin/env python + +# The Plugin needs the following configuration settings +#[ilias_*] +#env.ildbuser ilias +#env.ildbpassword youriliaspasword +#env.ildb ilias + +#%# family=auto +#%# capabilities=autoconf suggest + +import os +import sys +import MySQLdb +import _mysql +class ILIAS(): + title = "ILIAS session" + args = "--base 1000 -l 0" + vlabel = "ilias" + category = "ilias" + + 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') + + def connectdb(self): + self.con = MySQLdb.connect("localhost", self.user, self.pw,self.ildb) + self.pluginname = sys.argv[0].split('_')[1] + + + def config_sessions(self): + print("graph_title ILIAS Session") + print("graph_vlabel ilsessions") + print("graph_category ILIAS") + print("ilsessions.label ilSessions") + + 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") + usrs = cursor.fetchone()[0] + print("ilsessions %s"%(usrs)) + + + 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): + cursor = self.con.cursor() + cursor.execute("select count(user_id) from usr_session where 10 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0") + usrs = cursor.fetchone()[0] + print("il10minavg %s"%(usrs)) + + def config_60minavg(self): + print("graph_title ILIAS 60 avg") + print("graph_vlabel il60minavg") + print("graph_category ILIAS") + print("il60minavg.label 60 min Count") + + 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") + usrs = cursor.fetchone()[0] + print("il60minavg %s"%(usrs)) + + def config_total1day(self): + print("graph_title Users in 24h") + print("graph_vlabel iltotal1day") + print("graph_category ILIAS") + print("iltotal1day.label User/24h") + + 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 )") + usrs = cursor.fetchone()[0] + print("iltotal1day %s"%(usrs)) + + + def run(self): + cmd = ((len(sys.argv) > 1) and sys.argv[1] or None) or "execute" + function = None + if cmd == "execute": + function = "execute" + elif 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") + 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 From 167c204db263c9bddffb790cd84da66fa2ab5123 Mon Sep 17 00:00:00 2001 From: Felix Pahlow Date: Mon, 19 Mar 2018 12:19:28 +0100 Subject: [PATCH 2/3] 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 + From 890e971c2ca0814ad569ac5d5eb98f17db4df8db Mon Sep 17 00:00:00 2001 From: "Felix Pahlow (private)" Date: Fri, 20 Apr 2018 21:00:36 +0200 Subject: [PATCH 3/3] ILIAS plugin v2: Use bash+CLI and combine graphs Combine multiple graphs into one as suggested by @sumpfralle. --- plugins/ilias/example-graphs/ilias-day.png | Bin 0 -> 32597 bytes .../example-graphs/ilias_sessions-day.png | Bin 18997 -> 0 bytes plugins/ilias/ilias_ | 254 ------------------ plugins/ilias/ilias_session | 236 ++++++++++++++++ 4 files changed, 236 insertions(+), 254 deletions(-) create mode 100644 plugins/ilias/example-graphs/ilias-day.png delete mode 100644 plugins/ilias/example-graphs/ilias_sessions-day.png delete mode 100755 plugins/ilias/ilias_ create mode 100755 plugins/ilias/ilias_session diff --git a/plugins/ilias/example-graphs/ilias-day.png b/plugins/ilias/example-graphs/ilias-day.png new file mode 100644 index 0000000000000000000000000000000000000000..130604cf259103e2a73af5a9d070ef57abcb777c GIT binary patch literal 32597 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 Vu2i#mJd+Xdl9y4GE|E0w`#;rU;}ie@ literal 0 HcmV?d00001 diff --git a/plugins/ilias/example-graphs/ilias_sessions-day.png b/plugins/ilias/example-graphs/ilias_sessions-day.png deleted file mode 100644 index f53b11dfc77b3c96074fbce7e85343f46dcb6574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18997 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

ujh|&HqRQGoRjZh$YHpi~{jr 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 KT-G@yGywp5EY(i{ diff --git a/plugins/ilias/ilias_ b/plugins/ilias/ilias_ deleted file mode 100755 index 39bf1367..00000000 --- a/plugins/ilias/ilias_ +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -""" -: << =cut - -=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 pkgutil - - -class 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.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 = self.get_connection() - - 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 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" - ) - usrs = cursor.fetchone()[0] - 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 execute_5minavg(self): - cursor = self.con.cursor() - 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("il5minavg.value %s" % (usrs)) - - 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 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" - ) - usrs = cursor.fetchone()[0] - print("il60minavg.value %s" % (usrs)) - - 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 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 )") - usrs = cursor.fetchone()[0] - print("iltotal1day.value %s" % (usrs)) - - def run(self): - cmd = ((len(sys.argv) > 1) and sys.argv[1]) or "execute" - function = None - - if cmd == "config": - function = "config" - 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: - 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() - - sys.exit(0) - - -if __name__ == "__main__": - ILIAS().run() - diff --git a/plugins/ilias/ilias_session b/plugins/ilias/ilias_session new file mode 100755 index 00000000..5f85a7c4 --- /dev/null +++ b/plugins/ilias/ilias_session @@ -0,0 +1,236 @@ +#!/usr/bin/env bash +# Munin plugin for ILIAS + +: << =cut + +=head1 NAME + +ilias_session - Munin plugin to monitor L open source +learning management system's sessions + +=head1 DESCRIPTION + +Reads session and user statistcs from any ILIAS MySQL/MariaDB database. + +https://ilias.de/ | http://gallery.munin-monitoring.org/contrib/cms-index.html + +Requirements: + +bash version 4 is required for associative array support. +This plugin requires mysql CLI or a compatible client being available. + +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_session] + env.ildbuser ilias + env.ildbpassword youriliaspasword + env.ildb ilias + env.ildbhost localhost + env.ildbport 3306 + +WARNING: Setting env.ildbpassword will possibly expose the database password +to other processes and might be insecure. + +=head1 AUTHOR + +Copyright 2018 L + (L) + +=head1 LICENSE + +Licensed under the MIT license: +https://opensource.org/licenses/MIT + +=head1 CONTRIBUTE + +Find this plugin on L + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + + 2.0 + +=head1 CHANGELOG + +=head2 2.0 - 2018/04/20 + + first sh release + +=head2 1.0 - 2018/03/19 + + first release + +=cut + +# Include plugin.sh +# shellcheck source=/dev/null +. "${MUNIN_LIBDIR:-}/plugins/plugin.sh" + +# Shell options +set -o nounset # Like perl use strict; + +# Graph settings +global_attr=" + graph_title ILIAS session and logins + graph_category cms + graph_args --lower-limit 0 + graph_vlabel occurences + graph_info Number of active ILIAS user sessions and logins +" + +declare -A d_attr=( \ + [0,field]=iltotal1day \ + [0,type]=GAUGE \ + [0,draw]=LINE \ + [0,label]='users logged in within day' \ + [0,sql]="SELECT COUNT( usr_id ) AS C + FROM \`usr_data\` + WHERE last_login >= DATE_SUB( NOW( ) , INTERVAL 1 DAY ) + " \ + [1,field]=ilsessions \ + [1,type]=GAUGE \ + [1,draw]=LINE \ + [1,label]='active sessions' \ + [1,sql]="SELECT COUNT( user_id ) AS C + FROM usr_session + WHERE \`expires\` > UNIX_TIMESTAMP( NOW( ) ) AND user_id != 0 + " \ + [2,field]=il60minavg \ + [2,type]=GAUGE \ + [2,draw]=LINE \ + [2,label]='sessions created/updated within 1h' \ + [2,sql]="SELECT COUNT( user_id ) AS C + FROM usr_session + WHERE 60 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0 + " \ + [3,field]=il5minavg \ + [3,type]=GAUGE \ + [3,draw]=LINE \ + [3,label]='sessions created/updated within 5min' \ + [3,sql]="SELECT COUNT( user_id ) AS C + FROM usr_session + WHERE 5 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0 + " \ +) + +# Read the environment and apply defaults +DB_CLI_TOOL="${ildbcli:-mysql}" +DB_CLI_CMD="$(command -v "${DB_CLI_TOOL}")" +DB_HOST="${ildbhost:-localhost}" +DB_PORT="${ildbport:-3306}" +DB="${ildb:-ilias}" +DB_USER="${ildbuser:-root}" +DB_PASSWORD="${ildbpassword:-}" + +# Functions + +autoconf() { + if command -v "${DB_CLI_TOOL}" >/dev/null ; then + echo yes + else + echo "no (failed to find executable '${DB_CLI_TOOL}')" + fi +} + +config() { + local label_max_length=45 + local i=0 + + # print global attributes + echo "$global_attr" | sed -e 's/^ *//' -e '/^$/d' + + i=0 + # -v varname + # True if the shell variable varname is set (has been assigned a value). + # https://stackoverflow.com/a/45385463/2683737 + while [[ -v d_attr[$i,field] ]]; do + field=${d_attr[$i,field]} + echo "$field.type ${d_attr[$i,type]}" + echo "$field.draw ${d_attr[$i,draw]}" + echo "$field.label ${d_attr[$i,label]:0:${label_max_length}}" + echo "$field.min 0" + ((++i)) + done +} + +# Join a bash array $1 is the glue +join_by() { + local d=$1 + shift + echo -n "$1" + shift + printf "%s" "${@/#/$d}" +} + +fetch() { + local i=0 + local query=() + local query_string="" + declare -a results + + # create an array of queries + i=0 + while [[ -v d_attr[$i,field] ]]; do + query+=("${d_attr[$i,sql]}") + ((++i)) + done + + # build query by joining the array elements + query_string=$(join_by " UNION ALL " "${query[@]}") + + # obtain result using CLI call; don't supply password through + # command line; note that MySQL considers it insecure using + # an environment variable: + # >This method of specifying your MySQL password must + # >be considered extremely insecure and should not be used. + # >Some versions of ps include an option to display the + # >environment of running processes. [...] + result=$(MYSQL_PWD="$DB_PASSWORD" \ + "$DB_CLI_CMD" \ + --skip-column-names \ + -h "$DB_HOST" \ + -u "$DB_USER" \ + -P "$DB_PORT" \ + "$DB" \ + -e "$query_string" ) + + # initialize array + mapfile -t results <<< "$result" + + # extract result and echo it to stdout, which is + # captured by Munin + i=0 + while [[ -v d_attr[$i,field] ]]; do + echo "${d_attr[$i,field]}.value ${results[$i]}" + ((++i)) + done +} + + +# Main +case ${1:-} in +autoconf) + autoconf + ;; +config) + config + [ "${MUNIN_CAP_DIRTYCONFIG:-}" = "1" ] && fetch + ;; +*) + fetch + ;; +esac + +exit 0 +