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