# 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 import requests from cli.utils import print_json, check_address, check_mac_address class OgClient(): @staticmethod def list_clients(rest): res = rest.get('/clients') if not res: return 1 print_json(res.text) return 0 @staticmethod def list_client_hardware(rest, args): parser = argparse.ArgumentParser(prog='ogcli list hardware') parser.add_argument('--client-ip', nargs=1, type=str, required=True, help='client IP') parsed_args = parser.parse_args(args) payload = {'client': parsed_args.client_ip} res = rest.get('/hardware', payload=payload) if not res: return 1 print_json(res.text) return 0 @staticmethod def get_client_properties(rest, args): parser = argparse.ArgumentParser(prog='ogcli list client') parser.add_argument('--client-ip', nargs=1, required=True, help='client IP') parsed_args = parser.parse_args(args) payload = {'client': parsed_args.client_ip} res = rest.get('/client/info', payload=payload) if not res: return 1 print_json(res.text) return 0 @staticmethod def request_refresh(rest, args): parser = argparse.ArgumentParser(prog='ogcli request refresh') parser.add_argument('--client-ip', action='append', default=[], required=True, help='Client IP') parsed_args = parser.parse_args(args) payload = {'clients': parsed_args.client_ip} res = rest.post('/refresh', payload=payload) if not res: return 1 return 0 @staticmethod def add_client(rest, args): parser = argparse.ArgumentParser(prog='ogcli add client') parser.add_argument('--repo-id', type=int, nargs='?', required=True, help='specify the id of the repo') parser.add_argument('--room-id', nargs='?', type=int, required=True, help='specify the id of the room where the client is') parser.add_argument('--hostname', nargs='?', required=True, help='give a name to the client') parser.add_argument('--mac', nargs='?', required=True, help='mac address should have this format xx:xx:xx:xx:xx:xx') parser.add_argument('--ip', nargs='?', required=True, help='specify the ip address of the client') res = rest.get('/mode') boot_choices = res.json()['modes'] parser.add_argument('--boot-mode', nargs='?', required=True, choices=boot_choices, help='set a valid boot mode for the client') parsed_args = parser.parse_args(args) err = False if not check_address(parsed_args.ip): print('client\'s ip address is not valid', file=sys.stderr) err = True if not check_mac_address(parsed_args.mac): print('client\'s mac address is not valid', file=sys.stderr) err = True if err: parser.print_help(file=sys.stderr) return 1 payload = { 'name': parsed_args.hostname, 'netmask': '0', 'ip': parsed_args.ip, 'mac': parsed_args.mac.replace(":", ""), 'repo_id': parsed_args.repo_id, 'room': parsed_args.room_id, 'boot': parsed_args.boot_mode, 'netiface': 'eth0', 'netdriver': 'generic', 'livedir': 'ogLive' } res = rest.post('/client/add', payload=payload) if not res: return 1 return 0 @staticmethod def delete_client(rest, args): parser = argparse.ArgumentParser(prog='ogcli delete client') parser.add_argument('--ip', action='append', default=[], required=True, help='Client IP') parsed_args = parser.parse_args(args) payload = { 'clients': parsed_args.ip, } res = rest.post('/client/delete', payload=payload) if not res: return 1 return 0