summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorJavier Hernandez <jhernandez@soleta.eu>2023-10-27 11:38:24 +0200
committerJose M. Guisado <jguisado@soleta.eu>2023-10-27 11:57:25 +0200
commit4bf4f91f5466131bf278a97a6e3685f66106fc6f (patch)
tree023b0301e1b7be4132c565d35a6b1c0c901c9f46 /cli
parent37c4065f06f7cdaa35a49c7a6168f50394b37565 (diff)
client: support for adding clientsv0.3.3
Add a new client with command: $ ogcli add client --repo-id <repo id> --netmask <netmask> --room-id <room id> --hostname <hostname> --mac <mac address> --ip <ip address> --boot-mode <boot mode> For example: To add a new client with hostname "javipc", netmask 255.255.255.0, mac address a2:54:00:2e:05:7a, ip address 192.168.56.101, assign it to repo id 1, room id 1 and set its boot mode to oglive use: $ ogcli add client --hostname javipc --netmask 255.255.255.0 --mac a2:54:00:2e:05:7a --ip 192.168.56.101 --repo-id 1 --room-id 1 --boot-mode oglive Notes: - ogserver API REST json payload does not allow to specify a server (table 'entorno') for the client. It will automatically assign client to server with id 1 - ogserver API REST json payload specifies mac address without ':'. - payload must contain 'netiface', ogcli specifies 'eth0' is specified which is the default value in netiface column in db (table 'ordenadores') - netdriver column uses "generic" as default, this field is not used anymore, but it is set to "generic" by now. - ogserver should validate that boot mode set is correct.
Diffstat (limited to 'cli')
-rw-r--r--cli/cli.py4
-rw-r--r--cli/objects/client.py69
-rw-r--r--cli/utils.py9
3 files changed, 79 insertions, 3 deletions
diff --git a/cli/cli.py b/cli/cli.py
index ddc4a01..95b0f82 100644
--- a/cli/cli.py
+++ b/cli/cli.py
@@ -215,7 +215,7 @@ class OgCLI():
OgRoom.delete_room(self.rest, args[1:])
def add(self, args):
- choices = ['server', 'repo', 'center', 'room']
+ choices = ['server', 'repo', 'center', 'room', 'client']
parser = argparse.ArgumentParser(prog='ogcli add')
parser.add_argument('add_obj', choices=choices)
@@ -233,3 +233,5 @@ class OgCLI():
OgCenter.add_center(self.rest, args[1:])
elif parsed_args.add_obj == 'room':
OgRoom.add_room(self.rest, args[1:])
+ elif parsed_args.add_obj == 'client':
+ OgClient.add_client(self.rest, args[1:])
diff --git a/cli/objects/client.py b/cli/objects/client.py
index c3ad760..d438742 100644
--- a/cli/objects/client.py
+++ b/cli/objects/client.py
@@ -6,9 +6,9 @@
# (at your option) any later version.
import argparse
+import requests
-from cli.utils import print_json
-
+from cli.utils import print_json, check_address, check_mac_address
class OgClient():
@@ -56,3 +56,68 @@ class OgClient():
payload = {'clients': parsed_args.client_ip}
rest.post('/refresh', payload=payload)
+
+ @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('--netmask',
+ nargs='?',
+ required=True,
+ help='specify netmask address')
+ 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')
+ r = rest.get('/mode')
+ boot_choices = r.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.netmask):
+ print('netmask address is not valid', file=sys.stderr)
+ err = True
+ 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)
+ sys.exit(1)
+ payload = {
+ 'name': parsed_args.hostname,
+ 'netmask': parsed_args.netmask,
+ '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'
+ }
+ rest.post('/client/add', payload=payload)
diff --git a/cli/utils.py b/cli/utils.py
index 88c15a4..185e7ee 100644
--- a/cli/utils.py
+++ b/cli/utils.py
@@ -7,6 +7,7 @@
import json
import ipaddress
+import re
def scope_lookup(scope_id, scope_type, d):
if scope_id == d.get('id') and scope_type == d.get('type'):
@@ -39,3 +40,11 @@ def check_address(addr):
return True
except:
return False
+
+def check_mac_address(addr):
+ if re.match("[a-f0-9]{2}(:[a-f0-9]{2}){5}$", addr.lower()):
+ return True
+ else:
+ print(addr.lower())
+ return False
+