Exemplo n.º 1
0
 def test_parse_addr_ipv6_custom_port_multiple(self):
     res = tuple(parse_addrs('[::1]:8888,[::2]:9999,[::3]', 8888))
     self.assertEqual(res, ({
         'host': '::1',
         'port': 8888
     }, {
         'host': '::2',
         'port': 9999
     }, {
         'host': '::3',
         'port': 8888
     }))
Exemplo n.º 2
0
 def test_parse_addr_ipv6_def_port_multiple(self):
     res = tuple(parse_addrs('[::1],[::2]', 8888))
     self.assertEqual(res, (
         {
             'host': '::1',
             'port': 8888
         },
         {
             'host': '::2',
             'port': 8888
         },
     ))
Exemplo n.º 3
0
    def __init__(self,
                 callback,
                 conf_root,
                 listen_ipv4=None,
                 listen_ipv6=None,
                 default_port=None,
                 listen_ipv4_ssl=None,
                 listen_ipv6_ssl=None,
                 default_port_ssl=None,
                 pemfile=None,
                 cacert=None):
        '''Initializes the server and listens on the specified addresses.

        param callback : callable
            The callable that is called as callabale(msg, addr) whenever a message is received.
        param conf_root : unicode
            Path to the root of the configuration tree
        param listen_ipv4 : comma separated basestring of addresses
            Addresses to listen on for TCP and UDP connections
        param listen_ipv6 : comma separated basestring of addresses
            Addresses to listen on for TCP and UDP connections
        param default_port : short
            Port to use for listen_ipv4 and listen_ipv6 if they don't specify a custom port
        param listen_ipv4_ssl : comma separated basestring of addresses
            Addresses to listen on for SSL/TLS connections
        param listen_ipv6_ssl : comma separated basestring of addresses
            Addresses to listen on for SSL/TLS connections
        param default_port_ssl : short
            Port to use for listen_ipv4_ssl and listen_ipv6_ssl if they don't specify a custom port
        param pemfile : unicode
            File path to the pem file containing private and public keys for SSL/TLS
        param cacert : unicode
            File path to the cacert file with which the public key in pemfile is signed
        '''

        self.log = logging.getLogger('server')  # internal logger

        self.callback = callback
        self.closed = False

        self.stream_socks = set()
        self.ssl_socks = set()
        self.dgram_socks = set()

        self.client_stream_socks = set()
        self.stream_buffers = {}

        self.client_socket_addrs = {}

        self.select_timeout = None  # Set on shutdown to prevent infinite wait

        self.pemfile = normalize_path(
            pemfile if pemfile is not None else options.server.pemfile,
            conf_root)
        self.cacert = normalize_path(
            cacert if cacert is not None else options.server.cacert, conf_root)

        # Initialize server sockets
        listen_ipv4 = listen_ipv4 if listen_ipv4 is not None else options.server.listen_ipv4
        listen_ipv6 = listen_ipv6 if listen_ipv6 is not None else options.server.listen_ipv6
        default_port = default_port if default_port is not None else options.server.default_port

        ipv4_addrs = parse_addrs(listen_ipv4, default_port)
        ipv6_addrs = parse_addrs(listen_ipv6, default_port)

        for addr in ipv4_addrs:
            self.stream_socks.add(
                self.connect(addr, socket.AF_INET, socket.SOCK_STREAM))
            self.dgram_socks.add(
                self.connect(addr, socket.AF_INET, socket.SOCK_DGRAM))

        for addr in ipv6_addrs:
            self.stream_socks.add(
                self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM))
            self.dgram_socks.add(
                self.connect(addr, socket.AF_INET6, socket.SOCK_DGRAM))

        # Same thing for SSL addresses, except not datagram sockets
        listen_ipv4_ssl = listen_ipv4_ssl if listen_ipv4_ssl is not None else options.server.listen_ipv4_ssl
        listen_ipv6_ssl = listen_ipv6_ssl if listen_ipv6_ssl is not None else options.server.listen_ipv6_ssl
        default_port_ssl = default_port_ssl if default_port_ssl is not None else options.server.default_port_ssl

        self.validate_ssl_config(listen_ipv4_ssl, listen_ipv6_ssl)

        ipv4_addrs_ssl = parse_addrs(listen_ipv4_ssl, default_port_ssl)
        ipv6_addrs_ssl = parse_addrs(listen_ipv6_ssl, default_port_ssl)

        for addr in ipv4_addrs_ssl:
            s = self.connect(addr, socket.AF_INET, socket.SOCK_STREAM, True)
            self.stream_socks.add(s)
            self.ssl_socks.add(s)

        for addr in ipv6_addrs_ssl:
            s = self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM, True)
            self.stream_socks.add(s)
            self.ssl_socks.add(s)

        self.all_socks = set(self.stream_socks | self.dgram_socks)
Exemplo n.º 4
0
 def test_parse_addr_ipv4_def_port(self):
     res = tuple(parse_addrs('127.0.0.1', 8888))
     self.assertEqual(res, ({'host': '127.0.0.1', 'port': 8888},))
Exemplo n.º 5
0
 def test_parse_addr_ipv6_custom_port_multiple(self):
     res = tuple(parse_addrs('[::1]:8888,[::2]:9999,[::3]', 8888))
     self.assertEqual(res, ({'host': '::1', 'port': 8888}, {'host': '::2', 'port': 9999}, {'host': '::3', 'port': 8888}))
