]> git.siccegge.de Git - dane-monitoring-plugins.git/blob - check_dane/https.py
Refactor TLSA service checks
[dane-monitoring-plugins.git] / check_dane / https.py
1 #!/usr/bin/python3
2
3 from __future__ import print_function
4
5 import argparse
6 import logging
7
8 from ssl import SSLContext, PROTOCOL_TLSv1_2, CERT_REQUIRED
9 from socket import socket
10
11 from check_dane.cert import add_certificate_options
12 from check_dane.abstract import DaneChecker
13
14
15 class HttpsDaneChecker(DaneChecker):
16 def _init_connection(self, family, host, port):
17 connection = self._sslcontext.wrap_socket(socket(family),
18 server_hostname=host)
19 connection.connect((host, port))
20 connection.send(b"HEAD / HTTP/1.1\r\nHost: %s\r\n\r\n" % host.encode())
21 answer = connection.recv(512)
22 logging.debug(answer)
23
24 return connection
25
26
27 @property
28 def port(self):
29 return self._port
30
31
32 def _close_connection(self, connection):
33 connection.close()
34
35
36 def __init__(self):
37 DaneChecker.__init__(self)
38
39
40 def set_args(self, args):
41 DaneChecker.set_args(self, args)
42
43 self._port = args.port
44
45 sslcontext = SSLContext(PROTOCOL_TLSv1_2)
46 sslcontext.verify_mode = CERT_REQUIRED
47 sslcontext.load_verify_locations(args.castore)
48
49 self._sslcontext = sslcontext
50
51
52 def generate_menu(self, argparser):
53 DaneChecker.generate_menu(self, argparser)
54 argparser.add_argument("-p", "--port",
55 action="store", type=int, default=443,
56 help="HTTPS port")
57
58
59
60
61 def main():
62 logging.basicConfig(format='%(levelname)5s %(message)s')
63 checker = HttpsDaneChecker()
64 parser = argparse.ArgumentParser()
65
66 parser.add_argument("--verbose", action="store_true")
67 parser.add_argument("--quiet", action="store_true")
68
69 checker.generate_menu(parser)
70 add_certificate_options(parser)
71
72 args = parser.parse_args()
73 checker.set_args(args)
74
75 if args.verbose:
76 logging.getLogger().setLevel(logging.DEBUG)
77 elif args.quiet:
78 logging.getLogger().setLevel(logging.WARNING)
79 else:
80 logging.getLogger().setLevel(logging.INFO)
81
82 return checker.check()
83
84
85 if __name__ == '__main__':
86 import sys
87 sys.exit(main())