]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/srfsh/srfsh.c
v1, currently only answers to 'exit', 'quit', 'help', and a single router
[OpenSRF.git] / src / srfsh / srfsh.c
1 #include "opensrf/transport_client.h"
2
3 #define SRFSH_SERVER "elroy"
4 #define SRFSH_PORT 5222
5 #define SRFSH_USER "admin"
6 #define COMMAND_BUFSIZE 12
7
8
9 char* prompt = "srfsh# ";
10 transport_client* client = NULL;
11
12 int parse_request( char* request );
13 int handle_router( char* words[] );
14 int parse_error( char* words[] );
15 int router_query_servers( char* server );
16 int srfsh_client_connect();
17 void print_help();
18
19 int main( int argc, char* argv[] ) {
20
21
22         char request[256];
23         memset(request, 0, 256);
24         printf(prompt);
25
26         client = client_init( SRFSH_SERVER , SRFSH_PORT );
27         if( ! client_connect( client, SRFSH_USER, "asdfjkjk", "srfsh", 5 ) ) {
28                 fprintf(stderr, "Unable to connect to jabber server 'elroy' as 'admin'\n");
29                 fprintf(stderr, "Most queries will be futile...\n" );
30         }
31
32
33         while( fgets( request, 255, stdin) ) {
34
35                 // remove newline
36                 request[strlen(request)-1] = '\0';
37
38                 if( !strcmp(request, "exit") || !strcmp(request,"quit")) { 
39                         client_disconnect( client );
40                         client_free( client );  
41                         break; 
42                 }
43
44
45                 if( !strcmp(request, "help") || !strcmp(request,"?")) 
46                         print_help();
47                 else 
48                         parse_request( request );
49
50                 printf(prompt);
51                 memset(request, 0, 300);
52         }
53
54         fprintf(stderr, "Exiting...\n[Ignore Segfault]\n");
55         return 0;
56 }
57
58
59 int parse_error( char* words[] ) {
60
61         if( ! words )
62                 return 0;
63
64         int i = 0;
65         char* current;
66         char buffer[256];
67         memset(buffer, 0, 256);
68         while( (current=words[i++]) ) {
69                 strcat(buffer, current);
70                 strcat(buffer, " ");
71         }
72         if( ! buffer || strlen(buffer) < 1 ) 
73                 printf("\n");
74
75         fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
76         return 0;
77
78 }
79
80
81 int parse_request( char* request ) {
82
83         if( request == NULL )
84                 return 0;
85
86         int ret_val = 0;
87         int i = 0;
88         char* words[COMMAND_BUFSIZE]; 
89         memset(words,0,COMMAND_BUFSIZE);
90
91         char* cur_tok = strtok( request, " " );
92
93         if( cur_tok == NULL )
94                 return 0;
95
96         while(cur_tok != NULL) {
97                 words[i++] = cur_tok;
98                 cur_tok = strtok( NULL, " " );
99         }
100
101         // not sure why (strtok?), but this is necessary
102         memset( words + i, 0, COMMAND_BUFSIZE - i );
103
104         /* pass off to the top level command */
105         if( !strcmp(words[0],"router") ) 
106                 ret_val = handle_router( words );
107
108         if(!ret_val)
109                 return parse_error( words );
110
111         return 1;
112
113 }
114
115
116 int handle_router( char* words[] ) {
117
118         if(!client)
119                 return 1;
120
121         int i;
122
123         if( words[1] ) { 
124                 if( !strcmp(words[1],"query") ) {
125                         
126                         if( words[2] && !strcmp(words[2],"servers") ) {
127                                 for(i=3; i < COMMAND_BUFSIZE - 3 && words[i]; i++ ) {   
128                                         router_query_servers( words[i] );
129                                 }
130                                 return 1;
131                         }
132                         return 0;
133                 }
134                 return 0;
135         }
136         return 0;
137 }
138
139                 
140
141 int router_query_servers( char* router_server ) {
142
143         if( ! router_server || strlen(router_server) == 0 ) 
144                 return 0;
145
146         char rbuf[256];
147         memset(rbuf,0,256);
148         sprintf(rbuf,"router@%s/router", router_server );
149                 
150         transport_message* send = 
151                 message_init( "servers", NULL, NULL, rbuf, NULL );
152         message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
153
154         client_send_message( client, send );
155         message_free( send );
156
157         transport_message* recv = client_recv( client, -1 );
158         if( recv == NULL )
159                 fprintf(stderr, "NULL message received from router\n");
160         
161         printf( 
162                         "---------------------------------------------------------------------------------\n"
163                         "Received from 'server' query on %s\n"
164                         "---------------------------------------------------------------------------------\n"
165                         "original reg time | latest reg time | last used time | class | server\n"
166                         "---------------------------------------------------------------------------------\n"
167                         "%s"
168                         "---------------------------------------------------------------------------------\n"
169                         , router_server, recv->body );
170
171         message_free( recv );
172         
173         return 1;
174 }
175                 
176 void print_help() {
177
178         printf(
179                         "---------------------------------------------------------------------------------\n"
180                         "Commands:\n"
181                         "---------------------------------------------------------------------------------\n"
182                         "router query servers <server1 [, server2, ...]>\n"
183                         "router register <class>\n"
184                         "---------------------------------------------------------------------------------\n"
185                         );
186
187 }