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"
8 #include <readline/readline.h>
9 #include <readline/history.h>
12 #define SRFSH_PORT 5222
13 #define COMMAND_BUFSIZE 12
16 char* prompt = "srfsh# ";
18 /* our jabber connection */
19 transport_client* client = NULL;
22 int parse_request( char* request );
23 int handle_router( char* words[] );
24 int handle_time( char* words[] );
25 int handle_request( char* words[] );
26 int send_request( char* server, char* method, growing_buffer* buffer );
27 int parse_error( char* words[] );
28 int router_query_servers( char* server );
29 int srfsh_client_connect();
31 char* json_printer( json* object );
32 char* tabs(int count);
36 int main( int argc, char* argv[] ) {
40 /* see if they have a .srfsh.xml in their home directory */
41 char* home = getenv("HOME");
42 int l = strlen(home) + 36;
45 sprintf(fbuf,"%s/.srfsh.xml",home);
47 if(!access(fbuf, F_OK)) {
48 if( ! osrf_system_bootstrap_client(fbuf) )
49 fatal_handler( "Unable to bootstrap client for requests");
52 fatal_handler( "No Config file found at %s and none specified. "
53 "\nusage: %s <config_file>", fbuf, argv[0] );
57 if( ! osrf_system_bootstrap_client(argv[1]) )
58 fatal_handler( "Unable to bootstrap client for requests");
61 client = osrf_system_get_transport_client();
64 /* main process loop */
66 while((request=readline(prompt))) {
68 if( !strcmp(request, "exit") || !strcmp(request,"quit"))
71 char* req_copy = strdup(request);
73 if(parse_request( req_copy ) )
81 client_disconnect( client );
82 client_free( client );
90 int parse_error( char* words[] ) {
98 memset(buffer, 0, 256);
99 while( (current=words[i++]) ) {
100 strcat(buffer, current);
103 if( ! buffer || strlen(buffer) < 1 )
106 fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
112 int parse_request( char* request ) {
114 if( request == NULL )
119 char* words[COMMAND_BUFSIZE];
120 memset(words,0,COMMAND_BUFSIZE);
123 char* cur_tok = strtok( req, " " );
125 if( cur_tok == NULL )
128 while(cur_tok != NULL) {
129 words[i++] = cur_tok;
130 cur_tok = strtok( NULL, " " );
134 // not sure why (strtok?), but this is necessary
135 memset( words + i, 0, COMMAND_BUFSIZE - i );
137 /* pass off to the top level command */
138 if( !strcmp(words[0],"router") )
139 ret_val = handle_router( words );
141 else if( !strcmp(words[0],"time") )
142 ret_val = handle_time( words );
144 else if (!strcmp(words[0],"request"))
145 ret_val = handle_request( words );
147 else if (!strcmp(words[0],"help"))
151 return parse_error( words );
158 int handle_router( char* words[] ) {
166 if( !strcmp(words[1],"query") ) {
168 if( words[2] && !strcmp(words[2],"servers") ) {
169 for(i=3; i < COMMAND_BUFSIZE - 3 && words[i]; i++ ) {
170 router_query_servers( words[i] );
181 int handle_request( char* words[] ) {
187 char* server = words[1];
188 char* method = words[2];
190 growing_buffer* buffer = buffer_init(128);
192 buffer_add(buffer, "[");
193 for(i = 3; words[i] != NULL; i++ ) {
194 buffer_add( buffer, words[i] );
195 buffer_add(buffer, " ");
197 buffer_add(buffer, "]");
199 return send_request( server, method, buffer );
205 int send_request( char* server, char* method, growing_buffer* buffer ) {
206 if( server == NULL || method == NULL )
210 if( buffer != NULL && buffer->n_used > 0 )
211 params = json_tokener_parse(buffer->buf);
213 osrf_app_session* session = osrf_app_client_session_init(server);
214 double start = get_timestamp_millis();
216 if(!osrf_app_session_connect(session)) {
217 warning_handler( "Unable to connect to remote service %s\n", server );
221 int req_id = osrf_app_session_make_request( session, params, method, 1 );
223 osrf_message* omsg = osrf_app_session_request_recv( session, req_id, 8 );
226 printf("\nReceived no data from server\n");
230 if(omsg->result_content) {
231 char* content = json_printer( omsg->result_content );
232 printf( "\nReceived Data: %s\n",content );
236 printf( "\nReceived Exception:\nName: %s\nStatus: "
237 "%s\nStatusCode %d\n", omsg->status_name,
238 omsg->status_text, omsg->status_code );
241 osrf_message_free(omsg);
242 omsg = osrf_app_session_request_recv( session, req_id, 5 );
245 double end = get_timestamp_millis();
247 printf("\n------------------------------------\n");
248 if( osrf_app_session_request_complete( session, req_id ))
249 printf("Request Completed Successfully\n");
252 printf("Request Time in seconds: %f\n", end - start );
253 printf("------------------------------------\n");
255 osrf_app_session_request_finish( session, req_id );
256 osrf_app_session_disconnect( session );
257 osrf_app_session_destroy( session );
264 int handle_time( char* words[] ) {
271 printf( "%s\n", buf );
276 time_t epoch = (time_t)atoi( words[1] );
277 char* localtime = strdup( ctime( &epoch ) );
278 printf( "%s => %s", words[1], localtime );
289 int router_query_servers( char* router_server ) {
291 if( ! router_server || strlen(router_server) == 0 )
296 sprintf(rbuf,"router@%s/router", router_server );
298 transport_message* send =
299 message_init( "servers", NULL, NULL, rbuf, NULL );
300 message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
302 client_send_message( client, send );
303 message_free( send );
305 transport_message* recv = client_recv( client, -1 );
307 fprintf(stderr, "NULL message received from router\n");
310 "---------------------------------------------------------------------------------\n"
311 "Received from 'server' query on %s\n"
312 "---------------------------------------------------------------------------------\n"
313 "original reg time | latest reg time | last used time | class | server\n"
314 "---------------------------------------------------------------------------------\n"
316 "---------------------------------------------------------------------------------\n"
317 , router_server, recv->body );
319 message_free( recv );
327 "---------------------------------------------------------------------------------\n"
329 "---------------------------------------------------------------------------------\n"
330 "help - Display this message\n"
331 "last - Re-performs the last command\n"
332 "time - Prints the current time\n"
333 "time <timestamp> - Formats seconds since epoch into readable format\n"
334 "---------------------------------------------------------------------------------\n"
335 "router query servers <server1 [, server2, ...]>\n"
336 " - Returns stats on connected services\n"
338 "reqeust <service> <method> [ <json formatted string of params> ]\n"
339 " - Anything passed in will be wrapped in a json array,\n"
340 " so add commas if there is more than one param\n"
341 "---------------------------------------------------------------------------------\n"
349 char* tabs(int count) {
350 growing_buffer* buf = buffer_init(24);
352 for(i=0;i!=count;i++)
353 buffer_add(buf, " ");
355 char* final = buffer_data( buf );
360 char* json_printer( json* object ) {
364 char* string = json_object_to_json_string(object);
366 growing_buffer* buf = buffer_init(64);
369 for(i=0; i!= strlen(string); i++) {
371 if( string[i] == '{' ) {
373 buffer_add(buf, "\n");
374 char* tab = tabs(tab_var);
375 buffer_add(buf, tab);
377 buffer_add( buf, "{");
379 buffer_add( buf, "\n" );
381 buffer_add( buf, tab );
384 } else if( string[i] == '[' ) {
386 buffer_add(buf, "\n");
387 char* tab = tabs(tab_var);
388 buffer_add(buf, tab);
390 buffer_add( buf, "[");
392 buffer_add( buf, "\n" );
394 buffer_add( buf, tab );
397 } else if( string[i] == '}' ) {
400 buffer_add(buf, "\n");
401 char* tab = tabs(tab_var);
402 buffer_add(buf, tab);
404 buffer_add( buf, "}");
405 buffer_add( buf, "\n" );
407 buffer_add( buf, tab );
410 } else if( string[i] == ']' ) {
413 buffer_add(buf, "\n");
414 char* tab = tabs(tab_var);
415 buffer_add(buf, tab);
417 buffer_add( buf, "]");
418 buffer_add( buf, "\n" );
420 buffer_add( buf, tab );
427 buffer_add( buf, b );
432 char* result = buffer_data(buf);