def test_parse_env_str(self): env = 'booo=2,test=1' parsed = parse_env_str(env) self.assertEqual(parsed, {'test': '1', 'booo': '2'}) self.assertEqual(env_to_str(parsed), env)
def get_config(config_file): if not os.path.exists(config_file): raise IOError("the configuration file %r does not exist\n" % config_file) cfg, cfg_files_read = read_config(config_file) dget = cfg.dget config = {} # main circus options config['check'] = dget('circus', 'check_delay', 5, int) config['endpoint'] = dget('circus', 'endpoint', DEFAULT_ENDPOINT_DEALER) config['pubsub_endpoint'] = dget('circus', 'pubsub_endpoint', DEFAULT_ENDPOINT_SUB) config['multicast_endpoint'] = dget('circus', 'multicast_endpoint', DEFAULT_ENDPOINT_MULTICAST) config['stats_endpoint'] = dget('circus', 'stats_endpoint', None) config['statsd'] = dget('circus', 'statsd', False, bool) if config['stats_endpoint'] is None: config['stats_endpoint'] = DEFAULT_ENDPOINT_STATS elif not config['statsd']: warnings.warn("You defined a stats_endpoint without " "setting up statsd to True.", DeprecationWarning) config['statsd'] = True config['warmup_delay'] = dget('circus', 'warmup_delay', 0, int) config['httpd'] = dget('circus', 'httpd', False, bool) config['httpd_host'] = dget('circus', 'httpd_host', 'localhost', str) config['httpd_port'] = dget('circus', 'httpd_port', 8080, int) config['debug'] = dget('circus', 'debug', False, bool) config['pidfile'] = dget('circus', 'pidfile') config['loglevel'] = dget('circus', 'loglevel') config['logoutput'] = dget('circus', 'logoutput') # Initialize watchers, plugins & sockets to manage watchers = [] environs = {} plugins = [] sockets = [] for section in cfg.sections(): if section.startswith("socket:"): sock = dict(cfg.items(section)) sock['name'] = section.split("socket:")[-1].lower() sockets.append(sock) if section.startswith("plugin:"): plugins.append(dict(cfg.items(section))) if section.startswith("watcher:"): watcher = watcher_defaults() watcher['name'] = section.split("watcher:", 1)[1] # create watcher options for opt, val in cfg.items(section): if opt == 'cmd': watcher['cmd'] = val elif opt == 'args': watcher['args'] = val elif opt == 'numprocesses': watcher['numprocesses'] = dget(section, 'numprocesses', 1, int) elif opt == 'warmup_delay': watcher['warmup_delay'] = dget(section, 'warmup_delay', 0, int) elif opt == 'executable': watcher['executable'] = dget(section, 'executable', None, str) elif opt == 'working_dir': watcher['working_dir'] = val elif opt == 'shell': watcher['shell'] = dget(section, 'shell', False, bool) elif opt == 'uid': watcher['uid'] = val elif opt == 'gid': watcher['gid'] = val elif opt == 'send_hup': watcher['send_hup'] = dget(section, 'send_hup', False, bool) elif opt == 'check_flapping': watcher['check_flapping'] = dget(section, 'check_flapping', True, bool) elif opt == 'max_retry': watcher['max_retry'] = dget(section, "max_retry", 5, int) elif opt == 'graceful_timeout': watcher['graceful_timeout'] = dget( section, "graceful_timeout", 30, int) elif opt.startswith('stderr_stream') or \ opt.startswith('stdout_stream'): stream_name, stream_opt = opt.split(".", 1) watcher[stream_name][stream_opt] = val elif opt.startswith('rlimit_'): limit = opt[7:] watcher['rlimits'][limit] = int(val) elif opt == 'priority': watcher['priority'] = dget(section, "priority", 0, int) elif opt == 'use_sockets': watcher['use_sockets'] = dget(section, "use_sockets", False, bool) elif opt == 'singleton': watcher['singleton'] = dget(section, "singleton", False, bool) elif opt == 'copy_env': watcher['copy_env'] = dget(section, "copy_env", False, bool) elif opt == 'copy_path': watcher['copy_path'] = dget(section, "copy_path", False, bool) elif opt.startswith('hooks.'): hook_name = opt[len('hooks.'):] val = [elmt.strip() for elmt in val.split(',', 1)] if len(val) == 1: val.append(False) else: val[1] = to_boolean(val[1]) watcher['hooks'][hook_name] = val elif opt == 'respawn': watcher['respawn'] = dget(section, "respawn", True, bool) elif opt == 'env': logger.warning('the env option is deprecated the use of ' 'env sections is recommended') watcher['env'] = parse_env_str(val) elif opt == 'autostart': watcher['autostart'] = dget(section, "autostart", True, bool) elif opt == 'close_child_stdout': watcher['close_child_stdout'] = dget(section, "close_child_stdout", False, bool) elif opt == 'close_child_stderr': watcher['close_child_stderr'] = dget(section, "close_child_stderr", False, bool) else: # freeform watcher[opt] = val watchers.append(watcher) # Second pass to make sure env sections apply to all watchers. for section in cfg.sections(): if section.startswith('env:'): section_elements = section.split("env:", 1)[1] watcher_patterns = [s.strip() for s in section_elements.split(',')] for pattern in watcher_patterns: matching_watchers = [ w for w in watchers if fnmatch(w['name'], pattern) ] for watcher in matching_watchers: watcher_name = watcher['name'] if not watcher_name in environs: environs[watcher_name] = dict() environs[watcher_name].update( [(k.upper(), v) for k, v in cfg.items(section)]) if section == 'env': for watcher in watchers: environs[watcher['name']].update( [(k.upper(), v) for k, v in cfg.items(section)]) for watcher in watchers: if watcher['name'] in environs: if not 'env' in watcher: watcher['env'] = dict() watcher['env'].update(environs[watcher['name']]) config['watchers'] = watchers config['plugins'] = plugins config['sockets'] = sockets return config
def get_config(config_file): if not os.path.exists(config_file): sys.stderr.write("the configuration file %r does not exist\n" % config_file) sys.stderr.write("Exiting...\n") sys.exit(1) cfg, cfg_files_read = read_config(config_file) dget = cfg.dget config = {} # main circus options config['check'] = dget('circus', 'check_delay', 5, int) config['endpoint'] = dget('circus', 'endpoint', DEFAULT_ENDPOINT_DEALER) config['pubsub_endpoint'] = dget('circus', 'pubsub_endpoint', DEFAULT_ENDPOINT_SUB) config['stats_endpoint'] = dget('circus', 'stats_endpoint', None, str) config['warmup_delay'] = dget('circus', 'warmup_delay', 0, int) config['httpd'] = dget('circus', 'httpd', False, bool) config['httpd_host'] = dget('circus', 'httpd_host', 'localhost', str) config['httpd_port'] = dget('circus', 'httpd_port', 8080, int) config['debug'] = dget('circus', 'debug', False, bool) # Initialize watchers, plugins & sockets to manage watchers = [] environs = {} plugins = [] sockets = [] for section in cfg.sections(): if section.startswith("socket:"): sock = dict(cfg.items(section)) sock['name'] = section.split("socket:")[-1].lower() sockets.append(sock) if section.startswith("plugin:"): plugins.append(dict(cfg.items(section))) if section.startswith("watcher:"): watcher = watcher_defaults() watcher['name'] = section.split("watcher:", 1)[1] # create watcher options for opt, val in cfg.items(section): if opt == 'cmd': watcher['cmd'] = val elif opt == 'args': watcher['args'] = val elif opt == 'numprocesses': watcher['numprocesses'] = dget(section, 'numprocesses', 1, int) elif opt == 'warmup_delay': watcher['warmup_delay'] = dget(section, 'warmup_delay', 0, int) elif opt == 'executable': watcher['executable'] = dget(section, 'executable', None, str) elif opt == 'working_dir': watcher['working_dir'] = val elif opt == 'shell': watcher['shell'] = dget(section, 'shell', False, bool) elif opt == 'uid': watcher['uid'] = val elif opt == 'gid': watcher['gid'] = val elif opt == 'send_hup': watcher['send_hup'] = dget(section, 'send_hup', False, bool) elif opt == 'check_flapping': watcher['check_flapping'] = dget(section, 'check_flapping', True, bool) elif opt == 'max_retry': watcher['max_retry'] = dget(section, "max_retry", 5, int) elif opt == 'graceful_timeout': watcher['graceful_timeout'] = dget(section, "graceful_timeout", 30, int) elif opt.startswith('stderr_stream') or \ opt.startswith('stdout_stream'): stream_name, stream_opt = opt.split(".", 1) watcher[stream_name][stream_opt] = val elif opt.startswith('rlimit_'): limit = opt[7:] watcher['rlimits'][limit] = int(val) elif opt == 'priority': watcher['priority'] = dget(section, "priority", 0, int) elif opt == 'use_sockets': watcher['use_sockets'] = dget(section, "use_sockets", False, bool) elif opt == 'singleton': watcher['singleton'] = dget(section, "singleton", False, bool) elif opt == 'copy_env': watcher['copy_env'] = dget(section, "copy_env", False, bool) elif opt == 'copy_path': watcher['copy_path'] = dget(section, "copy_path", False, bool) elif opt.startswith('hooks.'): hook_name = opt[len('hooks.'):] val = [elmt.strip() for elmt in val.split(',', 1)] if len(val) == 1: val.append(False) else: val[1] = to_boolean(val[1]) watcher['hooks'][hook_name] = val elif opt == 'respawn': watcher['respawn'] = dget(section, "respawn", True, bool) elif opt == 'env': logger.warning('the env option is deprecated the use of ' 'env sections is recommended') watcher['env'] = parse_env_str(val) elif opt == 'autostart': watcher['autostart'] = dget(section, "autostart", True, bool) else: # freeform watcher[opt] = val watchers.append(watcher) if section.startswith('env:'): for watcher in section.split("env:", 1)[1].split(','): watcher = watcher.strip() if not watcher in environs: environs[watcher] = dict() environs[watcher].update([(k.upper(), v) for k, v in cfg.items(section)]) for watcher in watchers: if watcher['name'] in environs: if not 'env' in watcher: watcher['env'] = dict() watcher['env'].update(environs[watcher['name']]) config['watchers'] = watchers config['plugins'] = plugins config['sockets'] = sockets return config
def test_parse_env_str(self): env = "test=1,booo=2" parsed = parse_env_str(env) self.assertEqual(parsed, {"test": "1", "booo": "2"}) self.assertEqual(env_to_str(parsed), env)
def get_config(config_file): if not os.path.exists(config_file): sys.stderr.write("the configuration file %r does not exist\n" % config_file) sys.stderr.write("Exiting...\n") sys.exit(1) cfg, cfg_files_read = read_config(config_file) dget = cfg.dget config = {} # main circus options config['check'] = dget('circus', 'check_delay', 5, int) config['endpoint'] = dget('circus', 'endpoint', DEFAULT_ENDPOINT_DEALER) config['pubsub_endpoint'] = dget('circus', 'pubsub_endpoint', DEFAULT_ENDPOINT_SUB) config['stats_endpoint'] = dget('circus', 'stats_endpoint', None, str) config['warmup_delay'] = dget('circus', 'warmup_delay', 0, int) config['httpd'] = dget('circus', 'httpd', False, bool) config['httpd_host'] = dget('circus', 'httpd_host', 'localhost', str) config['httpd_port'] = dget('circus', 'httpd_port', 8080, int) config['debug'] = dget('circus', 'debug', False, bool) stream_backend = dget('circus', 'stream_backend', 'thread') if stream_backend == 'gevent': try: import gevent # NOQA except ImportError: sys.stderr.write("stream_backend set to gevent, " + "but gevent isn't installed\n") sys.stderr.write("Exiting...\n") sys.exit(1) from gevent import monkey monkey.patch_all() try: import zmq.green as zmq # NOQA except ImportError: try: from gevent_zeromq import monkey_patch except ImportError: sys.stderr.write("stream_backend set to gevent, but " + "but required PyZMQ >= 2.2.0.1 not found\n") sys.stderr.write("Exiting...\n") sys.exit(1) monkey_patch() warnings.warn("gevent_zeromq is deprecated, please " "use PyZMQ >= 2.2.0.1") config['stream_backend'] = stream_backend # Initialize watchers, plugins & sockets to manage watchers = [] environs = {} plugins = [] sockets = [] for section in cfg.sections(): if section.startswith("socket:"): sock = dict(cfg.items(section)) sock['name'] = section.split("socket:")[-1].lower() sockets.append(sock) if section.startswith("plugin:"): plugins.append(dict(cfg.items(section))) if section.startswith("watcher:"): watcher = watcher_defaults() watcher['name'] = section.split("watcher:", 1)[1] # create watcher options for opt, val in cfg.items(section): if opt == 'cmd': watcher['cmd'] = val elif opt == 'args': watcher['args'] = val elif opt == 'numprocesses': watcher['numprocesses'] = dget(section, 'numprocesses', 1, int) elif opt == 'warmup_delay': watcher['warmup_delay'] = dget(section, 'warmup_delay', 0, int) elif opt == 'executable': watcher['executable'] = dget(section, 'executable', None, str) elif opt == 'working_dir': watcher['working_dir'] = val elif opt == 'shell': watcher['shell'] = dget(section, 'shell', False, bool) elif opt == 'uid': watcher['uid'] = val elif opt == 'gid': watcher['gid'] = val elif opt == 'send_hup': watcher['send_hup'] = dget(section, 'send_hup', False, bool) elif opt == 'check_flapping': watcher['check_flapping'] = dget(section, 'check_flapping', True, bool) elif opt == 'max_retry': watcher['max_retry'] = dget(section, "max_retry", 5, int) elif opt == 'graceful_timout': watcher['graceful_timeout'] = dget( section, "graceful_timeout", 30, int) elif opt.startswith('stderr_stream') or \ opt.startswith('stdout_stream'): stream_name, stream_opt = opt.split(".", 1) watcher[stream_name][stream_opt] = val elif opt.startswith('rlimit_'): limit = opt[7:] watcher['rlimits'][limit] = int(val) elif opt == 'priority': watcher['priority'] = dget(section, "priority", 0, int) elif opt == 'use_sockets': watcher['use_sockets'] = dget(section, "use_sockets", False, bool) elif opt == 'singleton': watcher['singleton'] = dget(section, "singleton", False, bool) elif opt == 'stream_backend': watcher['stream_backend'] = val elif opt == 'copy_env': watcher['copy_env'] = dget(section, "copy_env", False, bool) elif opt == 'copy_path': watcher['copy_path'] = dget(section, "copy_path", False, bool) elif opt.startswith('hooks.'): hook_name = opt[len('hooks.'):] val = [elmt.strip() for elmt in val.split(',', 1)] if len(val) == 1: val.append(False) else: val[1] = to_boolean(val[1]) watcher['hooks'][hook_name] = val elif opt == 'respawn': watcher['respawn'] = dget(section, "respawn", True, bool) elif opt == 'env': logger.warning('the env option is deprecated the use of ' 'env sections is recommended') watcher['env'] = parse_env_str(val) else: # freeform watcher[opt] = val # set the stream backend if 'stream_backend' not in watcher: watcher['stream_backend'] = stream_backend watchers.append(watcher) if section.startswith('env:'): for watcher in section.split("env:", 1)[1].split(','): watcher = watcher.strip() if not watcher in environs: environs[watcher] = dict() environs[watcher].update([(k.upper(), v) for k, v in cfg.items(section)]) for watcher in watchers: if watcher['name'] in environs: if not 'env' in watcher: watcher['env'] = dict() watcher['env'].update(environs[watcher['name']]) config['watchers'] = watchers config['plugins'] = plugins config['sockets'] = sockets return config
def get_config(config_file): if not os.path.exists(config_file): raise IOError("the configuration file %r does not exist\n" % config_file) cfg, cfg_files_read = read_config(config_file) dget = cfg.dget config = {} # reading the global environ first def _upper(items): return [(key.upper(), value) for key, value in items] global_env = dict(_upper(os.environ.items())) if 'env' in cfg.sections(): global_env.update(dict(_upper(cfg.items('env')))) cfg.set_env(global_env) # main circus options config['check'] = dget('circus', 'check_delay', 5, int) config['endpoint'] = dget('circus', 'endpoint', DEFAULT_ENDPOINT_DEALER) config['pubsub_endpoint'] = dget('circus', 'pubsub_endpoint', DEFAULT_ENDPOINT_SUB) config['multicast_endpoint'] = dget('circus', 'multicast_endpoint', DEFAULT_ENDPOINT_MULTICAST) config['stats_endpoint'] = dget('circus', 'stats_endpoint', None) config['statsd'] = dget('circus', 'statsd', False, bool) if config['stats_endpoint'] is None: config['stats_endpoint'] = DEFAULT_ENDPOINT_STATS elif not config['statsd']: warnings.warn( "You defined a stats_endpoint without " "setting up statsd to True.", DeprecationWarning) config['statsd'] = True config['warmup_delay'] = dget('circus', 'warmup_delay', 0, int) config['httpd'] = dget('circus', 'httpd', False, bool) config['httpd_host'] = dget('circus', 'httpd_host', 'localhost', str) config['httpd_port'] = dget('circus', 'httpd_port', 8080, int) config['debug'] = dget('circus', 'debug', False, bool) config['pidfile'] = dget('circus', 'pidfile') config['loglevel'] = dget('circus', 'loglevel') config['logoutput'] = dget('circus', 'logoutput') config['fqdn_prefix'] = dget('circus', 'fqdn_prefix', None, str) # Initialize watchers, plugins & sockets to manage watchers = [] plugins = [] sockets = [] for section in cfg.sections(): if section.startswith("socket:"): sock = dict(cfg.items(section)) sock['name'] = section.split("socket:")[-1].lower() sockets.append(sock) if section.startswith("plugin:"): plugin = dict(cfg.items(section)) plugin['name'] = section plugins.append(plugin) if section.startswith("watcher:"): watcher = watcher_defaults() watcher['name'] = section.split("watcher:", 1)[1] # create watcher options for opt, val in cfg.items(section, noreplace=True): if opt == 'cmd': watcher['cmd'] = val elif opt == 'args': watcher['args'] = val elif opt == 'numprocesses': watcher['numprocesses'] = dget(section, 'numprocesses', 1, int) elif opt == 'warmup_delay': watcher['warmup_delay'] = dget(section, 'warmup_delay', 0, int) elif opt == 'executable': watcher['executable'] = dget(section, 'executable', None, str) elif opt == 'working_dir': watcher['working_dir'] = val elif opt == 'shell': watcher['shell'] = dget(section, 'shell', False, bool) elif opt == 'uid': watcher['uid'] = val elif opt == 'gid': watcher['gid'] = val elif opt == 'send_hup': watcher['send_hup'] = dget(section, 'send_hup', False, bool) elif opt == 'check_flapping': watcher['check_flapping'] = dget(section, 'check_flapping', True, bool) elif opt == 'max_retry': watcher['max_retry'] = dget(section, "max_retry", 5, int) elif opt == 'graceful_timeout': watcher['graceful_timeout'] = dget(section, "graceful_timeout", 30, int) elif opt.startswith('stderr_stream') or \ opt.startswith('stdout_stream'): stream_name, stream_opt = opt.split(".", 1) watcher[stream_name][stream_opt] = val elif opt.startswith('rlimit_'): limit = opt[7:] watcher['rlimits'][limit] = int(val) elif opt == 'priority': watcher['priority'] = dget(section, "priority", 0, int) elif opt == 'use_sockets': watcher['use_sockets'] = dget(section, "use_sockets", False, bool) elif opt == 'singleton': watcher['singleton'] = dget(section, "singleton", False, bool) elif opt == 'copy_env': watcher['copy_env'] = dget(section, "copy_env", False, bool) elif opt == 'copy_path': watcher['copy_path'] = dget(section, "copy_path", False, bool) elif opt.startswith('hooks.'): hook_name = opt[len('hooks.'):] val = [elmt.strip() for elmt in val.split(',', 1)] if len(val) == 1: val.append(False) else: val[1] = to_boolean(val[1]) watcher['hooks'][hook_name] = val elif opt == 'respawn': watcher['respawn'] = dget(section, "respawn", True, bool) elif opt == 'env': logger.warning('the env option is deprecated the use of ' 'env sections is recommended') watcher['env'] = parse_env_str(val) elif opt == 'autostart': watcher['autostart'] = dget(section, "autostart", True, bool) elif opt == 'close_child_stdout': watcher['close_child_stdout'] = dget( section, "close_child_stdout", False, bool) elif opt == 'close_child_stderr': watcher['close_child_stderr'] = dget( section, "close_child_stderr", False, bool) else: # freeform watcher[opt] = val watchers.append(watcher) # Second pass to make sure env sections apply to all watchers. environs = defaultdict(dict) # global env first def _extend(target, source): for name, value in source: if name in target: continue target[name] = value for watcher in watchers: _extend(environs[watcher['name']], global_env.items()) # then per-watcher env for section in cfg.sections(): if section.startswith('env:'): section_elements = section.split("env:", 1)[1] watcher_patterns = [s.strip() for s in section_elements.split(',')] for pattern in watcher_patterns: match = [w for w in watchers if fnmatch(w['name'], pattern)] for watcher in match: watcher_name = watcher['name'] extra = cfg.items(section, noreplace=True) environs[watcher_name].update(_upper(extra)) for watcher in watchers: if watcher['name'] in environs: if not 'env' in watcher: watcher['env'] = dict() _extend(watcher['env'], environs[watcher['name']].items()) for option, value in watcher.items(): if option in ('name', 'env'): continue if not isinstance(value, str): continue watcher[option] = replace_gnu_args(value, env=watcher['env']) config['watchers'] = watchers config['plugins'] = plugins config['sockets'] = sockets return config
def get_config(config_file): if not os.path.exists(config_file): sys.stderr.write("the configuration file %r does not exist\n" % config_file) sys.stderr.write("Exiting...\n") sys.exit(1) cfg, cfg_files_read = read_config(config_file) dget = cfg.dget config = {} # main circus options config['check'] = dget('circus', 'check_delay', 5, int) config['endpoint'] = dget('circus', 'endpoint', DEFAULT_ENDPOINT_DEALER) config['pubsub_endpoint'] = dget('circus', 'pubsub_endpoint', DEFAULT_ENDPOINT_SUB) config['stats_endpoint'] = dget('circus', 'stats_endpoint', None, str) config['warmup_delay'] = dget('circus', 'warmup_delay', 0, int) config['httpd'] = dget('circus', 'httpd', False, bool) config['httpd_host'] = dget('circus', 'httpd_host', 'localhost', str) config['httpd_port'] = dget('circus', 'httpd_port', 8080, int) config['debug'] = dget('circus', 'debug', False, bool) # Initialize watchers, plugins & sockets to manage watchers = [] environs = {} plugins = [] sockets = [] for section in cfg.sections(): if section.startswith("socket:"): sock = dict(cfg.items(section)) sock['name'] = section.split("socket:")[-1].lower() sockets.append(sock) if section.startswith("plugin:"): plugins.append(dict(cfg.items(section))) if section.startswith("watcher:"): watcher = watcher_defaults() watcher['name'] = section.split("watcher:", 1)[1] # create watcher options for opt, val in cfg.items(section): if opt == 'cmd': watcher['cmd'] = val elif opt == 'args': watcher['args'] = val elif opt == 'numprocesses': watcher['numprocesses'] = dget(section, 'numprocesses', 1, int) elif opt == 'warmup_delay': watcher['warmup_delay'] = dget(section, 'warmup_delay', 0, int) elif opt == 'executable': watcher['executable'] = dget(section, 'executable', None, str) elif opt == 'working_dir': watcher['working_dir'] = val elif opt == 'shell': watcher['shell'] = dget(section, 'shell', False, bool) elif opt == 'uid': watcher['uid'] = val elif opt == 'gid': watcher['gid'] = val elif opt == 'send_hup': watcher['send_hup'] = dget(section, 'send_hup', False, bool) elif opt == 'check_flapping': watcher['check_flapping'] = dget(section, 'check_flapping', True, bool) elif opt == 'max_retry': watcher['max_retry'] = dget(section, "max_retry", 5, int) elif opt == 'graceful_timout': watcher['graceful_timeout'] = dget( section, "graceful_timeout", 30, int) elif opt.startswith('publish'): X, publish_opt = opt.split(".", 1) watcher['publish'][publish_opt] = val elif opt.startswith('stream'): stream_name, stream_opt = opt.split(".", 1) watcher[stream_name][stream_opt] = val elif opt.startswith('rlimit_'): limit = opt[7:] watcher['rlimits'][limit] = int(val) elif opt == 'priority': watcher['priority'] = dget(section, "priority", 0, int) elif opt == 'use_sockets': watcher['use_sockets'] = dget(section, "use_sockets", False, bool) elif opt == 'singleton': watcher['singleton'] = dget(section, "singleton", False, bool) elif opt == 'copy_env': watcher['copy_env'] = dget(section, "copy_env", False, bool) elif opt == 'copy_path': watcher['copy_path'] = dget(section, "copy_path", False, bool) elif opt.startswith('hooks.'): hook_name = opt[len('hooks.'):] val = [elmt.strip() for elmt in val.split(',', 1)] if len(val) == 1: val.append(False) else: val[1] = to_boolean(val[1]) watcher['hooks'][hook_name] = val elif opt == 'respawn': watcher['respawn'] = dget(section, "respawn", True, bool) elif opt == 'env': logger.warning('the env option is deprecated the use of ' 'env sections is recommended') watcher['env'] = parse_env_str(val) elif opt == 'autostart': watcher['autostart'] = dget(section, "autostart", True, bool) else: # freeform watcher[opt] = val watchers.append(watcher) if section.startswith('env:'): for watcher in section.split("env:", 1)[1].split(','): watcher = watcher.strip() if not watcher in environs: environs[watcher] = dict() environs[watcher].update([(k.upper(), v) for k, v in cfg.items(section)]) for watcher in watchers: if watcher['name'] in environs: if not 'env' in watcher: watcher['env'] = dict() watcher['env'].update(environs[watcher['name']]) plugin_streams = ['stream_stdout', 'stream_stderr'] for stream in plugin_streams: if stream in watcher: plugin = create_plugin_from_stream(watcher[stream], watcher['name'], stream) if plugin: plugins.append(plugin) publishers = watcher.get('publish', {}) publishers[stream.split('_')[1]] = True watcher['publish'] = publishers config['watchers'] = watchers config['plugins'] = plugins config['sockets'] = sockets return config