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, "Usage: %s <path_to_config_file> <config_context>", argv[0] );
41 char* config = strdup( argv[1] );
42 char* context = strdup( argv[2] );
43 init_proc_title( argc, argv );
44 set_proc_title( "OpenSRF Router" );
46 osrfConfig* cfg = osrfConfigInit(config, context);
47 osrfConfigSetDefaultConfig(cfg);
48 jsonObject* configInfo = osrfConfigGetValueObject(NULL, "/router");
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);
62 int setupRouter(jsonObject* configChunk) {
64 if(!jsonObjectGetKey(configChunk, "transport"))
65 return 0; /* these are not the configs you're looking for */
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"));
73 char* level = jsonObjectGetString(jsonObjectFindPath(configChunk, "/loglevel"));
74 char* log_file = jsonObjectGetString(jsonObjectFindPath(configChunk, "/logfile"));
75 char* facility = jsonObjectGetString(jsonObjectFindPath(configChunk, "/syslog"));
78 if(level) llevel = atoi(level);
80 if(!log_file) { fprintf(stderr, "Log file name not specified\n"); return -1; }
82 if(!strcmp(log_file, "syslog")) {
83 osrfLogInit( OSRF_LOG_TYPE_SYSLOG, "router", llevel );
84 osrfLogSetSyslogFacility(osrfLogFacilityToInt(facility));
87 osrfLogInit( OSRF_LOG_TYPE_FILE, "router", llevel );
88 osrfLogSetFile( log_file );
95 osrfLogInfo( OSRF_LOG_MARK, "Router connecting as: server: %s port: %s "
96 "user: %s resource: %s", server, port, username, resource );
99 if(port) iport = atoi( port );
101 osrfStringArray* tclients = osrfNewStringArray(4);
102 osrfStringArray* tservers = osrfNewStringArray(4);
104 jsonObject* tclientsList = jsonObjectFindPath(configChunk, "/trusted_domains/client");
105 jsonObject* tserversList = jsonObjectFindPath(configChunk, "/trusted_domains/server");
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);
116 char* serverDomain = jsonObjectGetString(tserversList);
117 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted server: %s", serverDomain);
118 osrfStringArrayAdd(tservers, serverDomain);
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);
128 char* clientDomain = jsonObjectGetString(tclientsList);
129 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted client: %s", clientDomain);
130 osrfStringArrayAdd(tclients, clientDomain);
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 );
141 router = osrfNewRouter( server,
142 username, resource, password, iport, tclients, tservers );
144 signal(SIGHUP,routerSignalHandler);
145 signal(SIGINT,routerSignalHandler);
146 signal(SIGTERM,routerSignalHandler);
148 if( (osrfRouterConnect(router)) != 0 ) {
149 fprintf(stderr, "Unable to connect router to jabber server %s... exiting", server );
150 osrfRouterFree(router);
155 osrfRouterRun( router );
157 // Shouldn't get here, since osrfRouterRun()
158 // should go into an infinite loop
160 osrfRouterFree(router);