def construct(self): # This is the working dir by now. sys.path.insert(0, '') c = self.master_config self.import_statements() reusing = c.Global.reuse_files if reusing: try: self.load_config_from_json() except (AssertionError, IOError): reusing = False # check again, because reusing may have failed: if reusing: pass elif c.Global.secure: keyfile = os.path.join(c.Global.security_dir, c.Global.exec_key) key = str(uuid.uuid4()) with open(keyfile, 'w') as f: f.write(key) os.chmod(keyfile, stat.S_IRUSR | stat.S_IWUSR) c.SessionFactory.exec_key = key else: c.SessionFactory.exec_key = '' key = None try: self.factory = ControllerFactory(config=c, logname=self.log.name) self.start_logging() self.factory.construct() except: self.log.error("Couldn't construct the Controller", exc_info=True) self.exit(1) if not reusing: # save to new json config files f = self.factory cdict = { 'exec_key': key, 'ssh': c.Global.sshserver, 'url': "%s://%s:%s" % (f.client_transport, f.client_ip, f.regport), 'location': c.Global.location } self.save_connection_dict('ipcontroller-client.json', cdict) edict = cdict edict['url'] = "%s://%s:%s" % ( (f.client_transport, f.client_ip, f.regport)) self.save_connection_dict('ipcontroller-engine.json', edict)
def construct(self): # This is the working dir by now. sys.path.insert(0, '') c = self.master_config self.import_statements() reusing = c.Global.reuse_files if reusing: try: self.load_config_from_json() except (AssertionError,IOError): reusing=False # check again, because reusing may have failed: if reusing: pass elif c.Global.secure: keyfile = os.path.join(c.Global.security_dir, c.Global.exec_key) key = str(uuid.uuid4()) with open(keyfile, 'w') as f: f.write(key) os.chmod(keyfile, stat.S_IRUSR|stat.S_IWUSR) c.SessionFactory.exec_key = key else: c.SessionFactory.exec_key = '' key = None try: self.factory = ControllerFactory(config=c, logname=self.log.name) self.start_logging() self.factory.construct() except: self.log.error("Couldn't construct the Controller", exc_info=True) self.exit(1) if not reusing: # save to new json config files f = self.factory cdict = {'exec_key' : key, 'ssh' : c.Global.sshserver, 'url' : "%s://%s:%s"%(f.client_transport, f.client_ip, f.regport), 'location' : c.Global.location } self.save_connection_dict('ipcontroller-client.json', cdict) edict = cdict edict['url']="%s://%s:%s"%((f.client_transport, f.client_ip, f.regport)) self.save_connection_dict('ipcontroller-engine.json', edict)
class IPControllerApp(ApplicationWithClusterDir): name = u'ipcontroller' description = _description command_line_loader = IPControllerAppConfigLoader default_config_file_name = default_config_file_name auto_create_cluster_dir = True def create_default_config(self): super(IPControllerApp, self).create_default_config() # Don't set defaults for Global.secure or Global.reuse_furls # as those are set in a component. self.default_config.Global.import_statements = [] self.default_config.Global.clean_logs = True self.default_config.Global.secure = True self.default_config.Global.reuse_files = False self.default_config.Global.exec_key = "exec_key.key" self.default_config.Global.sshserver = None self.default_config.Global.location = None def pre_construct(self): super(IPControllerApp, self).pre_construct() c = self.master_config # The defaults for these are set in FCClientServiceFactory and # FCEngineServiceFactory, so we only set them here if the global # options have be set to override the class level defaults. # if hasattr(c.Global, 'reuse_furls'): # c.FCClientServiceFactory.reuse_furls = c.Global.reuse_furls # c.FCEngineServiceFactory.reuse_furls = c.Global.reuse_furls # del c.Global.reuse_furls # if hasattr(c.Global, 'secure'): # c.FCClientServiceFactory.secure = c.Global.secure # c.FCEngineServiceFactory.secure = c.Global.secure # del c.Global.secure def save_connection_dict(self, fname, cdict): """save a connection dict to json file.""" c = self.master_config url = cdict['url'] location = cdict['location'] if not location: try: proto,ip,port = split_url(url) except AssertionError: pass else: location = socket.gethostbyname_ex(socket.gethostname())[2][-1] cdict['location'] = location fname = os.path.join(c.Global.security_dir, fname) with open(fname, 'w') as f: f.write(json.dumps(cdict, indent=2)) os.chmod(fname, stat.S_IRUSR|stat.S_IWUSR) def load_config_from_json(self): """load config from existing json connector files.""" c = self.master_config # load from engine config with open(os.path.join(c.Global.security_dir, 'ipcontroller-engine.json')) as f: cfg = json.loads(f.read()) key = c.SessionFactory.exec_key = cfg['exec_key'] xport,addr = cfg['url'].split('://') c.HubFactory.engine_transport = xport ip,ports = addr.split(':') c.HubFactory.engine_ip = ip c.HubFactory.regport = int(ports) c.Global.location = cfg['location'] # load client config with open(os.path.join(c.Global.security_dir, 'ipcontroller-client.json')) as f: cfg = json.loads(f.read()) assert key == cfg['exec_key'], "exec_key mismatch between engine and client keys" xport,addr = cfg['url'].split('://') c.HubFactory.client_transport = xport ip,ports = addr.split(':') c.HubFactory.client_ip = ip c.Global.sshserver = cfg['ssh'] assert int(ports) == c.HubFactory.regport, "regport mismatch" def construct(self): # This is the working dir by now. sys.path.insert(0, '') c = self.master_config self.import_statements() reusing = c.Global.reuse_files if reusing: try: self.load_config_from_json() except (AssertionError,IOError): reusing=False # check again, because reusing may have failed: if reusing: pass elif c.Global.secure: keyfile = os.path.join(c.Global.security_dir, c.Global.exec_key) key = str(uuid.uuid4()) with open(keyfile, 'w') as f: f.write(key) os.chmod(keyfile, stat.S_IRUSR|stat.S_IWUSR) c.SessionFactory.exec_key = key else: c.SessionFactory.exec_key = '' key = None try: self.factory = ControllerFactory(config=c, logname=self.log.name) self.start_logging() self.factory.construct() except: self.log.error("Couldn't construct the Controller", exc_info=True) self.exit(1) if not reusing: # save to new json config files f = self.factory cdict = {'exec_key' : key, 'ssh' : c.Global.sshserver, 'url' : "%s://%s:%s"%(f.client_transport, f.client_ip, f.regport), 'location' : c.Global.location } self.save_connection_dict('ipcontroller-client.json', cdict) edict = cdict edict['url']="%s://%s:%s"%((f.client_transport, f.client_ip, f.regport)) self.save_connection_dict('ipcontroller-engine.json', edict) def save_urls(self): """save the registration urls to files.""" c = self.master_config sec_dir = c.Global.security_dir cf = self.factory with open(os.path.join(sec_dir, 'ipcontroller-engine.url'), 'w') as f: f.write("%s://%s:%s"%(cf.engine_transport, cf.engine_ip, cf.regport)) with open(os.path.join(sec_dir, 'ipcontroller-client.url'), 'w') as f: f.write("%s://%s:%s"%(cf.client_transport, cf.client_ip, cf.regport)) def import_statements(self): statements = self.master_config.Global.import_statements for s in statements: try: self.log.msg("Executing statement: '%s'" % s) exec s in globals(), locals() except: self.log.msg("Error running statement: %s" % s) def start_logging(self): super(IPControllerApp, self).start_logging() if self.master_config.Global.log_url: context = self.factory.context lsock = context.socket(zmq.PUB) lsock.connect(self.master_config.Global.log_url) handler = PUBHandler(lsock) handler.root_topic = 'controller' handler.setLevel(self.log_level) self.log.addHandler(handler) # def start_app(self): # Start the subprocesses: self.factory.start() self.write_pid_file(overwrite=True) try: self.factory.loop.start() except KeyboardInterrupt: self.log.critical("Interrupted, Exiting...\n")