diff options
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; +} |