| # Copyright 2015 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import collections |
| import json |
| |
| from autotest_lib.client.common_lib import utils |
| |
| |
| # Represents one instance of a protocol handler that the webserver can be |
| # configured with. |
| ProtocolHandler = collections.namedtuple('ProtocolHandler', |
| ['name', 'port', 'use_tls']) |
| |
| def get_n_protocol_handlers(n, port_base, use_tls=False, |
| handler_name_prefix='test_protocol_handler_'): |
| """Construct ProtocolHandler objects for a number of handlers. |
| |
| @param n: integer number of handlers. |
| @param port_base: integer port number. Each handler will be given a port |
| from the port_base, port_base + 1, port_base + 2, etc. |
| @param use_tls: True iff the handler should use encryption. |
| @param handler_name_prefix: string prefix to be used in the names of |
| the N handlers. |
| |
| """ |
| protocol_handlers = [] |
| for i in range(n): |
| protocol_handlers.append( |
| ProtocolHandler(name='%s%d' % (handler_name_prefix, i), |
| port=port_base + i, |
| use_tls=use_tls)) |
| return protocol_handlers |
| |
| |
| class WebserverConfig(object): |
| """Helper object that knows how to configure webservd.""" |
| |
| def __init__(self, |
| verbosity_level=3, |
| webserv_debug=None, |
| extra_protocol_handlers=None, |
| host=None): |
| """Construct an instance. |
| |
| @param verbosity_level: integer verbosity level. |
| @param webserv_debug: True iff the webserver should log in debug mode. |
| @param extra_protocol_handlers: list of protocol handler objects |
| obtained from get_n_protocol_handlers. These replace the |
| default handlers. |
| @param host: Host object if we want to control webservd on a remote |
| host. |
| |
| """ |
| self._verbosity_level = verbosity_level |
| self._webserv_debug = webserv_debug |
| self._extra_protocol_handlers = extra_protocol_handlers |
| self._run = utils.run if host is None else host.run |
| |
| |
| def _write_out_config_file(self, path, protocol_handlers): |
| """Write a config file at |path| for |protocol_handlers|. |
| |
| @param path: file system path to write config dict to. |
| @param protocol_handlers: list of ProtocolHandler objects. |
| |
| """ |
| handler_configs = [] |
| # Each handler gets a JSON dict. |
| for handler in self._extra_protocol_handlers: |
| handler_configs.append({'name': handler.name, |
| 'port': handler.port, |
| 'use_tls': handler.use_tls}) |
| config = {'protocol_handlers': handler_configs} |
| # Write out the actual file and give webservd permissions. |
| with open(path, 'w') as f: |
| f.write(json.dumps(config, indent=True)) |
| self._run('chown webservd:webservd %s' % path) |
| |
| |
| def restart_with_config(self): |
| """Restart the webserver with this configuration.""" |
| self._run('stop webservd', ignore_status=True) |
| config_path = None |
| if self._extra_protocol_handlers: |
| config_path = '/tmp/webservd.conf' |
| self._write_out_config_file(config_path, |
| self._extra_protocol_handlers) |
| args = ['WEBSERVD_LOG_LEVEL=%d' % self._verbosity_level] |
| if self._webserv_debug: |
| args.append('WEBSERVD_DEBUG=true') |
| if config_path: |
| args.append('WEBSERVD_CONFIG_PATH=%s' % config_path) |
| self._run('start webservd %s' % ' '.join(args)) |
| |
| |
| def close(self): |
| """Restarts the webserver with the default configuration.""" |
| self._run('stop webservd', ignore_status=True) |
| self._run('start webservd') |