source: ogServer-Git/src/cfg.c @ 3cea4bb

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

#1004 set default path to repository

This is /opt/opengnsys/images if not specified.

  • Property mode set to 100644
File size: 4.7 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_uint(value, &cfg->db.port) < 0 ||
62                            cfg->db.port > UINT16_MAX)
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}
191
192void from_json_to_legacy(struct og_server_cfg *cfg)
193{
194        snprintf(servidoradm, sizeof(servidoradm), "%s", cfg->rest.ip);
195        snprintf(puerto, sizeof(puerto), "%s", cfg->rest.port);
196        snprintf(usuario, sizeof(usuario), "%s", cfg->db.user);
197        snprintf(pasguor, sizeof(pasguor), "%s", cfg->db.pass);
198        snprintf(datasource, sizeof(datasource), "%s", cfg->db.ip);
199        snprintf(catalog, sizeof(catalog), "%s", cfg->db.name);
200        snprintf(interface, sizeof(interface), "%s", cfg->wol.interface);
201        snprintf(auth_token, sizeof(auth_token), "%s", cfg->rest.api_token);
202        snprintf(db_port, sizeof(db_port), "%u", cfg->db.port);
203}
Note: See TracBrowser for help on using the repository browser.