Commit Graph

55 Commits (dff298d421afcbe2bdd2246be961d5e963b7fdd0)
 

Author SHA1 Message Date
Jose M. Guisado dff298d421 create image: split into create and update
Image creation example:

	ogcli create image
		--disk
		--part 1
		--name 18oct2
		--desc 18oct2
		--repo-id 1
		--client-ip 192.168.56.11

Image update example:

	ogcli update image
		--disk 1
		--part 1
		--id 20
		--client-ip 192.168.56.11
2022-10-20 12:25:10 +02:00
Jose M. Guisado 0c1a747a31 create image: add repository_id param for new images
Adds 'repository_id' parameter when creating a *new* image (ie: using
--desc).

Removes unused --repo parameter.

See ogServer commit: 52a38d3e574fb25b47d230bc87754583eb17b4a6
("Use the repository id on image creation")
2022-06-28 17:08:15 +02:00
Jose M. Guisado 8932e4c07e create image: --client-ip option is required
--client-ip option is required when parsing a 'create image' command,
it is the only client selection option for 'create image'
command.
2022-05-31 09:15:54 +02:00
Jose M. Guisado 2f824d8429 send: add send reboot
Takes usual client options
(--client-ip, --room-id, --center-id)

Example:

> ogcli send reboot --client-ip 192.168.56.11
2022-05-25 10:56:14 +02:00
Jose M. Guisado 7d11dc47e1 list modes: use print_json
Follows commit b765ee50d3
(utils: add print_json)
2022-05-20 10:28:40 +02:00
Jose M. Guisado d90ab82cec format: use autopep8
Use autopep8 for coding format, and only for whitespace changes. This
change drops use of tabs in favor of spaces.

Doesn't use autopep8 --aggresive option.

Format command:

$ autopep8 --inline --recursive .

When using git-blame, use --ignore-rev in order to ignore this
reformatting commit.
2022-05-20 10:22:42 +02:00
Jose M. Guisado f88bcf78ac set mode: fix --help
'set mode' --help does not show the correct program name:

    ogcli [-h] [--center-id CENTER_ID] [--room-id ROOM_ID]
    ^^^^^      [--client-ip CLIENT_IP] --mode MODE

Adds full program name (ogcli set mode) in missing prog option
when creating the argparse object.
2022-05-20 08:58:16 +02:00
Jose M. Guisado 41170ec5f9 README: add setup example and update commands 2022-05-20 08:54:12 +02:00
Jose M. Guisado 397663fd37 send: add send refresh
Send refresh to a given client.

$ ogcli send refresh --client-ip 192.168.56.11
2022-05-20 08:52:23 +02:00
Jose M. Guisado e7b302c8b8 setup disk: fix padding
ogServer expects a 4-partition setup. When specifying less than that,
the partition setup needs to be padded with EMPTY partitions.

Fixes a bug in which this padding is not valid.
2022-05-17 11:40:07 +02:00
Jose M. Guisado b765ee50d3 utils: add print_json
Adds a pretty printing function for JSON data.

Replaces print for print_json in corresponding cli objects.

Follows commit 828d6c0ce7
("list scopes: pretty print scope tree")
2022-05-17 11:24:49 +02:00
Jose M. Guisado d8efd3321c create image: fix --repo default ip value
rest.URL is the ip and port of the ogServer like: 192.168.56.10:8888,
specified in ogcli.json.

As long as the host and port is specified in rest.URL, split by the ':'
character and extract the ip.

Fixes OpenGnsys clients failing to execute the command due to invalid
repository IP being fed to the underlying bash scripts.
2022-05-16 15:18:02 +02:00
Jose M. Guisado 828d6c0ce7 list scopes: pretty print scope tree
Use json module to pretty print the scope tree. JSON keys are ordered
and two-space indentation is used.
2022-05-16 15:17:58 +02:00
Jose M. Guisado eb5091d374 restore image: add tiptorrent transfer method
Makes --type optional, defaults to tiptorrent when option
is missing.
2022-05-16 15:17:58 +02:00
Jose M. Guisado fca68171b6 create image: make --desc option optional
--desc option is used only when creating a new image.

A new image is any image that is not defined in the
OpenGnsys DB.

