From 10d7b972cabaaffa099465c08f31dfe676ba5bbb Mon Sep 17 00:00:00 2001 From: Alejandro Sirgo Rica Date: Mon, 3 Jun 2024 12:46:28 +0200 Subject: cli: add list scopes --client-ip Implement a --client-ip filter to ease the task of finding the hierarchy associated to a client or list of clients. Usage: /ogcli list scopes --client-ip 10.141.10.23 /ogcli list scopes --client-ip 10.141.10.23 --client-ip 10.141.10.22 --- cli/cli.py | 2 +- cli/objects/scopes.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/cli/cli.py b/cli/cli.py index 9e5ad04..36fcb36 100644 --- a/cli/cli.py +++ b/cli/cli.py @@ -96,7 +96,7 @@ class OgCLI(): elif parsed_args.item == 'modes': OgModes.list_available_modes(self.rest) elif parsed_args.item == 'scopes': - OgScope.list_scopes(self.rest) + OgScope.list_scopes(self.rest, args[1:]) elif parsed_args.item == 'images': OgImage.list_images(self.rest) elif parsed_args.item == 'disks': diff --git a/cli/objects/scopes.py b/cli/objects/scopes.py index 1900b1b..6a9b71d 100644 --- a/cli/objects/scopes.py +++ b/cli/objects/scopes.py @@ -8,11 +8,58 @@ import argparse from cli.utils import print_json +import json +def _find_client_path(json_data, client_ip, res): + if json_data['type'] == 'computer': + if json_data['ip'] == client_ip: + res.append(f'{json_data['type']}: {client_ip}') + return True + return False + + children = json_data['scope'] + for child in children: + found = _find_client_path(child, client_ip, res) + if found: + res.append(f'{json_data['type']}: {json_data['name']}') + return True + return False + + +def _get_client_path(json_data, client_ip): + res = [] + children = json_data['scope'] + for child in children: + _find_client_path(child, client_ip, res) + res.reverse() + return res class OgScope(): @staticmethod - def list_scopes(rest): + def list_scopes(rest, args): + parser = argparse.ArgumentParser(prog='ogcli list scopes') + parser.add_argument('--client-ip', + action='append', + default=[], + required=False, + help='Client(s) IP') + parsed_args = parser.parse_args(args) + + ips = set() + for ip in parsed_args.client_ip: + ips.add(ip) + r = rest.get('/scopes') - print_json(r.text) + + if not ips: + print_json(r.text) + return None + + json_data = json.loads(r.text) + for idx, client_ip in enumerate(ips): + if idx != 0: + print('\n') + path = _get_client_path(json_data, client_ip) + for i, item in enumerate(path): + print(' ' * i + item) -- cgit v1.2.3-18-g5258