source: ogServer-Git/src/cfg.c @ 79e7e2b

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

#988 remove legacy configuration

Use og_server_cfg everywhere. Convert port to string to make it easy for the
dbi API since it expects a string. Remove legacy example configuration file.

  • Property mode set to 100644
File size: 4.1 KB
Line 
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 if (!strcmp(key, "port")) {
61                        if (og_json_parse_string(value, &cfg->db.port) < 0)
62                                return -1;
63                } else {
64                        syslog(LOG_ERR, "unknown key `%s' in db\n", key);
65                        return -1;
66                }
67        }
68
69        return 0;
70}
71
72static int parse_json_wol(struct og_server_cfg *cfg, json_t *element)
73{
74        const char *key;
75        json_t *value;
76
77        json_object_foreach(element, key, value) {
78                if (!strcmp(key, "interface")) {
79                        if (og_json_parse_string(value, &cfg->wol.interface) < 0)
80                                return -1;
81                } else {
82                        syslog(LOG_ERR, "unknown key `%s' in wol\n", key);
83                        return -1;
84                }
85        }
86
87        return 0;
88}
89
90static int parse_json_repo(struct og_server_cfg *cfg, json_t *element)
91{
92        const char *key;
93        json_t *value;
94
95        json_object_foreach(element, key, value) {
96                if (!strcmp(key, "directory")) {
97                        if (og_json_parse_string(value, &cfg->repo.dir) < 0)
98                                return -1;
99                } else {
100                        syslog(LOG_ERR, "unknown key `%s' in repo\n", key);
101                        return -1;
102                }
103        }
104
105        return 0;
106}
107
108#define OG_SERVER_CFG_REST      (1 << 0)
109#define OG_SERVER_CFG_DB        (1 << 1)
110#define OG_SERVER_CFG_WOL       (1 << 2)
111#define OG_SERVER_CFG_REPO      (1 << 3)
112
113int parse_json_config(const char *filename, struct og_server_cfg *cfg)
114{
115        json_t *root, *value;
116        uint32_t flags = 0;
117        json_error_t err;
118        const char *key;
119        char buf[4096];
120        int fd, ret;
121
122        fd = open(filename, O_RDONLY);
123        if (fd < 0) {
124                syslog(LOG_ERR, "Cannot open %s", filename);
125                return -1;
126        }
127
128        ret = read(fd, buf, sizeof(buf));
129        if (ret < 0 || ret == sizeof(buf)) {
130                syslog(LOG_ERR, "Cannot read from %s", filename);
131                return -1;
132        }
133
134        root = json_loads(buf, 0, &err);
135        if (!root) {
136                syslog(LOG_ERR, "Cannot parse malformed json file");
137                return -1;
138        }
139
140        json_object_foreach(root, key, value) {
141                if (!strcmp(key, "rest")) {
142                        if (parse_json_rest(cfg, value) < 0) {
143                                ret = -1;
144                                break;
145                        }
146                        flags |= OG_SERVER_CFG_REST;
147                } else if (!strcmp(key, "wol")) {
148                        if (parse_json_wol(cfg, value) < 0) {
149                                ret = -1;
150                                break;
151                        }
152                        flags |= OG_SERVER_CFG_WOL;
153                } else if (!strcmp(key, "database")) {
154                        if (parse_json_db(cfg, value) < 0) {
155                                ret = -1;
156                                break;
157                        }
158                        flags |= OG_SERVER_CFG_DB;
159                } else if (!strcmp(key, "repository")) {
160                        if (parse_json_repo(cfg, value) < 0)
161                                return -1;
162
163                        flags |= OG_SERVER_CFG_REPO;
164                } else {
165                        syslog(LOG_ERR, "unknown key `%s' in %s\n",
166                               key, filename);
167                        ret = -1;
168                }
169        }
170
171        if (ret < 0)
172                json_decref(root);
173
174        if ((flags & OG_SERVER_CFG_REST) &&
175            (flags & OG_SERVER_CFG_DB) &&
176            (flags & OG_SERVER_CFG_WOL)) {
177                ret = 0;
178        } else {
179                syslog(LOG_ERR, "Missing attributes in json file");
180                ret = -1;
181        }
182
183        if (ret < 0)
184                json_decref(root);
185        else
186                cfg->json = root;
187
188        return ret;
189}
Note: See TracBrowser for help on using the repository browser.