#!/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') 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(plugin.RETURNCODE['UNKNOWN'], '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: plugin.verbose(1, '-S/--sync_repo_index given') 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(plugin.RETURNCODE['CRITICAL'], '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) if rc == 8: # RC 8: Transaction aborted due to unresolved shlibs. plugin.back2nagios(plugin.RETURNCODE['WARNING'], serr[-1], serr[:-1]) elif rc not in [0, 6]: # RC 0: Packages to update # RC 6: Package(s) already installed plugin.back2nagios(plugin.RETURNCODE['WARNING'], 'Unknown returncode "%s", please contact the author of plugin or open an issue!' % 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['CRITICAL'], out, multilineoutput=multiline) # Exit plugin.brain2output() plugin.exit()