Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(778)

Unified Diff: sky/tools/skydb

Issue 840973002: Make skydb just a ctl-style helper (e.g. apachectl) (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/tools/debugger/prompt/prompt.cc ('k') | sky/tools/skypy/skyserver.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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__':
« no previous file with comments | « sky/tools/debugger/prompt/prompt.cc ('k') | sky/tools/skypy/skyserver.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698