#!/usr/bin/env python3 """HKP server Uses the python http.server module to create an HKP keyserver (pykeyserver) Functions: port(number or string or bytes or bytearray) -> 16 bit integer""" import ipaddress import argparse import http.server class HKPRequestHandler(http.server.BaseHTTPRequestHandler): """HKP Request Handler Class""" def run_server(server_class=http.server.ThreadingHTTPServer, handler_class=HKPRequestHandler, ip_address='', tcp_port=11371): """Run HTTP server with HKP request handler""" ip_address = str(ip_address) server_address = (ip_address, tcp_port) httpd = server_class(server_address, handler_class) httpd.serve_forever() def port(val): """Restrict port values to the TCP range. Receives a number or a string, bytes, or bytearray instance representing an integer literal. Raises ValueError if it's not a number or if the number falls outside TCP port range.""" num = int(val) if num < 1: raise ValueError if num.bit_length() > 16: raise ValueError return num def main(): """HKP server main function""" parser = argparse.ArgumentParser(description='Basic HKP keyserver') parser.add_argument('--address', type=ipaddress.ip_address, help='IP for server interface', default=ipaddress.ip_address('127.0.0.1')) parser.add_argument('--port', type=port, help='TCP Port for server interface', default=port(11371)) args = parser.parse_args() run_server(ip_address=args.address, tcp_port=args.port) if __name__ == '__main__': main()