diff --git a/check_yum/check_yum b/check_yum/check_yum index 8e930bf..56564fc 100644 --- a/check_yum/check_yum +++ b/check_yum/check_yum @@ -305,9 +305,28 @@ class YumTester: + "of this plugin. If the problem persists, then " \ + "please contact the author for a fix") - return number_packages + return number_packages, "'updates'=%s" % (number_packages) + def get_security_updateinfo(self): + """Fetches errata numbers and package names""" + + cmd = "%s list-security" % YUM + + output = self.run(cmd) + + errata = [] + + for line in output: + try: + if line.split()[1] != "security": + continue + except: + continue + (advisoryid, etype, package) = line.split() + errata.append( { "name": package, "advisory": advisoryid } ) + return errata + def get_security_updates(self): """Gets all updates, but differentiates between security and normal updates. Returns a tuple of the number @@ -317,10 +336,10 @@ class YumTester: output = self.run(cmd) - re_security_summary_rhel5 = re.compile("Needed \d+ of \d+ packages, for security") - re_security_summary_rhel6 = re.compile("\d+ package\(s\) needed for security, out of \d+ available") - re_no_security_updates_available_rhel5 = re.compile("No packages needed, for security, \d+ available") - re_no_security_updates_available_rhel6 = re.compile("No packages needed for security; \d+ packages available") + re_security_summary_rhel5 = re.compile("Needed \d+ of \d+ packages, for security") + re_security_summary_rhel6 = re.compile("\d+ package\(s\) needed for security, out of \d+ available") + re_no_security_updates_available_rhel5 = re.compile("No packages needed, for security, \d+ available") + re_no_security_updates_available_rhel6 = re.compile("No packages needed for security; \d+ packages available") summary_line_found = False for line in output: if re_no_security_updates_available_rhel5.match(line): @@ -394,7 +413,7 @@ class YumTester: status = UNKNOWN message = "code error - please contact author for a fix" - number_updates = self.get_all_updates() + number_updates, perfdata = self.get_all_updates() if number_updates == 0: status = OK message = "0 Updates Available" @@ -405,7 +424,7 @@ class YumTester: else: message = "%s Updates Available" % number_updates - return status, message + return status, message, perfdata def test_security_updates(self): @@ -417,6 +436,8 @@ class YumTester: number_security_updates, number_other_updates = \ self.get_security_updates() + + perfdata = "'security_updates'=%s 'other_updates'=%s" % (number_security_updates, number_other_updates) if number_security_updates == 0: status = OK message = "0 Security Updates Available" @@ -427,7 +448,6 @@ class YumTester: elif number_security_updates > 1: message = "%s Security Updates Available" \ % number_security_updates - if number_other_updates != 0: if self.warn_on_any_update and status != CRITICAL: status = WARNING @@ -437,7 +457,12 @@ class YumTester: message += ". %s Non-Security Updates Available" \ % number_other_updates - return status, message + if number_security_updates and self.long_output: + errata = self.get_security_updateinfo() + for e in errata: + message += "\n%s - %s" % (e['advisory'], e['name']) + + return status, message, perfdata def vprint(self, threshold, message): @@ -508,6 +533,13 @@ def main(): help="Explicitly disables a repository when calling YUM " + "Can take a comma separated list of repositories") + parser.add_option( "-l", + "--long-output", + action="store_true", + dest="long_output", + help="Shows more detailed output including the errata " + + "ID.") + parser.add_option( "-t", "--timeout", dest="timeout", @@ -544,14 +576,15 @@ def main(): tester.timeout = options.timeout tester.verbosity = options.verbosity tester.warn_on_any_update = options.warn_on_any_update + tester.long_output = options.long_output if options.version: print "%s - Version %s\n" \ % (__title__, __version__) sys.exit(OK) - result, output = tester.test_yum_updates() - end(result, output) + result, output, perfdata = tester.test_yum_updates() + end(result, output, perfdata) if __name__ == "__main__":