102 lines
3.9 KiB
Python
102 lines
3.9 KiB
Python
# 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')
|