OLD | NEW |
1 # Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from buildutil import BuildObject | 5 from buildutil import BuildObject |
6 from xml.dom import minidom | 6 from xml.dom import minidom |
7 | 7 |
8 import cherrypy | 8 import cherrypy |
9 import os | 9 import os |
10 import shutil | 10 import shutil |
(...skipping 13 matching lines...) Expand all Loading... |
24 factory_config: Path to the factory config file if handling factory | 24 factory_config: Path to the factory config file if handling factory |
25 requests. | 25 requests. |
26 use_test_image: Use chromiumos_test_image.bin rather than the standard. | 26 use_test_image: Use chromiumos_test_image.bin rather than the standard. |
27 static_url_base: base URL, other than devserver, for update images. | 27 static_url_base: base URL, other than devserver, for update images. |
28 client_prefix: The prefix for the update engine client. | 28 client_prefix: The prefix for the update engine client. |
29 forced_image: Path to an image to use for all updates. | 29 forced_image: Path to an image to use for all updates. |
30 """ | 30 """ |
31 | 31 |
32 def __init__(self, serve_only=None, test_image=False, urlbase=None, | 32 def __init__(self, serve_only=None, test_image=False, urlbase=None, |
33 factory_config_path=None, client_prefix=None, forced_image=None, | 33 factory_config_path=None, client_prefix=None, forced_image=None, |
34 use_cached=False, port=8080, src_image='', vm=False, *args, | 34 use_cached=False, port=8080, src_image='', vm=False, board=None, |
35 **kwargs): | 35 *args, **kwargs): |
36 super(Autoupdate, self).__init__(*args, **kwargs) | 36 super(Autoupdate, self).__init__(*args, **kwargs) |
37 self.serve_only = serve_only | 37 self.serve_only = serve_only |
38 self.factory_config = factory_config_path | 38 self.factory_config = factory_config_path |
39 self.use_test_image = test_image | 39 self.use_test_image = test_image |
40 if urlbase: | 40 if urlbase: |
41 self.urlbase = urlbase | 41 self.urlbase = urlbase |
42 else: | 42 else: |
43 self.urlbase = None | 43 self.urlbase = None |
44 | 44 |
45 self.client_prefix = client_prefix | 45 self.client_prefix = client_prefix |
46 self.forced_image = forced_image | 46 self.forced_image = forced_image |
47 self.use_cached = use_cached | 47 self.use_cached = use_cached |
48 self.src_image = src_image | 48 self.src_image = src_image |
49 self.vm = vm | 49 self.vm = vm |
| 50 self.board = board |
50 | 51 |
51 def _GetSecondsSinceMidnight(self): | 52 def _GetSecondsSinceMidnight(self): |
52 """Returns the seconds since midnight as a decimal value.""" | 53 """Returns the seconds since midnight as a decimal value.""" |
53 now = time.localtime() | 54 now = time.localtime() |
54 return now[3] * 3600 + now[4] * 60 + now[5] | 55 return now[3] * 3600 + now[4] * 60 + now[5] |
55 | 56 |
56 def _GetDefaultBoardID(self): | 57 def _GetDefaultBoardID(self): |
57 """Returns the default board id stored in .default_board.""" | 58 """Returns the default board id stored in .default_board.""" |
58 board_file = '%s/.default_board' % (self.scripts_dir) | 59 board_file = '%s/.default_board' % (self.scripts_dir) |
59 try: | 60 try: |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 | 290 |
290 Args: | 291 Args: |
291 image_path: full path to the image. | 292 image_path: full path to the image. |
292 move_to_static_dir: Moves the files from their dir to the static dir. | 293 move_to_static_dir: Moves the files from their dir to the static dir. |
293 static_image_dir: the directory to move images to after generating. | 294 static_image_dir: the directory to move images to after generating. |
294 Returns: | 295 Returns: |
295 True if the update payload was created successfully. | 296 True if the update payload was created successfully. |
296 """ | 297 """ |
297 _LogMessage('Generating update for image %s' % image_path) | 298 _LogMessage('Generating update for image %s' % image_path) |
298 update_path = self.GenerateUpdateFile(image_path) | 299 update_path = self.GenerateUpdateFile(image_path) |
299 stateful_update_path = self.GenerateStatefulFile(image_path) | 300 if update_path: |
300 if not update_path or not stateful_update_path: | 301 stateful_update_path = self.GenerateStatefulFile(image_path) |
301 _LogMessage('Failed to generate update') | 302 if stateful_update_path: |
302 return False | 303 if move_to_static_dir: |
| 304 return self.MoveImagesToStaticDir(update_path, stateful_update_path, |
| 305 static_image_dir) |
303 | 306 |
304 if move_to_static_dir: | 307 return True |
305 return self.MoveImagesToStaticDir(update_path, stateful_update_path, | 308 |
306 static_image_dir) | 309 _LogMessage('Failed to generate update') |
307 else: | 310 return False |
308 return True | |
309 | 311 |
310 def GenerateLatestUpdateImage(self, board_id, client_version, | 312 def GenerateLatestUpdateImage(self, board_id, client_version, |
311 static_image_dir=None): | 313 static_image_dir=None): |
312 """Generates an update using the latest image that has been built. | 314 """Generates an update using the latest image that has been built. |
313 | 315 |
314 This will only generate an update if the newest update is newer than that | 316 This will only generate an update if the newest update is newer than that |
315 on the client or client_version is 'ForcedUpdate'. | 317 on the client or client_version is 'ForcedUpdate'. |
316 | 318 |
317 Args: | 319 Args: |
318 board_id: Name of the board. | 320 board_id: Name of the board. |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 """Generates an update for non-factory and returns True on success.""" | 468 """Generates an update for non-factory and returns True on success.""" |
467 if self.use_cached and os.path.exists(os.path.join(static_image_dir, | 469 if self.use_cached and os.path.exists(os.path.join(static_image_dir, |
468 'update.gz')): | 470 'update.gz')): |
469 _LogMessage('Using cached image regardless of timestamps.') | 471 _LogMessage('Using cached image regardless of timestamps.') |
470 return True | 472 return True |
471 else: | 473 else: |
472 if self.forced_image: | 474 if self.forced_image: |
473 has_built_image = self.GenerateUpdateImage( | 475 has_built_image = self.GenerateUpdateImage( |
474 self.forced_image, move_to_static_dir=True, | 476 self.forced_image, move_to_static_dir=True, |
475 static_image_dir=static_image_dir) | 477 static_image_dir=static_image_dir) |
476 # Now that we've generated it, force devserver to use it. | 478 return has_built_image |
477 self.use_cached = True | |
478 elif self.serve_only: | 479 elif self.serve_only: |
479 return self.GenerateImageFromZip(static_image_dir) | 480 return self.GenerateImageFromZip(static_image_dir) |
480 elif board_id and client_version: | |
481 return self.GenerateLatestUpdateImage(board_id, | |
482 client_version, | |
483 static_image_dir) | |
484 else: | 481 else: |
| 482 if board_id: |
| 483 return self.GenerateLatestUpdateImage(board_id, |
| 484 client_version, |
| 485 static_image_dir) |
| 486 |
| 487 _LogMessage('You must set --board for pre-generating latest update.') |
485 return False | 488 return False |
486 | 489 |
487 def PreGenerateUpdate(self): | 490 def PreGenerateUpdate(self): |
488 """Pre-generates an update. Does not work for factory or label updates.""" | 491 """Pre-generates an update. Returns True on success.""" |
489 # Does not work with factory config. | 492 # Does not work with factory config. |
490 assert(not self.factory_config) | 493 assert(not self.factory_config) |
491 _LogMessage('Pre-generating the update payload.') | 494 _LogMessage('Pre-generating the update payload.') |
492 # Does not work with labels so just use static dir. | 495 # Does not work with labels so just use static dir. |
493 if self.GenerateUpdatePayloadForNonFactory(None, None, self.static_dir): | 496 if self.GenerateUpdatePayloadForNonFactory(self.board, '0.0.0.0', |
| 497 self.static_dir): |
494 # Force the devserver to use the pre-generated payload. | 498 # Force the devserver to use the pre-generated payload. |
495 self.use_cached = True | 499 self.use_cached = True |
| 500 _LogMessage('Pre-generated update successfully.') |
| 501 return True |
496 else: | 502 else: |
497 _LogMessage('Failed to pre-generate update.') | 503 _LogMessage('Failed to pre-generate update.') |
| 504 return False |
498 | 505 |
499 def HandleUpdatePing(self, data, label=None): | 506 def HandleUpdatePing(self, data, label=None): |
500 """Handles an update ping from an update client. | 507 """Handles an update ping from an update client. |
501 | 508 |
502 Args: | 509 Args: |
503 data: xml blob from client. | 510 data: xml blob from client. |
504 label: optional label for the update. | 511 label: optional label for the update. |
505 Returns: | 512 Returns: |
506 Update payload message for client. | 513 Update payload message for client. |
507 """ | 514 """ |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 is_delta_format = self._IsDeltaFormatFile(filename) | 567 is_delta_format = self._IsDeltaFormatFile(filename) |
561 if label: | 568 if label: |
562 url = '%s/%s/update.gz' % (static_urlbase, label) | 569 url = '%s/%s/update.gz' % (static_urlbase, label) |
563 else: | 570 else: |
564 url = '%s/update.gz' % static_urlbase | 571 url = '%s/update.gz' % static_urlbase |
565 | 572 |
566 _LogMessage('Responding to client to use url %s to get image.' % url) | 573 _LogMessage('Responding to client to use url %s to get image.' % url) |
567 return self.GetUpdatePayload(hash, sha256, size, url, is_delta_format) | 574 return self.GetUpdatePayload(hash, sha256, size, url, is_delta_format) |
568 else: | 575 else: |
569 return self.GetNoUpdatePayload() | 576 return self.GetNoUpdatePayload() |
OLD | NEW |