| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """A CherryPy-based webserver to host images and build packages.""" | 7 """A CherryPy-based webserver to host images and build packages.""" |
| 8 | 8 |
| 9 import cherrypy | 9 import cherrypy |
| 10 import optparse | 10 import optparse |
| 11 import os | 11 import os |
| 12 import subprocess |
| 12 import sys | 13 import sys |
| 13 | 14 |
| 14 import autoupdate | 15 import autoupdate |
| 16 import builder |
| 15 | 17 |
| 16 CACHED_ENTRIES=12 | 18 CACHED_ENTRIES=12 |
| 17 | 19 |
| 18 # Sets up global to share between classes. | 20 # Sets up global to share between classes. |
| 19 global updater | 21 global updater |
| 20 updater = None | 22 updater = None |
| 21 | 23 |
| 22 def _GetConfig(options): | 24 def _GetConfig(options): |
| 23 """Returns the configuration for the devserver.""" | 25 """Returns the configuration for the devserver.""" |
| 24 base_config = { 'global': | 26 base_config = { 'global': |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 if image_dir != os.readlink('static/archive'): | 64 if image_dir != os.readlink('static/archive'): |
| 63 cherrypy.log('removing stale symlink to %s' % image_dir, 'DEVSERVER') | 65 cherrypy.log('removing stale symlink to %s' % image_dir, 'DEVSERVER') |
| 64 os.unlink('static/archive') | 66 os.unlink('static/archive') |
| 65 os.symlink(image_dir, 'static/archive') | 67 os.symlink(image_dir, 'static/archive') |
| 66 else: | 68 else: |
| 67 os.symlink(image_dir, 'static/archive') | 69 os.symlink(image_dir, 'static/archive') |
| 68 cherrypy.log('archive dir: %s ready to be used to serve images.' % image_dir, | 70 cherrypy.log('archive dir: %s ready to be used to serve images.' % image_dir, |
| 69 'DEVSERVER') | 71 'DEVSERVER') |
| 70 | 72 |
| 71 | 73 |
| 72 class DevServerRoot: | 74 class DevServerRoot(object): |
| 73 """The Root Class for the Dev Server. | 75 """The Root Class for the Dev Server. |
| 74 | 76 |
| 75 CherryPy works as follows: | 77 CherryPy works as follows: |
| 76 For each method in this class, cherrpy interprets root/path | 78 For each method in this class, cherrpy interprets root/path |
| 77 as a call to an instance of DevServerRoot->method_name. For example, | 79 as a call to an instance of DevServerRoot->method_name. For example, |
| 78 a call to http://myhost/build will call build. CherryPy automatically | 80 a call to http://myhost/build will call build. CherryPy automatically |
| 79 parses http args and places them as keyword arguments in each method. | 81 parses http args and places them as keyword arguments in each method. |
| 80 For paths http://myhost/update/dir1/dir2, you can use *args so that | 82 For paths http://myhost/update/dir1/dir2, you can use *args so that |
| 81 cherrypy uses the update method and puts the extra paths in args. | 83 cherrypy uses the update method and puts the extra paths in args. |
| 82 """ | 84 """ |
| 83 | 85 |
| 84 def build(self, board, pkg): | 86 def __init__(self): |
| 87 self._builder = builder.Builder() |
| 88 |
| 89 def build(self, board, pkg, **kwargs): |
| 85 """Builds the package specified.""" | 90 """Builds the package specified.""" |
| 86 cherrypy.log('emerging %s' % pkg, 'BUILD') | 91 return self._builder.Build(board, pkg, kwargs) |
| 87 emerge_command = 'emerge-%s %s' % (board, pkg) | |
| 88 err = os.system(emerge_command) | |
| 89 if err != 0: | |
| 90 raise Exception('failed to execute %s' % emerge_command) | |
| 91 eclean_command = 'eclean-%s -d packages' % board | |
| 92 err = os.system(eclean_command) | |
| 93 if err != 0: | |
| 94 raise Exception('failed to execute %s' % emerge_command) | |
| 95 | 92 |
| 96 def index(self): | 93 def index(self): |
| 97 return 'Welcome to the Dev Server!' | 94 return 'Welcome to the Dev Server!' |
| 98 | 95 |
| 99 def update(self, *args): | 96 def update(self, *args): |
| 100 label = '/'.join(args) | 97 label = '/'.join(args) |
| 101 body_length = int(cherrypy.request.headers['Content-Length']) | 98 body_length = int(cherrypy.request.headers['Content-Length']) |
| 102 data = cherrypy.request.rfile.read(body_length) | 99 data = cherrypy.request.rfile.read(body_length) |
| 103 return updater.HandleUpdatePing(data, label) | 100 return updater.HandleUpdatePing(data, label) |
| 104 | 101 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 # We don't run the dev server with this option. | 205 # We don't run the dev server with this option. |
| 209 if options.validate_factory_config: | 206 if options.validate_factory_config: |
| 210 sys.exit(0) | 207 sys.exit(0) |
| 211 elif options.pregenerate_update: | 208 elif options.pregenerate_update: |
| 212 if not updater.PreGenerateUpdate(): | 209 if not updater.PreGenerateUpdate(): |
| 213 sys.exit(1) | 210 sys.exit(1) |
| 214 | 211 |
| 215 # If the command line requested after setup, it's time to do it. | 212 # If the command line requested after setup, it's time to do it. |
| 216 if not options.exit: | 213 if not options.exit: |
| 217 cherrypy.quickstart(DevServerRoot(), config=_GetConfig(options)) | 214 cherrypy.quickstart(DevServerRoot(), config=_GetConfig(options)) |
| OLD | NEW |