]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/router/router.h
added a debug_handler for verbose output
[OpenSRF.git] / src / router / router.h
1 #include "opensrf/transport_client.h"
2 #include "opensrf/transport_message.h"
3 #include <time.h>
4 #include <sys/select.h>
5
6 #ifndef ROUTER_H
7 #define ROUTER_H
8
9 #define ROUTER_MAX_TRUSTED 256
10
11 // ----------------------------------------------------------------------
12 // Jabber router_registrar/load balancer.  There is a top level linked list of 
13 // server_class_nodes.  A server class represents the a cluster of Jabber
14 // clients that define a single logical routing endpoint.  Each of these 
15 // server_class_nodes maintains a list of connected server_nodes, which
16 // represents the pool of connected server endpoints.  A request 
17 // directed at a particular class is routed to the next available
18 // server endpoint.
19 //
20 // ----------------------------------------------------------------------
21
22
23 // ----------------------------------------------------------------------
24 // Defines an element in a server list.  The server list is a circular
25 // doubly linked list.  User is responsible for freeing a server_node with 
26 // server_node_free()
27 // ----------------------------------------------------------------------
28 struct server_node_struct {
29
30         struct server_node_struct* next;
31         struct server_node_struct* prev;
32
33         time_t la_time; /* last time we sent a message to a server */
34         time_t reg_time;        /* time we originally registered */
35         time_t upd_time;        /* last re-register time */
36         int available;          /* true if we may be used */
37
38         int serve_count; /* how many messages we've sent */
39
40         /* jabber remote id  for this server node*/
41         char* remote_id;
42
43         /* we cache the last sent message in case our remote 
44                 endpoint has gone away.  If it has, the next server
45                 node in the list will re-send our last message */
46         transport_message* last_sent;
47
48 };
49 typedef struct server_node_struct server_node;
50
51
52 // ----------------------------------------------------------------------
53 // Models a basic jabber connection structure.  Any component that 
54 // connects to jabber will have one of these.
55 // ----------------------------------------------------------------------
56 struct jabber_connect_struct {
57
58         char* server;
59         int port;
60         char* username;
61         char* password;
62         char* resource;
63         int connect_timeout;
64
65         transport_client* t_client;
66 };
67 typedef struct jabber_connect_struct jabber_connect;
68
69
70
71 // ----------------------------------------------------------------------
72 // Defines an element in the list of server classes.  User is 
73 // responsible for freeing a server_class_node with 
74 // server_class_node_free().
75 // The server_node_list is a doubly (not circular) linked list
76 // ----------------------------------------------------------------------
77 struct server_class_node_struct {
78
79         /* the name of our class.  This will be used as the jabber
80          resource when we create a class level connection*/
81         char* server_class;
82
83         /* the current node in the ring of available server nodes */
84         server_node* current_server_node;
85
86         /* next and prev class_node pointers */
87         struct server_class_node_struct* next;
88         struct server_class_node_struct* prev;
89
90         /* our jabber connection struct */
91         jabber_connect* jabber;
92
93 };
94 typedef struct server_class_node_struct server_class_node;
95
96 // ----------------------------------------------------------------------
97 // Top level router_registrar object.  Maintains the list of 
98 // server_class_nodes and the top level router jabber connection.
99 // ----------------------------------------------------------------------
100 struct transport_router_registrar_struct {
101
102         /* the list of server class nodes */
103         server_class_node* server_class_list;
104
105         /* if we don't hear from the client in this amount of time
106                 we consider them dead... */ 
107         /* not currently used */
108         int client_timeout; /* seconds */
109
110         /* our top level connection to the jabber server */
111         jabber_connect* jabber; 
112
113         /* true if we connect to jabber as a jabber component */
114         int component;
115
116         char** trusted_servers;
117         char** trusted_clients;
118
119
120 };
121 typedef struct transport_router_registrar_struct transport_router_registrar;
122
123
124
125
126 // ----------------------------------------------------------------------
127 // Returns an allocated transport_router_registrar.  The user is responsible for
128 // freeing the allocated memory with router_registrar_free()
129 // client_timeout is unused at this time.
130 // connect_timeout is how long we will wait for a failed jabber connect
131 // attempt for the top level connection.
132 // ----------------------------------------------------------------------
133 transport_router_registrar* router_registrar_init( char* server, 
134                 int port, char* username, char* password, char* resource, 
135                 int client_timeout, int connect_timeout, int component );
136
137 // ----------------------------------------------------------------------
138 // Connects the top level router_registrar object to the Jabber server.
139 // ----------------------------------------------------------------------
140 int router_registrar_connect( transport_router_registrar* router );
141
142 // ----------------------------------------------------------------------
143 // Connects the given jabber_connect object to the Jabber server
144 // ----------------------------------------------------------------------
145 int j_connect( jabber_connect* jabber );
146
147
148 // ----------------------------------------------------------------------
149 // Builds and initializes a jabber_connect object. User is responsible
150 // for freeing the memory with jabber_connect_free();
151 // ----------------------------------------------------------------------
152 jabber_connect* jabber_connect_init( char* server, 
153                 int port, char* username, char* password, 
154                 char* resource, int connect_timeout, int component );
155
156 // ----------------------------------------------------------------------
157 // Allocates and initializes a server class instance.  This will be
158 // called when a new class message arrives.  It will connect to Jabber
159 // as router_registrar->username@router_registrar->server/new_class
160 // ----------------------------------------------------------------------
161 server_class_node* init_server_class( 
162                 transport_router_registrar* router_registrar, char* remote_id, char* server_class ); 
163
164 // ----------------------------------------------------------------------
165 // Allocates and initializes a server_node object.  The object must
166 // be freed with server_node_free().  
167 // remote_id is the full jabber login for the remote server connection
168 // I.e. where we send messages when we want to send them to this 
169 // server.
170 // ----------------------------------------------------------------------
171 server_node* init_server_node(  char* remote_id );
172
173
174 // ----------------------------------------------------------------------
175 // Routes messages sent to the provided server_class_node's class
176 // ----------------------------------------------------------------------
177 int  server_class_handle_msg( transport_router_registrar* router, 
178                 server_class_node* s_node, transport_message* msg );
179
180 // ----------------------------------------------------------------------
181 // Determines what to do with an inbound register/unregister message.
182 // ----------------------------------------------------------------------
183 int router_registrar_handle_msg( transport_router_registrar*, transport_message* msg );
184
185 // ----------------------------------------------------------------------
186 // Deallocates the memory occupied by the given server_node
187 // ----------------------------------------------------------------------
188 int server_node_free( server_node* node );
189
190 // ----------------------------------------------------------------------
191 // Deallocates the memory used by the given server_class_node.  This
192 // will also free any attached server_node's.
193 // ----------------------------------------------------------------------
194 int server_class_node_free( server_class_node* node );
195
196 // ----------------------------------------------------------------------
197 // Deallocates the memory used by a server_node
198 // ----------------------------------------------------------------------
199 int server_node_free( server_node* node );
200
201
202 // ----------------------------------------------------------------------
203 // Deallocates a jabber_connect node
204 // ----------------------------------------------------------------------
205 int jabber_connect_free( jabber_connect* jabber );
206
207 // ----------------------------------------------------------------------
208 // Deallocates the memory used by the router_registrar.  This will also call
209 // server_class_node_free on any attached server_class_nodes.
210 // ----------------------------------------------------------------------
211 int router_registrar_free( transport_router_registrar* router_registrar );
212
213
214 // ----------------------------------------------------------------------
215 //  Returns the server_node with the given Jabber remote_id
216 // ----------------------------------------------------------------------
217 server_node * find_server_node ( server_class_node * class, const char * remote_id );
218
219
220 // ----------------------------------------------------------------------
221 // Returns the server_class_node object with the given class_name
222 // ----------------------------------------------------------------------
223 server_class_node * find_server_class ( transport_router_registrar * router, const char * class_id );
224
225 // ----------------------------------------------------------------------
226 // Removes a server class from the top level router_registrar
227 // ----------------------------------------------------------------------
228 int unregister_server_node( server_class_node* active_class_node, char* remote_id );
229
230 int fill_fd_set( transport_router_registrar* router, fd_set* set );
231
232 void listen_loop( transport_router_registrar* router );
233
234
235 int router_return_server_info( transport_router_registrar* router, transport_message* msg );
236
237 int remove_server_class( transport_router_registrar* router, server_class_node* class );
238 // ----------------------------------------------------------------------
239 // Adds a handler for the SIGUSR1 that we send to wake all the 
240 // listening threads.
241 // ----------------------------------------------------------------------
242 //void sig_handler( int sig );
243
244 #endif