Index: remoting/tools/hostdir.py |
diff --git a/remoting/tools/hostdir.py b/remoting/tools/hostdir.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..d4905f4897777438e3d8899e274ba9f3482f277c |
--- /dev/null |
+++ b/remoting/tools/hostdir.py |
@@ -0,0 +1,227 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# Chromoting Directory API client implementation. Used for testing/debugging |
+# purposes. Requires Python 2.6: json module is not available in earlier |
+# versions. |
+ |
+import os |
+import httplib |
+import json |
+import urllib |
+import urllib2 |
+import random |
+import sys |
+ |
+DEFAULT_DIRECTORY_SERVER = 'www-googleapis-test.sandbox.google.com' |
+ |
+auth_filepath = os.path.join(os.path.expanduser('~'), |
+ '.chromotingDirectoryAuthToken') |
+ |
+def random_uuid(): |
+ return ("%04x%04x-%04x-%04x-%04x-%04x%04x%04x" % |
+ tuple(map(lambda x: random.randrange(0,65536), range(8)))) |
+ |
+class Host: |
+ def __init__(self, parameters=None): |
+ if parameters != None: |
+ self.host_id = parameters[u"hostId"] |
+ self.host_name = parameters[u"hostName"] |
+ self.public_key = parameters[u"publicKey"] |
+ # Following fields may be missing, use get() for them. |
+ self.jabber_id = parameters.get(u"jabberId") |
+ self.created_time = parameters.get(u"createdTime") |
+ self.updated_time = parameters.get(u"updatedTime") |
+ self.status = parameters.get(u"status") |
+ else: |
+ self.host_id = random_uuid() |
+ import socket |
+ self.host_name = socket.gethostname() |
+ self.public_key = None |
+ self.jabber_id = None |
+ self.created_time = None |
+ self.updated_time = None |
+ self.status = None |
+ |
+class HostDirectoryError(Exception): |
+ def __init__(self, message, response): |
+ Exception.__init__(self, message) |
+ print response |
+ self._response = response |
+ |
+class HostDirectory: |
+ def __init__(self, username, auth_token, server=DEFAULT_DIRECTORY_SERVER): |
+ self._username = username |
+ self._auth_token = auth_token |
+ self._base_url = '/chromoting/v1/@me/hosts' |
+ |
+ self._http = httplib.HTTPConnection(server) |
+ self._headers = {"Authorization": "GoogleLogin auth=" + self._auth_token, |
+ "Content-Type": "application/json" } |
+ |
+ def add_host(self, host): |
+ host_json = { 'data': |
+ { 'hostId': host.host_id, |
+ 'hostName': host.host_name, |
+ 'publicKey': host.public_key, |
+ } |
+ } |
+ if host.jabber_id: |
+ host_json['data']['jabberId'] = host.jabber_id |
+ post_data = json.dumps(host_json) |
+ self._http.request("POST", self._base_url, post_data, self._headers) |
+ response = self._http.getresponse() |
+ if response.status != 200: |
+ raise HostDirectoryError(response.reason, response.read()) |
+ data = response.read() |
+ |
+ def get_hosts(self): |
+ self._http.request("GET", self._base_url, headers=self._headers) |
+ response = self._http.getresponse() |
+ if response.status != 200: |
+ raise HostDirectoryError(response.reason, response.read()) |
+ data = response.read() |
+ data = json.loads(data)[u'data'] |
+ results = [] |
+ if data.has_key(u'items'): |
+ for item in data[u'items']: |
+ results.append(Host(item)) |
+ return results |
+ |
+ def delete_host(self, host_id): |
+ url = self._base_url + '/' + host_id |
+ self._http.request("DELETE", url, headers=self._headers) |
+ response = self._http.getresponse() |
+ if response.status / 100 != 2: # Normally 204 is returned |
+ raise HostDirectoryError(response.reason, response.read()) |
+ data = response.read() |
+ |
+def usage(): |
+ sys.stderr.write( |
+ ("Usage:\n" + |
+ " Login: \t\t%(cmd)s login\n" + |
+ " Register host: \t%(cmd)s insert --hostId=<hostId>" + |
+ " --hostName=<hostName> \\\n" + |
+ "\t\t\t --publicKey=<publicKey> --jabberId=<jabberId>\n" + |
+ " List hosts: \t\t%(cmd)s list\n" + |
+ " Delete a host: \t%(cmd)s delete <host_id>\n") |
+ % {"cmd" : sys.argv[0]}) |
+ return 1 |
+ |
+class CommandError(Exception): |
+ def __init__(self, message): |
+ Exception.__init__(self, message) |
+ |
+def load_auth_token(): |
+ try: |
+ lines = open(auth_filepath).readlines() |
+ except IOError as e: |
+ raise CommandError("Can't open file (%s). Please run " + |
+ "'%s login' and try again." % |
+ (auth_filepath, sys.argv[0])) |
+ if len(lines) != 2: |
+ raise CommandError("Invalid auth file (%s). Please run " + |
+ "'%s login' and try again." % |
+ (auth_filepath, sys.argv[0])) |
+ return map(lambda x: x.strip(), lines) |
+ |
+def login_cmd(args): |
+ """login command""" |
+ if len(args) != 0: |
+ return usage() |
+ |
+ import getpass |
+ import gaia_auth |
+ |
+ print "Email:", |
+ email = raw_input() |
+ passwd = getpass.getpass("Password: ") |
+ |
+ authenticator = gaia_auth.GaiaAuthenticator('chromoting'); |
+ auth_token = authenticator.authenticate(email, passwd) |
+ |
+ # Set permission mask for created file. |
+ os.umask(0066) |
+ auth_file = open(auth_filepath, 'w') |
+ auth_file.write(email) |
+ auth_file.write('\n') |
+ auth_file.write(auth_token) |
+ auth_file.close() |
+ |
+ print 'Auth token: ', auth_token |
+ print '...saved in', auth_filepath |
+ |
+def list_cmd(args): |
+ """list command""" |
+ if len(args) != 0: |
+ return usage() |
+ (username, token) = load_auth_token() |
+ client = HostDirectory(username, token) |
+ print '%36s %30s %s' % ("HOST ID", "HOST NAME", "JABBER ID") |
+ for host in client.get_hosts(): |
+ print '%36s %30s %s' % (host.host_id, host.host_name, host.jabber_id) |
+ return 0 |
+ |
+def insert_cmd(args): |
+ """insert command""" |
+ (username, token) = load_auth_token() |
+ client = HostDirectory(username, token) |
+ |
+ host = Host() |
+ for arg in args: |
+ if arg.startswith("--hostId="): |
+ host.host_id = arg[len("--hostId="):] |
+ elif arg.startswith("--hostName="): |
+ host.host_name = arg[len("--hostName="):] |
+ elif arg.startswith("--publicKey="): |
+ host.public_key = arg[len("--publicKey="):] |
+ elif arg.startswith("--jabberId="): |
+ host.jabber_id = arg[len("--jabberId="):] |
+ else: |
+ return usage() |
+ |
+ client.add_host(host) |
+ return 0 |
+ |
+def delete_cmd(args): |
+ """delete command""" |
+ if len(args) != 1: |
+ return usage() |
+ host_id = args[0] |
+ (username, token) = load_auth_token() |
+ client = HostDirectory(username, token) |
+ client.delete_host(host_id) |
+ return 0 |
+ |
+def main(): |
+ import sys |
+ args = sys.argv[1:] |
+ if len(args) == 0: |
+ return usage() |
+ command = args[0] |
+ |
+ try: |
+ if command == "help": |
+ usage() |
+ elif command == "login": |
+ return login_cmd(args[1:]) |
+ elif command == "list": |
+ return list_cmd(args[1:]) |
+ elif command == "insert": |
+ return insert_cmd(args[1:]) |
+ elif command == "delete": |
+ return delete_cmd(args[1:]) |
+ else: |
+ raise CommandError("Unknown command: %s" % command); |
+ |
+ except CommandError as e: |
+ sys.stderr.write("%s\n" % e.args[0]) |
+ return 1 |
+ |
+ return 0 |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |