From 6b8bd1c5eb881b87b7ccb49045d230961e12bef5 Mon Sep 17 00:00:00 2001 From: Sven Velt Date: Tue, 20 Sep 2016 22:50:12 +0200 Subject: [PATCH] check_xbps.py: New plugin for Voidlinux' package manager --- check_xbps.py | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100755 check_xbps.py diff --git a/check_xbps.py b/check_xbps.py new file mode 100755 index 0000000..9504536 --- /dev/null +++ b/check_xbps.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python2 +# -*- encoding: utf-8 -*- + +##################################################################### +# (c) 2016 by Sven Velt, Germany # +# sven-mymonplugins@velt.biz # +# # +# This file is part of "velt.biz - My Monitoring Plugins" # +# a fork of "team(ix) Monitoring Plugins" in 2015 # +# URL: https://gogs.velt.biz/velt.biz/MyMonPlugins/ # +# # +# This file 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, either version 2 of the License, # +# or (at your option) any later version. # +# # +# This file is distributed in the hope that it will be useful, but # +# WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this file. If not, see . # +##################################################################### + +import subprocess +import sys +import time + +try: + from monitoringplugin import MonitoringPlugin +except ImportError: + print '==========================' + print 'AIKS! Python import error!' + print '==========================\n' + print 'Could not find "monitoringplugin.py"!\n' + print 'Did you download "%s"' % os.path.basename(sys.argv[0]) + print 'without "monitoringplugin.py"?\n' + print 'Please go back to' + print 'https://gogs.velt.biz/velt.biz/MyMonPlugins and download it,' + print 'or even better:' + print 'get a full archive at http://gogs.velt.biz/velt.biz/MyMonPlugins/releases' + print 'or a master snapshot at http://gogs.velt.biz/velt.biz/MyMonPlugins/archive/master.tar.gz\n' + sys.exit(127) + + +plugin = MonitoringPlugin( + pluginname='check_xbps', + tagforstatusline='XBPS', + description='Check XBPS package manager for updates', + version='0.1', + ) + +plugin.add_cmdlineoption('-P', '--path-xbps-install', 'xbps_install', 'full path to xbps-install', default='/usr/bin/xbps-install') +plugin.add_cmdlineoption('-S', '--sync-repo-index', 'sync_repo_index', 'sync repository index files at startup', default=False, action='store_true') +plugin.add_cmdlineoption('', '--ignore-sync-failure', 'fail_on_sync_failure', 'ignore repo index sync failures', default=True, action='store_false') + +#FIXME: plugin.add_cmdlineoption('', '--mymonplugins-testmode', 'mymonplugins_testmode', None, default=False, action='store_true') + +plugin.parse_cmdlineoptions() + +############################################################################## +##### Testmode + +if plugin.options.mymonplugins_testmode: + mymonplugins_testmode = {} + + mymonplugins_testmode['xbps-install -S'] = '''[*] Updating `https://repo.voidlinux.eu/current/x86_64-repodata' ... +'''.split('\n') + + mymonplugins_testmode['xbps-install -un'] = '''elementary-1.17.1_1 remove x86_64 https://repo.voidlinux.eu/current 19821495 12302924 +bash-4.3.046_2 update x86_64 https://repo.voidlinux.eu/current 5019665 998440 +libllvm3.9-3.9.0_2 install x86_64 https://repo.voidlinux.eu/current 51052672 12480860 +linux4.7-4.7.4_1 install x86_64 https://repo.voidlinux.eu/current 61839987 55203908 +linux-4.7_1 update x86_64 https://repo.voidlinux.eu/current 624 +linux4.6-4.6.7_1 update x86_64 https://repo.voidlinux.eu/current 60995961 54434936 +lxc-2.0.4_1 update x86_64 https://repo.voidlinux.eu/current 1837102 468024'''.split('\n') + +############################################################################## + +def run_command(cmdline): + tstart = time.time() + plugin.verbose(1, 'Running command line: %s' % subprocess.list2cmdline(cmdline)) + try: + cmd = subprocess.Popen( + cmdline, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE + ) + except OSError: + plugin.back2nagios(3, 'Could not execute command line: %s' % subprocess.list2cmdline(cmdline)) + + (sout,serr) = cmd.communicate() + plugin.verbose(2, 'Runtime %.3fs' % (time.time() - tstart, ) ) + + sout = sout.rstrip().split('\n') + if sout == ['']: + sout = [] + serr = serr.rstrip().split('\n') + if serr == ['']: + serr = [] + + return( (sout, serr, cmd.returncode,) ) + +############################################################################## + +if plugin.options.sync_repo_index: + cmdline = [plugin.options.xbps_install, '-S',] + (sout, serr, rc) = run_command(cmdline) + sout and plugin.verbose(3, sout, prefix='stdout: ') + serr and plugin.verbose(3, serr, prefix='stderr: ') + plugin.verbose(2, 'Return code: %d' % rc) + if rc != 0 and plugin.options.fail_on_sync_failure: + plugin.back2nagios(2, 'Syncing of repository index files failed') + +############################################################################## + +cmdline = [plugin.options.xbps_install, '-un',] +(sout, serr, rc) = run_command(cmdline) +sout and plugin.verbose(3, sout, prefix='stdout: ') +serr and plugin.verbose(3, serr, prefix='stderr: ') +plugin.verbose(2, 'Return code: %d' % rc) + +action = {'remove':[], 'update':[], 'install':[],} +arch = {} +repo = {} +downby = 0L + +for line in sout: + cols = line.split(' ') + # Append package name to action type list + try: + action[cols[1]].append(cols[0]) + except KeyError: + action[cols[1]] = [ cols[0], ] + + # Count per arch + try: + arch[cols[2]] += 1 + except KeyError: + arch[cols[2]] = 1 + + # Count per repo + try: + repo[cols[3]] += 1 + except KeyError: + repo[cols[3]] = 1 + + # Count bytes to download + if len(cols) == 5: + downby += long(cols[4]) + else: + downby += long(cols[5]) + +if len(sout) == 0: + plugin.remember_check('Updates', plugin.RETURNCODE['OK'], 'Everything uptodate') +else: + out = [] + multiline = [] + for act in ['update', 'install', 'remove']: + pkgs = action.pop(act) + pkgs.sort() + l = len(pkgs) + out.append('%s package%s to %s' % (l, l != 1 and 's' or '', act) ) + l and multiline.append('%s(%s): %s' % (act, l, ', '.join(pkgs)) ) + for act in action: + pkgs = action.pop(act) + pkgs.sort() + l = len(pkgs) + out.append('%s package%s to %s' % (l, l != 1 and 's' or '', act) ) + l and multiline.append('%s(%s): %s' % (act, l, ', '.join(pkgs)) ) + + out = ', '.join(out) + if downby: + out += ' - %s to download' % plugin.value_to_human_binary(downby, 'B') + + stats = 'Statistics: ' + for (k, v) in arch.iteritems(): + stats += '%sx %s, ' % (v, k) + for (k, v) in repo.iteritems(): + stats += '%s from %s, ' % (v, k) + multiline.append(stats[:-2]) + + plugin.remember_check('Updates', plugin.RETURNCODE['WARNING'], out, multilineoutput=multiline) + +# Exit +plugin.brain2output() +plugin.exit() +