Commit Graph

92 Commits (0c03d82ca8792e5e0c41460f3aa5cdf6990a3412)

Author SHA1 Message Date
Jose M. Guisado 0c03d82ca8 ogclient: add support for X-Sequence header
Enable parsing of "X-Sequence" HTTP headers from incoming requests.
Add "seq" field in restRequest class.

Enable adding "X-Sequence" to outgoing responses.
Add "seq" field inside restResponse class.

Store current client sequence number inside ogClient class.

Ideally, the restRequest object should be used to retrieve the
sequence number but not all processing functions inside ogRest.py
receive the request as parameter (eg: process_refresh).
In the other hand, all processing functions receive the ogClient object.
2023-06-14 14:50:55 +02:00
Jose M. Guisado fa51f2be8f src: remove unused legacy software inventory code
Remove unnecessary InventarioSoftware invocation inside image_create
operation. Software inventory is executed after image creation
(see ogRest.py).

Remove legacy 'path' parameter. This parameter was used to specify the
path of a text file in which legacy bash scripts wrote the software
inventory of the client (something like "Csft-{ip}...").

Fixes: 04bb35bd86 ("live: rewrite software inventory")
Fixes: 2e3d47b7b8 ("Avoid writting /software output to a file")
2023-05-17 12:44:50 +02:00
Jose M. Guisado ee80dc89ad live: rewrite hardware inventory command
Replace legacy shell script InventarioHardware for helper functions
from hw_inventory.py

Use get_hardware_inventory to obtain a HardwareInventory object with
the hardware information. Map the HardwareInventory object to a legacy
response string with the legacy_list_hardware_inventory function.

Remove "Chrd-*" file reading logic, it's no longer needed. Legacy shell
script InventarioHardware uses that file.

Expect a change in the structure of hardware inventory response payload
in the future. This patch does not address the HTTP response containing
the hardware inventory as a '\n' separated string of hardware elements.
2023-04-18 17:15:57 +02:00
Jose M. Guisado 97e753cbfd ogRest: improve error logging when executing operations
Capture all possible Python exceptions in the try/except block of every
opengnsys operation.

Create an error handling function to deduplicate code in the except
block. The error handling function resets the ogRest state to IDLE and
sends the corresponding 500 Internal Server Error.

This *does not cover* every possible error. There are functions inside
ogThread which contain code that may raise errors that are not covered
by any try/except block.
2023-03-10 11:26:46 +01:00
Jose M. Guisado 5b5ef607ec ogRest: remove root logger constant
Remove unnecesary root logger constant: LOGGER

The root logger is used by default when executing:

	logging.debug()
	logging.info()
	logging.warning()
	...

There is no point in doing:

	LOGGER = logging.getLogger()  # Get root logger
	LOGGER.debug()  # Use root logger
2023-03-10 11:26:46 +01:00
Jose M. Guisado c9a3a763dd legacy: rewrite ogGetImageInfo
Rewrites this legacy script behavior using native Python code, using
subprocess module when executing programs like partclone.info or lzop

ogGetImageInfo is a bash script that retrieves information regarding an
OpenGnsys partition image, specifically:

- clonator
- compressor
- filesystem
- datasize (size of the partition image)

This rewrite only supports partclone and lzop compressed images. This is
standard behavior, we have no reports of other programs or compression
algorithms in use.

Keep this legacy function with hungarian notation to emphasize this is
still a legacy component that may be replaced in the future.
2023-03-02 13:15:10 +01:00
Jose M. Guisado 30fdcceea3 src: improve logging
Adds new logging handler redirecting messages to the log file
located in the Samba shared directory (applies to live mode
clients, i.e: ogLive)

Parses log level configuration from ogclient.json. See:

{
	"opengnsys": {
		...
                "log": "INFO",
		...
	}
	...
}

Adds --debug option to set root logger level to DEBUG when starting
ogClient. Overrides log level from config file.

In addition:

