diff options
author | Jose M. Guisado <jguisado@soleta.eu> | 2021-09-06 10:24:19 +0000 |
---|---|---|
committer | OpenGnSys Support Team <soporte-og@soleta.eu> | 2021-09-06 12:32:38 +0200 |
commit | 2d68f8a0ec04b1f7700dce6bc0635c3bce516453 (patch) | |
tree | 65e39c982a2f0d604d10a1117a8d22b80a4b8c26 /src | |
parent | 5558fbcf0b5be8a8f90e5b3609ae62dc7c27f84e (diff) |
#1061 add timeout to pending scheduled commands
Pending schedule commands can deny ogLive boot of clients due
to filling of pending cmd queue with commands such as "Iniciar Sesión".
For example: Using RemotePC to serve clients that do not boot into
ogLive will fill up the pending command queue with "Iniciar Sesión".
Introduce a safety timeout for pending (scheduled) commands to
avoid this situation.
Diffstat (limited to 'src')
-rw-r--r-- | src/core.c | 11 | ||||
-rw-r--r-- | src/rest.c | 1 | ||||
-rw-r--r-- | src/rest.h | 2 |
3 files changed, 14 insertions, 0 deletions
@@ -186,14 +186,25 @@ static void og_agent_reset_state(struct og_client *cli) memset(cli->buf, 0, sizeof(cli->buf)); } +#define OG_AGENT_CMD_TIMEOUT 900 + static void og_agent_deliver_pending_cmd(struct og_client *cli) { + struct timeval now, elapsed; const struct og_cmd *cmd; cmd = og_cmd_find(inet_ntoa(cli->addr.sin_addr)); if (!cmd) return; + gettimeofday(&now, NULL); + timersub(&now, &cmd->tv, &elapsed); + if (elapsed.tv_sec >= OG_AGENT_CMD_TIMEOUT) { + og_dbi_update_action(cmd->id, false); + og_cmd_free(cmd); + return; + } + og_send_request(cmd->method, cmd->type, &cmd->params, cmd->json); cli->last_cmd_id = cmd->id; @@ -2323,6 +2323,7 @@ static void og_cmd_init(struct og_cmd *cmd, enum og_rest_method method, cmd->params.ips_array[0] = strdup(cmd->ip); cmd->params.ips_array_len = 1; cmd->json = root; + gettimeofday(&cmd->tv, NULL); } static int og_cmd_legacy_wol(const char *input, struct og_cmd *cmd) @@ -2,6 +2,7 @@ #define OG_REST_H #include <ev.h> +#include <sys/time.h> extern struct ev_loop *og_loop; @@ -89,6 +90,7 @@ struct og_cmd { enum og_rest_method method; struct og_msg_params params; json_t *json; + struct timeval tv; }; const struct og_cmd *og_cmd_find(const char *client_ip); |