#980 add procedure auto execution

Users can configure clients to execute a procedure at start.

This commit adapt this functionality to new functions and behaviour
of the ogAdmServer.
master
Javier Sánchez Parra 2020-05-14 10:07:34 +02:00 committed by OpenGnSys Support Team
parent a63ec0ba7f
commit 16e45fa83e
1 changed files with 36 additions and 1 deletions

View File

@ -185,6 +185,7 @@ struct og_client {
enum og_client_status status;
enum og_cmd_type last_cmd;
unsigned int last_cmd_id;
bool autorun;
};
static inline int og_client_socket(const struct og_client *cli)
@ -1523,6 +1524,7 @@ struct og_computer {
unsigned int center;
unsigned int room;
char name[OG_COMPUTER_NAME_MAXLEN + 1];
unsigned int procedure_id;
};
#define OG_REST_PARAM_ADDR (1UL << 0)
@ -4809,6 +4811,7 @@ static int og_dbi_get_computer_info(struct og_computer *computer,
"SELECT ordenadores.idordenador,"
" ordenadores.nombreordenador,"
" ordenadores.idaula,"
" ordenadores.idproautoexec,"
" centros.idcentro FROM ordenadores "
"INNER JOIN aulas ON aulas.idaula=ordenadores.idaula "
"INNER JOIN centros ON centros.idcentro=aulas.idcentro "
@ -4831,6 +4834,7 @@ static int og_dbi_get_computer_info(struct og_computer *computer,
computer->id = dbi_result_get_uint(result, "idordenador");
computer->center = dbi_result_get_uint(result, "idcentro");
computer->room = dbi_result_get_uint(result, "idaula");
computer->procedure_id = dbi_result_get_uint(result, "idproautoexec");
strncpy(computer->name,
dbi_result_get_string(result, "nombreordenador"),
OG_COMPUTER_NAME_MAXLEN);
@ -5069,12 +5073,36 @@ static int og_json_parse_partition_array(json_t *value,
return 0;
}
static int og_dbi_queue_autorun(uint32_t computer_id, uint32_t proc_id)
{
struct og_task dummy_task = {
.scope = computer_id,
.type_scope = AMBITO_ORDENADORES,
.procedure_id = proc_id,
};
struct og_dbi *dbi;
dbi = og_dbi_open(&dbi_config);
if (!dbi) {
syslog(LOG_ERR, "cannot open connection database "
"(%s:%d)\n", __func__, __LINE__);
return -1;
}
if (og_dbi_queue_procedure(dbi, &dummy_task)) {
og_dbi_close(dbi);
return -1;
}
og_dbi_close(dbi);
return 0;
}
static int og_resp_refresh(json_t *data, struct og_client *cli)
{
struct og_partition partitions[OG_PARTITION_MAX] = {};
const char *serial_number = NULL;
struct og_computer computer = {};
struct og_partition disk_setup;
struct og_computer computer;
char cfg[1024] = {};
struct og_dbi *dbi;
const char *key;
@ -5150,6 +5178,13 @@ static int og_resp_refresh(json_t *data, struct og_client *cli)
return -1;
}
if (!cli->autorun && computer.procedure_id) {
cli->autorun = true;
if (og_dbi_queue_autorun(computer.id, computer.procedure_id))
return -1;
}
return 0;
}