blob: 73aa3ba717328545ae6b5ac07114cdb507f09d68 [file] [log] [blame]
rtc@google.comded22402009-10-26 22:36:21 +00001# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import autoupdate
Sean O'Connor14b6a0a2010-03-20 23:23:48 -07006import buildutil
7import optparse
rtc@google.comded22402009-10-26 22:36:21 +00008import os
chocobo@google.com4dc25812009-10-27 23:46:26 +00009import sys
Andrew de los Reyes52620802010-04-12 13:40:07 -070010import web
rtc@google.comded22402009-10-26 22:36:21 +000011
rtc@google.com21a5ca32009-11-04 18:23:23 +000012global updater
13updater = None
rtc@google.comded22402009-10-26 22:36:21 +000014
rtc@google.com64244662009-11-12 00:52:08 +000015
rtc@google.comded22402009-10-26 22:36:21 +000016class index:
17 def GET(self):
Tan Gaoba175362010-07-07 11:25:12 -070018 return render.index(None)
rtc@google.comded22402009-10-26 22:36:21 +000019
20class update:
21 """
Tan Gaoba175362010-07-07 11:25:12 -070022 Processes updates from the client machine. If an update is found, the url
rtc@google.comded22402009-10-26 22:36:21 +000023 references a static link that can be served automagically from web.py.
24 """
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070025 def POST(self, args=None):
26 return updater.HandleUpdatePing(web.data(), args)
rtc@google.com21a5ca32009-11-04 18:23:23 +000027
rtc@google.com64244662009-11-12 00:52:08 +000028class build:
29 """
30 builds the package specified by the pkg parameter and returns the name
31 of the output file.
32 """
Ryan Cairnsdd1ceb82010-03-02 21:35:01 -080033 def POST(self):
rtc@google.com64244662009-11-12 00:52:08 +000034 input = web.input()
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070035 web.debug('emerging %s ' % input.pkg)
36 emerge_command = 'emerge-%s %s' % (input.board, input.pkg)
Ryan Cairnsdd1ceb82010-03-02 21:35:01 -080037 err = os.system(emerge_command)
38 if err != 0:
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070039 raise Exception('failed to execute %s' % emerge_command)
Mandeep Singh Bainesea6b7a52010-08-17 14:03:57 -070040 eclean_command = 'eclean-%s -d packages' % input.board
41 err = os.system(eclean_command)
42 if err != 0:
43 raise Exception('failed to execute %s' % emerge_command)
rtc@google.comded22402009-10-26 22:36:21 +000044
Darin Petkove17164a2010-08-11 13:24:41 -070045def OverrideWSGIServer(server_address, wsgi_app):
46 """Creates a CherryPyWSGIServer instance.
47
48 Overrides web.py's WSGIServer routine (web.httpserver.WSGIServer) to
49 increase the accepted connection socket timeout from the default 10
50 seconds to 10 minutes. The extra time is necessary to serve delta
51 updates as well as update requests from a low priority update_engine
52 process running on a heavily loaded Chrome OS device.
53 """
54 web.debug('using local OverrideWSGIServer routine')
55 from web.wsgiserver import CherryPyWSGIServer
56 return CherryPyWSGIServer(server_address, wsgi_app, server_name="localhost",
57 timeout=600)
58
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070059if __name__ == '__main__':
60 usage = 'usage: %prog [options]'
61 parser = optparse.OptionParser(usage)
Sean O'Connore38ea152010-04-16 13:50:40 -070062 parser.add_option('--archive_dir', dest='archive_dir',
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070063 help='serve archived builds only.')
Andrew de los Reyes9223f132010-05-07 17:08:17 -070064 parser.add_option('--client_prefix', dest='client_prefix',
65 help='Required prefix for client software version.',
66 default='MementoSoftwareUpdate')
Andrew de los Reyes52620802010-04-12 13:40:07 -070067 parser.add_option('--factory_config', dest='factory_config',
68 help='Config file for serving images from factory floor.')
Sean O'Connor1f7fd362010-04-07 16:34:52 -070069 parser.add_option('-t', action='store_true', dest='test_image')
70 parser.add_option('-u', '--urlbase', dest='urlbase',
71 help='base URL, other than devserver, for update images.')
Andrew de los Reyes52620802010-04-12 13:40:07 -070072 parser.add_option('--validate_factory_config', action="store_true",
73 dest='validate_factory_config',
74 help='Validate factory config file, then exit.')
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070075 options, args = parser.parse_args()
76 # clean up the args, due to httpserver's hardcoded use of sys.argv
77 if options.archive_dir:
Andrew de los Reyes52620802010-04-12 13:40:07 -070078 sys.argv.remove('--archive_dir')
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070079 sys.argv.remove(options.archive_dir)
Andrew de los Reyes9223f132010-05-07 17:08:17 -070080 if '--client_prefix' in sys.argv:
81 sys.argv.remove('--client_prefix')
82 sys.argv.remove(options.client_prefix)
Andrew de los Reyes52620802010-04-12 13:40:07 -070083 if options.factory_config:
84 sys.argv.remove('--factory_config')
85 sys.argv.remove(options.factory_config)
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070086 if options.test_image:
87 sys.argv.remove('-t')
Sean O'Connor1f7fd362010-04-07 16:34:52 -070088 if options.urlbase:
89 sys.argv.remove('-u')
90 sys.argv.remove(options.urlbase)
Andrew de los Reyes52620802010-04-12 13:40:07 -070091 if options.validate_factory_config:
92 sys.argv.remove('--validate_factory_config')
rtc@google.com21a5ca32009-11-04 18:23:23 +000093
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070094 root_dir = os.path.realpath('%s/../..' %
95 os.path.dirname(os.path.abspath(sys.argv[0])))
96 if options.archive_dir:
97 static_dir = os.path.realpath(options.archive_dir)
98 assert os.path.exists(static_dir), '%s must exist.' % options.archive_dir
99 web.debug('using archive dir: %s' % static_dir)
100 else:
101 static_dir = os.path.realpath('%s/static' %
102 os.path.dirname(os.path.abspath(sys.argv[0])))
103 web.debug('dev root is %s' % root_dir)
104 os.system('mkdir -p %s' % static_dir)
105 web.debug('Serving images from %s' % static_dir)
rtc@google.com21a5ca32009-11-04 18:23:23 +0000106
Andrew de los Reyes52620802010-04-12 13:40:07 -0700107 updater = autoupdate.Autoupdate(
108 root_dir=root_dir,
109 static_dir=static_dir,
110 serve_only=options.archive_dir,
111 urlbase=options.urlbase,
112 test_image=options.test_image,
113 factory_config_path=options.factory_config,
Andrew de los Reyesfb4444b2010-06-29 18:11:28 -0700114 validate_factory_config=options.validate_factory_config,
115 client_prefix=options.client_prefix)
Andrew de los Reyes52620802010-04-12 13:40:07 -0700116 if options.validate_factory_config:
117 sys.exit(0)
rtc@google.com21a5ca32009-11-04 18:23:23 +0000118 urls = ('/', 'index',
rtc@google.com64244662009-11-12 00:52:08 +0000119 '/update', 'update',
Sean O'Connor14b6a0a2010-03-20 23:23:48 -0700120 '/update/(.+)', 'update',
rtc@google.com64244662009-11-12 00:52:08 +0000121 '/build', 'build')
122
Darin Petkove17164a2010-08-11 13:24:41 -0700123 # Overrides the default WSGIServer routine -- see OverrideWSGIServer.
124 web.httpserver.WSGIServer = OverrideWSGIServer
Sean O'Connor14b6a0a2010-03-20 23:23:48 -0700125 app = web.application(urls, globals(), autoreload=True)
rtc@google.com21a5ca32009-11-04 18:23:23 +0000126 render = web.template.render('templates/')
rtc@google.comded22402009-10-26 22:36:21 +0000127 app.run()