diff options
author | OpenGnSys Support Team <soporte-og@soleta.eu> | 2024-05-14 17:59:22 +0200 |
---|---|---|
committer | OpenGnSys Support Team <soporte-og@soleta.eu> | 2024-05-14 18:02:01 +0200 |
commit | b63bbfd8326ef6f9bfa97605b8b728a77f60df97 (patch) | |
tree | cada5398c59dddcc64cbdaf7e1c4e479328bd4f6 | |
parent | 5ea25a11b206a3776f2f849c9a7f632b35f13223 (diff) |
rest: extend GET /session to support for more than one clientv1.2.5-10
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.
-rw-r--r-- | src/rest.c | 92 |
1 files changed, 53 insertions, 39 deletions
@@ -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(); |