rest: extend GET /session to support for more than one client

GET /session only supports for one single client IP address, extend
it to remove this artificial limit.

Add "clients" json attribute which is an alias of the existing "client"
for consistency with other existing endpoints.
master v1.2.5-10
OpenGnSys Support Team 2024-05-14 17:59:22 +02:00
parent 5ea25a11b2
commit b63bbfd832
1 changed files with 53 additions and 39 deletions

View File

@ -856,22 +856,66 @@ static int og_cmd_session(json_t *element, struct og_msg_params *params)
return og_send_request(OG_METHOD_POST, OG_CMD_SESSION, params, clients);
}
static int og_json_os_array_get(struct og_dbi *dbi, json_t *array, const char *ip)
{
unsigned int disk, partition;
const char *os_name;
const char *msglog;
dbi_result result;
json_t *item;
result = dbi_conn_queryf(dbi->conn,
"SELECT op.numdisk, op.numpar, nom.nombreso "
"FROM ordenadores o "
"INNER JOIN ordenadores_particiones op "
" ON o.idordenador = op.idordenador "
"INNER JOIN nombresos nom "
" ON op.idnombreso = nom.idnombreso "
"WHERE o.ip = '%s'", ip);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
__func__, __LINE__, msglog);
return -1;
}
while (dbi_result_next_row(result)) {
item = json_object();
if (!item) {
dbi_result_free(result);
return -1;
}
disk = dbi_result_get_uint(result, "numdisk");
partition = dbi_result_get_uint(result, "numpar");
os_name = dbi_result_get_string(result, "nombreso");
json_object_set_new(item, "disk", json_integer(disk));
json_object_set_new(item, "partition", json_integer(partition));
json_object_set_new(item, "name", json_string(os_name));
json_array_append_new(array, item);
}
dbi_result_free(result);
return 0;
}
static int og_cmd_get_session(json_t *element, struct og_msg_params *params,
char *buffer_reply)
{
json_t *value, *root, *array, *item;
const char *key, *msglog, *os_name;
unsigned int disk, partition;
json_t *value, *root, *array;
struct og_dbi *dbi;
dbi_result result;
int err = 0;
const char *key;
int err = 0, i;
struct og_buffer og_buffer = {
.data = buffer_reply
};
json_object_foreach(element, key, value) {
if (!strcmp(key, "client"))
if (!strcmp(key, "client")) /* alias for backward compatibility */
err = og_json_parse_clients(value, params);
else if (!strcmp(key, "clients"))
err = og_json_parse_clients(value, params);
else
err = -1;
@ -890,50 +934,20 @@ static int og_cmd_get_session(json_t *element, struct og_msg_params *params,
return -1;
}
result = dbi_conn_queryf(dbi->conn,
"SELECT op.numdisk, op.numpar, nom.nombreso "
"FROM ordenadores o "
"INNER JOIN ordenadores_particiones op "
" ON o.idordenador = op.idordenador "
"INNER JOIN nombresos nom "
" ON op.idnombreso = nom.idnombreso "
"WHERE o.ip = '%s'",
params->ips_array[0]);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
__func__, __LINE__, msglog);
og_dbi_close(dbi);
return -1;
}
array = json_array();
if (!array) {
dbi_result_free(result);
og_dbi_close(dbi);
return -1;
}
while (dbi_result_next_row(result)) {
item = json_object();
if (!item) {
dbi_result_free(result);
og_dbi_close(dbi);
for (i = 0; i < params->ips_array_len; i++) {
if (og_json_os_array_get(dbi, array, params->ips_array[i]) < 0) {
json_decref(array);
og_dbi_close(dbi);
return -1;
}
disk = dbi_result_get_uint(result, "numdisk");
partition = dbi_result_get_uint(result, "numpar");
os_name = dbi_result_get_string(result, "nombreso");
json_object_set_new(item, "disk", json_integer(disk));
json_object_set_new(item, "partition", json_integer(partition));
json_object_set_new(item, "name", json_string(os_name));
json_array_append_new(array, item);
}
dbi_result_free(result);
og_dbi_close(dbi);
root = json_object();