From 85b345db77d64013f83d5ebc51389776e110464f Mon Sep 17 00:00:00 2001 From: Javier Sánchez Parra Date: Mon, 27 Apr 2020 16:58:30 +0200 Subject: #942 Add tasks to queue --- sources/ogAdmServer.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++----- sources/schedule.c | 2 +- sources/schedule.h | 2 +- 3 files changed, 70 insertions(+), 9 deletions(-) diff --git a/sources/ogAdmServer.c b/sources/ogAdmServer.c index f72b82c..c3eb980 100644 --- a/sources/ogAdmServer.c +++ b/sources/ogAdmServer.c @@ -504,7 +504,11 @@ int checkDato(struct og_dbi *dbi, char *dato, const char *tabla, } struct og_task { + uint32_t task_id; uint32_t procedure_id; + uint32_t command_id; + uint32_t center_id; + uint32_t schedule_id; uint32_t type_scope; uint32_t scope; const char *filtered_scope; @@ -2951,6 +2955,7 @@ static int og_cmd_restore_incremental_image(json_t *element, struct og_msg_param } struct og_cmd { + uint32_t id; struct list_head list; uint32_t client_id; const char *ip; @@ -3322,6 +3327,50 @@ static int og_cmd_legacy(const char *input, struct og_cmd *cmd) return err; } +static int og_dbi_add_action(const struct og_dbi *dbi, const struct og_task *task, + struct og_cmd *cmd) +{ + char start_date_string[24]; + struct tm *start_date; + const char *msglog; + dbi_result result; + time_t now; + + time(&now); + start_date = localtime(&now); + + sprintf(start_date_string, "%hu/%hhu/%hhu %hhu:%hhu:%hhu", + start_date->tm_year + 1900, start_date->tm_mon + 1, + start_date->tm_mday, start_date->tm_hour, start_date->tm_min, + start_date->tm_sec); + result = dbi_conn_queryf(dbi->conn, + "INSERT INTO acciones (idordenador, " + "tipoaccion, idtipoaccion, descriaccion, ip, " + "sesion, idcomando, parametros, fechahorareg, " + "estado, resultado, ambito, idambito, " + "restrambito, idprocedimiento, idcentro, " + "idprogramacion) " + "VALUES (%d, %d, %d, '%s', '%s', %d, %d, '%s', " + "'%s', %d, %d, %d, %d, '%s', %d, %d, %d)", + cmd->client_id, EJECUCION_TAREA, task->task_id, + "", cmd->ip, 0, task->command_id, + task->params, start_date_string, + ACCION_INICIADA, ACCION_SINRESULTADO, + task->type_scope, task->scope, "", + task->procedure_id, task->center_id, + task->schedule_id); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return -1; + } + cmd->id = dbi_conn_sequence_last(dbi->conn, NULL); + dbi_result_free(result); + + return 0; +} + static int og_queue_task_command(struct og_dbi *dbi, const struct og_task *task, char *query) { @@ -3349,8 +3398,12 @@ static int og_queue_task_command(struct og_dbi *dbi, const struct og_task *task, cmd->mac = strdup(dbi_result_get_string(result, "mac")); og_cmd_legacy(task->params, cmd); - list_add_tail(&cmd->list, &cmd_list); + if (og_dbi_add_action(dbi, task, cmd)) { + dbi_result_free(result); + return -1; + } + list_add_tail(&cmd->list, &cmd_list); } dbi_result_free(result); @@ -3488,7 +3541,7 @@ static int og_dbi_queue_procedure(struct og_dbi *dbi, struct og_task *task) dbi_result result; result = dbi_conn_queryf(dbi->conn, - "SELECT parametros, procedimientoid " + "SELECT parametros, procedimientoid, idcomando " "FROM procedimientos_acciones " "WHERE idprocedimiento=%d ORDER BY orden", task->procedure_id); if (!result) { @@ -3508,6 +3561,7 @@ static int og_dbi_queue_procedure(struct og_dbi *dbi, struct og_task *task) } task->params = strdup(dbi_result_get_string(result, "parametros")); + task->command_id = dbi_result_get_uint(result, "idcomando"); if (og_queue_task_clients(dbi, task)) return -1; } @@ -3517,7 +3571,8 @@ static int og_dbi_queue_procedure(struct og_dbi *dbi, struct og_task *task) return 0; } -static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id) +static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id, + uint32_t schedule_id) { struct og_task task = {}; uint32_t task_id_next; @@ -3525,10 +3580,14 @@ static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id) const char *msglog; dbi_result result; + task.schedule_id = schedule_id; + result = dbi_conn_queryf(dbi->conn, "SELECT tareas_acciones.orden, " "tareas_acciones.idprocedimiento, " "tareas_acciones.tareaid, " + "tareas.idtarea, " + "tareas.idcentro, " "tareas.ambito, " "tareas.idambito, " "tareas.restrambito " @@ -3546,11 +3605,13 @@ static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id) task_id_next = dbi_result_get_uint(result, "tareaid"); if (task_id_next > 0) { - if (og_dbi_queue_task(dbi, task_id_next)) + if (og_dbi_queue_task(dbi, task_id_next, schedule_id)) return -1; continue; } + task.task_id = dbi_result_get_uint(result, "idtarea"); + task.center_id = dbi_result_get_uint(result, "idcentro"); task.procedure_id = dbi_result_get_uint(result, "idprocedimiento"); task.type_scope = dbi_result_get_uint(result, "ambito"); task.scope = dbi_result_get_uint(result, "idambito"); @@ -3575,7 +3636,7 @@ static int og_dbi_queue_task(struct og_dbi *dbi, uint32_t task_id) return 0; } -void og_dbi_schedule_task(unsigned int task_id) +void og_dbi_schedule_task(unsigned int task_id, unsigned int schedule_id) { struct og_msg_params params = {}; bool duplicated = false; @@ -3589,7 +3650,7 @@ void og_dbi_schedule_task(unsigned int task_id) __func__, __LINE__); return; } - og_dbi_queue_task(dbi, task_id); + og_dbi_queue_task(dbi, task_id, schedule_id); og_dbi_close(dbi); list_for_each_entry(cmd, &cmd_list, list) { @@ -3641,7 +3702,7 @@ static int og_cmd_task_post(json_t *element, struct og_msg_params *params) return -1; } - og_dbi_queue_task(dbi, atoi(params->task_id)); + og_dbi_queue_task(dbi, atoi(params->task_id), 0); og_dbi_close(dbi); list_for_each_entry(cmd, &cmd_list, list) diff --git a/sources/schedule.c b/sources/schedule.c index 6299acc..3d30aad 100644 --- a/sources/schedule.c +++ b/sources/schedule.c @@ -397,7 +397,7 @@ static void og_agent_timer_cb(struct ev_loop *loop, ev_timer *timer, int events) struct og_schedule *current; current = container_of(timer, struct og_schedule, timer); - og_dbi_schedule_task(current->task_id); + og_dbi_schedule_task(current->task_id, current->schedule_id); ev_timer_stop(loop, timer); list_del(¤t->list); diff --git a/sources/schedule.h b/sources/schedule.h index 7195a05..f207afa 100644 --- a/sources/schedule.h +++ b/sources/schedule.h @@ -32,6 +32,6 @@ void og_schedule_update(struct ev_loop *loop, unsigned int schedule_id, void og_schedule_delete(struct ev_loop *loop, uint32_t schedule_id); void og_schedule_next(struct ev_loop *loop); void og_schedule_refresh(struct ev_loop *loop); -void og_dbi_schedule_task(unsigned int task_id); +void og_dbi_schedule_task(unsigned int task_id, unsigned int schedule_id); #endif -- cgit v1.2.3-18-g5258