initial xmpp checking code
- take care of argument parsing, measure time for socket connection - initial README
This commit is contained in:
commit
48e0593246
3 changed files with 152 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.*.swp
|
||||||
|
.ropeproject/
|
24
README
Normal file
24
README
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
nagios/icinga check for XMPP
|
||||||
|
============================
|
||||||
|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
------
|
||||||
|
|
||||||
|
usage: check_xmpp [-h] -H HOST_ADDRESS [-p PORT] [-s | -c] [-4 | -6]
|
||||||
|
[--servername SERVERNAME] [--starttls]
|
||||||
|
|
||||||
|
Check XMPP services
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-H HOST_ADDRESS, --host-address HOST_ADDRESS
|
||||||
|
host address
|
||||||
|
-p PORT, --port PORT port
|
||||||
|
-s, --s2s server to server (s2s)
|
||||||
|
-c, --c2s client to server (c2s)
|
||||||
|
-4, --ipv4 enforce IPv4
|
||||||
|
-6, --ipv6 enforce IPv6
|
||||||
|
--servername SERVERNAME
|
||||||
|
server name to be used
|
||||||
|
--starttls check whether the service allows starttls
|
126
check_xmpp
Executable file
126
check_xmpp
Executable file
|
@ -0,0 +1,126 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import nagiosplugin
|
||||||
|
import socket
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
class Xmpp(nagiosplugin.Resource):
|
||||||
|
state = nagiosplugin.Unknown
|
||||||
|
cause = None
|
||||||
|
|
||||||
|
def __init__(self, host_address, port, ipv6, is_server, starttls,
|
||||||
|
servername):
|
||||||
|
self.address = host_address
|
||||||
|
self.port = port
|
||||||
|
self.ipv6 = ipv6
|
||||||
|
self.is_server = is_server
|
||||||
|
self.starttls = starttls
|
||||||
|
self.servername = servername
|
||||||
|
|
||||||
|
def probe(self):
|
||||||
|
start = datetime.now()
|
||||||
|
try:
|
||||||
|
for res in self.get_addrinfo():
|
||||||
|
af, socktype, proto, canonname, sa = res
|
||||||
|
try:
|
||||||
|
s = socket.socket(af, socktype, proto)
|
||||||
|
except socket.error:
|
||||||
|
s = None
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
s.connect(sa)
|
||||||
|
except socket.error:
|
||||||
|
s.close()
|
||||||
|
s = None
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
if s is None:
|
||||||
|
self.state = nagiosplugin.Critical
|
||||||
|
self.cause = 'could not open socket'
|
||||||
|
return nagiosplugin.Metric("time", "unknown")
|
||||||
|
s.close()
|
||||||
|
except socket.gaierror as e:
|
||||||
|
self.state = nagiosplugin.Critical
|
||||||
|
self.cause = str(e)
|
||||||
|
return nagiosplugin.Metric("time", "unknown")
|
||||||
|
end = datetime.now()
|
||||||
|
return nagiosplugin.Metric(
|
||||||
|
'time', (end - start).total_seconds(), 's', min=0)
|
||||||
|
|
||||||
|
def get_addrinfo(self):
|
||||||
|
if self.ipv6 is None:
|
||||||
|
addrfamily = 0
|
||||||
|
elif self.ipv6 is True:
|
||||||
|
addrfamily = socket.AF_INET6
|
||||||
|
else:
|
||||||
|
addrfamily = socket.AF_INET
|
||||||
|
return socket.getaddrinfo(
|
||||||
|
self.address, self.port, addrfamily, socket.SOCK_STREAM,
|
||||||
|
socket.IPPROTO_TCP)
|
||||||
|
self.result = nagiosplugin.Critical
|
||||||
|
|
||||||
|
|
||||||
|
class XmppContext(nagiosplugin.ScalarContext):
|
||||||
|
|
||||||
|
def evaluate(self, metric, resource):
|
||||||
|
if resource.cause:
|
||||||
|
return nagiosplugin.Result(resource.state, resource.cause, metric)
|
||||||
|
return super(XmppContext, self).evaluate(metric, resource)
|
||||||
|
|
||||||
|
|
||||||
|
@nagiosplugin.guarded
|
||||||
|
def main():
|
||||||
|
import argparse
|
||||||
|
parser = argparse.ArgumentParser(description="Check XMPP services")
|
||||||
|
parser.add_argument(
|
||||||
|
"-H", "--host-address", help="host address", required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p", "--port", help="port", type=int)
|
||||||
|
is_server = parser.add_mutually_exclusive_group()
|
||||||
|
is_server.add_argument(
|
||||||
|
"--s2s", dest="is_server", action='store_true',
|
||||||
|
help="server to server (s2s)")
|
||||||
|
is_server.add_argument(
|
||||||
|
"--c2s", dest="is_server", action='store_false',
|
||||||
|
help="client to server (c2s)")
|
||||||
|
ipv6 = parser.add_mutually_exclusive_group()
|
||||||
|
ipv6.add_argument(
|
||||||
|
"-4", "--ipv4", dest="ipv6", action='store_false',
|
||||||
|
help="enforce IPv4")
|
||||||
|
ipv6.add_argument(
|
||||||
|
"-6", "--ipv6", dest="ipv6", action='store_true',
|
||||||
|
help="enforce IPv6")
|
||||||
|
parser.add_argument(
|
||||||
|
"--servername", help="server name to be used")
|
||||||
|
parser.add_argument(
|
||||||
|
"--starttls",
|
||||||
|
action='store_true', help="check whether the service allows starttls")
|
||||||
|
parser.set_defaults(is_server=False, ipv6=None)
|
||||||
|
parser.add_argument(
|
||||||
|
"-w", "--warning", metavar="SECONDS", default='',
|
||||||
|
help="return warning if connection setup takes longer than SECONDS")
|
||||||
|
parser.add_argument(
|
||||||
|
"-c", "--critical", metavar="SECONDS", default='',
|
||||||
|
help="return critical if connection setup takes longer than SECONDS")
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.port is None:
|
||||||
|
if args.is_server:
|
||||||
|
args.port = 5269
|
||||||
|
else:
|
||||||
|
args.port = 5222
|
||||||
|
if args.servername is None:
|
||||||
|
args.servername = args.host_address
|
||||||
|
kwargs = vars(args)
|
||||||
|
warning = kwargs.pop('warning')
|
||||||
|
critical = kwargs.pop('critical')
|
||||||
|
check = nagiosplugin.Check(
|
||||||
|
Xmpp(**kwargs),
|
||||||
|
XmppContext('time', warning, critical)
|
||||||
|
)
|
||||||
|
check.main()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue