From bac0898baaaf6d18f9ed6010d0c9315439d784cb Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 25 Jan 2019 09:49:56 +0200 Subject: Change: implement register-admin-client --- effitool | 119 ++++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 91 insertions(+), 28 deletions(-) diff --git a/effitool b/effitool index 2bff76c..c2ee727 100755 --- a/effitool +++ b/effitool @@ -30,6 +30,15 @@ CONFIG_FILENAME = os.path.expanduser('~/.config/effitool/credentials.conf') JSON = 'application/json' URLENC = 'application/x-www-form-urlencoded' +ADMIN_SCOPES = [ + 'uapi_clients_get', + 'uapi_clients_id_get', + 'uapi_clients_id_put', + 'uapi_clients_id_delete', + 'uapi_clients_post', + 'uapi_clients_id_secret_put', +] + class Config: @@ -110,6 +119,27 @@ class HTTPAPI: r = urllib.request.urlopen(req) return self.get_json(r) + def post_json(self, token, path, obj): + return self.send_json('POST', token, path, obj) + + def put_json(self, token, path, obj): + return self.send_json('PUT', token, path, obj) + + def send_json(self, method, token, path, obj): + url = self.url(path) + host, port, path = self.parse_url(url) + + data = json.dumps(obj).encode('UTF-8') + headers = { + 'Content-type': JSON, + 'Authorization': 'Bearer {}'.format(token), + } + + req = urllib.request.Request( + url, data=data, headers=headers, method=method) + r = urllib.request.urlopen(req) + return self.get_json(r) + def parse_url(self, url): parse = urllib.parse.urlparse(url) if parse.scheme != 'https': @@ -131,43 +161,74 @@ class HTTPAPI: return 'Basic {}'.format(basic.decode('UTF-8')) -def list_servers(args, config): - for name in config.servers(): - print('server', name) - server = config.get(name) - for key in sorted(server): - print(' ', key, server[key]) +class Tool: + + def __init__(self, config): + self._config = config + + def servers(self): + return self._config.servers() + + def get_server(self, name): + return self._config.get(name) + def get_chosen_server(self, args): + if args['api']: + name = args['api'] + else: + name = self._config.get_default_server() + return self.get_server(name) -def status(args, config): - for name in config.servers(): - server = config.get(name) + def get_admin_token(self, server): url = server['url'] + client_id = server['client_id'] + client_secret = server['client_secret'] + api = HTTPAPI(url) - obj = api.get('/status') - print('server', name, obj['resources']) + return api.get_access_token(client_id, client_secret, ADMIN_SCOPES) + + def list_servers(self, args): + for name in self.servers(): + print('server', name) + server = self.get_server(name) + for key in sorted(server): + print(' ', key, server[key]) + + def status(self, args): + for name in self.servers(): + server = self.get_server(name) + url = server['url'] + api = HTTPAPI(url) + obj = api.get('/status') + print('server', name, obj['resources']) + + + def register_admin_client(self, args): + server = self.get_chosen_server(args) + token = self.get_admin_token(server) + api = HTTPAPI(server['url']) + + new_client = { + 'id': args['client_id'], + } + api.post_json(token, '/clients', new_client) + new_secret = { + 'secret': args['client_secret'], + } + api.put_json( + token, '/clients/{}/secret'.format(new_client['id']), new_secret) -def register_client(args, config): - new_client_id = args['client_id'] - new_client_secret = args['client_secret'] - name = config.get_default_server() - server = config.get(name) - url = server['url'] - client_id = server['client_id'] - client_secret = server['client_secret'] - api = HTTPAPI(url) - token = api.get_access_token(client_id, client_secret, ['xxx']) - print(token) - print('NEED TO ACTUALLY CREATE CLIENT HERE') - assert 0 + print('Created new admin client', new_client['id']) def process_args(config): + tool = Tool(config) + subcommands = [ - ('list-servers', list_servers, []), - ('status', status, []), - ('register-client', register_client, [ + ('list-servers', tool.list_servers, []), + ('status', tool.status, []), + ('register-admin-client', tool.register_admin_client, [ ('--client-id', {'required':True}), ('--client-secret', {'required':True}), ]), @@ -176,6 +237,8 @@ def process_args(config): p = argparse.ArgumentParser() factory = p.add_subparsers() + p.add_argument('-a', '--api') + for name, func, args in subcommands: pp = factory.add_parser(name) for name, kwargs in args: @@ -184,7 +247,7 @@ def process_args(config): args = vars(p.parse_args()) func = args['func'] - func(args, config) + func(args) def main(): -- cgit v1.2.1