32336a7a08a3e2f3b1b93991f97feac6b62d0c62
[src/app-framework-binder.git] / src / config.c
1 /*
2  * Copyright (C) 2015 "IoT.bzh"
3  * Author "Fulup Ar Foll"
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18    References:
19      https://www.gnu.org/software/libmicrohttpd/manual/html_node/index.html#Top
20      http://www-01.ibm.com/support/knowledgecenter/SSB23S_1.1.0.9/com.ibm.ztpf-ztpfdf.doc_put.09/gtpc2/cpp_vsprintf.html?cp=SSB23S_1.1.0.9%2F0-3-8-1-0-16-8
21
22 */
23
24 #include "../include/local-def.h"
25 #include <stdarg.h>
26 #include <sys/stat.h>
27 #include <sys/types.h>
28
29 #define AFB_CONFIG_JTYPE "AFB_config"
30
31 PUBLIC  char *ERROR_LABEL[]=ERROR_LABEL_DEF;
32
33 // load config from disk and merge with CLI option
34 PUBLIC AFB_error configLoadFile (AFB_session * session, AFB_config *cliconfig) {
35    static char cacheTimeout [10];
36    int fd;
37    json_object * AFBConfig, *value;
38    
39    // TBD integrate alias-dir array with config-file
40    session->config->aliasdir = cliconfig->aliasdir;
41    session->config->mode = cliconfig->mode;
42
43    // default HTTP port
44    if (cliconfig->httpdPort == 0) session->config->httpdPort=1234;
45    else session->config->httpdPort=cliconfig->httpdPort;
46    
47    // default Plugin API timeout
48    if (cliconfig->apiTimeout == 0) session->config->apiTimeout=DEFLT_API_TIMEOUT;
49    else session->config->apiTimeout=cliconfig->apiTimeout;
50    
51    // default AUTH_TOKEN
52    if (cliconfig->token == NULL) session->config->token= DEFLT_AUTH_TOKEN;
53    else session->config->token=cliconfig->token;
54
55    // cache timeout default one hour
56    if (cliconfig->cacheTimeout == 0) session->config->cacheTimeout=DEFLT_CACHE_TIMEOUT;
57    else session->config->cacheTimeout=cliconfig->cacheTimeout;
58
59    // cache timeout default one hour
60    if (cliconfig->cntxTimeout == 0) session->config->cntxTimeout=DEFLT_CNTX_TIMEOUT;
61    else session->config->cntxTimeout=cliconfig->cntxTimeout;
62
63    if (cliconfig->rootdir == NULL) {
64        session->config->rootdir = getenv("AFBDIR");
65        if (session->config->rootdir == NULL) {
66            session->config->rootdir = malloc (512);
67            strncpy  (session->config->rootdir, getenv("HOME"),512);
68            strncat (session->config->rootdir, "/.AFB",512);
69        }
70        // if directory does not exist createit
71        mkdir (session->config->rootdir,  O_RDWR | S_IRWXU | S_IRGRP);
72    } else {
73        session->config->rootdir =  cliconfig->rootdir;
74    }
75    
76    // if no Angular/HTML5 rootbase let's try '/' as default
77    if  (cliconfig->rootbase == NULL) {
78        session->config->rootbase = "/opa";
79    } else {
80        session->config->rootbase= cliconfig->rootbase;
81    }
82    
83    if  (cliconfig->rootapi == NULL) {
84        session->config->rootapi = "/api";
85    } else {
86        session->config->rootapi= cliconfig->rootapi;
87    }
88
89    if  (cliconfig->ldpaths == NULL) {
90        session->config->ldpaths = PLUGIN_INSTALL_DIR;
91    } else {
92        session->config->ldpaths= cliconfig->ldpaths;
93    }
94
95    // if no session dir create a default path from rootdir
96    if  (cliconfig->sessiondir == NULL) {
97        session->config->sessiondir = malloc (512);
98        strncpy (session->config->sessiondir, session->config->rootdir, 512);
99        strncat (session->config->sessiondir, "/sessions",512);
100    } else {
101        session->config->sessiondir = cliconfig->sessiondir;
102    }
103
104    // if no config dir create a default path from sessiondir
105    if  (cliconfig->configfile == NULL) {
106        session->config->configfile = malloc (512);
107        strncpy (session->config->configfile, session->config->sessiondir, 512);
108        strncat (session->config->configfile, "/AFB-config.json",512);
109    } else {
110        session->config->configfile = cliconfig->configfile;
111    }
112
113    // if no config dir create a default path from sessiondir
114    if  (cliconfig->pidfile == NULL) {
115        session->config->pidfile = malloc (512);
116        strncpy (session->config->pidfile, session->config->sessiondir, 512);
117        strncat (session->config->pidfile, "/AFB-process.pid",512);
118    } else {
119        session->config->pidfile= cliconfig->pidfile;
120    }
121
122    // if no config dir create a default path from sessiondir
123    if  (cliconfig->console == NULL) {
124        session->config->console = malloc (512);
125        strncpy (session->config->console, session->config->sessiondir, 512);
126        strncat (session->config->console, "/AFB-console.out",512);
127    } else {
128        session->config->console= cliconfig->console;
129    }
130    
131    // just upload json object and return without any further processing
132    if((fd = open(session->config->configfile, O_RDONLY)) < 0) {
133       if (verbose) fprintf (stderr, "AFB:notice: config at %s: %s\n", session->config->configfile, strerror(errno));
134       return AFB_EMPTY;
135    }
136
137    // openjson from FD is not public API we need to reopen it !!!
138    close(fd);
139    AFBConfig = json_object_from_file (session->config->configfile);
140
141    // check it is an AFB_config
142    if (json_object_object_get_ex (AFBConfig, "jtype", &value)) {
143       if (strcmp (AFB_CONFIG_JTYPE, json_object_get_string (value))) {
144          fprintf (stderr,"AFB: Error file [%s] is not a valid [%s] type\n ", session->config->configfile, AFB_CONFIG_JTYPE);
145          return AFB_FAIL;
146       }
147    }
148
149    if (!cliconfig->rootdir && json_object_object_get_ex (AFBConfig, "rootdir", &value)) {
150       session->config->rootdir =  strdup (json_object_get_string (value));
151    }
152    
153    if (!cliconfig->rootbase && json_object_object_get_ex (AFBConfig, "rootbase", &value)) {
154       session->config->rootbase =  strdup (json_object_get_string (value));
155    }
156    
157    if (!cliconfig->rootapi && json_object_object_get_ex (AFBConfig, "rootapi", &value)) {
158       session->config->rootapi =  strdup (json_object_get_string (value));
159    }
160    
161    if (!cliconfig->ldpaths && json_object_object_get_ex (AFBConfig, "plugins", &value)) {
162       session->config->ldpaths =  strdup (json_object_get_string (value));
163    }
164
165    if (!cliconfig->setuid && json_object_object_get_ex (AFBConfig, "setuid", &value)) {
166       session->config->setuid = strdup (json_object_get_string (value));
167    }
168    
169    if (!cliconfig->sessiondir && json_object_object_get_ex (AFBConfig, "sessiondir", &value)) {
170       session->config->sessiondir = strdup (json_object_get_string (value));
171    }
172    
173    if (!cliconfig->pidfile && json_object_object_get_ex (AFBConfig, "pidfile", &value)) {
174       session->config->pidfile = strdup (json_object_get_string (value));
175    }
176
177    if (!cliconfig->httpdPort && json_object_object_get_ex (AFBConfig, "httpdPort", &value)) {
178       session->config->httpdPort = json_object_get_int (value);
179    }
180    
181
182    if (!cliconfig->localhostOnly && json_object_object_get_ex (AFBConfig, "localhostonly", &value)) {
183       session->config->localhostOnly = json_object_get_int (value);
184    }
185    
186    if (!cliconfig->cacheTimeout && json_object_object_get_ex (AFBConfig, "cachetimeout", &value)) {
187       session->config->cacheTimeout = json_object_get_int (value);
188    }
189    
190    if (!cliconfig->apiTimeout && json_object_object_get_ex (AFBConfig, "apitimeout", &value)) {
191       session->config->apiTimeout = json_object_get_int (value);
192    }
193    
194    if (!cliconfig->cntxTimeout && json_object_object_get_ex (AFBConfig, "cntxtimeout", &value)) {
195       session->config->cntxTimeout = json_object_get_int (value);
196    }
197    
198    // cacheTimeout is an integer but HTTPd wants it as a string
199    snprintf (cacheTimeout, sizeof (cacheTimeout),"%d", session->config->cacheTimeout);
200    session->cacheTimeout = cacheTimeout; // httpd uses cacheTimeout string version
201    
202    json_object_put   (AFBConfig);    // decrease reference count to free the json object
203
204  
205    
206    return AFB_SUCCESS;
207 }
208
209
210 PUBLIC AFB_session *configInit ()
211 {
212   AFB_session *session = calloc (1, sizeof (AFB_session));
213   session->config = calloc (1, sizeof (AFB_config));
214   return session;
215 }
216