| Index: testing/legion/rpc_server.py
|
| diff --git a/testing/legion/rpc_server.py b/testing/legion/rpc_server.py
|
| deleted file mode 100644
|
| index 43b431707e851c0601058c401a3dcf3d0201c255..0000000000000000000000000000000000000000
|
| --- a/testing/legion/rpc_server.py
|
| +++ /dev/null
|
| @@ -1,128 +0,0 @@
|
| -# Copyright 2015 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""The task RPC server code.
|
| -
|
| -This server is an XML-RPC server which serves code from
|
| -rpc_methods.RPCMethods.
|
| -
|
| -This server will run until shutdown is called on the server object. This can
|
| -be achieved in 2 ways:
|
| -
|
| -- Calling the Quit RPC method defined in RPCMethods
|
| -- Not receiving any calls within the idle_timeout_secs time.
|
| -"""
|
| -
|
| -import logging
|
| -import threading
|
| -import time
|
| -import xmlrpclib
|
| -import SimpleXMLRPCServer
|
| -import SocketServer
|
| -
|
| -#pylint: disable=relative-import
|
| -import common_lib
|
| -import rpc_methods
|
| -
|
| -
|
| -class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
|
| - """Restricts access to only specified IP address.
|
| -
|
| - This call assumes the server is RPCServer.
|
| - """
|
| -
|
| - def do_POST(self):
|
| - """Verifies the task is authorized to perform RPCs."""
|
| - if self.client_address[0] != self.server.authorized_address:
|
| - logging.error('Received unauthorized RPC request from %s',
|
| - self.task_address[0])
|
| - self.send_response(403)
|
| - response = 'Forbidden'
|
| - self.send_header('Content-type', 'text/plain')
|
| - self.send_header('Content-length', str(len(response)))
|
| - self.end_headers()
|
| - self.wfile.write(response)
|
| - else:
|
| - return SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.do_POST(self)
|
| -
|
| -
|
| -class RPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer,
|
| - SocketServer.ThreadingMixIn):
|
| - """Restricts all endpoints to only specified IP addresses."""
|
| -
|
| - def __init__(self, authorized_address,
|
| - idle_timeout_secs=common_lib.DEFAULT_TIMEOUT_SECS):
|
| - SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(
|
| - self, (common_lib.SERVER_ADDRESS, common_lib.SERVER_PORT),
|
| - allow_none=True, logRequests=False,
|
| - requestHandler=RequestHandler)
|
| -
|
| - self.authorized_address = authorized_address
|
| - self.idle_timeout_secs = idle_timeout_secs
|
| - self.register_instance(rpc_methods.RPCMethods(self))
|
| -
|
| - self._shutdown_requested_event = threading.Event()
|
| - self._rpc_received_event = threading.Event()
|
| - self._idle_thread = threading.Thread(target=self._CheckForIdleQuit)
|
| -
|
| - def shutdown(self):
|
| - """Shutdown the server.
|
| -
|
| - This overloaded method sets the _shutdown_requested_event to allow the
|
| - idle timeout thread to quit.
|
| - """
|
| - self._shutdown_requested_event.set()
|
| - SimpleXMLRPCServer.SimpleXMLRPCServer.shutdown(self)
|
| - logging.info('Server shutdown complete')
|
| -
|
| - def serve_forever(self, poll_interval=0.5):
|
| - """Serve forever.
|
| -
|
| - This overloaded method starts the idle timeout thread before calling
|
| - serve_forever. This ensures the idle timer thread doesn't get started
|
| - without the server running.
|
| -
|
| - Args:
|
| - poll_interval: The interval to poll for shutdown.
|
| - """
|
| - logging.info('RPC server starting')
|
| - self._idle_thread.start()
|
| - SimpleXMLRPCServer.SimpleXMLRPCServer.serve_forever(self, poll_interval)
|
| -
|
| - def _dispatch(self, method, params):
|
| - """Dispatch the call to the correct method with the provided params.
|
| -
|
| - This overloaded method adds logging to help trace connection and
|
| - call problems.
|
| -
|
| - Args:
|
| - method: The method name to call.
|
| - params: A tuple of parameters to pass.
|
| -
|
| - Returns:
|
| - The result of the parent class' _dispatch method.
|
| - """
|
| - logging.debug('Calling %s%s', method, params)
|
| - self._rpc_received_event.set()
|
| - return SimpleXMLRPCServer.SimpleXMLRPCServer._dispatch(self, method, params)
|
| -
|
| - def _CheckForIdleQuit(self):
|
| - """Check for, and exit, if the server is idle for too long.
|
| -
|
| - This method must be run in a separate thread to avoid a deadlock when
|
| - calling server.shutdown.
|
| - """
|
| - timeout = time.time() + self.idle_timeout_secs
|
| - while time.time() < timeout:
|
| - if self._shutdown_requested_event.is_set():
|
| - # An external source called shutdown()
|
| - return
|
| - elif self._rpc_received_event.is_set():
|
| - logging.debug('Resetting the idle timeout')
|
| - timeout = time.time() + self.idle_timeout_secs
|
| - self._rpc_received_event.clear()
|
| - time.sleep(1)
|
| - # We timed out, kill the server
|
| - logging.warning('Shutting down the server due to the idle timeout')
|
| - self.shutdown()
|
|
|