Inhaltsverzeichnis

APT Check

Benötigt: python-apt

Client

#!/usr/bin/env python
#
# Check_MK APT Plugin - Check for upgradeable packages.
#
# Copyright 2010, Stefan Schlesinger <sts@ono.at>
#
#
# This program 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 3 of the License, or
# (at your option) any later version.
#
# This program 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 program.  If not, see <http://www.gnu.org/licenses/>.
#
#
# Mod damit es mit Debian UND Ubuntu funktioniert  03/2011 Matthias Henze <mh@mhcsoftware.de>
# Mod damit Packages die auf "keep" stehen ignoriert werden 08/2011 Matthias Henze <mh@mhcsoftware.de>
# Mod fuer neue APT-API v0.8.0    02/2014 Matthias Henze <mh@mhcsoftware.de>
# Mod fuer neue APT-API v0.8.8i.2 06/2014 Matthias Henze <mh@mhcsoftware.de>


import sys
import os
import datetime
import warnings
warnings.filterwarnings("ignore")

from pprint import pprint

try:
    import apt
except ImportError:
    sys.exit


class AptCache(apt.Cache):

    # apt-cache update interval in seconds
    update_interval = 3600

    # file to check against
    update_last_file = "/var/tmp/checkmk_apt_timestamp"

    def __init__(self):
        apt.Cache.__init__(self)
        self.update_cache()

    # automatically update the apt cache once a hour
    def update_cache(self):
        delta = self.last_cache_update(self.update_last_file)
        if not delta or delta.seconds > self.update_interval:
            self.update()
            self.open(None)
            # update the timestamp
            self.update_timestamp(self.update_last_file)

    def last_cache_update(self, file):
        # return false, if we don't have the file yet
        if not os.path.isfile(file):
            return False

        now     = datetime.datetime.now()
        mtime   = datetime.datetime.fromtimestamp(os.path.getmtime(file))
        delta   = now - mtime

        return delta

    def update_timestamp(self, file):
        open(file, 'w').close()
        return True


def get_upgradeable():
    pkgs_to_upgrade     = []
    pkgs_to_sec_upgrade = []
    cache = AptCache()

    for pkg in cache:
           if pkg.is_upgradable:
               name      = pkg.name
               candidate = pkgcand.source_name
               if candidate == "Debian-Security":
                   pkgs_to_sec_upgrade.append(name)
               elif candidate.find("security") > -1:
                   pkgs_to_sec_upgrade.append(name)
               else:
                   pkgs_to_upgrade.append(name)

    return [pkgs_to_upgrade, pkgs_to_sec_upgrade]



def main():
    upgrades, secupgrades = get_upgradeable()

    # print the beginning of the plugin header
    print "<<<apt>>>"

    if len(upgrades) > 0:
        print "upgrades \"%s\"" % ",".join(upgrades)
    else:
        print "upgrades"

    if len(secupgrades) > 0:
        print "secupgrades \"%s\"" % ",".join(secupgrades)
    else:
        print "secupgrades"


if __name__ == "__main__":
    main()

Server

#!/usr/bin/env python
#
# Check_MK APT Plugin - Check for upgradeable packages.
#
# Copyright 2010, Stefan Schlesinger <sts@ono.at>
#
# This program 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 3 of the License, or
# (at your option) any later version.
#
# This program 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 program.  If not, see <http://www.gnu.org/licenses/>.
#
#
# Mod damit es mit Debian UND Ubuntu funktioniert  03/2011 Matthias Henze <mh@mhcsoftware.de>
#



def inventory_apt_upgrades(checkname, info):
    if len(info) >= 1:
        return [(None, "", None)]

    return []

def check_apt_upgrades(item, params, info):

    level   = 0 # 0:OK, 1:WARNING 2:CRITICAL, 3: UNKNOWN
    updates = []

    for line in info:

	      # if we don't have any upgrades listed, the line list
	      # will only contain one element, eg. "upgrades\n"
	      if len(line) < 2:
	          continue

	      # there are upgrades availiable, evaluate the importency.
	      #secupgrades return CRITICAL, normal upgrades only WARNING.
        type = line[0]
        pkgs = line[1].strip("\"").split(",")

        if len(pkgs) > 0:
            if level < 2 and type == "secupgrades":
                level = 2

            if level < 1 and type == "upgrades":
                level = 1

            updates.extend(pkgs)

    # Construct a the status message.
    if level == 0:
        msg = "OK - All packages are up to date."
    elif level == 1:
        msg = "%s packages available for upgrade: %s" % (len(updates), ",".join(updates))
    elif level == 2:
        msg = "%s packages available for upgrade: %s" % (len(updates), ",".join(updates))

    return (level, msg)

# declare the check to Check_MK. Dict format:
#  ( check_function, "service name", perf_data_provided?(0:1), inventory_function)
check_info['apt.upgrades'] = \
      (check_apt_upgrades, "apt.upgrades", 0, inventory_apt_upgrades)