Chromium Code Reviews| Index: sky/tools/skydb |
| diff --git a/sky/tools/skydb b/sky/tools/skydb |
| index 5fee198566078a9cbf5c12120da37e3e2fa91d3b..3a561fb3fac21dccafaaa74df33de7fbc7cce5fa 100755 |
| --- a/sky/tools/skydb |
| +++ b/sky/tools/skydb |
| @@ -6,8 +6,11 @@ |
| from skypy.paths import Paths |
| from skypy.skyserver import SkyServer |
| import argparse |
| +import json |
| import logging |
| import os |
| +import requests |
| +import signal |
| import skypy.configuration as configuration |
| import subprocess |
| import urlparse |
| @@ -19,13 +22,17 @@ SUPPORTED_MIME_TYPES = [ |
| 'text/plain', |
| ] |
| - |
| HTTP_PORT = 9999 |
| +PID_FILE_PATH = "/tmp/skydb.pids" |
| class SkyDebugger(object): |
| def __init__(self): |
| self.paths = None |
| + self.pids = {} |
| + # FIXME: This is not android aware nor aware of the port |
| + # skyserver is listening on. |
| + self.base_url = 'http://localhost:7777' |
| def _server_root_and_url_from_path_arg(self, url_or_path): |
| # This is already a valid url we don't need a local server. |
| @@ -46,16 +53,8 @@ class SkyDebugger(object): |
| def _in_chromoting(self): |
| return os.environ.get('CHROME_REMOTE_DESKTOP_SESSION', False) |
| - def main(self): |
| - logging.basicConfig(level=logging.INFO) |
| - |
| - parser = argparse.ArgumentParser(description='Sky launcher/debugger') |
| - parser.add_argument('--gdb', action='store_true') |
| - parser.add_argument('--use-osmesa', action='store_true', |
| - default=self._in_chromoting()) |
| - parser.add_argument('url_or_path', nargs='?', type=str) |
| - configuration.add_arguments(parser) |
| - args = parser.parse_args() |
| + def start_command(self, args): |
| + self.stop_command([]) # Quit any existing process. |
| self.paths = Paths(os.path.join('out', args.configuration)) |
| @@ -71,24 +70,108 @@ class SkyDebugger(object): |
| if args.use_osmesa: |
| shell_command.append('--args-for=mojo:native_viewport_service --use-osmesa') |
| - server_root = None |
| - |
| if args.url_or_path: |
| # Check if we need a local server for the url/path arg: |
| server_root, url = \ |
| self._server_root_and_url_from_path_arg(args.url_or_path) |
| + server = SkyServer(self.paths, HTTP_PORT, args.configuration, |
| + server_root) |
| + self.pids['sky_server_pid'] = server.start() |
| + |
| prompt_args = '--args-for=mojo:sky_debugger_prompt %s' % url |
| shell_command.append(prompt_args) |
| if args.gdb: |
| shell_command = ['gdb', '--args'] + shell_command |
| - if server_root: |
| - with SkyServer(self.paths, HTTP_PORT, args.configuration, |
| - server_root): |
| - subprocess.check_call(shell_command) |
| + self.pids['mojo_shell_pid'] = subprocess.Popen(shell_command).pid |
| + |
| + def _kill_if_exists(self, key, name): |
| + pid = self.pids.pop(key, None) |
| + if not pid: |
| + logging.info('No pid for %s, nothing to do.' % name) |
| + return |
| + logging.info('Killing %s (%s).' % (name, pid)) |
| + try: |
| + os.kill(pid, signal.SIGTERM) |
| + except OSError: |
| + logging.info('%s (%s) already gone.' % (name, pid)) |
| + |
| + def stop_command(self, args): |
| + # FIXME: Send /quit to sky prompt instead of killing. |
| + # self._send_command_to_sky('/quit') |
| + self._kill_if_exists('mojo_shell_pid', 'mojo_shell') |
| + self._kill_if_exists('sky_server_pid', 'sky_server') |
| + |
| + def load_command(self, args): |
| + self._send_command_to_sky('/load', args[0]) |
| + |
| + def _send_command_to_sky(self, command_path, payload=None): |
| + url = self.base_url + command_path |
| + if payload: |
| + response = requests.post(url, payload) |
| else: |
| - subprocess.check_call(shell_command) |
| + response = requests.get(url) |
| + print response.text |
| + |
| + # FIXME: These could be made into a context object with __enter__/__exit__. |
| + def _load_pid_file(self, path): |
| + try: |
| + with open(path, 'r') as pid_file: |
| + return json.load(pid_file) |
| + except: |
| + if os.path.exists(path): |
| + logging.warn('Failed to read pid file: %s' % path) |
| + return {} |
| + |
| + def _write_pid_file(self, path, pids): |
| + try: |
| + with open(path, 'w') as pid_file: |
| + json.dump(pids, pid_file) |
| + except: |
| + logging.warn('Failed to write pid file: %s' % path) |
| + |
| + def _add_basic_command(self, subparsers, name, url_path, help_text): |
| + parser = subparsers.add_parser(name, help=help_text) |
| + command = lambda args: self._send_command_to_sky(url_path) |
| + parser.set_defaults(func=command) |
| + |
| + def main(self): |
| + logging.basicConfig(level=logging.INFO) |
| + |
| + self.pids = self._load_pid_file(PID_FILE_PATH) |
| + |
| + parser = argparse.ArgumentParser(description='Sky launcher/debugger') |
| + subparsers = parser.add_subparsers(help='sub-command help') |
| + |
| + start_parser = subparsers.add_parser('start', |
| + help='launch a new mojo_shell with sky') |
| + configuration.add_arguments(start_parser) |
| + start_parser.add_argument('--gdb', action='store_true') |
| + start_parser.add_argument('--use-osmesa', action='store_true', |
| + default=self._in_chromoting()) |
| + start_parser.add_argument('url_or_path', nargs='?', type=str) |
| + start_parser.set_defaults(func=self.start_command) |
| + |
| + stop_parser = subparsers.add_parser('stop', |
| + help='launch a new mojo_shell with sky') |
|
ojan
2015/01/07 23:49:54
This help is wrong?
|
| + stop_parser.set_defaults(func=self.stop_command) |
| + |
| + self._add_basic_command(subparsers, 'trace', '/trace', |
| + 'toggle tracing') |
| + self._add_basic_command(subparsers, 'reload', '/reload', |
| + 'reload the current page') |
| + self._add_basic_command(subparsers, 'inspect', '/inspect', |
| + 'stop the running sky instance') |
| + |
| + load_parser = subparsers.add_parser('load', |
| + help='load a new page in the currently running sky') |
| + load_parser.set_defaults(func=self.load_command) |
| + |
| + args = parser.parse_args() |
| + args.func(args) |
| + |
| + self._write_pid_file(PID_FILE_PATH, self.pids) |
| if __name__ == '__main__': |