1 #include "opensrf/transport_client.h"
2 #include "opensrf/generic_utils.h"
3 #include "opensrf/osrf_message.h"
4 #include "opensrf/osrf_app_session.h"
7 #define SRFSH_PORT 5222
8 #define COMMAND_BUFSIZE 12
11 char* prompt = "srfsh# ";
13 transport_client* client = NULL;
15 int parse_request( char* request );
16 int handle_router( char* words[] );
17 int handle_time( char* words[] );
18 int handle_request( char* words[] );
19 int send_request( char* server, char* method, growing_buffer* buffer );
20 int parse_error( char* words[] );
21 int router_query_servers( char* server );
22 int srfsh_client_connect();
24 char* json_printer( json* object );
25 char* tabs(int count);
27 int main( int argc, char* argv[] ) {
31 fatal_handler( "usage: %s <jabbersever> <username> <password> <config_file>", argv[0] );
33 config_reader_init( "opensrf", argv[4] );
36 memset(request, 0, 256);
39 client = client_init( argv[1], SRFSH_PORT, 0 );
40 if( ! client_connect( client, argv[2], argv[3], "srfsh", 5, AUTH_DIGEST ) ) {
41 fprintf(stderr, "Unable to connect to jabber server '%s' as '%s'\n", argv[1], argv[2]);
42 fprintf(stderr, "Most queries will be futile...\n" );
45 if( ! osrf_system_bootstrap_client("srfsh.xml") )
46 fprintf( stderr, "Unable to bootstrap client for requests\n");
49 while( fgets( request, 255, stdin) ) {
52 request[strlen(request)-1] = '\0';
54 if( !strcmp(request, "exit") || !strcmp(request,"quit")) {
55 client_disconnect( client );
56 client_free( client );
60 if(!strcmp(request,"last")) {
62 memset(request,0,256);
63 strcpy(request, last_request);
64 printf("%s\n", request);
71 char* req_copy = strdup(request);
73 if( !strcmp(request, "help") || !strcmp(request,"?"))
76 if(parse_request( req_copy ) && strcmp(request,"last") ) {
78 last_request = strdup(request);
84 memset(request, 0, 300);
88 fprintf(stderr, "Exiting...\n[Ignore Segfault]\n");
97 int parse_error( char* words[] ) {
105 memset(buffer, 0, 256);
106 while( (current=words[i++]) ) {
107 strcat(buffer, current);
110 if( ! buffer || strlen(buffer) < 1 )
113 fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
119 int parse_request( char* request ) {
121 if( request == NULL )
126 char* words[COMMAND_BUFSIZE];
127 memset(words,0,COMMAND_BUFSIZE);
128 //char* req = strdup(request);
131 char* cur_tok = strtok( req, " " );
133 if( cur_tok == NULL )
136 while(cur_tok != NULL) {
137 words[i++] = cur_tok;
138 cur_tok = strtok( NULL, " " );
143 // not sure why (strtok?), but this is necessary
144 memset( words + i, 0, COMMAND_BUFSIZE - i );
146 /* pass off to the top level command */
147 if( !strcmp(words[0],"router") )
148 ret_val = handle_router( words );
150 else if( !strcmp(words[0],"time") )
151 ret_val = handle_time( words );
153 else if (!strcmp(words[0],"request"))
154 ret_val = handle_request( words );
157 return parse_error( words );
164 int handle_router( char* words[] ) {
172 if( !strcmp(words[1],"query") ) {
174 if( words[2] && !strcmp(words[2],"servers") ) {
175 for(i=3; i < COMMAND_BUFSIZE - 3 && words[i]; i++ ) {
176 router_query_servers( words[i] );
187 int handle_request( char* words[] ) {
193 char* server = words[1];
194 char* method = words[2];
196 growing_buffer* buffer = buffer_init(128);
198 buffer_add(buffer, "[");
199 for(i = 3; words[i] != NULL; i++ ) {
200 buffer_add( buffer, words[i] );
201 buffer_add(buffer, " ");
203 buffer_add(buffer, "]");
205 return send_request( server, method, buffer );
211 int send_request( char* server, char* method, growing_buffer* buffer ) {
212 if( server == NULL || method == NULL )
216 if( buffer != NULL && buffer->n_used > 0 )
217 params = json_tokener_parse(buffer->buf);
219 osrf_app_session* session = osrf_app_client_session_init(server);
220 double start = get_timestamp_millis();
222 if(!osrf_app_session_connect(session)) {
223 warning_handler( "Unable to connect to remote service %s\n", server );
227 int req_id = osrf_app_session_make_request( session, params, method, 1 );
229 osrf_message* omsg = osrf_app_session_request_recv( session, req_id, 8 );
232 printf("Received no data from server\n");
236 if(omsg->result_content) {
237 char* content = json_printer( omsg->result_content );
238 printf( "Received Data: %s\n",content );
242 printf( "Received Message but no result data\n");
244 osrf_message_free(omsg);
245 omsg = osrf_app_session_request_recv( session, req_id, 5 );
249 if( osrf_app_session_request_complete( session, req_id ))
250 printf("[Request Completed Successfully]\n");
252 double end = get_timestamp_millis();
254 printf("Request Time in seconds: %f\n", end - start );
256 osrf_app_session_disconnect( session );
263 int handle_time( char* words[] ) {
270 printf( "%s\n", buf );
275 time_t epoch = (time_t)atoi( words[1] );
276 char* localtime = strdup( ctime( &epoch ) );
277 printf( "%s => %s", words[1], localtime );
288 int router_query_servers( char* router_server ) {
290 if( ! router_server || strlen(router_server) == 0 )
295 sprintf(rbuf,"router@%s/router", router_server );
297 transport_message* send =
298 message_init( "servers", NULL, NULL, rbuf, NULL );
299 message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
301 client_send_message( client, send );
302 message_free( send );
304 transport_message* recv = client_recv( client, -1 );
306 fprintf(stderr, "NULL message received from router\n");
309 "---------------------------------------------------------------------------------\n"
310 "Received from 'server' query on %s\n"
311 "---------------------------------------------------------------------------------\n"
312 "original reg time | latest reg time | last used time | class | server\n"
313 "---------------------------------------------------------------------------------\n"
315 "---------------------------------------------------------------------------------\n"
316 , router_server, recv->body );
318 message_free( recv );
326 "---------------------------------------------------------------------------------\n"
328 "---------------------------------------------------------------------------------\n"
329 "help - Display this message\n"
330 "last - Re-performs the last command\n"
331 "time - Prints the current time\n"
332 "time <timestamp> - Formats seconds since epoch into readable format\n"
333 "---------------------------------------------------------------------------------\n"
334 "router query servers <server1 [, server2, ...]>\n"
335 " - Returns stats on connected services\n"
336 "reqeust <service> <method> [ <json formatted string of params> ]\n"
337 " - Anything passed in will be wrapped in a json array\n"
338 "---------------------------------------------------------------------------------\n"
345 char* tabs(int count) {
346 growing_buffer* buf = buffer_init(24);
348 for(i=0;i!=count;i++)
349 buffer_add(buf, " ");
351 char* final = buffer_data( buf );
356 char* json_printer( json* object ) {
360 char* string = json_object_to_json_string(object);
362 growing_buffer* buf = buffer_init(64);
365 for(i=0; i!= strlen(string); i++) {
367 if( string[i] == '{' ) {
369 buffer_add(buf, "\n");
370 char* tab = tabs(tab_var);
371 buffer_add(buf, tab);
373 buffer_add( buf, "{");
375 buffer_add( buf, "\n" );
377 buffer_add( buf, tab );
380 } else if( string[i] == '[' ) {
382 buffer_add(buf, "\n");
383 char* tab = tabs(tab_var);
384 buffer_add(buf, tab);
386 buffer_add( buf, "[");
388 buffer_add( buf, "\n" );
390 buffer_add( buf, tab );
393 } else if( string[i] == '}' ) {
396 buffer_add(buf, "\n");
397 char* tab = tabs(tab_var);
398 buffer_add(buf, tab);
400 buffer_add( buf, "}");
401 buffer_add( buf, "\n" );
403 buffer_add( buf, tab );
406 } else if( string[i] == ']' ) {
409 buffer_add(buf, "\n");
410 char* tab = tabs(tab_var);
411 buffer_add(buf, tab);
413 buffer_add( buf, "]");
414 buffer_add( buf, "\n" );
416 buffer_add( buf, tab );
423 buffer_add( buf, b );
428 char* result = buffer_data(buf);