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 osrfRouterFree(router);
16 // Exit by re-raising the signal so that the parent
17 // process can detect it
19 signal( signo, SIG_DFL );
23 static int setupRouter(jsonObject* configChunk);
26 int main( int argc, char* argv[] ) {
29 osrfLogError( OSRF_LOG_MARK, "Usage: %s <path_to_config_file> <config_context>", argv[0] );
33 char* config = strdup( argv[1] );
34 char* context = strdup( argv[2] );
35 init_proc_title( argc, argv );
36 set_proc_title( "OpenSRF Router" );
38 osrfConfig* cfg = osrfConfigInit(config, context);
39 osrfConfigSetDefaultConfig(cfg);
40 jsonObject* configInfo = osrfConfigGetValueObject(NULL, "/router");
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);
54 int setupRouter(jsonObject* configChunk) {
56 if(!jsonObjectGetKey(configChunk, "transport"))
57 return 0; /* these are not the configs you're looking for */
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"));
65 char* level = jsonObjectGetString(jsonObjectFindPath(configChunk, "/loglevel"));
66 char* log_file = jsonObjectGetString(jsonObjectFindPath(configChunk, "/logfile"));
67 char* facility = jsonObjectGetString(jsonObjectFindPath(configChunk, "/syslog"));
70 if(level) llevel = atoi(level);
72 if(!log_file) { fprintf(stderr, "Log file name not specified\n"); return -1; }
74 if(!strcmp(log_file, "syslog")) {
75 osrfLogInit( OSRF_LOG_TYPE_SYSLOG, "router", llevel );
76 osrfLogSetSyslogFacility(osrfLogFacilityToInt(facility));
79 osrfLogInit( OSRF_LOG_TYPE_FILE, "router", llevel );
80 osrfLogSetFile( log_file );
87 osrfLogInfo( OSRF_LOG_MARK, "Router connecting as: server: %s port: %s "
88 "user: %s resource: %s", server, port, username, resource );
91 if(port) iport = atoi( port );
93 osrfStringArray* tclients = osrfNewStringArray(4);
94 osrfStringArray* tservers = osrfNewStringArray(4);
96 jsonObject* tclientsList = jsonObjectFindPath(configChunk, "/trusted_domains/client");
97 jsonObject* tserversList = jsonObjectFindPath(configChunk, "/trusted_domains/server");
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);
108 char* serverDomain = jsonObjectGetString(tserversList);
109 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted server: %s", serverDomain);
110 osrfStringArrayAdd(tservers, serverDomain);
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);
120 char* clientDomain = jsonObjectGetString(tclientsList);
121 osrfLogInfo( OSRF_LOG_MARK, "Router adding trusted client: %s", clientDomain);
122 osrfStringArrayAdd(tclients, clientDomain);
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 );
133 router = osrfNewRouter( server,
134 username, resource, password, iport, tclients, tservers );
136 signal(SIGHUP,routerSignalHandler);
137 signal(SIGINT,routerSignalHandler);
138 signal(SIGTERM,routerSignalHandler);
140 if( (osrfRouterConnect(router)) != 0 ) {
141 fprintf(stderr, "Unable to connect router to jabber server %s... exiting", server );
142 osrfRouterFree(router);
147 osrfRouterRun( router );
149 // Shouldn't get here, since osrfRouterRun()
150 // should go into an infinite loop
152 osrfRouterFree(router);