From 1c2e5c4c96f3c8b114508de7f713dda8ebfcb877 Mon Sep 17 00:00:00 2001 From: Javier Hernandez Date: Thu, 19 Oct 2023 10:21:44 +0200 Subject: cli: add room add functionality to add and remove a room to add a new room use the command: ogcli add room --name --netmask --center
--gateway [--location ] [--ntp ] [--dns ] [--group ] for instance, to create a room with name 'dummyroom', netmask '255.255.255.0' and gateway 10.141.10.1 that is inside the center with id 1, use: $ ogcli add room --name dummyroom --netmask 255.255.255.0 --gateway 10.141.10.1 --center 1 Optionally, it is possible to provide additional information such as location (--location ), ntp server (--ntp ), dns server (--dns ), and a group to contain the room (--group ). to delete a room use: ogcli delete room --id for instance, to delete room with id 4 use: $ ogcli delete room --id 4 --- cli/cli.py | 9 ++++-- cli/objects/room.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cli/utils.py | 9 +++++- 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 cli/objects/room.py diff --git a/cli/cli.py b/cli/cli.py index f2175a7..ddc4a01 100644 --- a/cli/cli.py +++ b/cli/cli.py @@ -16,6 +16,7 @@ from cli.objects.reboot import OgReboot from cli.objects.repo import OgRepo from cli.objects.server import OgServer from cli.objects.center import OgCenter +from cli.objects.room import OgRoom import argparse import requests import sys @@ -196,7 +197,7 @@ class OgCLI(): OgImage.update_image(self.rest, args[1:]) def delete(self, args): - choices = ['server', 'center'] + choices = ['server', 'center', 'room'] parser = argparse.ArgumentParser(prog='ogcli delete') parser.add_argument('delete_obj', choices=choices) @@ -210,9 +211,11 @@ class OgCLI(): OgServer.delete_server(self.rest, args[1:]) elif parsed_args.delete_obj == 'center': OgCenter.delete_center(self.rest, args[1:]) + elif parsed_args.delete_obj == 'room': + OgRoom.delete_room(self.rest, args[1:]) def add(self, args): - choices = ['server', 'repo', 'center'] + choices = ['server', 'repo', 'center', 'room'] parser = argparse.ArgumentParser(prog='ogcli add') parser.add_argument('add_obj', choices=choices) @@ -228,3 +231,5 @@ class OgCLI(): OgRepo.add_repo(self.rest, args[1:]) elif parsed_args.add_obj == 'center': OgCenter.add_center(self.rest, args[1:]) + elif parsed_args.add_obj == 'room': + OgRoom.add_room(self.rest, args[1:]) diff --git a/cli/objects/room.py b/cli/objects/room.py new file mode 100644 index 0000000..66d0dba --- /dev/null +++ b/cli/objects/room.py @@ -0,0 +1,88 @@ +import sys +import argparse +from cli.utils import check_address + +class OgRoom(): + + @staticmethod + def add_room(rest, args): + parser = argparse.ArgumentParser(prog='ogcli add room') + parser.add_argument('--name', + nargs='?', + required=True, + help='give a name to the room') + parser.add_argument('--netmask', + nargs='?', + required=True, + help='provide the netmask for the room') + parser.add_argument('--center', + nargs='?', + type=int, + required=True, + help='provide the id of the center that will contain the room') + parser.add_argument('--location', + nargs='?', + required=False, + help='specify the location of the room') + parser.add_argument('--gateway', + nargs='?', + required=True, + help='address of the main gateway in the room') + parser.add_argument('--ntp', + nargs='?', + required=False, + help='address of the ntp server') + parser.add_argument('--dns', + nargs='?', + required=False, + help='address of the dns server') + parser.add_argument('--group', + nargs='?', + type=int, + required=False, + help='id of the group that will contain the room') + parsed_args = parser.parse_args(args) + + err = False + if parsed_args.netmask and not check_address(parsed_args.netmask): + print('invalid netmask address', file=sys.stderr) + err = True + if parsed_args.gateway and not check_address(parsed_args.gateway): + print('invalid gateway address', file=sys.stderr) + err = True + if parsed_args.ntp and not check_address(parsed_args.ntp): + print('invalid ntp address', file=sys.stderr) + err = True + if parsed_args.dns and not check_address(parsed_args.dns): + print('invalid dns address', file=sys.stderr) + err = True + if err: + parser.print_help(file=sys.stderr) + sys.exit(1) + + payload = { + 'name': parsed_args.name, + 'netmask': parsed_args.netmask, + 'center': parsed_args.center + } + if parsed_args.gateway: + payload['gateway'] = parsed_args.gateway + if parsed_args.ntp: + payload['ntp'] = parsed_args.ntp + if parsed_args.dns: + payload['dns'] = parsed_args.dns + if parsed_args.group: + payload['group'] = parsed_args.group + rest.post('/room/add', payload=payload) + + @staticmethod + def delete_room(rest, args): + parser = argparse.ArgumentParser(prog='ogcli delete room') + parser.add_argument('--id', + nargs='?', + required=True, + help='room id in database') + parsed_args = parser.parse_args(args) + payload = {'id': parsed_args.id} + rest.post('/room/delete', payload=payload) + diff --git a/cli/utils.py b/cli/utils.py index b267207..88c15a4 100644 --- a/cli/utils.py +++ b/cli/utils.py @@ -6,7 +6,7 @@ # (at your option) any later version. import json - +import ipaddress def scope_lookup(scope_id, scope_type, d): if scope_id == d.get('id') and scope_type == d.get('type'): @@ -32,3 +32,10 @@ def ips_in_scope(scope): def print_json(text): payload = json.loads(text) print(json.dumps(payload, sort_keys=True, indent=2)) + +def check_address(addr): + try: + ip = ipaddress.ip_address(addr) + return True + except: + return False -- cgit v1.2.3-18-g5258