def makeService(self, options): slist = [] try: configfile = os.path.join(options['config'], 'config.yaml') config = localconfig.read_config(configfile=configfile) except Exception as err: log.err("cannot load local configuration: " + str(err)) raise err log_level = config.get('log_level', 'INFO') log_to_db = config.get('log_to_db', False) slist = self.servicenames try: config_services = config['services'] isEnabled = False for sname in slist: if 'log_level' in config_services[sname]: log_level = config_services[sname]['log_level'] if config_services[sname]['enabled']: isEnabled = True break if not isEnabled: log.err("no services in list (" + str(self.servicenames) + ") are enabled in configuration file: shutting down") sys.exit(0) except Exception as err: log.err( "error checking for enabled services, check config file - exception: " + str(err)) raise Exception( "error checking for enabled services, check config file - exception: " + str(err)) try: logger.set_log_level(log_level, log_to_db=log_to_db) except Exception as err: log.err("exception while initializing logger - exception: " + str(err)) logger.set_log_level('INFO') logger.enable_bootstrap_logging(name_prefix='policy_engine') r = anchore_engine.services.common.makeService(slist, options, bootstrap_db=True) logger.disable_bootstrap_logging() return r
def makeService(snames, options, db_connect=True, require_system_user_auth=True, module_name="anchore_engine.services", validate_params={}): try: logger.enable_bootstrap_logging(service_name=','.join(snames)) try: # config and init configfile = configdir = None if options['config']: configdir = options['config'] configfile = os.path.join(options['config'], 'config.yaml') anchore_engine.configuration.localconfig.load_config( configdir=configdir, configfile=configfile, validate_params=validate_params) localconfig = anchore_engine.configuration.localconfig.get_config() localconfig['myservices'] = [] logger.spew("localconfig=" + json.dumps(localconfig, indent=4, sort_keys=True)) except Exception as err: logger.error("cannot load configuration: exception - " + str(err)) raise err # get versions of things try: versions = anchore_engine.configuration.localconfig.get_versions() except Exception as err: logger.error("cannot detect versions of service: exception - " + str(err)) raise err if db_connect: logger.info("initializing database") # connect to DB try: db.initialize(localconfig=localconfig, versions=versions) except Exception as err: logger.error("cannot connect to configured DB: exception - " + str(err)) raise err #credential bootstrap localconfig['system_user_auth'] = (None, None) if require_system_user_auth: gotauth = False max_retries = 60 for count in range(1, max_retries): if gotauth: continue try: with session_scope() as dbsession: localconfig[ 'system_user_auth'] = get_system_user_auth( session=dbsession) if localconfig['system_user_auth'] != (None, None): gotauth = True else: logger.error( "cannot get system user auth credentials yet, retrying (" + str(count) + " / " + str(max_retries) + ")") time.sleep(5) except Exception as err: logger.error( "cannot get system-user auth credentials - service may not have system level access" ) localconfig['system_user_auth'] = (None, None) if not gotauth: raise Exception( "service requires system user auth to start") # application object application = service.Application("multi-service-" + '-'.join(snames)) #multi-service retservice = service.MultiService() retservice.setServiceParent(application) success = False try: scount = 0 for sname in snames: if sname in localconfig['services'] and localconfig[ 'services'][sname]['enabled']: smodule = importlib.import_module(module_name + "." + sname) s = smodule.createService(sname, localconfig) s.setServiceParent(retservice) rc = smodule.initializeService(sname, localconfig) if not rc: raise Exception("failed to initialize service") rc = smodule.registerService(sname, localconfig) if not rc: raise Exception("failed to register service") logger.debug("starting service: " + sname) success = True scount += 1 localconfig['myservices'].append(sname) else: logger.error( "service not enabled in config, not starting service: " + sname) if scount == 0: logger.error( "no services/subservices were enabled/started on this host" ) success = False except Exception as err: logger.error("cannot create/init/register service: " + sname + " - exception: " + str(err)) success = False if not success: logger.error("cannot start service (see above for information)") traceback.print_exc('Service init failure') raise Exception("cannot start service (see above for information)") return (retservice) finally: logger.disable_bootstrap_logging()