blob: 0dfe559b5e0940e0c7a8d74a0489601f4a522567 [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)
rtc@google.comded22402009-10-26 22:36:21 +000040
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070041if __name__ == '__main__':
42 usage = 'usage: %prog [options]'
43 parser = optparse.OptionParser(usage)
Sean O'Connore38ea152010-04-16 13:50:40 -070044 parser.add_option('--archive_dir', dest='archive_dir',
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070045 help='serve archived builds only.')
Andrew de los Reyes9223f132010-05-07 17:08:17 -070046 parser.add_option('--client_prefix', dest='client_prefix',
47 help='Required prefix for client software version.',
48 default='MementoSoftwareUpdate')
Andrew de los Reyes52620802010-04-12 13:40:07 -070049 parser.add_option('--factory_config', dest='factory_config',
50 help='Config file for serving images from factory floor.')
Sean O'Connor1f7fd362010-04-07 16:34:52 -070051 parser.add_option('-t', action='store_true', dest='test_image')
52 parser.add_option('-u', '--urlbase', dest='urlbase',
53 help='base URL, other than devserver, for update images.')
Andrew de los Reyes52620802010-04-12 13:40:07 -070054 parser.add_option('--validate_factory_config', action="store_true",
55 dest='validate_factory_config',
56 help='Validate factory config file, then exit.')
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070057 options, args = parser.parse_args()
58 # clean up the args, due to httpserver's hardcoded use of sys.argv
59 if options.archive_dir:
Andrew de los Reyes52620802010-04-12 13:40:07 -070060 sys.argv.remove('--archive_dir')
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070061 sys.argv.remove(options.archive_dir)
Andrew de los Reyes9223f132010-05-07 17:08:17 -070062 if '--client_prefix' in sys.argv:
63 sys.argv.remove('--client_prefix')
64 sys.argv.remove(options.client_prefix)
Andrew de los Reyes52620802010-04-12 13:40:07 -070065 if options.factory_config:
66 sys.argv.remove('--factory_config')
67 sys.argv.remove(options.factory_config)
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070068 if options.test_image:
69 sys.argv.remove('-t')
Sean O'Connor1f7fd362010-04-07 16:34:52 -070070 if options.urlbase:
71 sys.argv.remove('-u')
72 sys.argv.remove(options.urlbase)
Andrew de los Reyes52620802010-04-12 13:40:07 -070073 if options.validate_factory_config:
74 sys.argv.remove('--validate_factory_config')
rtc@google.com21a5ca32009-11-04 18:23:23 +000075
Sean O'Connor14b6a0a2010-03-20 23:23:48 -070076 root_dir = os.path.realpath('%s/../..' %
77 os.path.dirname(os.path.abspath(sys.argv[0])))
78 if options.archive_dir:
79 static_dir = os.path.realpath(options.archive_dir)
80 assert os.path.exists(static_dir), '%s must exist.' % options.archive_dir
81 web.debug('using archive dir: %s' % static_dir)
82 else:
83 static_dir = os.path.realpath('%s/static' %
84 os.path.dirname(os.path.abspath(sys.argv[0])))
85 web.debug('dev root is %s' % root_dir)
86 os.system('mkdir -p %s' % static_dir)
87 web.debug('Serving images from %s' % static_dir)
rtc@google.com21a5ca32009-11-04 18:23:23 +000088
Andrew de los Reyes52620802010-04-12 13:40:07 -070089 updater = autoupdate.Autoupdate(
90 root_dir=root_dir,
91 static_dir=static_dir,
92 serve_only=options.archive_dir,
93 urlbase=options.urlbase,
94 test_image=options.test_image,
95 factory_config_path=options.factory_config,
Andrew de los Reyesfb4444b2010-06-29 18:11:28 -070096 validate_factory_config=options.validate_factory_config,
97 client_prefix=options.client_prefix)
Andrew de los Reyes52620802010-04-12 13:40:07 -070098 if options.validate_factory_config:
99 sys.exit(0)
rtc@google.com21a5ca32009-11-04 18:23:23 +0000100 urls = ('/', 'index',
rtc@google.com64244662009-11-12 00:52:08 +0000101 '/update', 'update',
Sean O'Connor14b6a0a2010-03-20 23:23:48 -0700102 '/update/(.+)', 'update',
rtc@google.com64244662009-11-12 00:52:08 +0000103 '/build', 'build')
104
Sean O'Connor14b6a0a2010-03-20 23:23:48 -0700105 app = web.application(urls, globals(), autoreload=True)
rtc@google.com21a5ca32009-11-04 18:23:23 +0000106 render = web.template.render('templates/')
rtc@google.comded22402009-10-26 22:36:21 +0000107 app.run()