def loadDmonConf(self, conf): ''' { 'title':'The Foo Thing', 'vars':{ 'foo':10, 'bar':["baz","faz"] } 'forks':( ('name',{ # nested config for forked dmon }, ), 'includes':( '~/foo/config.json', ), 'ctors':( ('baz','ctor://foo.bar.Baz()'), ('mybus','tcp://host.com/syn.svcbus'), ), 'services':( ('mybus',( ('baz',{'tags':('foo.bar','baz')}), ), ), } ''' checkConfDict(conf) self.locs.update( conf.get('vars',{}) ) # handle forks first to prevent socket bind weirdness for name,subconf in conf.get('forks',()): self._fireDmonFork(name,subconf) title = conf.get('title') if title != None: s_thisplat.setProcName('dmon: %s' % title) # handle includes next for path in conf.get('includes',()): fullpath = os.path.expanduser(path) try: self.loadDmonFile(fullpath) except Exception as e: raise Exception('Include Error (%s): %s' % (path,e)) self._addConfValu(conf,'poolsize') for name,url in conf.get('ctors',()): item = s_telepath.evalurl(url,locs=self.locs) self.locs[name] = item self.fire('dmon:conf:ctor', name=name, item=item) for busname,svcruns in conf.get('services',()): svcbus = self.locs.get(busname) if svcbus == None: raise NoSuchObj(name) for svcname,svcopts in svcruns: item = self.locs.get(svcname) if item == None: raise NoSuchObj(svcname) tags = svcopts.get('tags',()) svcname = svcopts.get('name',svcname) s_service.runSynSvc(svcname, item, svcbus, tags=tags)
def loadDmonConf(self, conf): ''' { 'title':'The Foo Thing', 'vars':{ 'foo':10, 'bar':["baz","faz"] } 'forks':( ('name',{ # nested config for forked dmon }, ), 'includes':( '~/foo/config.json', ), 'ctors':( ('baz', 'ctor://foo.bar.Baz()'), ('faz', 'ctor://foo.bar.Baz()', {'config':'woot'}), ('mybus', 'tcp://host.com/syn.svcbus'), ), 'services':( ('mybus',( ('baz',{'tags':('foo.bar','baz')}), ), ), 'addons':( ('auth','tcp://host.com:8899/synauth'), ('logging','ctor://mypkg.mymod.MyLogger()'), ), 'configs':{ 'woot':{ 'fooopt':10, }, }, } ''' checkConfDict(conf) self.locs.update(conf.get('vars', {})) # handle forks first to prevent socket bind weirdness for name, subconf in conf.get('forks', ()): self._fireDmonFork(name, subconf) title = conf.get('title') if title != None: s_thisplat.setProcName('dmon: %s' % title) # handle includes next for path in conf.get('includes', ()): fullpath = os.path.expanduser(path) try: self.loadDmonFile(fullpath) except Exception as e: raise Exception('Include Error (%s): %s' % (path, e)) configs = conf.get('configs', {}) for row in conf.get('ctors', ()): copts = {} # ctor options if len(row) == 2: name, url = row elif len(row) == 3: name, url, copts = row else: raise Exception('Invalid ctor row: %r' % (row, )) item = self.dmoneval(url) self.locs[name] = item # check for a ctor opt that wants us to load a config dict by name cfgname = copts.get('config') if cfgname != None: if not isinstance(item, s_config.Configable): raise Exception('dmon ctor: %s does not support configs' % name) opts = configs.get(cfgname) if opts == None: raise NoSuchConf(name=cfgname) item.setConfOpts(opts) # check for a ctor opt that wants us to "flatten" several configs in order cfgnames = copts.get('configs') if cfgnames != None: if not isinstance(item, s_config.Configable): raise Exception('dmon ctor: %s does not support configs' % name) opts = {} for cfgname in cfgnames: cfgopts = configs.get(cfgname) if cfgopts == None: raise NoSuchConf(name=cfgname) opts.update(cfgopts) item.setConfOpts(opts) # check for a match between config and ctor names opts = configs.get(name) if opts != None: item.setConfOpts(opts) self.fire('dmon:conf:ctor', name=name, item=item) for busname, svcruns in conf.get('services', ()): svcbus = self.dmoneval(busname) if svcbus == None: raise NoSuchObj(name) for svcname, svcopts in svcruns: item = self.locs.get(svcname) if item == None: raise NoSuchObj(svcname) tags = svcopts.get('tags', ()) svcname = svcopts.get('name', svcname) s_service.runSynSvc(svcname, item, svcbus, tags=tags)
def _loadDmonConf(self, conf): checkConfDict(conf) self.locs.update(conf.get('vars', {})) # handle forks first to prevent socket bind weirdness for name, subconf in conf.get('forks', ()): self._fireDmonFork(name, subconf) title = conf.get('title') if title is not None: s_thisplat.setProcName('dmon: %s' % title) # handle explicit module load requests for name, info in conf.get('modules', ()): modu = s_dyndeps.getDynMod(name) if modu is None: logger.warning('dmon mod not loaded: %s', name) # handle includes next for path in conf.get('includes', ()): fullpath = os.path.expanduser(path) try: self.loadDmonFile(fullpath) except Exception as e: raise Exception('Include Error (%s): %s' % (path, e)) configs = conf.get('configs', {}) for row in conf.get('ctors', ()): copts = {} # ctor options if len(row) == 2: name, url = row elif len(row) == 3: name, url, copts = row else: raise Exception('Invalid ctor row: %r' % (row, )) if url.find('://') == -1: # this is a (name,dynfunc,config) formatted ctor... item = s_dyndeps.tryDynFunc(url, copts) else: item = self.dmoneval(url) self.locs[name] = item # check for a ctor opt that wants us to load a config dict by name cfgname = copts.get('config') if cfgname is not None: if not isinstance(item, s_config.Configable): raise Exception('dmon ctor: %s does not support configs' % name) opts = configs.get(cfgname) if opts is None: raise s_common.NoSuchConf(name=cfgname) item.setConfOpts(opts) # check for a ctor opt that wants us to "flatten" several configs in order cfgnames = copts.get('configs') if cfgnames is not None: if not isinstance(item, s_config.Configable): raise Exception('dmon ctor: %s does not support configs' % name) opts = {} for cfgname in cfgnames: cfgopts = configs.get(cfgname) if cfgopts is None: raise s_common.NoSuchConf(name=cfgname) opts.update(cfgopts) item.setConfOpts(opts) # check for a match between config and ctor names opts = configs.get(name) if opts is not None: item.setConfOpts(opts) self.fire('dmon:conf:ctor', name=name, item=item) for busname, svcruns in conf.get('services', ()): svcbus = self.dmoneval(busname) if svcbus is None: raise s_common.NoSuchObj(name) for svcname, svcopts in svcruns: item = self.locs.get(svcname) if item is None: raise s_common.NoSuchObj(svcname) svcname = svcopts.get('name', svcname) s_service.runSynSvc(svcname, item, svcbus, **svcopts)
def loadDmonConf(self, conf): ''' { 'title':'The Foo Thing', 'vars':{ 'foo':10, 'bar':["baz","faz"] } 'forks':( ('name',{ # nested config for forked dmon }, ), 'includes':( '~/foo/config.json', ), 'ctors':( ('baz', 'ctor://foo.bar.Baz()'), ('faz', 'ctor://foo.bar.Baz()', {'config':'woot'}), ('mybus', 'tcp://host.com/syn.svcbus'), ), 'services':( ('mybus',( ('baz',{'tags':('foo.bar','baz')}), ), ), 'addons':( ('auth','tcp://host.com:8899/synauth'), ('logging','ctor://mypkg.mymod.MyLogger()'), ), 'configs':{ 'woot':{ 'fooopt':10, }, }, } ''' checkConfDict(conf) self.locs.update( conf.get('vars',{}) ) # handle forks first to prevent socket bind weirdness for name,subconf in conf.get('forks',()): self._fireDmonFork(name,subconf) title = conf.get('title') if title != None: s_thisplat.setProcName('dmon: %s' % title) # handle includes next for path in conf.get('includes',()): fullpath = os.path.expanduser(path) try: self.loadDmonFile(fullpath) except Exception as e: raise Exception('Include Error (%s): %s' % (path,e)) configs = conf.get('configs',{}) for row in conf.get('ctors',()): copts = {} # ctor options if len(row) == 2: name,url = row elif len(row) == 3: name,url,copts = row else: raise Exception('Invalid ctor row: %r' % (row,)) item = self.dmoneval(url) self.locs[name] = item # check for a ctor opt that wants us to load a config dict by name cfgname = copts.get('config') if cfgname != None: if not isinstance(item,s_config.ConfigMixin): raise Exception('dmon ctor: %s does not support configs' % name) opts = configs.get(cfgname) if opts == None: raise NoSuchConf(name=cfgname) item.setConfOpts(opts) # check for a ctor opt that wants us to "flatten" several configs in order cfgnames = copts.get('configs') if cfgnames != None: if not isinstance(item,s_config.ConfigMixin): raise Exception('dmon ctor: %s does not support configs' % name) opts = {} for cfgname in cfgnames: cfgopts = configs.get(cfgname) if cfgopts == None: raise NoSuchConf(name=cfgname) opts.update(cfgopts) item.setConfOpts(opts) self.fire('dmon:conf:ctor', name=name, item=item) for busname,svcruns in conf.get('services',()): svcbus = self.dmoneval(busname) if svcbus == None: raise NoSuchObj(name) for svcname,svcopts in svcruns: item = self.locs.get(svcname) if item == None: raise NoSuchObj(svcname) tags = svcopts.get('tags',()) svcname = svcopts.get('name',svcname) s_service.runSynSvc(svcname, item, svcbus, tags=tags)