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