- Replaces any occurence of print with a corresponding logging function.
- Unsets log level for handlers, use root logger level instead.
- Default level for root logger is INFO.
- Replaces level from response log messages to debug (ogRest)
2022-06-08 10:27:06 +02:00
Jose M. Guisado 2465ef25b7 #1065 Add event datagram socket
ogClient can receive events via a datagram socket opened at 55885.
This socket is only opened when in windows or linux mode, for
event reporting from within the system.

Events reported this way are sent back to ogServer via a 103 Early
Hints HTTP message. Information regarding the event is sent in the
response's payload.
2021-11-29 12:58:13 +01:00
Jose M. Guisado f9511932ad #1065 Add windows mode
Add agent mode for windows platform.

Subprocess module for shell/run is cross-platform an no change was
needed. The subprocess will run with the same privilege as its parent,
ogclient.

TODO: Provide a windows installer. As of now,  an administrator
needs to install python and required libraries for this mode to be
usable.
2021-11-18 13:50:16 +01:00
Jose M. Guisado 3dfe54968b #1065 Use logging module instead of syslog
We can't use syslog if we want to execute ogClient in the Windows
platform.

Use the native logging library so we can attach different handlers
depending on the mode ogClient is executing.

Logging configuration is done via a python dict. There is a different
dict for linux and windows. These dicts define the configuration of the
root logger, handlers and formatters used.

As of now, it is only expected to use the root logger for everything
logging related. The root logger is obtained via:

	LOGGER = logging.getLogger()

More info about handlers, formatters and loggers:
	https://docs.python.org/3/howto/logging.html

Logging configuration is done at startup, just after parsing the json
(knowing ogclient mode). If json parsing goes bad, ogclient will only
print a message to stdout.
2021-11-18 10:29:46 +01:00
Jose M. Guisado 2d3d31bf61 #1065 src: add linux mode
ogClient can run in "linux" mode. In addition to live or virtual.
Serves as a substitute to the legacy ogagent, which has not received any
updates since 2020/07/23.

Linux mode initially supports remote reboot and poweroff. Requires
updated ogServer with the Linux ogclient state.

ogClient can be set up to run in linux mode by specifying it in
ogclient.json:

