From d5c5416792e7427a677f9e5b858465c3c6777287 Mon Sep 17 00:00:00 2001 From: Stefan Daniel Schwarz Date: Mon, 10 Nov 2008 00:00:00 +0100 Subject: [PATCH] Initial version --- plugins/other/apt_ubuntu | 134 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100755 plugins/other/apt_ubuntu diff --git a/plugins/other/apt_ubuntu b/plugins/other/apt_ubuntu new file mode 100755 index 00000000..65907739 --- /dev/null +++ b/plugins/other/apt_ubuntu @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# -*- encoding: iso-8859-1 -*- +# +# apt_ubuntu +# +# Plugin to monitor packages that should be installed on Ubuntu systems. +# +# Author: Stefan Daniel Schwarz +# +# v1.0 2008-11-07 - First draft +# v1.1 2008-11-08 - critical = #: First # critical, rest warning +# v1.2 2008-11-09 - Code cleanup for MuninExchange submission +# +# Usage: place in /etc/munin/plugins/ (or link it there using ln -s) +# +# Parameters understood: +# +# config (required) +# autoconf (optional - used by munin-config) +# +# Magic markers - optional - used by installation scripts and +# munin-config: +# +#%# capabilities=autoconf +#%# family=contrib + +########################################################### +category = 'system' # 'upgrades' +title = 'Upgradable packages' # 'Upgradeable packages' +vlabel = 'Total packages' +other = 'other' +total = 'total' + +archives = ['security', 'updates', 'proposed', 'backports'] +colour = ['ff0000', '22ff22', '0022ff', '00aaaa', 'ff00ff'] +origins = ['Ubuntu'] + +critical = 1 +########################################################### + +import os +import sys +import warnings + +warnings.filterwarnings('ignore', 'apt API not stable yet', FutureWarning) + +def autoconf(): + if os.path.exists('/etc/lsb-release'): + for line in open('/etc/lsb-release'): + if line.strip() == 'DISTRIB_ID=Ubuntu': + try: + import apt + except ImportError: + print 'no (python-apt not installed)' + sys.exit(1) + cache = apt.Cache() + if not cache.has_key('update-notifier-common'): + print 'no (update-notifier-common not found)' + sys.exit(1) + if not cache['update-notifier-common'].isInstalled: + print 'no (update-notifier-common not installed)' + sys.exit(1) + if not os.path.exists('/etc/apt/apt.conf.d/10periodic'): + print 'no (/etc/apt/apt.conf.d/10periodic not found)' + sys.exit(1) + for line in open('/etc/apt/apt.conf.d/10periodic'): + if line.strip() == 'APT::Periodic::Update-Package-Lists "1";': + print 'yes' + sys.exit(0) + print 'no (APT::Periodic::Update-Package-Lists not "1")' + sys.exit(1) + print 'no' + sys.exit(1) + +def config(): + print 'graph_category %s' % (category) + print 'graph_title %s' % (title) + #print 'graph_total %s' % (total) + print 'graph_vlabel %s' % (vlabel) + for i, archive in enumerate(archives + [other]): + if len(colour) > i: + print '%s.colour %s' % (archive, colour[i]) + if i < critical: + print '%s.critical 0:0' % (archive) + if i == 0: + print '%s.draw AREA' % (archive) + else: + print '%s.draw STACK' % (archive) + print '%s.label %s' % (archive, archive) + if i + 1 > critical: + print '%s.warning 0:0' % (archive) + print 'total.colour 000000' + print 'total.draw LINE1' + print 'total.label %s' % (total) + sys.exit(0) + +def check_origin(pkg): + #print 'Checking: %s (%s)' % (pkg.name, map(str, pkg.candidateOrigin)) + if pkg.candidateOrigin: + for archive in archives: + for origin in pkg.candidateOrigin: + #a = origin.archive.rpartition('-')[2] + a = origin.archive.split('-')[origin.archive.count('-')] + if a == archive and origin.origin in origins: + return a + return other + +if len(sys.argv) > 1: + if sys.argv[1] == 'autoconf': + autoconf() + elif sys.argv[1] == 'config': + config() + elif sys.argv[1]: + print('unknown argument "' + sys.argv[1] + '"') + sys.exit(1) + +try: + import apt +except ImportError: + print "The module 'apt' is currently not installed. You can install it by typing:\nsudo apt-get install python-apt\nImportError: No module named apt" + sys.exit(1) + +pkgs = {} +total = 0 +for pkg in apt.Cache(): + if pkg.isUpgradable: + a = check_origin(pkg) + pkgs[a] = pkgs.get(a, 0) + 1 + total += 1 + +for archive in archives + [other]: + print '%s.value %s' % (archive, pkgs.pop(archive, 0)) + +print 'total.value %s' % (total)