cli: add server commands

Add OgServer class inside cli/objects/server.py

This OgServer class implements add, list, set and delete commands
related to the server API (/server and /client/server) exposed by the
ogServer. These server endpoints correspond with the "entornos" table and
"identorno" foreign key in the "ordenadores" tables.

To list all rows from the "entornos" table. i.e: Listing all stored
addresses for the ogServer:

	ogcli list servers

	{
	  "servers": [
	    {
	      "address": "192.168.2.240",
	      "id": 1
	    },
	    {
	      "address": "1.1.1.1",
	      "id": 2
	    }
	  ]
	}

To store a new ip address for the ogServer, ogCLI will reply with the
new id:

	ogcli add server --address "10.141.10.1"

	{"id", "2"}

To set a client's associated ogServer address using the server id:

	ogcli set server --id 2 --client-ip 10.141.10.100

To set the associated server of a whole room use --room-id parameter:

	ogcli set server --id 2 --room-id 1

To remove any existing address (which is not currently set as the
ogServer addres for any client) using the server id:

	ogcli delete server --id 2

To determine a client's associated server just list the client's
information (this requires an updated ogServer):

	ogcli list client --client-ip 10.141.10.100

	{
	  "boot": "oglive",
	  "center": 1,
	  ...
	  "server_id": 1
	}
master v0.3.1
Jose M. Guisado 2023-08-23 15:39:36 +02:00
parent 563e30893d
commit a721957cc4
2 changed files with 104 additions and 3 deletions

View File

@ -13,6 +13,7 @@ from cli.objects.images import OgImage
from cli.objects.disks import OgDisk from cli.objects.disks import OgDisk
from cli.objects.poweroff import OgPoweroff from cli.objects.poweroff import OgPoweroff
from cli.objects.reboot import OgReboot from cli.objects.reboot import OgReboot
from cli.objects.server import OgServer
import argparse import argparse
import requests import requests
import sys import sys
@ -68,7 +69,8 @@ class OgCLI():
def list(self, args): def list(self, args):
choices = ['clients', 'scopes', 'modes', 'hardware', choices = ['clients', 'scopes', 'modes', 'hardware',
'client', 'images', 'disks'] 'client', 'images', 'disks', 'server',
'servers']
parser = argparse.ArgumentParser(prog='ogcli list') parser = argparse.ArgumentParser(prog='ogcli list')
parser.add_argument('item', choices=choices) parser.add_argument('item', choices=choices)
parsed_args = parser.parse_args([args[0]]) parsed_args = parser.parse_args([args[0]])
@ -87,15 +89,19 @@ class OgCLI():
OgImage.list_images(self.rest) OgImage.list_images(self.rest)
elif parsed_args.item == 'disks': elif parsed_args.item == 'disks':
OgDisk.list_disks(self.rest, args[1:]) OgDisk.list_disks(self.rest, args[1:])
elif parsed_args.item in ['server', 'servers']:
OgServer.list_servers(self.rest)
def set(self, args): def set(self, args):
choices = ['modes', 'mode'] choices = ['modes', 'mode', 'server']
parser = argparse.ArgumentParser(prog='ogcli set') parser = argparse.ArgumentParser(prog='ogcli set')
parser.add_argument('item', choices=choices) parser.add_argument('item', choices=choices)
parsed_args = parser.parse_args([args[0]]) parsed_args = parser.parse_args([args[0]])
if parsed_args.item in choices: if parsed_args.item in ['modes', 'mode']:
OgModes.set_modes(self.rest, args[1:]) OgModes.set_modes(self.rest, args[1:])
elif parsed_args.item == 'server':
OgServer.set_server(self.rest, args[1:])
def send(self, args): def send(self, args):
choices = ['reboot', 'refresh', 'poweroff', 'wol'] choices = ['reboot', 'refresh', 'poweroff', 'wol']
@ -147,3 +153,21 @@ class OgCLI():
if parsed_args.update_obj == 'image': if parsed_args.update_obj == 'image':
OgImage.update_image(self.rest, args[1:]) OgImage.update_image(self.rest, args[1:])
def delete(self, args):
choices = ['server']
parser = argparse.ArgumentParser(prog='ogcli remove')
parser.add_argument('delete_obj', choices=choices)
parsed_args = parser.parse_args([args[0]])
if parsed_args.delete_obj == 'server':
OgServer.delete_server(self.rest, args[1:])
def add(self, args):
choices = ['server']
parser = argparse.ArgumentParser(prog='ogcli remove')
parser.add_argument('add_obj', choices=choices)
parsed_args = parser.parse_args([args[0]])
if parsed_args.add_obj == 'server':
OgServer.add_server(self.rest, args[1:])

View File

@ -0,0 +1,77 @@
# Copyright (C) 2023 Soleta Networks <info@soleta.eu>
#
# 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 *
class OgServer():
@staticmethod
def list_servers(rest):
r = rest.get('/server')
print_json(r.text)
@staticmethod
def add_server(rest, args):
parser = argparse.ArgumentParser()
parser.add_argument('--address',
nargs='?',
required=True,
help='valid ogserver ip address')
parsed_args = parser.parse_args(args)
payload = {'address': parsed_args.address}
rest.post('/server', payload=payload)
@staticmethod
def delete_server(rest, args):
parser = argparse.ArgumentParser()
parser.add_argument('--id',
nargs='?',
required=True,
help='server id in the database')
parsed_args = parser.parse_args(args)
payload = {'id': parsed_args.id}
rest.delete('/server', payload=payload)
@staticmethod
def set_server(rest, args):
parser = argparse.ArgumentParser()
parser.add_argument('--id',
nargs='?',
required=True,
help='server id in the database')
group = parser.add_argument_group('clients', 'Client selection args')
group.add_argument('--room-id',
type=int,
action='append',
default=[],
required=False,
help='Clients from given room id')
group.add_argument('--client-ip',
action='append',
default=[],
required=False,
help='Any valid client IP')
parsed_args = parser.parse_args(args)
r = rest.get('/scopes')
scopes = r.json()
ips = set()
for room in parsed_args.room_id:
room_scope = scope_lookup(room, 'room', scopes)
ips.update(ips_in_scope(room_scope))
for l in parsed_args.client_ip:
ips.add(l)
if not ips:
print('No clients specified.')
return
parsed_args = parser.parse_args(args)
payload = {'id': parsed_args.id, 'clients': list(ips)}
rest.post('/client/server', payload=payload)