mirror of https://git.48k.eu/ogserver
Add POST /modes REST request
This patch implements HTTP POST /modes request which can change the mode of any particular scope. Request: POST /modes { "scope": {"id": 1, "type": "computer"}, "mode": "pxe" } Response: 200 OKmaster
parent
96b02b5424
commit
33b0c6f694
29
src/json.c
29
src/json.c
|
@ -39,6 +39,35 @@ int og_json_parse_bool(json_t *element, bool *value)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int og_json_parse_scope(json_t *element, struct og_scope *scope,
|
||||||
|
const uint64_t required_flags)
|
||||||
|
{
|
||||||
|
uint64_t flags = 0UL;
|
||||||
|
const char *key;
|
||||||
|
json_t *value;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
json_object_foreach(element, key, value) {
|
||||||
|
if (!strcmp(key, "id")) {
|
||||||
|
err = og_json_parse_uint(value, &scope->id);
|
||||||
|
flags |= OG_PARAM_SCOPE_ID;
|
||||||
|
} else if (!strcmp(key, "type")) {
|
||||||
|
err = og_json_parse_string(value, &scope->type);
|
||||||
|
flags |= OG_PARAM_SCOPE_TYPE;
|
||||||
|
} else {
|
||||||
|
err = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags != required_flags)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
int og_json_parse_partition(json_t *element, struct og_partition *part,
|
int og_json_parse_partition(json_t *element, struct og_partition *part,
|
||||||
uint64_t required_flags)
|
uint64_t required_flags)
|
||||||
{
|
{
|
||||||
|
|
11
src/json.h
11
src/json.h
|
@ -50,6 +50,17 @@ struct og_sync_params {
|
||||||
const char *method;
|
const char *method;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define OG_PARAM_SCOPE_ID (1UL << 0)
|
||||||
|
#define OG_PARAM_SCOPE_TYPE (1UL << 1)
|
||||||
|
|
||||||
|
struct og_scope {
|
||||||
|
uint32_t id;
|
||||||
|
const char *type;
|
||||||
|
};
|
||||||
|
|
||||||
|
int og_json_parse_scope(json_t *element, struct og_scope *scope,
|
||||||
|
const uint64_t required_flags);
|
||||||
|
|
||||||
struct og_msg_params {
|
struct og_msg_params {
|
||||||
const char *ips_array[OG_CLIENTS_MAX];
|
const char *ips_array[OG_CLIENTS_MAX];
|
||||||
const char *mac_array[OG_CLIENTS_MAX];
|
const char *mac_array[OG_CLIENTS_MAX];
|
||||||
|
|
98
src/rest.c
98
src/rest.c
|
@ -110,6 +110,8 @@ static bool og_send_cmd(char *ips_array[], int ips_array_len,
|
||||||
#define OG_REST_PARAM_TIME_AM_PM (1UL << 38)
|
#define OG_REST_PARAM_TIME_AM_PM (1UL << 38)
|
||||||
#define OG_REST_PARAM_TIME_MINUTES (1UL << 39)
|
#define OG_REST_PARAM_TIME_MINUTES (1UL << 39)
|
||||||
#define OG_REST_PARAM_NETMASK (1UL << 40)
|
#define OG_REST_PARAM_NETMASK (1UL << 40)
|
||||||
|
#define OG_REST_PARAM_SCOPE (1UL << 41)
|
||||||
|
#define OG_REST_PARAM_MODE (1UL << 42)
|
||||||
|
|
||||||
static LIST_HEAD(client_list);
|
static LIST_HEAD(client_list);
|
||||||
|
|
||||||
|
@ -162,6 +164,12 @@ static bool og_msg_params_validate(const struct og_msg_params *params,
|
||||||
return (params->flags & flags) == flags;
|
return (params->flags & flags) == flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool og_flags_validate(const uint64_t flags,
|
||||||
|
const uint64_t required_flags)
|
||||||
|
{
|
||||||
|
return (flags & required_flags) == required_flags;
|
||||||
|
}
|
||||||
|
|
||||||
static int og_json_parse_clients(json_t *element, struct og_msg_params *params)
|
static int og_json_parse_clients(json_t *element, struct og_msg_params *params)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -898,6 +906,84 @@ static int og_cmd_get_modes(json_t *element, struct og_msg_params *params,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int og_cmd_post_modes(json_t *element, struct og_msg_params *params)
|
||||||
|
{
|
||||||
|
struct og_scope scope = {};
|
||||||
|
const char *mode_str;
|
||||||
|
struct og_dbi *dbi;
|
||||||
|
const char *msglog;
|
||||||
|
uint64_t flags = 0;
|
||||||
|
dbi_result result;
|
||||||
|
const char *key;
|
||||||
|
json_t *value;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
json_object_foreach(element, key, value) {
|
||||||
|
if (!strcmp(key, "scope")) {
|
||||||
|
err = og_json_parse_scope(value, &scope,
|
||||||
|
OG_PARAM_SCOPE_ID |
|
||||||
|
OG_PARAM_SCOPE_TYPE);
|
||||||
|
flags |= OG_REST_PARAM_SCOPE;
|
||||||
|
} else if (!strcmp(key, "mode")) {
|
||||||
|
err = og_json_parse_string(value, &mode_str);
|
||||||
|
flags |= OG_REST_PARAM_MODE;
|
||||||
|
} else {
|
||||||
|
err = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!og_flags_validate(flags, OG_REST_PARAM_SCOPE |
|
||||||
|
OG_REST_PARAM_MODE))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
dbi = og_dbi_open(&dbi_config);
|
||||||
|
if (!dbi) {
|
||||||
|
syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(scope.type, "computer")) {
|
||||||
|
result = dbi_conn_queryf(dbi->conn,
|
||||||
|
"UPDATE ordenadores SET arranque='%s' "
|
||||||
|
"WHERE idordenador=%u",
|
||||||
|
mode_str, scope.id);
|
||||||
|
} else if (!strcmp(scope.type, "room")) {
|
||||||
|
result = dbi_conn_queryf(dbi->conn,
|
||||||
|
"UPDATE ordenadores SET arranque='%s' "
|
||||||
|
"WHERE idaula=%u",
|
||||||
|
mode_str, scope.id);
|
||||||
|
} else if (!strcmp(scope.type, "center")) {
|
||||||
|
result = dbi_conn_queryf(dbi->conn,
|
||||||
|
"UPDATE ordenadores SET arranque='%s' "
|
||||||
|
"INNER JOIN aulas ON "
|
||||||
|
"ordenadores.idaula=aulas.idcentro "
|
||||||
|
"WHERE aulas.idcentro=%u",
|
||||||
|
mode_str, scope.id);
|
||||||
|
} else {
|
||||||
|
syslog(LOG_ERR, "unknown scope type (%s:%d)\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
og_dbi_close(dbi);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
dbi_result_free(result);
|
||||||
|
og_dbi_close(dbi);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int og_cmd_stop(json_t *element, struct og_msg_params *params)
|
static int og_cmd_stop(json_t *element, struct og_msg_params *params)
|
||||||
{
|
{
|
||||||
const char *key;
|
const char *key;
|
||||||
|
@ -3188,10 +3274,18 @@ int og_client_state_process_payload_rest(struct og_client *cli)
|
||||||
}
|
}
|
||||||
err = og_cmd_reboot(root, ¶ms);
|
err = og_cmd_reboot(root, ¶ms);
|
||||||
} else if (!strncmp(cmd, "modes", strlen("modes"))) {
|
} else if (!strncmp(cmd, "modes", strlen("modes"))) {
|
||||||
if (method != OG_METHOD_GET)
|
if (method != OG_METHOD_GET && method != OG_METHOD_POST)
|
||||||
return og_client_method_not_found(cli);
|
return og_client_method_not_found(cli);
|
||||||
|
|
||||||
err = og_cmd_get_modes(root, ¶ms, buf_reply);
|
if (method == OG_METHOD_POST && !root) {
|
||||||
|
syslog(LOG_ERR, "command modes with no payload\n");
|
||||||
|
return og_client_bad_request(cli);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method == OG_METHOD_GET)
|
||||||
|
err = og_cmd_get_modes(root, ¶ms, buf_reply);
|
||||||
|
else if (method == OG_METHOD_POST)
|
||||||
|
err = og_cmd_post_modes(root, ¶ms);
|
||||||
} else if (!strncmp(cmd, "stop", strlen("stop"))) {
|
} else if (!strncmp(cmd, "stop", strlen("stop"))) {
|
||||||
if (method != OG_METHOD_POST)
|
if (method != OG_METHOD_POST)
|
||||||
return og_client_method_not_found(cli);
|
return og_client_method_not_found(cli);
|
||||||
|
|
Loading…
Reference in New Issue