/ / nagiospirugin: Wie man verschiedene fmt_metric basierend auf dem Wert zeigt? - Python, Plugins, Nagios

Nagioplugin: Wie zeigt man verschiedene fmt_metric basierend auf dem Wert? - Python, Plugins, Nagios

Ich schreibe ein Nagios-Plugin, das XML-Ausgabe von verwendet sslyze um den SSL-Wert basierend auf zu berechnen Qualys Server-Bewertungshandbuch.

Hier ist mein Code:

            if certificateMatchesServerHostname == "True" and expire_in.days > 0 and validationResult == "ok":
...
final_score = protocol_score * 0.3 + key_score * 0.3 + cipher_score * 0.4
return [nap.Metric("sslscore", final_score, min=0, max=100)]
elif certificateMatchesServerHostname != "True":
return [nap.Metric("serverHostname", hostnameValidation[0].attrib["serverHostname"])]
elif expire_in.days <= 0:
return [nap.Metric("expireInDays", expire_in.days)]
elif validationResult != "ok":
return [nap.Metric("validationResult", validationResult)]


@nap.guarded
def main():
check = nap.Check(
SslConfiguration(),
nap.ScalarContext("sslscore", nap.Range("@65:80"), nap.Range("@0:65")),
nap.ScalarContext("serverHostname", fmt_metric="The certificate does not match the host name {value}"),
nap.ScalarContext("expireInDays", nap.Range("@:0"), fmt_metric="The certificate expired {value} days ago"),
nap.ScalarContext("validationResult", fmt_metric="This server"s certificate is not trusted: {value}"))
check.main(timeout=60)

Der Grund warum ich mehrere ScalarContext benutzen muss, möchte ich anders zeigen fmt_metric Wenn es ein Problem mit dem SSL-Zertifikat gibt: stimmt nicht überein, abgelaufen, nicht vertrauenswürdig, ...

Mit dem obigen Code sieht die Ausgabe etwa so aus:

SSLCONFIGURATION CRITICAL - The certificate does not match the host name a.b.c.d (outside range 0:)
critical: The certificate does not match the host name a.b.c.d (outside range 0:)
| serverHostname=a.b.c.d

Was ich wirklich zeigen möchte, ist:

SSLCONFIGURATION CRITICAL - final_score is 0 (The certificate does not match the host name a.b.c.d) | sslscore=0;@65:80;@65;0;100

Also, ich habe ein paar Fragen:

  1. Wie kann ich anders anzeigen? fmt_metric basierend auf dem sslscore-Wert in nur einem Kontext sslscore?

  2. Wie entferne ich die redundante Leitung (2.)?

    critical: The certificate does not match the host name a.b.c.d (outside range 0:)
    
  3. Wie verschiebe ich die Metrik (3. Zeile) bis zum Ende der ersten Zeile?

Antworten:

0 für die Antwort № 1

Mit Hilfe von meinem Freund habe ich das Problem endlich gelöst.

Über die erste Frage können wir das verwenden nagiosplugin.summary Modul zum Ändern der Statuszeile, etwa so:

class SslConfiguration(nap.Resource):
def __init__(self, host, port):
self.host = host
self.port = port

def check(self):
...
if hostname_validation.startswith("OK") and expire_in.days > 0 and is_trusted == "OK":
final_score = protocol_score * 0.3 + key_score * 0.3 + cipher_score * 0.4
else:
final_score = 0
return (hostname_validation, is_trusted, expire_in.days, final_score)

def probe(self):
if self.check()[3] > 0:
return [nap.Metric("sslscore", self.check()[3])]
elif not self.check()[0].startswith("OK"):
return [nap.Metric("sslscore", 0, context="serverHostname")]
elif self.check()[1] != "OK":
return [nap.Metric("sslscore", 0, context="validationResult")]
elif self.check()[2] <= 0:
return [nap.Metric("sslscore", 0, context="expireInDays")]


class SslSummary(nap.Summary):
def __init__(self, host, port):
self.host = host
self.port = port

def status_line(self, results):
ssl_configuration = SslConfiguration(self.host, self.port)
if results["sslscore"].context.name == "serverHostname":
return "sslscore is 0 ({0})".format(ssl_configuration.check()[0])
elif results["sslscore"].context.name == "validationResult":
return "sslscore is 0 ({0})".format(ssl_configuration.check()[1])
elif results["sslscore"].context.name == "expireInDays":
return "sslscore is 0 (The certificate expired {0} days ago)".format(ssl_configuration.check()[2])

def problem(self, results):
return self.status_line(results)

Die zweite und dritte Frage können gelöst werden, indem man die verbose Parameter von main() bis Null:

@nap.guarded
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-H", "--host", type=str, required=True)
parser.add_argument("-p", "--port", type=int, default=443)
parser.add_argument("-v", "--verbose", action="count", default=0, help="increase output verbosity (use up to 3 times)")
parser.add_argument("-t", "--timeout", type=int, default=60)
args = parser.parse_args()

check = nap.Check(
SslConfiguration(args.host, args.port),
nap.ScalarContext("sslscore", nap.Range("@65:80"), nap.Range("@0:65")),
nap.ScalarContext("serverHostname", nap.Range("@65:80"), nap.Range("@0:65")),
nap.ScalarContext("validationResult", nap.Range("@65:80"), nap.Range("@0:65")),
nap.ScalarContext("expireInDays", nap.Range("@65:80"), nap.Range("@0:65")),
SslSummary(args.host, args.port))
check.main(args.verbose, args.timeout)

Jetzt kann die Ausgabe helfen, dass sysadmin weiß, was vor sich geht:

check_ssl_configuration.py -H google.com
SSLCONFIGURATION OK - sslscore is 87 | sslscore=87.0;@65:80;@65

check_ssl_configuration.py -H 173.194.127.169
SSLCONFIGURATION CRITICAL - sslscore is 0 (FAILED - Certificate does NOT match 173.194.127.169) | sslscore=0;@65:80;@65