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