Пример #1
0
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing provisioner.",
                  event_type='init_provisioner')
         provider_config = section2dict(scp, "SLACK")
         # Load configuration.
         try:
             self.endpoint_s = config.get("endpoint", None)
             self.load_provider_config(provider_config)
         except KeyError as ex:
             raise OptionMissingError(
                 "A require option was missing: '{0}:{1}'.".format(
                     section, ex.args[0]))
         # Create the web client.
         self.make_web_client()
         # Initialize the provider.
         self.init_provider()
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
     return defer.succeed(None)
Пример #2
0
 def startService(self):
     """
     Start the service.
     """
     scp = load_config(config_file=self.config,
                       defaults=self.make_config_defaults())
     self.scp = scp
     app_info = section2dict(scp, "APPLICATION")
     log_level = app_info.get("log_level", "INFO")
     log = Logger(observer=self.logObserverFactory(log_level))
     self.log = log
     self.amqp_info = section2dict(scp, "AMQP")
     amqp_rate_limit_ms = self.amqp_info.get("rate_limit_ms", None)
     if not amqp_rate_limit_ms is None:
         self.amqp_rate_limit_ms = int(amqp_rate_limit_ms)
     amqp_log_level = self.amqp_info.get("log_level", log_level)
     self.amqp_log = Logger(
         observer=self.logObserverFactory(amqp_log_level))
     service_state = self.service_state
     service_state.last_update = datetime.datetime.today()
     self.start_amqp_client()
     provisioner_tag = app_info['provisioner']
     log.info("Provisioner tag => '{provisioner}'",
              provisioner=provisioner_tag)
     provisioner_factory = get_plugin_factory(provisioner_tag,
                                              IProvisionerFactory)
     if provisioner_factory is None:
         msg = "No provisioner factory was found!"
         log.error(msg)
         d = self.reactor.callLater(0, self.reactor.stop)
         raise Exception(msg)
     provisioner_factory.log = self.log
     provisioner = provisioner_factory.generateProvisioner()
     provisioner.reactor = self.reactor
     provisioner.service_state = service_state
     provisioner.load_config(self.config, log_level,
                             self.logObserverFactory)
     self.provisioner = provisioner
     web_log_level = log_level
     if scp.has_section("WEB"):
         web_info = section2dict(scp, "WEB")
         web_log_level = web_info.get("log_level", log_level)
     self.web_log = Logger(observer=self.logObserverFactory(web_log_level))
Пример #3
0
 def configure_target_exchange(self, scp):
     """
     Configure the parameters for connection to the target exchange.
     """
     section = "AMQP_TARGET"
     publisher_config = section2dict(scp, section)
     self.pub_exchange = get_config_opt(publisher_config, section, "exchange")
     self.pub_vhost = get_config_opt(publisher_config, section, "vhost")
     self.pub_user = get_config_opt(publisher_config, section, "user")
     self.pub_passwd = get_config_opt(publisher_config, section, "passwd")
     self.pub_endpoint_s = get_config_opt(publisher_config, section, "endpoint")
     spec_path = get_config_opt(publisher_config, section, "spec")
     self.pub_spec = txamqp.spec.load(spec_path)
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing Orgsync RESTful API provisioner.",
                  event_type='init_provisioner')
         # Load API configuration info-- endpoint info, URL, API key.
         try:
             self.diagnostic_mode = bool(
                 config.get("diagnostic_mode", False))
             self.endpoint_s = config.get("endpoint", None)
             self.url_prefix = config["url_prefix"]
             self.api_key = config["api_key"]
             self.max_per_day = config.get("max_per_day", 20)
             self.account_query = jinja2.Template(config['account_query'])
             self.account_update = jinja2.Template(config['account_update'])
             self.account_delete = jinja2.Template(config['account_delete'])
             self.account_add = jinja2.Template(config['account_add'])
             account_template_path = config['account_template']
             attrib_map_path = config["attribute_map"]
         except KeyError as ex:
             raise OptionMissingError(
                 "A require option was missing: '{0}:{1}'.".format(
                     section, ex.args[0]))
         # Start the daiy countdown timer.
         self.daily_reset = LoopingCall(self.reset_daily_countdown)
         d = self.daily_reset.start(60 * 60 * 24, now=True)
         # Create the web client.
         self.make_web_client()
         # Create the attribute map.
         self.make_attribute_map(attrib_map_path)
         # Create the account template.
         self.make_account_template(account_template_path)
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
     return defer.succeed(None)
