blob: 73aa3ba717328545ae6b5ac07114cdb507f09d68 [file] [log] [blame]
Nick Sanders723f3262010-09-16 05:18:41 -07001# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
rtc@google.comded22402009-10-26 22:36:21 +00002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
Nick Sanders723f3262010-09-16 05:18:41 -07005import autoupdate
6import buildutil
Sean O'Connor14b6a0a2010-03-20 23:23:48 -07007import 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.')
Nick Sanders723f3262010-09-16 05:18:41 -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:
78 sys.argv.remove('--archive_dir')
79 sys.argv.remove(options.archive_dir)
80 if '--client_prefix' in sys.argv:
81 sys.argv.remove('--client_prefix')
82 sys.argv.remove(options.client_prefix)
83 if options.factory_config:
84 sys.argv.remove('--factory_config')
85 sys.argv.remove(options.factory_config)
86 if options.test_image:
87 sys.argv.remove('-t')
88 if options.urlbase:
89 sys.argv.remove('-u')
90 sys.argv.remove(options.urlbase)
91 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)
Nick Sanders723f3262010-09-16 05:18:41 -070098 assert os.path.exists(static_dir), '%s must exist.' % options.archive_dir
99 web.debug('using archive dir: %s' % static_dir)
Sean O'Connor14b6a0a2010-03-20 23:23:48 -0700100 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)
Nick Sanders723f3262010-09-16 05:18:41 -0700105 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,
Nick Sanders723f3262010-09-16 05:18:41 -0700110 serve_only=options.archive_dir,
Andrew de los Reyes52620802010-04-12 13:40:07 -0700111 urlbase=options.urlbase,
112 test_image=options.test_image,
113 factory_config_path=options.factory_config,
Nick Sanders723f3262010-09-16 05:18:41 -0700114 validate_factory_config=options.validate_factory_config,
115 client_prefix=options.client_prefix)
116 if options.validate_factory_config:
117 sys.exit(0)
118 urls = ('/', 'index',
119 '/update', 'update',
120 '/update/(.+)', 'update',
121 '/build', 'build')
rtc@google.com64244662009-11-12 00:52:08 +0000122
Nick Sanders723f3262010-09-16 05:18:41 -0700123 # Overrides the default WSGIServer routine -- see OverrideWSGIServer.
124 web.httpserver.WSGIServer = OverrideWSGIServer
125 app = web.application(urls, globals(), autoreload=True)
126 render = web.template.render('templates/')
127 app.run()