1#! /usr/bin/env python 2 3# Copyright 2014 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Fake implementation of a Device Server. 8 9This module can be used in testing both in autotests and locally. To use locally 10you can just run this python module directly. 11""" 12 13import argparse 14import logging 15import logging.handlers 16import cherrypy 17 18import common 19from fake_device_server import commands 20from fake_device_server import devices 21from fake_device_server import fail_control 22from fake_device_server import meta_handler 23from fake_device_server import oauth 24from fake_device_server import registration_tickets 25from fake_device_server import resource_delegate 26 27PORT = 9876 28 29 30def stop_server(): 31 """Stops the cherrypy server and blocks.""" 32 cherrypy.engine.stop() 33 34 35def start_server(generation): 36 """Starts the cherrypy server and blocks. 37 38 @param generation: string unique to this instance of the fake device server. 39 40 """ 41 fail_control_handler = fail_control.FailControl() 42 cherrypy.tree.mount( 43 fail_control_handler, '/' + fail_control.FAIL_CONTROL_PATH, 44 {'/': 45 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 46 } 47 ) 48 oauth_handler = oauth.OAuth(fail_control_handler) 49 commands_handler = commands.Commands(oauth_handler, fail_control_handler) 50 cherrypy.tree.mount( 51 commands_handler, '/' + commands.COMMANDS_PATH, 52 {'/': 53 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 54 } 55 ) 56 devices_resource = resource_delegate.ResourceDelegate({}) 57 # TODO(wiley): We need to validate device commands. 58 devices_handler = devices.Devices(devices_resource, 59 commands_handler, 60 oauth_handler, 61 fail_control_handler) 62 cherrypy.tree.mount( 63 devices_handler, '/' + devices.DEVICES_PATH, 64 {'/': 65 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 66 } 67 ) 68 tickets = resource_delegate.ResourceDelegate({}) 69 registration_tickets_handler = registration_tickets.RegistrationTickets( 70 tickets, devices_handler, fail_control_handler) 71 cherrypy.tree.mount( 72 registration_tickets_handler, 73 '/' + registration_tickets.REGISTRATION_PATH, 74 {'/': 75 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 76 } 77 ) 78 cherrypy.tree.mount( 79 oauth_handler, 80 '/' + oauth.OAUTH_PATH, 81 {'/': 82 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 83 } 84 ) 85 cherrypy.tree.mount( 86 meta_handler.MetaHandler(generation), 87 '/' + meta_handler.META_HANDLER_PATH, 88 {'/': 89 {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} 90 } 91 ) 92 # Don't parse POST for params. 93 cherrypy.config.update({'global': {'request.process_request_body': False}}) 94 cherrypy.engine.start() 95 96 97def main(): 98 """Main method for callers who start this module directly.""" 99 parser = argparse.ArgumentParser( 100 description='Acts like a fake instance of GCD') 101 parser.add_argument('generation', metavar='generation', type=str, 102 help='Unique generation id for confirming health') 103 args = parser.parse_args() 104 cherrypy.config.update({'server.socket_port': PORT}) 105 start_server(args.generation) 106 cherrypy.engine.block() 107 108 109if __name__ == '__main__': 110 formatter = logging.Formatter( 111 'fake_gcd_server: [%(levelname)s] %(message)s') 112 handler = logging.handlers.SysLogHandler(address='/dev/log') 113 handler.setFormatter(formatter) 114 logging.basicConfig(level=logging.DEBUG) 115 logging.getLogger().addHandler(handler) 116 main() 117