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…
	
	Add table
		Add a link
		
	
		Reference in a new issue