Add WoL sending capability

Builds a json payload to consume the ogServer API to send
WoL packets.

Adds 'send' as a command:

	ogcli send

Adds a wol object for to the 'send' command, so that sending a wol can
be specified as:

	ogcli send wol

* WoL packet type is specified with --type option.
* Specifying targets follows same parameters as 'set modes' with:
	--client-ip
	--room-id
	--center-id
master
Jose M. Guisado 2021-03-29 13:42:44 +02:00 committed by OpenGnSys Support Team
parent be84b0a15c
commit 0f55ce7341
2 changed files with 83 additions and 0 deletions

View File

@ -9,6 +9,7 @@
from cli.objects.client import OgClient from cli.objects.client import OgClient
from cli.objects.scopes import OgScope from cli.objects.scopes import OgScope
from cli.objects.modes import OgModes from cli.objects.modes import OgModes
from cli.objects.wol import OgWol
import argparse import argparse
import requests import requests
import sys import sys
@ -73,3 +74,12 @@ class OgCLI():
if parsed_args.item == 'modes': if parsed_args.item == 'modes':
OgModes.set_modes(self.rest, args[1:]) OgModes.set_modes(self.rest, args[1:])
def send(self, args):
choices = ['wol']
parser = argparse.ArgumentParser(prog='ogcli send')
parser.add_argument('send_obj', choices=choices)
parsed_args = parser.parse_args([args[0]])
if parsed_args.send_obj == 'wol':
OgWol.send_wol(self.rest, args[1:])

73
cli/objects/wol.py Normal file
View File

@ -0,0 +1,73 @@
#
# Copyright (C) 2021 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, version 3.
#
from cli.utils import *
import argparse
class OgWol():
@staticmethod
def send_wol(rest, args):
def scope_lookup(scope_id, scope_type, d):
if scope_id == d.get('id') and \
scope_type == d.get('type'):
return d
for scope in d['scope']:
lookup = scope_lookup(scope_id,
scope_type,
scope)
if lookup is not None:
return lookup
return None
parser = argparse.ArgumentParser()
parser.add_argument('--type',
nargs='?',
choices=['broadcast','unicast'],
default='broadcast',
help='')
group = parser.add_argument_group('clients', 'Client selection options')
group.add_argument('--center-id',
type=int,
action='append',
default=[],
required=False,
help='Clients from given center id')
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='Specific client IP')
parsed_args = parser.parse_args(args)
r = rest.get('/scopes')
scopes = r.json()
ips = set()
for center in parsed_args.center_id:
center_scope = scope_lookup(center, 'center', scopes)
ips.update(ips_in_scope(center_scope))
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 found")
return None
payload = {'type': parsed_args.type, 'clients': list(ips)}
r = rest.post('/wol', payload=payload)