source: ogServer-Git/sources/cfg.c @ 866b6c5

Last change on this file since 866b6c5 was 866b6c5, checked in by OpenGnSys Support Team <soporte-og@…>, 4 years ago

#988 add json configuration file

New configuration file at /opt/opengnsys/cfg/ogserver.json

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[866b6c5]1/*
2 * Copyright (C) 2020 Soleta Networks <info@soleta.eu>
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Affero General Public License as published by the
6 * Free Software Foundation, version 3.
7 */
8
9#include "json.h"
10#include "cfg.h"
11#include "ogAdmServer.h"
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <fcntl.h>
15#include <unistd.h>
16#include <syslog.h>
17
18static int parse_json_rest(struct og_server_cfg *cfg, json_t *element)
19{
20        const char *key;
21        json_t *value;
22
23        json_object_foreach(element, key, value) {
24                if (!strcmp(key, "ip")) {
25                        if (og_json_parse_string(value, &cfg->rest.ip) < 0)
26                                return -1;
27                } else if (!strcmp(key, "port")) {
28                        if (og_json_parse_string(value, &cfg->rest.port) < 0)
29                                return -1;
30                } else if (!strcmp(key, "api_token")) {
31                        if (og_json_parse_string(value, &cfg->rest.api_token) < 0)
32                                return -1;
33                } else {
34                        syslog(LOG_ERR, "unknown key `%s' in rest\n", key);
35                        return -1;
36                }
37        }
38
39        return 0;
40}
41
42static int parse_json_db(struct og_server_cfg *cfg, json_t *element)
43{
44        const char *key;
45        json_t *value;
46
47        json_object_foreach(element, key, value) {
48                if (!strcmp(key, "ip")) {
49                        if (og_json_parse_string(value, &cfg->db.ip) < 0)
50                                return -1;
51                } else if (!strcmp(key, "user")) {
52                        if (og_json_parse_string(value, &cfg->db.user) < 0)
53                                return -1;
54                } else if (!strcmp(key, "pass")) {
55                        if (og_json_parse_string(value, &cfg->db.pass) < 0)
56                                return -1;
57                } else if (!strcmp(key, "name")) {
58                        if (og_json_parse_string(value, &cfg->db.name) < 0)
59                                return -1;
60                } else {
61                        syslog(LOG_ERR, "unknown key `%s' in db\n", key);
62                        return -1;
63                }
64        }
65
66        return 0;
67}
68
69static int parse_json_wol(struct og_server_cfg *cfg, json_t *element)
70{
71        const char *key;
72        json_t *value;
73
74        json_object_foreach(element, key, value) {
75                if (!strcmp(key, "interface")) {
76                        if (og_json_parse_string(value, &cfg->wol.interface) < 0)
77                                return -1;
78                } else {
79                        syslog(LOG_ERR, "unknown key `%s' in wol\n", key);
80                        return -1;
81                }
82        }
83
84        return 0;
85}
86
87#define OG_SERVER_CFG_REST      (1 << 0)
88#define OG_SERVER_CFG_DB        (1 << 1)
89#define OG_SERVER_CFG_WOL       (1 << 2)
90
91int parse_json_config(const char *filename, struct og_server_cfg *cfg)
92{
93        json_t *root, *value;
94        uint32_t flags = 0;
95        json_error_t err;
96        const char *key;
97        char buf[4096];
98        int fd, ret;
99
100        fd = open(filename, O_RDONLY);
101        if (!fd) {
102                syslog(LOG_ERR, "Cannot open %s", filename);
103                return -1;
104        }
105
106        ret = read(fd, buf, sizeof(buf));
107        if (ret < 0 || ret == sizeof(buf)) {
108                syslog(LOG_ERR, "Cannot read from %s", filename);
109                return -1;
110        }
111
112        root = json_loads(buf, 0, &err);
113        if (!root) {
114                syslog(LOG_ERR, "Cannot parse malformed json file");
115                return -1;
116        }
117
118        json_object_foreach(root, key, value) {
119                if (!strcmp(key, "rest")) {
120                        if (parse_json_rest(cfg, value) < 0)
121                                return -1;
122
123                        flags |= OG_SERVER_CFG_REST;
124                } else if (!strcmp(key, "wol")) {
125                        if (parse_json_wol(cfg, value) < 0)
126                                return -1;
127
128                        flags |= OG_SERVER_CFG_WOL;
129                } else if (!strcmp(key, "database")) {
130                        if (parse_json_db(cfg, value) < 0)
131                                return -1;
132
133                        flags |= OG_SERVER_CFG_DB;
134                } else {
135                        syslog(LOG_ERR, "unknown key `%s' in %s\n",
136                               key, filename);
137                        ret = -1;
138                }
139        }
140
141        if ((flags & OG_SERVER_CFG_REST) &&
142            (flags & OG_SERVER_CFG_DB) &&
143            (flags & OG_SERVER_CFG_WOL)) {
144                ret = 0;
145        } else {
146                syslog(LOG_ERR, "Missing attributes in json file");
147                ret = -1;
148        }
149
150        json_decref(root);
151
152        return ret;
153}
154
155void from_json_to_legacy(struct og_server_cfg *cfg)
156{
157        snprintf(servidoradm, sizeof(servidoradm), cfg->rest.ip);
158        snprintf(puerto, sizeof(puerto), cfg->rest.port);
159        snprintf(usuario, sizeof(usuario), cfg->db.user);
160        snprintf(pasguor, sizeof(pasguor), cfg->db.pass);
161        snprintf(datasource, sizeof(datasource), cfg->db.ip);
162        snprintf(catalog, sizeof(catalog), cfg->db.name);
163        snprintf(interface, sizeof(interface), cfg->wol.interface);
164        snprintf(auth_token, sizeof(auth_token), cfg->rest.api_token);
165}
Note: See TracBrowser for help on using the repository browser.