# Copyright (C) 2020-2024 Soleta Networks # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Affero General Public License as published by the # Free Software Foundation; either version 3 of the License, or # (at your option) any later version. import argparse from cli.utils import print_json import json def _find_client_path(json_data, client_ip, client_name, res): if json_data['type'] == 'computer': if json_data['ip'] == client_ip: res.append(f'{json_data["type"]}: {client_ip}') return True elif json_data['name'] == client_name: res.append(f'{json_data["type"]}: {client_name}') return True return False children = json_data['scope'] for child in children: found = _find_client_path(child, client_ip, client_name, res) if found: res.append(f'{json_data["type"]}: {json_data["name"]}') return True return False def _get_client_path(json_data, client_ip, client_name): res = [] children = json_data['scope'] for child in children: _find_client_path(child, client_ip, client_name, res) res.reverse() return res class OgScope(): @staticmethod def list_scopes(rest, args): parser = argparse.ArgumentParser(prog='ogcli list scope') group = parser.add_mutually_exclusive_group(required=False) group.add_argument('--client-ip', action='append', default=[], help='Client(s) IP') group.add_argument('--name', nargs='?', help='Name of the client') parsed_args = parser.parse_args(args) ips = set() for ip in parsed_args.client_ip: ips.add(ip) r = rest.get('/scopes') json_data = json.loads(r.text) if parsed_args.name: path = _get_client_path(json_data, None, parsed_args.name) for i, item in enumerate(path): print(' ' * i + item) elif parsed_args.client_ip: for idx, client_ip in enumerate(parsed_args.client_ip): if idx != 0: print('\n') path = _get_client_path(json_data, client_ip, None) for i, item in enumerate(path): print(' ' * i + item) return None else: print_json(r.text) return None