blob: 73aa3ba717328545ae6b5ac07114cdb507f09d68 [file] [log] [blame]
# Copyright (c) 2009 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 autoupdate
import buildutil
import optparse
import os
import sys
import web
global updater
updater = None
class index:
def GET(self):
return render.index(None)
class update:
"""
Processes updates from the client machine. If an update is found, the url
references a static link that can be served automagically from web.py.
"""
def POST(self, args=None):
return updater.HandleUpdatePing(web.data(), args)
class build:
"""
builds the package specified by the pkg parameter and returns the name
of the output file.
"""
def POST(self):
input = web.input()
web.debug('emerging %s ' % input.pkg)
emerge_command = 'emerge-%s %s' % (input.board, input.pkg)
err = os.system(emerge_command)
if err != 0:
raise Exception('failed to execute %s' % emerge_command)
eclean_command = 'eclean-%s -d packages' % input.board
err = os.system(eclean_command)
if err != 0:
raise Exception('failed to execute %s' % emerge_command)
def OverrideWSGIServer(server_address, wsgi_app):
"""Creates a CherryPyWSGIServer instance.
Overrides web.py's WSGIServer routine (web.httpserver.WSGIServer) to
increase the accepted connection socket timeout from the default 10
seconds to 10 minutes. The extra time is necessary to serve delta
updates as well as update requests from a low priority update_engine
process running on a heavily loaded Chrome OS device.
"""
web.debug('using local OverrideWSGIServer routine')
from web.wsgiserver import CherryPyWSGIServer
return CherryPyWSGIServer(server_address, wsgi_app, server_name="localhost",
timeout=600)
if __name__ == '__main__':
usage = 'usage: %prog [options]'
parser = optparse.OptionParser(usage)
parser.add_option('--archive_dir', dest='archive_dir',
help='serve archived builds only.')
parser.add_option('--client_prefix', dest='client_prefix',
help='Required prefix for client software version.',
default='MementoSoftwareUpdate')
parser.add_option('--factory_config', dest='factory_config',
help='Config file for serving images from factory floor.')
parser.add_option('-t', action='store_true', dest='test_image')
parser.add_option('-u', '--urlbase', dest='urlbase',
help='base URL, other than devserver, for update images.')
parser.add_option('--validate_factory_config', action="store_true",
dest='validate_factory_config',
help='Validate factory config file, then exit.')
options, args = parser.parse_args()
# clean up the args, due to httpserver's hardcoded use of sys.argv
if options.archive_dir:
sys.argv.remove('--archive_dir')
sys.argv.remove(options.archive_dir)
if '--client_prefix' in sys.argv:
sys.argv.remove('--client_prefix')
sys.argv.remove(options.client_prefix)
if options.factory_config:
sys.argv.remove('--factory_config')
sys.argv.remove(options.factory_config)
if options.test_image:
sys.argv.remove('-t')
if options.urlbase:
sys.argv.remove('-u')
sys.argv.remove(options.urlbase)
if options.validate_factory_config:
sys.argv.remove('--validate_factory_config')
root_dir = os.path.realpath('%s/../..' %
os.path.dirname(os.path.abspath(sys.argv[0])))
if options.archive_dir:
static_dir = os.path.realpath(options.archive_dir)
assert os.path.exists(static_dir), '%s must exist.' % options.archive_dir
web.debug('using archive dir: %s' % static_dir)
else:
static_dir = os.path.realpath('%s/static' %
os.path.dirname(os.path.abspath(sys.argv[0])))
web.debug('dev root is %s' % root_dir)
os.system('mkdir -p %s' % static_dir)
web.debug('Serving images from %s' % static_dir)
updater = autoupdate.Autoupdate(
root_dir=root_dir,
static_dir=static_dir,
serve_only=options.archive_dir,
urlbase=options.urlbase,
test_image=options.test_image,
factory_config_path=options.factory_config,
validate_factory_config=options.validate_factory_config,
client_prefix=options.client_prefix)
if options.validate_factory_config:
sys.exit(0)
urls = ('/', 'index',
'/update', 'update',
'/update/(.+)', 'update',
'/build', 'build')
# Overrides the default WSGIServer routine -- see OverrideWSGIServer.
web.httpserver.WSGIServer = OverrideWSGIServer
app = web.application(urls, globals(), autoreload=True)
render = web.template.render('templates/')
app.run()