Exemplo n.º 6
0
 def test_parse_addr_ipv6_def_port_multiple(self):
     res = tuple(parse_addrs('[::1],[::2]', 8888))
     self.assertEqual(res, ({'host': '::1', 'port': 8888}, {'host': '::2', 'port': 8888},))
Exemplo n.º 7
0
 def test_parse_addr_ipv6_custom_port(self):
     res = tuple(parse_addrs('[::1]:8888', 8888))
     self.assertEqual(res, ({'host': '::1', 'port': 8888},))
Exemplo n.º 8
0
 def test_parse_addr_ipv4_custom_port(self):
     res = tuple(parse_addrs('127.0.0.1:8888', 8888))
     self.assertEqual(res, ({'host': '127.0.0.1', 'port': 8888}, ))
Exemplo n.º 9
0
 def test_parse_addr_ipv6_custom_port(self):
     res = tuple(parse_addrs('[::1]:8888', 8888))
     self.assertEqual(res, ({'host': '::1', 'port': 8888}, ))
Exemplo n.º 10
0
    def __init__(self, callback, conf_root, listen_ipv4=None, listen_ipv6=None, default_port=None, listen_ipv4_ssl=None, listen_ipv6_ssl=None, default_port_ssl=None, pemfile=None, cacert=None):
        '''Initializes the server and listens on the specified addresses.

        param callback : callable
            The callable that is called as callabale(msg, addr) whenever a message is received.
        param conf_root : unicode
            Path to the root of the configuration tree
        param listen_ipv4 : comma separated basestring of addresses
            Addresses to listen on for TCP and UDP connections
        param listen_ipv6 : comma separated basestring of addresses
            Addresses to listen on for TCP and UDP connections
        param default_port : short
            Port to use for listen_ipv4 and listen_ipv6 if they don't specify a custom port
        param listen_ipv4_ssl : comma separated basestring of addresses
            Addresses to listen on for SSL/TLS connections
        param listen_ipv6_ssl : comma separated basestring of addresses
            Addresses to listen on for SSL/TLS connections
        param default_port_ssl : short
            Port to use for listen_ipv4_ssl and listen_ipv6_ssl if they don't specify a custom port
        param pemfile : unicode
            File path to the pem file containing private and public keys for SSL/TLS
        param cacert : unicode
            File path to the cacert file with which the public key in pemfile is signed
        '''

        self.log = logging.getLogger('server') # internal logger

        self.callback = callback
        self.closed = False

        self.stream_socks = set()
        self.ssl_socks = set()
        self.dgram_socks = set()

        self.client_stream_socks = set()
        self.stream_buffers = {}

        self.client_socket_addrs = {}

        self.select_timeout = None # Set on shutdown to prevent infinite wait

        self.pemfile = normalize_path(pemfile if pemfile is not None else options.server.pemfile, conf_root)
        self.cacert = normalize_path(cacert if cacert is not None else options.server.cacert, conf_root)

        # Initialize server sockets
        listen_ipv4 = listen_ipv4 if listen_ipv4 is not None else options.server.listen_ipv4
        listen_ipv6 = listen_ipv6 if listen_ipv6 is not None else options.server.listen_ipv6
        default_port = default_port if default_port is not None else options.server.default_port
        
        ipv4_addrs = parse_addrs(listen_ipv4, default_port)
        ipv6_addrs = parse_addrs(listen_ipv6, default_port)

        for addr in ipv4_addrs:
            self.stream_socks.add(self.connect(addr, socket.AF_INET, socket.SOCK_STREAM))
            self.dgram_socks.add(self.connect(addr, socket.AF_INET, socket.SOCK_DGRAM))

        for addr in ipv6_addrs:
            self.stream_socks.add(self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM))
            self.dgram_socks.add(self.connect(addr, socket.AF_INET6, socket.SOCK_DGRAM))

        # Same thing for SSL addresses, except not datagram sockets
        listen_ipv4_ssl = listen_ipv4_ssl if listen_ipv4_ssl is not None else options.server.listen_ipv4_ssl
        listen_ipv6_ssl = listen_ipv6_ssl if listen_ipv6_ssl is not None else options.server.listen_ipv6_ssl
        default_port_ssl = default_port_ssl if default_port_ssl is not None else options.server.default_port_ssl

        self.validate_ssl_config(listen_ipv4_ssl, listen_ipv6_ssl)
        
        ipv4_addrs_ssl = parse_addrs(listen_ipv4_ssl, default_port_ssl)
        ipv6_addrs_ssl = parse_addrs(listen_ipv6_ssl, default_port_ssl)

        for addr in ipv4_addrs_ssl:
            s = self.connect(addr, socket.AF_INET, socket.SOCK_STREAM, True)
            self.stream_socks.add(s)
            self.ssl_socks.add(s)

        for addr in ipv6_addrs_ssl:
            s = self.connect(addr, socket.AF_INET6, socket.SOCK_STREAM, True)
            self.stream_socks.add(s)
            self.ssl_socks.add(s)

        self.all_socks = set(self.stream_socks | self.dgram_socks)