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)
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
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
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)