See commit d2f20d0be06617f421eecca111449d94672695eb
(#942 Create DB image when calling POST /image/create)
2022-05-10 16:19:17 +02:00
Jose M. Guisado 5c1137662e Fix --help
Non-method attributes are shown using dir() when listing available
commands.

	usage: ogcli [-h] [{create,list,restore,rest,send,set,setup}]

'rest' is a class instance of OgRest and must not be
shown when listing available commands.

Method members of OgCLI class are the available commands that ogcli can
execute.
Use inspect module in order to get class members (getmembers) and filter
only those that are a method (ismethod).

	usage: ogcli [-h] [{create,list,restore,send,set,setup}]

Fixes: 0f2d1f1dba ("Show all valid commands when running ogcli --help")
2022-05-10 16:19:17 +02:00
Jose M. Guisado 0f2d1f1dba Show all valid commands when running ogcli --help
Commands are retrieved using dir() so future commands will show
accordingly.

"ogcli --help" now will print:

usage: ogcli [-h] {create,list,rest,restore,send,set,setup}

positional arguments:
  {create,list,rest,restore,send,set,setup}
                        Subcommand to run

optional arguments:
  -h, --help            show this help message and exit
2021-09-27 12:55:36 +02:00
OpenGnSys Support Team 5f922571e2 ogCLI is AGPLv3+
Update license header in files.
2021-05-14 00:26:33 +02:00
Javier Sánchez Parra a2f1056c40 Add alias "set mode"
"ogcli set modes ..." should be "ogcli set mode ..." because clients
only have one mode assigned at a time.

To not break the backwards compatibility, this commits adds "set mode"
but maintains "set modes".
2021-05-12 17:23:06 +02:00
Jose M. Guisado 01ed5a3039 Add "setup disk" command
Enables sending format and partition commands to the ogServer.

Syntax: ogcli setup disk {options}

Options are:

  --type [{dos,gpt}]    Disk partition scheme
  --num [NUM]           Disk number (defaults to 1)
  --format [FORMAT]     Indicates which partitions to reformat if they
                        are already present. Use --part alone to mean all
                        partitions.
  --part PART [PART ...]
                        Partition definition (syntax:
                        "num,part_scheme,fs,size")

	size is specified as a positive digit followed by a size unit
	like [MGT]

		512M, 50G, 1T, etc.

	ogcli accepts {LINUX,WINDOWS,EFI,CACHE} as part types and {EXT4,
	NTFS, FAT32, CACHE} as filesystem types inside the partition
	definition string

	1,LINUX,EXT4,50G => partition 1, of type linux with ext4 fs of
			    50 GB size

	If you wanted to add a partition cache (OpenGnsys usually
	mandates this partition to be number 4) you can omit partitions
	up to that number and ogcli will fill with EMPTY partitions.

	So if you define the following parts:
		--part 1,...
		--part 4,...
	ogcli will fill parts 2 and 3 with EMPTY part type and fs.

Client selection argument follow previous used options

  --center-id CENTER_ID
  --room-id ROOM_ID
  --client-ip CLIENT_IP
2021-04-07 12:58:54 +02:00
Jose M. Guisado 19e7d98aec Add 'send poweroff' command
Enables sending poweroff commands to clients.

Only arguments required are the usual client selection like:

	--client-ip
	--room-id
	--center-id
2021-04-06 13:16:46 +02:00
Jose M. Guisado a576aeaf1e Add 'create image'
Enables creation of images using /image/create from ogServer API.

Summary of the options:

	--disk
	Disk number

	--part
	Partition number

	--name
	Image name which will be used for the .img file.

	--desc
	Description of the image. This option enables ogServer to store
	an entry in the database regarding this image.

	--repo
	Optional. Holds the ip address of the repo which will store the
	created image. Defaults to ogserver address specified inside
	ogcli.json

	--client-ip
	Client ip for which we want to create a partition image
2021-04-06 13:16:46 +02:00
Jose M. Guisado 4dfb90cf56 Add 'list disks'
Enables consuming /client/setup API from ogServer in order to fetch
partition and disk setup information from a given client.

Example, if pc11 is a client with 1 disk, 4 part (1:linux,2-3:empty,4:cache):

ogcli list disk --client-ip 192.168.56.11

{
  "partitions": [
    {
      "disk": 1,
      "partition": 0,
      "code": 1,
      "size": 52428800,
      "used_size": 0,
      "filesystem": 0,
      "os": 0,
      "image": 0,
      "software": 0
    },
    {
      "disk": 1,
      "partition": 1,
      "code": 131,
      "size": 40000000,
      "used_size": 4,
      "filesystem": 6,
      "os": 8,
      "image": 0,
      "software": 0
    },
    {
      "disk": 1,
      "partition": 2,
      "code": 0,
      "size": 0,
      "used_size": 0,
      "filesystem": 1,
      "os": 0,
      "image": 0,
      "software": 0
    },
    {
      "disk": 1,
      "partition": 3,
      "code": 0,
      "size": 0,
      "used_size": 0,
      "filesystem": 1,
      "os": 0,
      "image": 0,
      "software": 0
    },
    {
      "disk": 1,
      "partition": 4,
      "code": 202,
      "size": 10000000,
      "used_size": 1,
      "filesystem": 2,
      "os": 0,
      "image": 0,
      "software": 0
    }
  ]
}
2021-04-06 13:16:46 +02:00
Jose M. Guisado c417964179 Fix fallback --repo value in 'restore image'
'--repo' was an optional argument to specify the ip of the machine
holding the image to be restored. In case it was not specified it
defaults to the ip specified inside ogcli.json for the ogServer

(ie. As fallback, we assume the repo is in the same machine as the
ogServer)

We retrieve the ip using urlparse from urllib.parse module. The parse
result has a 'netloc' member which holds the ip, but also any specified
port.

This resulted in a payload like:

	> ogcli restore image --id 3 --disk 1 --part 1
	--type unicast-direct --client-ip 192.168.56.11

	{"disk": "1", "partition": "1", "id": "1", "name": "pc11bak",
	"profile": "3", "repository": "192.168.56.10:8888", "type":
	"UNICAST-DIRECT", "clients": ["192.168.56.11"]}

Split netloc to avoid copying the ogServer port.
2021-03-31 15:07:40 +02:00
Jose M. Guisado 6fd3cb7a25 Add 'restore image' command
Adds cli capability to send image restore commands to the ogServer.

It has the following options:

	--id
	To specify image id

	--disk
	Target disk

	--part
	Target partition

	--type
	To specify type of restore to send. UNICAST-DIRECT or
	UNICAST-CACHE are supported as of this patch.

	--repo
	Optional argument to specify image repo to fetch the image. This
	applies for UNICAST-DIRECT cases. (not restoring from a cache
	partition). If not specified it will default to rest.URL ip
	(ie. ogServer ip)

	--client-ip, --room-id and --center-id
	Target client args
2021-03-30 14:01:39 +02:00
Jose M. Guisado 5abe862228 Add list images
ogServer exposes a list of known partition images at /images, use it to
implement 'list images' command.
2021-03-30 14:00:25 +02:00
Jose M. Guisado 40bd146377 Fix utils.py
When utils.py was created, moved functions declaration was not kept for
scope_lookup by mistake, in previous commit it was named
'scope_lookup_id'.

ips_in_scope is a function that maps a list of scopes to the list of ips
contained in it, recursively. (if the scope is a room it will gather all
computers ips in that room). Add 'None' check for its scope param,
avoiding duplication of this check in several other objects using this
function.

Also import utils in 'modes' object, which was not added previously.

Fixes: be84b0a ("Add utils.py")
2021-03-30 13:29:06 +02:00
Jose M. Guisado e81c38f098 Fix help messages
program name of subsequent parsers after the first one need their
"prog=" parameter specified so they do not show sys.argv[0] only.

With this patch, for example:

	ogcli list --help

Shows:

	usage: ogcli list [-h] {clients,scopes,modes,hardware,client}
	...

Instead of:

	usage: ogcli [-h] {clients,scopes,modes,hardware,client}
	...
2021-03-29 13:54:37 +02:00
Jose M. Guisado 0f55ce7341 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
2021-03-29 13:47:28 +02:00
Jose M. Guisado be84b0a15c Add utils.py
Move auxiliary code that will be used by several objects. In this case,
scope filtering and searching by id is going to be used by 'send wol'
too.

Avoid duplicating this code creating utils.py
2021-03-29 13:47:18 +02:00
Jose M. Guisado 565e798ef9 Print json instead of python dict in responses
r.json() decodes the responses json and passes it to json.loads() which
will convert the content into a python dictionary.

Print the literal JSON text so that output can be further manipulated by
other tools like jq.
2021-03-18 15:40:35 +01:00
Jose M. Guisado c80f27c98c Make client and center params more specific
Non specific parameter names like '--center' or '--client' should not be
used to specify an ip or id, only a literal name.

Rename --client to --client-ip and --center to --center-id to leave
unspecific parameters free to later implement --center or --client using
names.
2021-03-03 11:17:05 +01:00
Jose M. Guisado 1be7f3f8a8 Add README.md 2021-03-03 11:17:05 +01:00
Jose M. Guisado 63ef83806d Rename --room param to --room-id in "set modes"
--room will be used to specify the room name instead of the id.
2021-03-03 11:17:05 +01:00
Jose M. Guisado 2b7d6b081c Add client, room and center args to set_modes
New arguments to make specifying the target machines more flexible when
changing their boot mode (known as "set client mode"). These argument
are optional although any of them must be used to specify some target.

	--client IP
	--room id
	--center id

The arguments can be specified several times like "--client ip --client
ip --room id --room id --room id", etc.

Center or room id can be obtained via /scopes.

As of this patch, set_modes does iterate through the whole /scopes
output and then filters ips with those that were specified by user.
2021-02-26 15:34:11 +01:00
Jose M. Guisado f6fa795803 Bring clients.py up to date with ogServer API
get_client_properties is not using a valid API resource to fetch
computer details. Use /client/info.

list_client_hardware is not building a valid payload. Drop
payload building using 'scope' as key and updates o that its
uses "{ client : ip }" scheme for specifying a client. This is the
standard way of specifying a client in ogServer.
2021-02-26 15:34:02 +01:00
Roberto Hueso Gómez 015a43ac3a Rework set mode command
This reworks the POST /mode command to the new API:
POST /mode
{
  'clients': ['192.168.1.5', '192.168.1.6']
  'mode': 'pxe'
}
2020-08-12 15:17:10 +02:00
Roberto Hueso Gómez d4f4497056 Change GET and POST /modes URI to /mode
This adapts to the ogServer.
2020-08-03 11:49:38 +02:00
Roberto Hueso Gómez adb2e9ffba Rework ogcli set mode command
This patch adapts the command to the fixed POST /modes request. It can
now be called with something like: ogcli set modes --scope-name=pc12
--mode=pxe

NOTE: This inherits from the legacy setclientmode script and requires
scope names to be unique. This should be fixed in the future in case
it's convenient to have duplicated scope names.
2020-07-30 10:16:56 +02:00
Roberto Hueso Gómez 513308fe81 Add ogcli list client command
This requests GET /client/properties by calling something like:
ogcli list client --id=6

It is important to notice that 'id' must be a "computer" type
scope id.
2020-07-14 11:21:16 +02:00
Roberto Hueso Gómez f4e1bb767b Add ogcli list hardware command
This requests GET /hardware by calling something like:
ogcli list hardware --scope-id=6

It is important to notice that 'scope-id' must be a "computer" type scope id.
2020-07-08 13:38:50 +02:00
Roberto Hueso Gómez e3d30d23ff Add payload option on GET requests
Instead of using query strings we use a json body for GET HTTP requests. This is
allowed under RFCs 7230-7237.

https://stackoverflow.com/questions/978061/http-get-with-request-body
2020-07-08 11:43:49 +02:00
Roberto Hueso Gómez 8961937329 Add ogcli set mode command
This requests POST /modes and changes a scope mode by calling something like:
ogcli set modes --scope-id=1 --scope-type=computer --mode=pxe
2020-07-06 13:32:02 +02:00
Roberto Hueso Gómez 4dddd359e7 Add post() to OgREST
This is a wrapper that provides HTTP POST requests.
2020-07-03 14:25:22 +02:00
Roberto Hueso Gómez 53ed3933d9 Fix ogcli shebang
This uses python3 and improves portability by using '/usr/bin/env'.
2020-07-01 14:14:31 +02:00
OpenGnSys Support Team 14b7729a71 add license header to source code files 2020-07-01 12:34:46 +02:00
Roberto Hueso Gómez dbf0f00650 Rename files to remove 'og' prefix
This prefix is redundant on almost every file, so the prefix is removed from
filenames and imports.
2020-06-30 12:51:51 +02:00
Roberto Hueso Gómez f41b5f8f9d Add list modes command
This is consistent with HTTP GET /modes
2020-06-30 12:43:51 +02:00
Roberto Hueso Gómez 7483cb76a2 Check required config params are in config file
In case a required config param is not in ogcli.json config file, this exits
the program with an error code.
2020-06-25 10:52:27 +02:00
Roberto Hueso Gómez be18d619e6 Add list scopes command
This is consistent with HTTP GET /scopes
2020-06-19 13:10:14 +02:00