mirror of https://git.48k.eu/ogserver
166 lines
3.9 KiB
C
166 lines
3.9 KiB
C
/*
|
|
* Copyright (C) 2020 Soleta Networks <info@soleta.eu>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License as published by the
|
|
* Free Software Foundation, version 3.
|
|
*/
|
|
|
|
#include "json.h"
|
|
#include "cfg.h"
|
|
#include "ogAdmServer.h"
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <syslog.h>
|
|
|
|
static int parse_json_rest(struct og_server_cfg *cfg, json_t *element)
|
|
{
|
|
const char *key;
|
|
json_t *value;
|
|
|
|
json_object_foreach(element, key, value) {
|
|
if (!strcmp(key, "ip")) {
|
|
if (og_json_parse_string(value, &cfg->rest.ip) < 0)
|
|
return -1;
|
|
} else if (!strcmp(key, "port")) {
|
|
if (og_json_parse_string(value, &cfg->rest.port) < 0)
|
|
return -1;
|
|
} else if (!strcmp(key, "api_token")) {
|
|
if (og_json_parse_string(value, &cfg->rest.api_token) < 0)
|
|
return -1;
|
|
} else {
|
|
syslog(LOG_ERR, "unknown key `%s' in rest\n", key);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int parse_json_db(struct og_server_cfg *cfg, json_t *element)
|
|
{
|
|
const char *key;
|
|
json_t *value;
|
|
|
|
json_object_foreach(element, key, value) {
|
|
if (!strcmp(key, "ip")) {
|
|
if (og_json_parse_string(value, &cfg->db.ip) < 0)
|
|
return -1;
|
|
} else if (!strcmp(key, "user")) {
|
|
if (og_json_parse_string(value, &cfg->db.user) < 0)
|
|
return -1;
|
|
} else if (!strcmp(key, "pass")) {
|
|
if (og_json_parse_string(value, &cfg->db.pass) < 0)
|
|
return -1;
|
|
} else if (!strcmp(key, "name")) {
|
|
if (og_json_parse_string(value, &cfg->db.name) < 0)
|
|
return -1;
|
|
} else {
|
|
syslog(LOG_ERR, "unknown key `%s' in db\n", key);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int parse_json_wol(struct og_server_cfg *cfg, json_t *element)
|
|
{
|
|
const char *key;
|
|
json_t *value;
|
|
|
|
json_object_foreach(element, key, value) {
|
|
if (!strcmp(key, "interface")) {
|
|
if (og_json_parse_string(value, &cfg->wol.interface) < 0)
|
|
return -1;
|
|
} else {
|
|
syslog(LOG_ERR, "unknown key `%s' in wol\n", key);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define OG_SERVER_CFG_REST (1 << 0)
|
|
#define OG_SERVER_CFG_DB (1 << 1)
|
|
#define OG_SERVER_CFG_WOL (1 << 2)
|
|
|
|
int parse_json_config(const char *filename, struct og_server_cfg *cfg)
|
|
{
|
|
json_t *root, *value;
|
|
uint32_t flags = 0;
|
|
json_error_t err;
|
|
const char *key;
|
|
char buf[4096];
|
|
int fd, ret;
|
|
|
|
fd = open(filename, O_RDONLY);
|
|
if (!fd) {
|
|
syslog(LOG_ERR, "Cannot open %s", filename);
|
|
return -1;
|
|
}
|
|
|
|
ret = read(fd, buf, sizeof(buf));
|
|
if (ret < 0 || ret == sizeof(buf)) {
|
|
syslog(LOG_ERR, "Cannot read from %s", filename);
|
|
return -1;
|
|
}
|
|
|
|
root = json_loads(buf, 0, &err);
|
|
if (!root) {
|
|
syslog(LOG_ERR, "Cannot parse malformed json file");
|
|
return -1;
|
|
}
|
|
|
|
json_object_foreach(root, key, value) {
|
|
if (!strcmp(key, "rest")) {
|
|
if (parse_json_rest(cfg, value) < 0)
|
|
return -1;
|
|
|
|
flags |= OG_SERVER_CFG_REST;
|
|
} else if (!strcmp(key, "wol")) {
|
|
if (parse_json_wol(cfg, value) < 0)
|
|
return -1;
|
|
|
|
flags |= OG_SERVER_CFG_WOL;
|
|
} else if (!strcmp(key, "database")) {
|
|
if (parse_json_db(cfg, value) < 0)
|
|
return -1;
|
|
|
|
flags |= OG_SERVER_CFG_DB;
|
|
} else {
|
|
syslog(LOG_ERR, "unknown key `%s' in %s\n",
|
|
key, filename);
|
|
ret = -1;
|
|
}
|
|
}
|
|
|
|
if ((flags & OG_SERVER_CFG_REST) &&
|
|
(flags & OG_SERVER_CFG_DB) &&
|
|
(flags & OG_SERVER_CFG_WOL)) {
|
|
ret = 0;
|
|
} else {
|
|
syslog(LOG_ERR, "Missing attributes in json file");
|
|
ret = -1;
|
|
}
|
|
|
|
json_decref(root);
|
|
|
|
return ret;
|
|
}
|
|
|
|
void from_json_to_legacy(struct og_server_cfg *cfg)
|
|
{
|
|
snprintf(servidoradm, sizeof(servidoradm), cfg->rest.ip);
|
|
snprintf(puerto, sizeof(puerto), cfg->rest.port);
|
|
snprintf(usuario, sizeof(usuario), cfg->db.user);
|
|
snprintf(pasguor, sizeof(pasguor), cfg->db.pass);
|
|
snprintf(datasource, sizeof(datasource), cfg->db.ip);
|
|
snprintf(catalog, sizeof(catalog), cfg->db.name);
|
|
snprintf(interface, sizeof(interface), cfg->wol.interface);
|
|
snprintf(auth_token, sizeof(auth_token), cfg->rest.api_token);
|
|
}
|