Пример #5
0
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing provisioner.",
                  event_type='init_provisioner')
         # Load configuration info-- endpoint info, credentials, base DN, etc.
         try:
             self.provision_group = config["provision_group"].lower()
             self.endpoint_s = config["endpoint"]
             self.use_starttls = bool(config.get("use_starttls", True))
             self.starttls_hostname = config.get("starttls_hostname",
                                                 "localhost")
             starttls_trust_anchor = config.get('starttls_trust_anchor',
                                                None)
             self.bind_dn = config["bind_dn"]
             self.bind_passwd = config["bind_passwd"]
             self.base_dn = config["base_dn"]
             self.search_filter = config.get('filter', None)
             self.account_template_path = config["account_template"]
             self.page_size = int(config.get('page_size', 100))
         except KeyError as ex:
             raise OptionMissingError(
                 "A required option was missing: '{}:{}'.".format(
                     section, ex.args[0]))
         self.parse_account_template_()
         self.load_starttls_trust_anchor(starttls_trust_anchor)
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {}".format(ex))
         raise
     return defer.succeed(None)
Пример #6
0
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """             
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         config_parser = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(config_parser, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.debug("Initialized logging for Kiki provisioner delivery service.",
             event_type='init_provisioner_logging')
         # Load and configure the attribute resolver.
         attrib_resolver_tag = get_config_opt(config, section, "attrib_resolver")
         self.install_attribute_resolver(attrib_resolver_tag, config_parser)
         # Load and configure the group attribute resolver.
         group_attrib_resolver_tag = config.get("group_attrib_resolver", None)
         self.install_group_attribute_resolver(group_attrib_resolver_tag, config_parser)
         # Load parse map.
         parser_map_filename = get_config_opt(config, section, "parser_map")
         self.load_parser_map(parser_map_filename)
         # Install group mapper.
         group_mapper_tag = get_config_opt(config, section, "group_mapper")
         self.install_group_mapper(group_mapper_tag, config_parser)
         # Install the router
         router_tag = get_config_opt(config, section, "router")
         self.install_router(router_tag, config_parser)
         # Connect to exchange for publishing.
         self.configure_target_exchange(config_parser)
         yield self.connect_to_exchange() 
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
Пример #7
0
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing provisioner.",
                  event_type='init_provisioner')
         # Load API configuration info-- endpoint info, URL, API key.
         try:
             self.diagnostic_mode = bool(
                 int(config.get("diagnostic_mode", 0)))
             self.unmanaged_logins = set(
                 login.lower()
                 for login in config.get("unmanaged_logins", "").split())
             self.provision_group = config.get("provision_group", None)
             if self.provision_group is not None:
                 self.provision_group = self.provision_group.lower()
             workroom_map_path = config.get("workroom_map", None)
             self.endpoint_s = config.get("endpoint", None)
             self.url_prefix = config["url_prefix"]
             self.api_key = config["api_key"]
             self.cache_size = int(config["cache_size"])
             self.authenticate = config['authenticate']
             self.accounts_query = config['accounts_query']
             self.max_page = int(config.get('max_page', 100))
             self.local_computed_match_template = jinja2.Template(
                 config['local_computed_match_template'])
             if self.provision_group:
                 self.account_update = jinja2.Template(
                     config['account_update'])
                 self.account_delete = jinja2.Template(
                     config['account_delete'])
                 self.account_add = config['account_add']
                 account_template_path = config['account_template']
                 attrib_map_path = config["attribute_map"]
             if workroom_map_path:
                 self.workrooms_query = config['workrooms_query']
                 self.workroom_members = jinja2.Template(
                     config['workroom_members'])
                 self.workroom_subject = jinja2.Template(
                     config['workroom_subject'])
                 self.workroom_cache_size = int(
                     config.get("workroom_cache_size", 100))
                 self.workroom_retry_delay = int(
                     config.get("workroom_retry_delay", 20))
         except KeyError as ex:
             raise OptionMissingError(
                 "A require option was missing: '{0}:{1}'.".format(
                     section, ex.args[0]))
         if self.provision_group is None and workroom_map_path is None:
             raise OptionMissingError(
                 "Must provide at least one of `provision_group` (account "
                 "provisioning) or `workroom_map` (workroom mapping).")
         # Create the web client.
         self.make_default_web_client()
         self.__workroom_cache = None
         if self.provision_group:
             # Create the attribute map.
             self.make_attribute_map(attrib_map_path)
             # Create the account template.
             self.make_account_template(account_template_path)
         if workroom_map_path:
             # Create the workroom cache.
             self.__workroom_cache = pylru.lrucache(
                 self.workroom_cache_size)
         # Create the workroom map.
         self.make_workroom_map(workroom_map_path)
         # Create account cache.
         self.__account_cache = pylru.lrucache(self.cache_size)
         # Initialize access token.
         self.__auth_token = None
         log.info("Diagnostic mode: {diagnostic}",
                  diagnostic=self.diagnostic_mode)
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
     return defer.succeed(None)
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing provisioner.",
                  event_type='init_provisioner')
         # Load API configuration info-- endpoint info, URL, API key.
         try:
             self.unmanaged_logins = set(
                 login.lower()
                 for login in config.get("unmanaged_logins", "").split())
             log.debug("unmanaged_logins: {unmanaged_logins}",
                       unmanaged_logins=list(self.unmanaged_logins))
             self.provision_group = config.get("provision_group", None)
             if self.provision_group is not None:
                 self.provision_group = self.provision_group.lower()
             target_group_map_path = config.get("target_group_map", None)
             self.endpoint_s = config.get("endpoint", None)
             self.url_prefix = config["url_prefix"]
             self.client_secret = config["client_secret"]
             self.account_cache_size = int(config["account_cache_size"])
             if target_group_map_path:
                 self.target_group_cache_size = int(
                     config.get("target_group_cache_size", 100))
                 self.target_group_retry_delay = int(
                     config.get("target_group_retry_delay", 20))
             self.account_sync_rate_limit_ms = int(
                 config.get("account_sync_rate_limit_ms", 0))
             self.member_sync_rate_limit_ms = int(
                 config.get("member_sync_rate_limit_ms", 0))
             self.provision_strategy = config.get("provision_strategy",
                                                  "query-first").lower()
             self.group_sync_strategy = config.get(
                 "group_sync_strategy", "add-members-first").lower()
             if not self.group_sync_strategy in ('query-first',
                                                 'add-members-first'):
                 raise Exception("Unknown group_sync_strategy: {}".format(
                     self.group_sync_strategy))
             self.account_cache_validity_period = int(
                 config.get("account_cache_validity_period", 0))
         except KeyError as ex:
             raise OptionMissingError(
                 "A require option was missing: '{0}:{1}'.".format(
                     section, ex.args[0]))
         if self.provision_group is None and target_group_map_path is None:
             raise OptionMissingError(
                 "Must provide at least one of `provision_group` (account "
                 "provisioning) or `target_group_map` (target_group mapping)."
             )
         if not self.provision_strategy in ('query-first', 'create-first'):
             raise Exception(
                 "`provision_strategy` must be one of: query-first, create-first"
             )
         # Create the web client.
         self.make_default_web_client()
         self.__target_group_cache = None
         if target_group_map_path:
             # Create the target_group cache.
             self.__target_group_cache = pylru.lrucache(
                 self.target_group_cache_size)
         # Create the target_group map.
         self.make_target_group_map(target_group_map_path)
         # Create account cache.
         self.__account_cache = pylru.lrucache(self.account_cache_size)
         # Initialize access token.
         self.auth_token = None
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
     self.parse_config(scp)
     return defer.succeed(None)
Пример #9
0
 def load_config(self, config_file, default_log_level, logObserverFactory):
     """                                                             
     Load the configuration for this provisioner and initialize it.  
     """
     log = Logger(observer=logObserverFactory("ERROR"))
     try:
         # Load config.
         scp = load_config(config_file, defaults=self.get_config_defaults())
         section = "PROVISIONER"
         config = section2dict(scp, section)
         self.config = config
         # Start logger.
         log_level = config.get('log_level', default_log_level)
         log = Logger(observer=logObserverFactory(log_level))
         self.log = log
         log.info("Initializing SSH provisioner.",
                  event_type='init_provisioner')
         # Initialize template environment.
         self.template_env = jinja2.Environment(trim_blocks=True,
                                                lstrip_blocks=True)
         self.template_env.filters['shellquote'] = filter_shellquote
         self.template_env.filters['newline'] = filter_newline
         # Load SSH configuration info.
         try:
             self.provision_cmd = self.template_env.from_string(
                 config["provision_cmd"].strip())
             self.deprovision_cmd = self.template_env.from_string(
                 config["deprovision_cmd"].strip())
             template_str = config.get("sync_cmd", None)
             if template_str is not None:
                 log.debug("Sync command template: {template}",
                           template=template_str)
                 self.sync_cmd = self.template_env.from_string(
                     template_str.strip())
             self.provision_cmd_type = self.parse_command_type(
                 config.get("provision_cmd_type", "simple"))
             self.deprovision_cmd_type = self.parse_command_type(
                 config.get("deprovision_cmd_type", "simple"))
             self.sync_cmd_type = self.parse_command_type(
                 config.get("sync_cmd_type", "simple"))
             if self.provision_cmd_type == self.CMD_TYPE_INPUT:
                 self.provision_input = self.template_env.from_string(
                     config["provision_input"].strip())
             if self.deprovision_cmd_type == self.CMD_TYPE_INPUT:
                 self.deprovision_input = self.template_env.from_string(
                     config["deprovision_input"].strip())
             if self.sync_cmd_type == self.CMD_TYPE_INPUT:
                 template_str = config.get("sync_input", None)
                 log.debug("Sync input template: {template}",
                           template=template_str)
                 self.sync_input = self.template_env.from_string(
                     template_str.strip())
             result = config.get("provision_ok_result", None)
             if result is not None:
                 self.provision_ok_result = int(result.strip())
             result = config.get("deprovision_ok_result", None)
             if result is not None:
                 self.deprovision_ok_result = int(result.strip())
             result = config.get("sync_ok_result", None)
             if result is not None:
                 self.sync_ok_result = int(result.strip())
             self.cmd_timeout = int(config['cmd_timeout'])
             self.host = config["host"]
             self.port = int(config["port"])
             self.ssh_user = config["user"]
             self.known_hosts = os.path.expanduser(config["known_hosts"])
             if "keys" in config:
                 self.keys = config["keys"].split(",")
         except KeyError as ex:
             raise OptionMissingError(
                 "A require option was missing: '{0}:{1}'.".format(
                     section, ex.args[0]))
         self.load_groupmap(config.get("group_map", None))
     except Exception as ex:
         d = self.reactor.callLater(0, self.reactor.stop)
         log.failure("Provisioner failed to initialize: {0}".format(ex))
         raise
     return defer.succeed(None)