coredump.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import absolute_import, print_function
  2. import datetime
  3. from progressbar import ProgressBar, Bar, FileTransferSpeed, Timer, Percentage
  4. from libpebble2.protocol.transfers import GetBytesInfoResponse
  5. from libpebble2.services.getbytes import GetBytesService
  6. from libpebble2.exceptions import GetBytesError
  7. from pebble_tool.commands.base import PebbleCommand
  8. from pebble_tool.exceptions import ToolError
  9. class CoredumpCommand(PebbleCommand):
  10. """Takes a screenshot from the watch."""
  11. command = 'coredump'
  12. def __init__(self):
  13. self.progress_bar = ProgressBar(widgets=[Percentage(), Bar(marker='=', left='[', right=']'), ' ',
  14. FileTransferSpeed(), ' ', Timer(format='%s')])
  15. self.started = False
  16. def __call__(self, args):
  17. super(CoredumpCommand, self).__call__(args)
  18. get_bytes = GetBytesService(self.pebble)
  19. get_bytes.register_handler("progress", self._handle_progress)
  20. self.progress_bar.start()
  21. try:
  22. core_data = get_bytes.get_coredump(args.fresh)
  23. except GetBytesError as ex:
  24. if ex.code == GetBytesInfoResponse.ErrorCode.DoesNotExist:
  25. raise ToolError('No coredump on device')
  26. else:
  27. raise
  28. self.progress_bar.finish()
  29. filename = self._generate_filename() if args.filename is None else args.filename
  30. with open(filename, "w") as core_file:
  31. core_file.write(core_data)
  32. print("Saved coredump to {}".format(filename))
  33. def _handle_progress(self, progress, total):
  34. if not self.started:
  35. self.progress_bar.maxval = total
  36. self.started = True
  37. self.progress_bar.update(progress)
  38. @classmethod
  39. def _generate_filename(cls):
  40. return datetime.datetime.now().strftime("pebble_coredump_%Y-%m-%d_%H-%M-%S.core")
  41. @classmethod
  42. def add_parser(cls, parser):
  43. parser = super(CoredumpCommand, cls).add_parser(parser)
  44. parser.add_argument('filename', nargs='?', type=str, help="Filename of coredump")
  45. parser.add_argument('--fresh', action="store_true", help="Require a fresh coredump")
  46. return parser