source: ogServer-Git/src/cfg.c

Last change on this file was a7cce8d, checked in by OpenGnSys Support Team <soporte-og@…>, 3 years ago

ogServer is AGPLv3+

Update license header in files.

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright (C) 2020-2021 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; either version 3 of the License, or
7 * (at your option) any later version.
8 */
9
10#include "json.h"
11#include "cfg.h"
12#include "ogAdmServer.h"
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <fcntl.h>
16#include <unistd.h>
17#include <syslog.h>
18
19static int parse_json_rest(struct og_server_cfg *cfg, json_t *element)
20{
21        const char *key;
22        json_t *value;
23
24        json_object_foreach(element, key, value) {
25                if (!strcmp(key, "ip")) {
26                        if (og_json_parse_string(value, &cfg->rest.ip) < 0)
27                                return -1;
28                } else if (!strcmp(key, "port")) {
29                        if (og_json_parse_string(value, &cfg->rest.port) < 0)
30                                return -1;
31                } else if (!strcmp(key, "api_token")) {
32                        if (og_json_parse_string(value, &cfg->rest.api_token) < 0)
33                                return -1;
34                } else {
35                        syslog(LOG_ERR, "unknown key `%s' in rest\n", key);
36                        return -1;
37                }
38        }
39
40        return 0;
41}
42
43static int parse_json_db(struct og_server_cfg *cfg, json_t *element)
44{
45        const char *key;
46        json_t *value;
47
48        json_object_foreach(element, key, value) {
49                if (!strcmp(key, "ip")) {
50                        if (og_json_parse_string(value, &cfg->db.ip) < 0)
51                                return -1;
52                } else if (!strcmp(key, "user")) {
53                        if (og_json_parse_string(value, &cfg->db.user) < 0)
54                                return -1;
55                } else if (!strcmp(key, "pass")) {
56                        if (og_json_parse_string(value, &cfg->db.pass) < 0)
57                                return -1;
58                } else if (!strcmp(key, "name")) {
59                        if (og_json_parse_string(value, &cfg->db.name) < 0)
60                                return -1;
61                } else if (!strcmp(key, "port")) {
62                        if (og_json_parse_string(value, &cfg->db.port) < 0)
63                                return -1;
64                } else {
65                        syslog(LOG_ERR, "unknown key `%s' in db\n", key);
66                        return -1;
67                }
68        }
69
70        return 0;
71}
72
73static int parse_json_wol(struct og_server_cfg *cfg, json_t *element)
74{
75        const char *key;
76        json_t *value;
77
78        json_object_foreach(element, key, value) {
79                if (!strcmp(key, "interface")) {
80                        if (og_json_parse_string(value, &cfg->wol.interface) < 0)
81                                return -1;
82                } else {
83                        syslog(LOG_ERR, "unknown key `%s' in wol\n", key);
84                        return -1;
85                }
86        }
87
88        return 0;
89}
90
91static int parse_json_repo(struct og_server_cfg *cfg, json_t *element)
92{
93        const char *key;
94        json_t *value;
95
96        json_object_foreach(element, key, value) {
97                if (!strcmp(key, "directory")) {
98                        if (og_json_parse_string(value, &cfg->repo.dir) < 0)
99                                return -1;
100                } else {
101                        syslog(LOG_ERR, "unknown key `%s' in repo\n", key);
102                        return -1;
103                }
104        }
105
106        return 0;
107}
108
109#define OG_SERVER_CFG_REST      (1 << 0)
110#define OG_SERVER_CFG_DB        (1 << 1)
111#define OG_SERVER_CFG_WOL       (1 << 2)
112#define OG_SERVER_CFG_REPO      (1 << 3)
113
114int parse_json_config(const char *filename, struct og_server_cfg *cfg)
115{
116        json_t *root, *value;
117        uint32_t flags = 0;
118        json_error_t err;
119        const char *key;
120        char buf[4096];
121        int fd, ret;
122
123        fd = open(filename, O_RDONLY);
124        if (fd < 0) {
125                syslog(LOG_ERR, "Cannot open %s", filename);
126                return -1;
127        }
128
129        ret = read(fd, buf, sizeof(buf));
130        if (ret < 0 || ret == sizeof(buf)) {
131                syslog(LOG_ERR, "Cannot read from %s", filename);
132                return -1;
133        }
134
135        root = json_loads(buf, 0, &err);
136        if (!root) {
137                syslog(LOG_ERR, "Cannot parse malformed json file");
138                return -1;
139        }
140
141        json_object_foreach(root, key, value) {
142                if (!strcmp(key, "rest")) {
143                        if (parse_json_rest(cfg, value) < 0) {
144                                ret = -1;
145                                break;
146                        }
147                        flags |= OG_SERVER_CFG_REST;
148                } else if (!strcmp(key, "wol")) {
149                        if (parse_json_wol(cfg, value) < 0) {
150                                ret = -1;
151                                break;
152                        }
153                        flags |= OG_SERVER_CFG_WOL;
154                } else if (!strcmp(key, "database")) {
155                        if (parse_json_db(cfg, value) < 0) {
156                                ret = -1;
157                                break;
158                        }
159                        flags |= OG_SERVER_CFG_DB;
160                } else if (!strcmp(key, "repository")) {
161                        if (parse_json_repo(cfg, value) < 0)
162                                return -1;
163
164                        flags |= OG_SERVER_CFG_REPO;
165                } else {
166                        syslog(LOG_ERR, "unknown key `%s' in %s\n",
167                               key, filename);
168                        ret = -1;
169                }
170        }
171
172        if (ret < 0)
173                json_decref(root);
174
175        if ((flags & OG_SERVER_CFG_REST) &&
176            (flags & OG_SERVER_CFG_DB) &&
177            (flags & OG_SERVER_CFG_WOL)) {
178                ret = 0;
179        } else {
180                syslog(LOG_ERR, "Missing attributes in json file");
181                ret = -1;
182        }
183
184        if (ret < 0)
185                json_decref(root);
186        else
187                cfg->json = root;
188
189        return ret;
190}
Note: See TracBrowser for help on using the repository browser.