summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOpenGnSys Support Team <soporte-og@soleta.eu>2024-05-14 17:59:22 +0200
committerOpenGnSys Support Team <soporte-og@soleta.eu>2024-05-14 18:02:01 +0200
commitb63bbfd8326ef6f9bfa97605b8b728a77f60df97 (patch)
treecada5398c59dddcc64cbdaf7e1c4e479328bd4f6 /src
parent5ea25a11b206a3776f2f849c9a7f632b35f13223 (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.
Diffstat (limited to 'src')
-rw-r--r--src/rest.c92
1 files changed, 53 insertions, 39 deletions
diff --git a/src/rest.c b/src/rest.c
index a426a0f..985e017 100644
--- a/src/rest.c
+++ b/src/rest.c
@@ -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();