class AppServer(service.MultiService): def __init__(self, basedir=".", stdout=sys.stdout): service.MultiService.__init__(self) self.basedir = os.path.abspath(basedir) try: umask = open(os.path.join(basedir, "umask")).read().strip() self.umask = int(umask, 8) # octal string like 0022 except EnvironmentError: self.umask = None port = open(os.path.join(basedir, "port")).read().strip() self.tub = Tub(certFile=os.path.join(basedir, "tub.pem")) self.tub.listenOn(port) self.tub.setServiceParent(self) self.tub.registerNameLookupHandler(self.lookup) print >> stdout, "Server Running" self.ready_observers = OneShotObserverList() # make sure we log any problems self.when_ready().addErrback(log.err) def when_ready(self): # return a Deferred that fires (with this AppServer instance) when # the service is running and the location is set. return self.ready_observers.whenFired() def startService(self): if self.umask is not None: os.umask(self.umask) service.MultiService.startService(self) d = self.setMyLocation() d.addBoth(self.ready_observers.fire) def setMyLocation(self): location = open(os.path.join(self.basedir, "location")).read().strip() if location: self.tub.setLocation(location) return defer.succeed(self) d = self.tub.setLocationAutomatically() d.addCallback(lambda ign: self) return d def lookup(self, name): # walk through our configured services, see if we know about this one services = load_service_data(self.basedir)["services"] s = services.get(name) if not s: return None service_basedir = os.path.join(self.basedir, s["relative_basedir"]) service_type = s["type"] service_args = s["args"] s = build_service(service_basedir, self.tub, service_type, service_args) s.setServiceParent(self) return s
class AppServer(service.MultiService): def __init__(self, basedir=".", stdout=sys.stdout): service.MultiService.__init__(self) self.basedir = os.path.abspath(basedir) try: umask = open(os.path.join(basedir, "umask")).read().strip() self.umask = int(umask, 8) # octal string like 0022 except EnvironmentError: self.umask = None port = open(os.path.join(basedir, "port")).read().strip() self.tub = Tub(certFile=os.path.join(basedir, "tub.pem")) self.tub.listenOn(port) self.tub.setServiceParent(self) self.tub.registerNameLookupHandler(self.lookup) print >>stdout, "Server Running" self.ready_observers = OneShotObserverList() # make sure we log any problems self.when_ready().addErrback(log.err) def when_ready(self): # return a Deferred that fires (with this AppServer instance) when # the service is running and the location is set. return self.ready_observers.whenFired() def startService(self): if self.umask is not None: os.umask(self.umask) service.MultiService.startService(self) d = self.setMyLocation() d.addBoth(self.ready_observers.fire) def setMyLocation(self): location = open(os.path.join(self.basedir, "location")).read().strip() if location: self.tub.setLocation(location) return defer.succeed(self) d = self.tub.setLocationAutomatically() d.addCallback(lambda ign: self) return d def lookup(self, name): # walk through our configured services, see if we know about this one service_basedir = os.path.join(self.basedir, "services", name) if not os.path.exists(service_basedir): return None service_type_f = os.path.join(service_basedir, "service_type") service_type = open(service_type_f).read().strip() service_args_f = os.path.join(service_basedir, "service_args") service_args = eval(open(service_args_f).read().strip()) s = build_service(service_basedir, self.tub, service_type, service_args) s.setServiceParent(self) return s
class AppServer(service.MultiService): def __init__(self, basedir=".", stdout=sys.stdout): service.MultiService.__init__(self) self.basedir = os.path.abspath(basedir) try: umask = open(os.path.join(basedir, "umask")).read().strip() self.umask = int(umask, 8) # octal string like 0022 except EnvironmentError: self.umask = None self.port = open(os.path.join(basedir, "port")).read().strip() self.tub = Tub(certFile=os.path.join(basedir, "tub.pem")) self.tub.listenOn(self.port) self.tub.setServiceParent(self) self.tub.registerNameLookupHandler(self.lookup) self.setMyLocation() print("Server Running", file=stdout) def startService(self): if self.umask is not None: os.umask(self.umask) service.MultiService.startService(self) def setMyLocation(self): location_fn = os.path.join(self.basedir, "location") location = open(location_fn).read().strip() if not location: raise ValueError("This flappserver was created without " "'--location=', and Foolscap no longer uses " "IP-address autodetection. Please edit '%s' " "to contain e.g. 'tcp:example.org:12345', with " "a hostname and port number that match this " "server (we're listening on %s)" % (location_fn, self.port)) self.tub.setLocation(location) def lookup(self, name): # walk through our configured services, see if we know about this one services = load_service_data(self.basedir)["services"] service_desc = services.get(name) if service_desc: service_basedir = os.path.join(self.basedir, service_desc["relative_basedir"]) service_type = service_desc["type"] service_args = [arg for arg in service_desc["args"]] service = build_service(service_basedir, self.tub, service_type, service_args) service.setServiceParent(self) return service
class AppServer(service.MultiService): def __init__(self, basedir=".", stdout=sys.stdout): service.MultiService.__init__(self) self.basedir = os.path.abspath(basedir) try: umask = open(os.path.join(basedir, "umask")).read().strip() self.umask = int(umask, 8) # octal string like 0022 except EnvironmentError: self.umask = None self.port = open(os.path.join(basedir, "port")).read().strip() self.tub = Tub(certFile=os.path.join(basedir, "tub.pem")) self.tub.listenOn(self.port) self.tub.setServiceParent(self) self.tub.registerNameLookupHandler(self.lookup) self.setMyLocation() print >>stdout, "Server Running" def startService(self): if self.umask is not None: os.umask(self.umask) service.MultiService.startService(self) def setMyLocation(self): location_fn = os.path.join(self.basedir, "location") location = open(location_fn).read().strip() if not location: raise ValueError("This flappserver was created without " "'--location=', and Foolscap no longer uses " "IP-address autodetection. Please edit '%s' " "to contain e.g. 'example.org:12345', with a " "hostname and port number that match this " "server (we're listening on %s)" % (location_fn, self.port)) self.tub.setLocation(location) def lookup(self, name): # walk through our configured services, see if we know about this one services = load_service_data(self.basedir)["services"] s = services.get(name) if not s: return None service_basedir = os.path.join(self.basedir, s["relative_basedir"].encode("utf-8")) service_type = s["type"] service_args = [arg.encode("utf-8") for arg in s["args"]] s = build_service(service_basedir, self.tub, service_type, service_args) s.setServiceParent(self) return s
def makeService(config, reactor=reactor): parent = MultiService() basedir = FilePath(os.path.expanduser(config["basedir"])) basedir.makedirs(ignoreExistingDirectory=True) basedir.chmod(0o700) data = Data(basedir.child("config.json")) dns_server = DNSServerFactory(verbose=0) s1 = UDPServer(int(config["dns-port"]), dns.DNSDatagramProtocol(dns_server), interface=config["dns-interface"]) s1.setServiceParent(parent) s2 = TCPServer(int(config["dns-port"]), dns_server, interface=config["dns-interface"]) s2.setServiceParent(parent) s = Server(data, dns_server) s.update_records() certFile = basedir.child("tub.data").path #furlFile = basedir.child("server.furl").path t = Tub(certFile=certFile) t.setOption("keepaliveTimeout", 60) # ping after 60s of idle t.setOption("disconnectTimeout", 5*60) # disconnect/reconnect after 5m #t.setOption("logLocalFailures", True) #t.setOption("logRemoteFailures", True) #t.unsafeTracebacks = True fp = config["foolscap-port"] if not fp.startswith("tcp:"): raise usage.UsageError("I don't know how to handle non-tcp foolscap-port=") port = int(fp.split(":")[1]) assert port > 1 t.listenOn(fp) t.setLocation("tcp:%s:%d" % (config["hostname"], port)) c = Controller(data, s) cf = t.registerReference(c, furlFile=basedir.child("controller.furl").path) furl_prefix = cf[:cf.rfind("/")+1] c.set_furl_prefix(furl_prefix) t.registerNameLookupHandler(c.lookup) t.setServiceParent(parent) return parent