summaryrefslogtreecommitdiffstats
path: root/src/legacy.c
diff options
context:
space:
mode:
authorJose M. Guisado <jguisado@soleta.eu>2021-06-09 11:25:29 +0000
committerOpenGnSys Support Team <soporte-og@soleta.eu>2021-06-09 13:41:28 +0200
commit141b0797e17f616d633704a4b011fde515496ab3 (patch)
tree48b875bd0d52009a4eb7a681065bda082c59409d /src/legacy.c
parentcb7fa569b2f79e8c767b3969394839a96f241298 (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.c269
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, &params) < 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, &params) < 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, &params) < 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;
+}