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>
8 static osrfRouter* router = NULL;
10 void routerSignalHandler( int signo ) {
11 osrfLogWarning( OSRF_LOG_MARK, "Received signal [%d], cleaning up...", signo );
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.
21 osrfRouterFree(router);
24 // Exit by re-raising the signal so that the parent
25 // process can detect it
27 signal( signo, SIG_DFL );
31 static int setupRouter(jsonObject* configChunk);
34 int main( int argc, char* argv[] ) {
37 osrfLogError( OSRF_LOG_MARK,
38 "Usage: %s <path_to_config_file> <config_context>", argv[0] );
42 const char* config_file = argv[1];
43 const char* context = argv[2];
45 /* Get a set of router definitions from a config file */
47 osrfConfig* cfg = osrfConfigInit(config_file, context);
49 osrfLogError( OSRF_LOG_MARK, "Router can't load config file %s", config_file );
53 osrfConfigSetDefaultConfig(cfg);
54 jsonObject* configInfo = osrfConfigGetValueObject(NULL, "/router");
56 if( configInfo->size < 1 || NULL == jsonObjectGetIndex( configInfo, 1 ) ) {
57 osrfLogError( OSRF_LOG_MARK, "No routers defined in config file %s, context \"%s\"",
58 config_file, context );
62 /* We're done with the command line now, */
63 /* so we can safely overlay it */
65 init_proc_title( argc, argv );
66 set_proc_title( "OpenSRF Router" );
68 /* Spawn child process(es) */
71 for(i = 0; i < configInfo->size; i++) {
72 jsonObject* configChunk = jsonObjectGetIndex(configInfo, i);
73 if(fork() == 0) { /* create a new child to run this router instance */
74 setupRouter(configChunk);
75 break; /* We're a child; don't spawn any more children here */
82 int setupRouter(jsonObject* configChunk) {
84 if(!jsonObjectGetKey(configChunk, "transport"))
85 return 0; /* these are not the configs you're looking for */
87 const char* server = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/server"));
88 const char* port = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/port"));
89 const char* username = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/username"));
90 const char* password = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/password"));
91 const char* resource = jsonObjectGetString(jsonObjectFindPath(configChunk, "/transport/resource"));
93 const char* level = jsonObjectGetString(jsonObjectFindPath(configChunk, "/loglevel"));
94 const char* log_file = jsonObjectGetString(jsonObjectFindPath(configChunk, "/logfile"));
95 const char* facility = jsonObjectGetString(jsonObjectFindPath(configChunk, "/syslog"));
98 if(level) llevel = atoi(level);
100 if(!log_file) { fprintf(stderr, "Log file name not specified\n"); return -1; }
102 if(!strcmp(log_file, "syslog")) {
103 osrfLogInit( OSRF_LOG_TYPE_SYSLOG, "router", llevel );
104 osrfLogSetSyslogFacility(osrfLogFacilityToInt(facility));
107 osrfLogInit( OSRF_LOG_TYPE_FILE, "router", llevel );
108 osrfLogSetFile( log_file );
111 osrfLogInfo( OSRF_LOG_MARK, "Router connecting as: server: %s port: %s "
112 "user: %s resource: %s", server, port, username, resource );
115 if(port) iport = atoi( port );
117 osrfStringArray* tclients = osrfNewStringArray(4);
118 osrfStringArray* tservers = osrfNewStringArray(4);
120 jsonObject* tclientsList = jsonObjectFindPath(configChunk, "/trusted_domains/client");
121 jsonObject* tserversList = jsonObjectFindPath(configChunk, "/trusted_domains/server");
125 if(tserversList->type == JSON_ARRAY) {
126 for( i = 0; i != tserversList->size; i++ ) {
127 const char* serverDomain = jsonObjectGetString(jsonObjectGetIndex(tserversList, i));
128 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted server: %s", serverDomain);
129 osrfStringArrayAdd(tservers, serverDomain);
132 const char* serverDomain = jsonObjectGetString(tserversList);
133 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted server: %s", serverDomain);
134 osrfStringArrayAdd(tservers, serverDomain);
137 if(tclientsList->type == JSON_ARRAY) {
138 for( i = 0; i != tclientsList->size; i++ ) {
139 const char* clientDomain = jsonObjectGetString(jsonObjectGetIndex(tclientsList, i));
140 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted client: %s", clientDomain);
141 osrfStringArrayAdd(tclients, clientDomain);
144 const char* clientDomain = jsonObjectGetString(tclientsList);
145 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted client: %s", clientDomain);
146 osrfStringArrayAdd(tclients, clientDomain);
150 if( tclients->size == 0 || tservers->size == 0 ) {
151 osrfLogError( OSRF_LOG_MARK, "We need trusted servers and trusted client to run the router...");
152 osrfStringArrayFree( tservers );
153 osrfStringArrayFree( tclients );
157 router = osrfNewRouter( server,
158 username, resource, password, iport, tclients, tservers );
160 signal(SIGHUP,routerSignalHandler);
161 signal(SIGINT,routerSignalHandler);
162 signal(SIGTERM,routerSignalHandler);
164 if( (osrfRouterConnect(router)) != 0 ) {
165 fprintf(stderr, "Unable to connect router to jabber server %s... exiting\n", server );
166 osrfRouterFree(router);
171 osrfRouterRun( router );
173 // Shouldn't get here, since osrfRouterRun()
174 // should go into an infinite loop
176 osrfRouterFree(router);