diff options
author | Jose M. Guisado <jguisado@soleta.eu> | 2021-06-09 11:25:29 +0000 |
---|---|---|
committer | OpenGnSys Support Team <soporte-og@soleta.eu> | 2021-06-09 13:41:28 +0200 |
commit | 141b0797e17f616d633704a4b011fde515496ab3 (patch) | |
tree | 48b875bd0d52009a4eb7a681065bda082c59409d /src/legacy.c | |
parent | cb7fa569b2f79e8c767b3969394839a96f241298 (diff) |
#915 Add schedule/command
Enables ogserver to schedule commands (also referred as actions in
legacy web console jargon).
This feature enables ogserver to write in the "acciones" table in order
to have full capabilities for command scheduling purposes, thus not
depending in the legacy web console to insert into "acciones" table.
Diffstat (limited to 'src/legacy.c')
-rw-r--r-- | src/legacy.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/src/legacy.c b/src/legacy.c new file mode 100644 index 0000000..b1f1084 --- /dev/null +++ b/src/legacy.c @@ -0,0 +1,269 @@ +#include <jansson.h> +#include <netinet/in.h> +#include <stdlib.h> +#include <syslog.h> + +#include "json.h" +#include "rest.h" +#include "legacy.h" + +#define LEGACY_CMD_MAX 4096 + +static const char *og_cmd_wol_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + const json_t *root = cmd->json; + const char *wol_type; + uint32_t type; + int len; + + wol_type = json_string_value(json_object_get(root, "type")); + if (!wol_type) + return NULL; + + if (!strcmp(wol_type, "broadcast")) + type = 1; + else + type = 2; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), "nfn=Arrancar\rmar=%u", type); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_poweroff_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + int len; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), "nfn=Apagar"); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_reboot_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + int len; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), "nfn=Reiniciar"); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_session_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + const json_t *root = cmd->json; + const char *dsk, *par; + int len; + + dsk = json_string_value(json_object_get(root, "disk")); + if (!dsk) + return NULL; + par = json_string_value(json_object_get(root, "part")); + if (!par) + return NULL; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=IniciarSesion\rdsk=%s\rpar=%s", + dsk, par); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_software_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + const json_t *root = cmd->json; + const char *dsk, *par; + int len; + + dsk = json_string_value(json_object_get(root, "disk")); + if (!dsk) + return NULL; + par = json_string_value(json_object_get(root, "partition")); + if (!par) + return NULL; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=InventarioSoftware\rdsk=%s\rpar=%s", + dsk, par); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_hardware_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + int len; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=InventarioHardware"); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_shell_run_to_legacy(struct og_cmd_json *cmd) +{ + const json_t *root = cmd->json; + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + const char *scp; + int len; + + scp = json_string_value(json_object_get(root, "run")); + if (!scp) + return NULL; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=EjecutarScript\rscp=%s", scp); + if (len >= (int)sizeof(legacy_cmd)) { + syslog(LOG_ERR, "script payload too large (%s:%d)\n", + __func__, __LINE__); + return NULL; + } + + return strdup(legacy_cmd); +} + +static char *og_cmd_image_create_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + struct og_msg_params params = {}; + json_t *root = cmd->json; + int len; + + if (og_json_parse_create_image(root, ¶ms) < 0) + return NULL; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=CrearImagen\rdsk=%s\rpar=%s\rcpt=%s\ridi=%s\rnci=%s\ripr=%s", + params.disk, params.partition, params.code, params.id, + params.name, params.repository); + if (len >= (int)sizeof(legacy_cmd)) + return NULL; + + return strdup(legacy_cmd); +} + +static const char *og_cmd_image_restore_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + struct og_msg_params params = {}; + json_t *root = cmd->json; + int len; + + if (og_json_parse_restore_image(root, ¶ms) < 0) + return NULL; + + len = snprintf(legacy_cmd, sizeof(legacy_cmd), + "nfn=RestaurarImagen\rdsk=%s\rpar=%s\ridi=%s\rnci=%s\ripr=%s\rifs=%s\rptc=%s", + params.disk, params.partition, params.id, params.name, + params.repository, params.profile, params.type); + if (len >= (int)sizeof(legacy_cmd)) { + return NULL; + } + + return strdup(legacy_cmd); +} + +static const char *og_cmd_setup_to_legacy(struct og_cmd_json *cmd) +{ + char legacy_cmd[LEGACY_CMD_MAX + 1] = {}; + uint32_t bufsiz = sizeof(legacy_cmd); + const char *dsk, *ttp, *che, *tch; + struct og_msg_params params = {}; + json_t *partition_setup, *value; + const json_t *root = cmd->json; + uint32_t consumed = 0; + size_t index; + int len; + + dsk = json_string_value(json_object_get(root, "disk")); + if (!dsk) + return NULL; + ttp = json_string_value(json_object_get(root, "type")); + if (!ttp) + return NULL; + che = json_string_value(json_object_get(root, "cache")); + if (!che) + return NULL; + tch = json_string_value(json_object_get(root, "cache_size")); + if (!tch) + return NULL; + + len = snprintf(legacy_cmd + consumed, bufsiz, "nfn=Configurar\rttp=%s\rdsk=%s\rcfg=dis=%s*che=%s*tch=%s!", + ttp, dsk, dsk, che, tch); + if (len >= bufsiz) + return NULL; + consumed += len; + if (consumed < bufsiz) + bufsiz -= len; + + partition_setup = json_object_get(root, "partition_setup"); + if (!partition_setup) + return NULL; + if (og_json_parse_partition_setup(partition_setup, ¶ms) < 0) + return NULL; + + json_array_foreach(partition_setup, index, value) { + len = snprintf(legacy_cmd + consumed, bufsiz, "par=%s*cpt=%s*sfi=%s*tam=%s*ope=%s%%", + params.partition_setup[index].number, + params.partition_setup[index].code, + params.partition_setup[index].filesystem, + params.partition_setup[index].size, + params.partition_setup[index].format); + if (len >= bufsiz) + return NULL; + consumed += len; + if (consumed < bufsiz) + bufsiz -= len; + } + + return strdup(legacy_cmd); +} + +const char *og_msg_params_to_legacy(struct og_cmd_json *cmd) +{ + const char *legacy_cmd = NULL; + + if (!strncmp(cmd->type, "wol", strlen("wol"))) + legacy_cmd = og_cmd_wol_to_legacy(cmd); + else if (!strncmp(cmd->type, "poweroff", strlen("poweroff"))) + legacy_cmd = og_cmd_poweroff_to_legacy(cmd); + else if (!strncmp(cmd->type, "reboot", strlen("reboot"))) + legacy_cmd = og_cmd_reboot_to_legacy(cmd); + else if (!strncmp(cmd->type, "session", strlen("session"))) + legacy_cmd = og_cmd_session_to_legacy(cmd); + else if (!strncmp(cmd->type, "software", strlen("software"))) + legacy_cmd = og_cmd_software_to_legacy(cmd); + else if (!strncmp(cmd->type, "hardware", strlen("hardware"))) + legacy_cmd = og_cmd_hardware_to_legacy(cmd); + else if (!strncmp(cmd->type, "run", strlen("run"))) + legacy_cmd = og_cmd_shell_run_to_legacy(cmd); + else if (!strncmp(cmd->type, "image_create", strlen("image_create"))) + legacy_cmd = og_cmd_image_create_to_legacy(cmd); + else if (!strncmp(cmd->type, "image_restore", strlen("image_restore"))) + legacy_cmd = og_cmd_image_restore_to_legacy(cmd); + else if (!strncmp(cmd->type, "setup", strlen("setup"))) + legacy_cmd = og_cmd_setup_to_legacy(cmd); + + if (!legacy_cmd) { + syslog(LOG_ERR, "failed to translate command %s (%s:%d)\n", + cmd->type, __func__, __LINE__); + } + + return legacy_cmd; +} |