Exemplo n.º 1
0
    def rebind_ports(self):
        def addClientPortToIRCd(port, ircd, desc):
            ircd.saveClientPort(desc, port)

        def addServerPortToIRCd(port, ircd, desc):
            ircd.saveServerPort(desc, port)

        def logPortNotBound(error):
            log.msg("An error occurred: {}".format(error))

        # Client ports
        old_ports, new_ports = set(self.client_ports.keys()), set(self.servconfig["server_client_ports"])
        ports_to_unbind, ports_to_bind = old_ports - new_ports, new_ports - old_ports

        for port in ports_to_unbind:
            self.client_ports[port].stopListening()
            del self.client_ports[port]

        for port in ports_to_bind:
            try:
                endpoint = serverFromString(reactor, resolveEndpointDescription(port))
            except ValueError as e:
                log.msg("Could not bind {}: not a valid description ({})".format(port, e))
                continue
            listenDeferred = endpoint.listen(self)
            listenDeferred.addCallback(addClientPortToIRCd, self, port)
            listenDeferred.addErrback(logPortNotBound)

        # Server ports
        old_ports, new_ports = set(self.server_ports.keys()), set(self.servconfig["server_link_ports"])
        ports_to_unbind, ports_to_bind = old_ports - new_ports, new_ports - old_ports

        for port in ports_to_unbind:
            self.server_ports[port].stopListening()
            del self.server_ports[port]

        for port in ports_to_bind:
            try:
                endpoint = serverFromString(reactor, resolveEndpointDescription(port))
            except ValueError as e:
                log.msg("Could not bind {}: not a valid description ({})".format(port, e))
                continue
            listenDeferred = endpoint.listen(self.server_factory)
            listenDeferred.addCallback(addServerPortToIRCd, self, port)
            listenDeferred.addErrback(logPortNotBound)
Exemplo n.º 2
0
 def connect_server(self, servername):
     def sendServerHandshake(protocol, password):
         protocol.callRemote(IntroduceServer, name=self.name, password=password, description=self.servconfig["server_description"], version=protocol_version, commonmodules=self.common_modules)
         protocol.sentDataBurst = False
     if servername in self.servers:
         raise RuntimeError ("Server {} is already connected".format(servername))
     if servername not in self.servconfig["serverlinks"]:
         raise RuntimeError ("Server {} is not configured".format(servername))
     servinfo = self.servconfig["serverlinks"][servername]
     if "ip" not in servinfo:
         raise RuntimeError ("Server {} is not properly configured: IP address must be specified".format(servername))
     if "connect" not in servinfo:
         raise RuntimeError ("Server {} is not properly configured: Connection description not provided".format(servername))
     if "incoming_password" not in servinfo or "outgoing_password" not in servinfo:
         raise RuntimeError ("Server {} is not properly configured: Passwords not specified".format(servername))
     try:
         endpoint = clientFromString(reactor, resolveEndpointDescription(servinfo["connect"]))
     except ValueError as e:
         raise RuntimeError ("Server {} is not properly configured: Connection description is not valid ({})".format(servername, e))
     connectDeferred = endpoint.connect(self.server_factory)
     connectDeferred.addCallback(sendServerHandshake, servinfo["outgoing_password"])
     reactor.callLater(30, connectDeferred.cancel) # Time out the connection after 30 seconds
Exemplo n.º 3
0
         options.update(yaml.safe_load(f))
 except:
     print "Error: Loading configuration file"  # Oh well
 if options["app_verbose"] or args.verbose:
     log.startLogging(args.log_file)
 ssl_cert = ChainedOpenSSLContextFactory(options["app_ssl_key"],
                                         options["app_ssl_pem"])
 ssl_cert.getContext().set_verify(
     SSL.VERIFY_PEER, lambda connection, x509, errnum, errdepth, ok: True
 )  # We can ignore the validity of certs to get what we need
 ircd = IRCD(args.config, options, ssl_cert)
 serverlink_factory = ServerFactory(ircd)
 for portstring in options["server_client_ports"]:
     try:
         endpoint = serverFromString(reactor,
                                     resolveEndpointDescription(portstring))
     except ValueError as e:
         log.msg("Could not bind {}: not a valid description ({})".format(
             portstring, e))
         continue
     listenDeferred = endpoint.listen(ircd)
     listenDeferred.addCallback(addClientPortToIRCd, ircd, portstring)
     listenDeferred.addErrback(logPortNotBound)
 for portstring in options["server_link_ports"]:
     try:
         endpoint = serverFromString(reactor,
                                     resolveEndpointDescription(portstring))
     except ValueError as e:
         log.msg("Could not bind {}: not a valid description ({})".format(
             portstring, e))
         continue
Exemplo n.º 4
0
 args = parser.parse_args()
 # Load config file
 try:
     with open(args.config) as f:
         options.update(yaml.safe_load(f))
 except:
     print 'Error: Loading configuration file' # Oh well
 if options["app_verbose"] or args.verbose:
     log.startLogging(args.log_file)
 ssl_cert = ChainedOpenSSLContextFactory(options["app_ssl_key"],options["app_ssl_pem"])
 ssl_cert.getContext().set_verify(SSL.VERIFY_PEER, lambda connection, x509, errnum, errdepth, ok: True) # We can ignore the validity of certs to get what we need
 ircd = IRCD(args.config, options, ssl_cert)
 serverlink_factory = ServerFactory(ircd)
 for portstring in options["server_client_ports"]:
     try:
         endpoint = serverFromString(reactor, resolveEndpointDescription(portstring))
     except ValueError as e:
         log.msg("Could not bind {}: not a valid description ({})".format(portstring, e))
         continue
     listenDeferred = endpoint.listen(ircd)
     listenDeferred.addCallback(addClientPortToIRCd, ircd, portstring)
     listenDeferred.addErrback(logPortNotBound)
 for portstring in options["server_link_ports"]:
     try:
         endpoint = serverFromString(reactor, resolveEndpointDescription(portstring))
     except ValueError as e:
         log.msg("Could not bind {}: not a valid description ({})".format(portstring, e))
         continue
     listenDeferred = endpoint.listen(serverlink_factory)
     listenDeferred.addCallback(addServerPortToIRCd, ircd, portstring)
     listenDeferred.addErrback(logPortNotBound)