cli: add room

add functionality to add and remove a room

to add a new room use the command: ogcli add room --name <name>
--netmask <netmask> --center <center> --gateway <gateway> [--location
<location>] [--ntp <ntp>] [--dns <dns>] [--group <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 <location>), ntp server (--ntp <ntp>), dns server
(--dns <dns>), and a group to contain the room (--group <group>).

to delete a room use: ogcli delete room --id <id>

for instance, to delete room with id 4 use:

$ ogcli delete room --id 4
master
Javier Hernandez 2023-10-19 10:21:44 +02:00 committed by Jose M. Guisado
parent 7c30d56910
commit 1c2e5c4c96
3 changed files with 103 additions and 3 deletions

View File

@ -16,6 +16,7 @@ from cli.objects.reboot import OgReboot
from cli.objects.repo import OgRepo from cli.objects.repo import OgRepo
from cli.objects.server import OgServer from cli.objects.server import OgServer
from cli.objects.center import OgCenter from cli.objects.center import OgCenter
from cli.objects.room import OgRoom
import argparse import argparse
import requests import requests
import sys import sys
@ -196,7 +197,7 @@ class OgCLI():
OgImage.update_image(self.rest, args[1:]) OgImage.update_image(self.rest, args[1:])
def delete(self, args): def delete(self, args):
choices = ['server', 'center'] choices = ['server', 'center', 'room']
parser = argparse.ArgumentParser(prog='ogcli delete') parser = argparse.ArgumentParser(prog='ogcli delete')
parser.add_argument('delete_obj', choices=choices) parser.add_argument('delete_obj', choices=choices)
@ -210,9 +211,11 @@ class OgCLI():
OgServer.delete_server(self.rest, args[1:]) OgServer.delete_server(self.rest, args[1:])
elif parsed_args.delete_obj == 'center': elif parsed_args.delete_obj == 'center':
OgCenter.delete_center(self.rest, args[1:]) OgCenter.delete_center(self.rest, args[1:])
elif parsed_args.delete_obj == 'room':
OgRoom.delete_room(self.rest, args[1:])
def add(self, args): def add(self, args):
choices = ['server', 'repo', 'center'] choices = ['server', 'repo', 'center', 'room']
parser = argparse.ArgumentParser(prog='ogcli add') parser = argparse.ArgumentParser(prog='ogcli add')
parser.add_argument('add_obj', choices=choices) parser.add_argument('add_obj', choices=choices)
@ -228,3 +231,5 @@ class OgCLI():
OgRepo.add_repo(self.rest, args[1:]) OgRepo.add_repo(self.rest, args[1:])
elif parsed_args.add_obj == 'center': elif parsed_args.add_obj == 'center':
OgCenter.add_center(self.rest, args[1:]) OgCenter.add_center(self.rest, args[1:])
elif parsed_args.add_obj == 'room':
OgRoom.add_room(self.rest, args[1:])

View File

@ -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)

View File

@ -6,7 +6,7 @@
# (at your option) any later version. # (at your option) any later version.
import json import json
import ipaddress
def scope_lookup(scope_id, scope_type, d): def scope_lookup(scope_id, scope_type, d):
if scope_id == d.get('id') and scope_type == d.get('type'): 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): def print_json(text):
payload = json.loads(text) payload = json.loads(text)
print(json.dumps(payload, sort_keys=True, indent=2)) print(json.dumps(payload, sort_keys=True, indent=2))
def check_address(addr):
try:
ip = ipaddress.ip_address(addr)
return True
except:
return False