1 #include "opensrf/transport_client.h"
2 #include "opensrf/generic_utils.h"
5 #define SRFSH_PORT 5222
6 #define COMMAND_BUFSIZE 12
9 char* prompt = "srfsh# ";
11 transport_client* client = NULL;
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();
21 int main( int argc, char* argv[] ) {
25 fatal_handler( "usage: %s <jabbersever> <username> <password>", argv[0] );
28 memset(request, 0, 256);
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" );
38 while( fgets( request, 255, stdin) ) {
41 request[strlen(request)-1] = '\0';
43 if( !strcmp(request, "exit") || !strcmp(request,"quit")) {
44 client_disconnect( client );
45 client_free( client );
49 if(!strcmp(request,"last")) {
50 memset(request,0,256);
51 strcpy(request, last_request);
52 printf("%s\n", request);
55 last_request = strdup(request);
58 if( !strcmp(request, "help") || !strcmp(request,"?"))
61 parse_request( request );
64 memset(request, 0, 300);
67 fprintf(stderr, "Exiting...\n[Ignore Segfault]\n");
72 int parse_error( char* words[] ) {
80 memset(buffer, 0, 256);
81 while( (current=words[i++]) ) {
82 strcat(buffer, current);
85 if( ! buffer || strlen(buffer) < 1 )
88 fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
94 int parse_request( char* request ) {
101 char* words[COMMAND_BUFSIZE];
102 memset(words,0,COMMAND_BUFSIZE);
103 //char* req = strdup(request);
106 char* cur_tok = strtok( req, " " );
108 if( cur_tok == NULL )
111 while(cur_tok != NULL) {
112 words[i++] = cur_tok;
113 cur_tok = strtok( NULL, " " );
118 // not sure why (strtok?), but this is necessary
119 memset( words + i, 0, COMMAND_BUFSIZE - i );
121 /* pass off to the top level command */
122 if( !strcmp(words[0],"router") )
123 ret_val = handle_router( words );
125 if( !strcmp(words[0],"time") )
126 ret_val = handle_time( words );
129 return parse_error( words );
136 int handle_router( char* words[] ) {
144 if( !strcmp(words[1],"query") ) {
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] );
159 int handle_time( char* words[] ) {
166 printf( "%s\n", buf );
171 time_t epoch = (time_t)atoi( words[1] );
172 char* localtime = strdup( ctime( &epoch ) );
173 printf( "%s => %s", words[1], localtime );
184 int router_query_servers( char* router_server ) {
186 if( ! router_server || strlen(router_server) == 0 )
191 sprintf(rbuf,"router@%s/router", router_server );
193 transport_message* send =
194 message_init( "servers", NULL, NULL, rbuf, NULL );
195 message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
197 client_send_message( client, send );
198 message_free( send );
200 transport_message* recv = client_recv( client, -1 );
202 fprintf(stderr, "NULL message received from router\n");
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"
211 "---------------------------------------------------------------------------------\n"
212 , router_server, recv->body );
214 message_free( recv );
222 "---------------------------------------------------------------------------------\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"