]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/router/osrf_router_main.c
706d21426757c5f96af86f8d639304589851de28
[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 <signal.h>
6
7 static osrfRouter* router = NULL;
8
9 void routerSignalHandler( int signo ) {
10         osrfLogWarning( OSRF_LOG_MARK, "Received signal [%d], cleaning up...", signo );
11         osrfConfigCleanup();
12         osrfRouterFree(router);
13         router = NULL;
14
15         // Exit by re-raising the signal so that the parent
16         // process can detect it
17         
18         signal( signo, SIG_DFL );
19         raise( signo );
20 }
21
22 static int setupRouter( char* config, char* context );
23
24
25 int main( int argc, char* argv[] ) {
26
27         if( argc < 3 ) {
28                 osrfLogError( OSRF_LOG_MARK,  "Usage: %s <path_to_config_file> <config_context>", argv[0] );
29                 exit(0);
30         }
31
32         char* config = strdup( argv[1] );
33         char* context = strdup( argv[2] );
34         init_proc_title( argc, argv );
35         set_proc_title( "OpenSRF Router" );
36
37         int rc = setupRouter( config, context );
38         free(config);
39         free(context);
40         return rc ? EXIT_FAILURE : EXIT_SUCCESS;
41 }
42
43 int setupRouter( char* config, char* context ) {
44
45         osrfConfig* cfg = osrfConfigInit( config, context );
46         osrfConfigSetDefaultConfig(cfg);
47
48         char* server                    = osrfConfigGetValue(NULL, "/transport/server");
49         char* port                              = osrfConfigGetValue(NULL, "/transport/port");
50         char* username                  = osrfConfigGetValue(NULL, "/transport/username");
51         char* password                  = osrfConfigGetValue(NULL, "/transport/password");
52         char* resource                  = osrfConfigGetValue(NULL, "/transport/resource");
53
54         /* set up the logger */
55         char* level = osrfConfigGetValue(NULL, "/loglevel");
56         char* log_file = osrfConfigGetValue(NULL, "/logfile");
57         char* facility = osrfConfigGetValue(NULL, "/syslog");
58
59         int llevel = 1;
60         if(level) llevel = atoi(level);
61
62         if(!log_file) { fprintf(stderr, "Log file name not specified\n"); return -1; }
63
64         if(!strcmp(log_file, "syslog")) {
65                 osrfLogInit( OSRF_LOG_TYPE_SYSLOG, "router", llevel );
66                 osrfLogSetSyslogFacility(osrfLogFacilityToInt(facility));
67
68         } else {
69                 osrfLogInit( OSRF_LOG_TYPE_FILE, "router", llevel );
70                 osrfLogSetFile( log_file );
71         }
72
73         free(facility);
74         free(level);
75         free(log_file);
76
77         osrfLogInfo(  OSRF_LOG_MARK, "Router connecting as: server: %s port: %s "
78                         "user: %s resource: %s", server, port, username, resource );
79
80         int iport = 0;
81         if(port)        iport = atoi( port );
82
83         osrfStringArray* tclients = osrfNewStringArray(4);
84         osrfStringArray* tservers = osrfNewStringArray(4);
85         osrfConfigGetValueList(NULL, tservers, "/trusted_domains/server" );
86         osrfConfigGetValueList(NULL, tclients, "/trusted_domains/client" );
87
88         int i;
89         for( i = 0; i != tservers->size; i++ ) 
90                 osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted server: %s", osrfStringArrayGetString( tservers, i ) );
91
92         for( i = 0; i != tclients->size; i++ ) 
93                 osrfLogInfo( OSRF_LOG_MARK,  "Router adding trusted client: %s", osrfStringArrayGetString( tclients, i ) );
94
95         if( tclients->size == 0 || tservers->size == 0 ) {
96                 osrfLogError( OSRF_LOG_MARK, "We need trusted servers and trusted client to run the router...");
97                 osrfStringArrayFree( tservers );
98                 osrfStringArrayFree( tclients );
99                 return -1;
100         }
101
102         router = osrfNewRouter( server,
103                         username, resource, password, iport, tclients, tservers );
104         
105         signal(SIGHUP,routerSignalHandler);
106         signal(SIGINT,routerSignalHandler);
107         signal(SIGTERM,routerSignalHandler);
108
109         if( (osrfRouterConnect(router)) != 0 ) {
110                 fprintf(stderr, "!!!! Unable to connect router to jabber server %s... exiting", server );
111                 osrfRouterFree(router);
112                 return -1;
113         }
114
115         free(server); free(port); 
116         free(username); free(password);
117         free(resource);
118
119         daemonize();
120         osrfRouterRun( router );
121
122         // Shouldn't get here, since osrfRouterRun()
123         // should go into an infinite loop
124
125         osrfRouterFree(router);
126         router = NULL;
127         
128         return -1;
129 }
130
131