30e497508e18fd2d704f49aa56f127ea37063c46
[OpenSRF.git] / src / router / osrf_router_main.c
1 #include "osrf_router.h"
2 #include <opensrf/osrfConfig.h>
3 #include <opensrf/utils.h>
4 #include <opensrf/log.h>
5 #include <opensrf/osrf_json.h>
6 #include <signal.h>
7
8 static osrfRouter* router = NULL;
9
10 void routerSignalHandler( int signo ) {
11         osrfLogWarning( OSRF_LOG_MARK, "Received signal [%d], cleaning up...", signo );
12
13     /* for now, just forcibly exit.  This is not a friendly way to clean up, but
14      * there is a bug in osrfRouterFree() (in particular with cleaning up sockets),
15      * that can cause the router process to stick around.  If we do this, we 
16      * are guaranteed to exit.  
17      */
18     _exit(0);
19
20         osrfConfigCleanup();
21         osrfRouterFree(router);
22         router = NULL;
23
24         // Exit by re-raising the signal so that the parent
25         // process can detect it
26         
27         signal( signo, SIG_DFL );
28         raise( signo );
29 }
30
31 static int setupRouter(jsonObject* configChunk);
32
33
34 int main( int argc, char* argv[] ) {
35
36         if( argc < 3 ) {
37                 osrfLogError( OSRF_LOG_MARK,  "Usage: %s <path_to_config_file> <config_context>", argv[0] );
38                 exit(0);
39         }
40
41         char* config = strdup( argv[1] );
42         char* context = strdup( argv[2] );
43         init_proc_title( argc, argv );
44         set_proc_title( "OpenSRF Router" );
45
46         osrfConfig* cfg = osrfConfigInit(config, context);
47         osrfConfigSetDefaultConfig(cfg);
48     jsonObject* configInfo = osrfConfigGetValueObject(NULL, "/router");
49
50     int i;
51     for(i = 0; i < configInfo->size; i++) {
52         jsonObject* configChunk = jsonObjectGetIndex(configInfo, i);
53         if(fork() == 0) /* create a new child to run this router instance */
54             setupRouter(configChunk);
55     }
56
57         free(config);
58         free(context);
59     return EXIT_SUCCESS;
60 }
61
62 int setupRouter(jsonObject* configChunk) {
63
64     if(!jsonObjectGetKey(configChunk, "transport"))
65         return 0; /* these are not the configs you're looking for */
66
67         char* server = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/server"));
68         char* port = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/port"));
69         char* username = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/username"));
70         char* password = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/password"));
71         char* resource = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/resource"));
72
73         char* level = jsonObjectGetString(jsonObjectFindPath(configChunk, "/loglevel"));
74         char* log_file = jsonObjectGetString(jsonObjectFindPath(configChunk, "/logfile"));
75         char* facility = jsonObjectGetString(jsonObjectFindPath(configChunk, "/syslog"));
76
77         int llevel = 1;
78         if(level) llevel = atoi(level);
79
80         if(!log_file) { fprintf(stderr, "Log file name not specified\n"); return -1; }
81
82         if(!strcmp(log_file, "syslog")) {
83                 osrfLogInit( OSRF_LOG_TYPE_SYSLOG, "router", llevel );
84                 osrfLogSetSyslogFacility(osrfLogFacilityToInt(facility));
85
86         } else {
87                 osrfLogInit( OSRF_LOG_TYPE_FILE, "router", llevel );
88                 osrfLogSetFile( log_file );
89         }
90
91         free(facility);
92         free(level);
93         free(log_file);
94
95         osrfLogInfo(  OSRF_LOG_MARK, "Router connecting as: server: %s port: %s "
96                         "user: %s resource: %s", server, port, username, resource );
97
98         int iport = 0;
99         if(port)        iport = atoi( port );
100
101         osrfStringArray* tclients = osrfNewStringArray(4);
102         osrfStringArray* tservers = osrfNewStringArray(4);
103
104     jsonObject* tclientsList = jsonObjectFindPath(configChunk, "/trusted_domains/client");
105     jsonObject* tserversList = jsonObjectFindPath(configChunk, "/trusted_domains/server");
106
107         int i;
108
109     if(tserversList->type == JSON_ARRAY) {
110             for( i = 0; i != tserversList->size; i++ ) {
111             char* serverDomain = jsonObjectGetString(jsonObjectGetIndex(tserversList, i));
112                     osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted server: %s", serverDomain);
113             osrfStringArrayAdd(tservers, serverDomain);
114         }
115     } else {
116         char* serverDomain = jsonObjectGetString(tserversList);
117         osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted server: %s", serverDomain);
118         osrfStringArrayAdd(tservers, serverDomain);
119     }
120
121     if(tclientsList->type == JSON_ARRAY) {
122             for( i = 0; i != tclientsList->size; i++ ) {
123             char* clientDomain = jsonObjectGetString(jsonObjectGetIndex(tclientsList, i));
124                     osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted client: %s", clientDomain);
125             osrfStringArrayAdd(tclients, clientDomain);
126         }
127     } else {
128         char* clientDomain = jsonObjectGetString(tclientsList);
129         osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted client: %s", clientDomain);
130         osrfStringArrayAdd(tclients, clientDomain);
131     }
132
133
134         if( tclients->size == 0 || tservers->size == 0 ) {
135                 osrfLogError( OSRF_LOG_MARK, "We need trusted servers and trusted client to run the router...");
136                 osrfStringArrayFree( tservers );
137                 osrfStringArrayFree( tclients );
138                 return -1;
139         }
140
141         router = osrfNewRouter( server,
142                         username, resource, password, iport, tclients, tservers );
143         
144         signal(SIGHUP,routerSignalHandler);
145         signal(SIGINT,routerSignalHandler);
146         signal(SIGTERM,routerSignalHandler);
147
148         if( (osrfRouterConnect(router)) != 0 ) {
149                 fprintf(stderr, "Unable to connect router to jabber server %s... exiting", server );
150                 osrfRouterFree(router);
151                 return -1;
152         }
153
154         daemonize();
155         osrfRouterRun( router );
156
157         // Shouldn't get here, since osrfRouterRun()
158         // should go into an infinite loop
159
160         osrfRouterFree(router);
161         router = NULL;
162         
163         return -1;
164 }
165
166