summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-01-25 09:49:56 +0200
committerLars Wirzenius <liw@liw.fi>2019-01-25 09:49:56 +0200
commitbac0898baaaf6d18f9ed6010d0c9315439d784cb (patch)
tree299f5b8535dd031513809eb0f4858c3abb506627
parentf7087038dcd6ca196ef8be418ee5848cea25ac91 (diff)
downloadeffitool-bac0898baaaf6d18f9ed6010d0c9315439d784cb.tar.gz
Change: implement register-admin-client
-rwxr-xr-xeffitool119
1 files 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():