{
	"opengnsys": {
		"ip": "192.168.56.10",
		"port": 8889,
		"log": "DEBUG",
		"mode": "linux",
	...
}
2021-11-15 13:37:40 +01:00
OpenGnSys Support Team cb9edc8d95 ogClient is AGPLv3+
Update license header in files.
2021-05-14 00:19:28 +02:00
Jose M. Guisado bd98dd1da0 #995 Add link speed in probe responses
Separates probe method into separate ogclient modes (virtual, vdi) so
future supported OS can easily have a tailored probe responses.

Link speed is retrieved using a minimal ethtool command sent using fcntl
module from python.
2021-05-04 18:30:40 +02:00
Jose M. Guisado f0aa3df485 Rename 'linux' folder and operations to 'live'
ogLive related operations are named inside a 'Linux' folder, also its
python class is named OgLinuxOperations. Rename every 'linux' occurrence
with live to further clarify this folder and operations.

 - OgLinuxOperations -> OgLiveOperations
 - src/linux/ -> src/live/

Fixes: 1377acee ('Rename 'linux' mode to 'live' mode')
2020-12-03 13:38:43 +01:00
Javier Sánchez Parra 900a1c8f08 #1010 Change POST /software to GET
ogClient /software gets a representation of the target resource’s state.
GET method is more appropriate than POST.

Change /software method from POST to GET.
2020-12-02 14:12:40 +01:00
Jose M. Guisado f8e566bf63 #1000 ogRest: set idle state after processing bad request
Before this patch the ogRest would hang indifinitely in a BUSY state
when a bad request was received. Fix this by returning ogRest state to
IDLE once the corresponding bad request response has been sent.

This accounts for the following cases:

 - Unknown GET action
 - Unknown POST action
 - Unknown HTTP verb
2020-12-01 13:32:18 +01:00
Javier Sánchez Parra b138fbc0db #1004 Send datasize in bytes
Image datasize is expressed in kibibytes but the existing REST API field
represent data in bytes.

This commit changes ogClient to send datasize in bytes.
2020-09-29 12:34:05 +02:00
Javier Sánchez Parra c86eae48fe #1004 Add new fields to /image/create response
Extend ogClient to include more information about the image that has been
created. This patch modifies ogClient to read an info file created by image
creation script, add this info to the JSON response and then remove the file.

Example of new /image/create response:

{
  "disk": "1",
  "partition": "1",
  "code": "131",
  "id": "1",
  "name": "ubuntu",
  "repository": "192.168.56.10",
  "software": "Ubuntu 18.04.5 LTS \naccountsservice 0.6.45\n...",
  "clonator": "PARTCLONE",
  "compressor": "LZOP",
  "filesystem": "EXTFS",
  "datasize": 2100000
}

New fields are "clonator", "compressor", "filesystem" and "datasize".
2020-09-10 14:46:37 +02:00
Javier Sánchez Parra 0593119352 #999 Fix ogClient session command
Disconnect gracefully from ogServer after booting OS, the script to start the
OS calls kexec, so everything is gone after it. For Windows, this results in a
reboot.

This commit also improves the disconnect function to make sure the
disconnection is synchronous.
2020-08-21 18:39:35 +02:00
Javier Sánchez Parra de129f7449 Add Virtual status
Since version 1.2.0, OpenGnsys supports ogVDI hypervisor OS. This commit
a new status which indicates that clients are running ogVDI
2020-06-26 14:39:21 +02:00
Roberto Hueso Gómez 93f1b35fcd Add syslog logs for HTTP requests and responses
This is useful for debuging and getting information on the processes that are
being executed in ogclient.

syslog outputs are something similar to:

Jun 26 10:36:40 ogAdministrator /ogclient: GET refresh HTTP/1.1
Jun 26 10:36:40 ogAdministrator /ogclient: HTTP/1.0 500 Internal Server Err
2020-06-26 12:37:09 +02:00
Roberto Hueso Gómez 93bbc39d4b Import OgLinuxOperations only when necessary
This fixes a circular import error produced by the import of ogClient inside of
OgLinuxOperations.
2020-06-08 14:26:35 +02:00
Roberto Hueso Gómez 1377aceec2 Rename 'linux' mode to 'live' mode
'linux' represents ogLive mode that is the reason for the rename.
2020-06-05 14:55:10 +02:00
Roberto Hueso Gómez b29b2eb452 Move check_vm_state_loop() into OgVirtualOperations
Improves code encapsulation by moving check_vm_state_loop method into
OgVirtualOperations class. This also fixes import error when running ogclient in
'linux' mode.
2020-05-26 11:24:26 +02:00
Javier Sánchez Parra 6502180fc8 Only import virtual functions when needed.
ogClient may runs on an OS that do not have all the dependencies needed
to use virtual functions.

This commit change the behaviour to only import virtual functions when
the ogClient has to work with Virtual Machines. This way ogClient works
on environments which do not need virtual functions.
2020-05-20 10:33:41 +02:00
Javier Sánchez Parra 621fb7a786 Adapt ogLinuxOperation to work with json config file
ogClient changed its config file format to json. This patch adapts
ogLinuxOperation to use new config file.

Co-authored-by: Roberto Hueso <rhueso@soleta.eu>
2020-05-18 08:33:37 +02:00
Roberto Hueso Gómez 3c055d198d Wait before polling QMP for host poweroff
This patch waits before polling qemu with QMP so that it has time to be ready
for requests. It also increases wait time in case the host machine is slow.
2020-05-14 17:28:50 +02:00
Roberto Hueso Gómez 269c7b5055 Rename operation 'execCMD' to 'shellrun'
This patch also ignores calls to shellrun when virtual mode is activated.
2020-05-13 17:30:12 +02:00
Roberto Hueso Gómez 38b6d77561 Switch config file to json
This patch makes configuration parsing easier as well as making the full
configuration available in many subclasses.
2020-05-13 14:10:01 +02:00
Roberto Hueso Gómez 6ca16dd200 Poweroff when no VM and no jobs are running
This patch calls poweroff in virtual mode when no VM is running and no jobs are
being executed. This is useful when the guest OS shutdowns so that the host OS
does not continue to run.
2020-05-11 11:12:11 +02:00
Roberto Hueso Gómez b576836e43 Avoid killing ogclient in virtual mode 2020-04-20 09:14:52 +02:00
Roberto Hueso Gómez 2e3d47b7b8 Avoid writting /software output to a file 2020-04-17 16:59:48 +02:00
Roberto Hueso Gómez 7ccc498014 Use samba for create and restore virtual partitions
This requires to configure user and password for samba repositories.
2020-04-17 15:50:35 +02:00
Roberto Hueso Gomez f56065a438 Fix reboot and poweroff threads args 2020-04-13 15:16:52 +02:00
Roberto Hueso Gomez 4f03c31f85 Add mode selection for ogClient 2020-04-08 13:31:45 +02:00
OpenGnSys Support Team d69841ed97 rename getURI to get_uri in restRequest 2020-03-09 18:10:57 +01:00
OpenGnSys Support Team 5964e48df9 rename execcmd to shellrun 2020-03-09 18:10:54 +01:00
Roberto Hueso Gómez 4e1ad0f949 Put state to IDLE after run/schedule 2020-03-03 14:13:10 +01:00
Roberto Hueso Gómez b53f8d0f8f Send complete HTTP header when response has no body 2020-03-02 09:32:40 +01:00
OpenGnSys Support Team a85c113ee7 Rename operation to method
As defined by the HTTP standard.
2020-02-26 17:58:15 +01:00
Alvaro Neira Ayuso 6f7ba325b8 Modify way to close PID process
With our client disconnection, we hid that the ogClient process will be
closed too. This new way only close the subprocess keeping the ogClient
still working.
2020-02-24 09:35:24 +01:00
Alvaro Neira Ayuso 583057bd69 Use state machine to avoid race condition problems
This patch allows us to control the thread using a state machine. This state
machine controls if the client is busy or not. This new way to control the
threads give us more control for avoiding race condition problems.
2020-02-23 20:04:47 +01:00
OpenGnSys Support Team 3917c3675f pep-0008 cleanup
From pep-0008: Method Names and Instance Variables

Use the function naming rules: lowercase with words separated by underscores as
necessary to improve readability.
2020-02-21 12:57:54 +01:00
Roberto Hueso Gómez 1fd9f2e07c Use 'with' keyword for file reading
This is applied to /software and /hardware file reads.
We should use 'with' instead of opening and closing a file since this prevents
that files stay open after an exception is raised.
2020-02-05 16:49:42 +01:00
Roberto Hueso Gómez fe4236dcd8 Fix /image/restore execution and response 2020-02-05 13:42:10 +01:00
Roberto Hueso Gómez 680214317e Fix /image/create execution and response 2020-02-05 13:41:54 +01:00
Roberto Hueso Gómez 2934773d88 Fix /setup execution and response 2020-02-03 10:15:54 +01:00
Roberto Hueso Gómez e96e187825 Fix parseGetConf(...) configuration parsing
This patch also reformats the response to the /refresh command.
2020-02-03 10:15:49 +01:00
OpenGnSys Support Team f86999da0c add space after Content-Length and Content-Type
ogAdmServer needs this space to work fine.
2020-01-28 09:14:13 +01:00
Roberto Hueso Gómez dabc7ebf83 Change POST /refresh to GET /refresh
This patch changes the HTTP method for /refresh and cleans up the implementation
of the /refresh Linux operator.
2020-01-21 17:33:05 +01:00