# 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')