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 transport_client* client = NULL;
20 int parse_request( char* request );
21 int handle_router( char* words[] );
22 int handle_time( char* words[] );
23 int handle_request( char* words[] );
24 int send_request( char* server, char* method, growing_buffer* buffer );
25 int parse_error( char* words[] );
26 int router_query_servers( char* server );
27 int srfsh_client_connect();
29 char* json_printer( json* object );
30 char* tabs(int count);
32 int main( int argc, char* argv[] ) {
35 fatal_handler( "usage: %s <config_file>", argv[0] );
37 config_reader_init( "opensrf", argv[1] );
39 if( ! osrf_system_bootstrap_client("srfsh.xml") )
40 fprintf( stderr, "Unable to bootstrap client for requests\n");
42 client = osrf_system_get_transport_client();
45 while((request=readline(prompt))) {
47 if( !strcmp(request, "exit") || !strcmp(request,"quit"))
50 char* req_copy = strdup(request);
52 if(parse_request( req_copy ) )
60 client_disconnect( client );
61 client_free( client );
69 int parse_error( char* words[] ) {
77 memset(buffer, 0, 256);
78 while( (current=words[i++]) ) {
79 strcat(buffer, current);
82 if( ! buffer || strlen(buffer) < 1 )
85 fprintf( stderr, "Command Incomplete or Not Recognized: %s\n", buffer );
91 int parse_request( char* request ) {
98 char* words[COMMAND_BUFSIZE];
99 memset(words,0,COMMAND_BUFSIZE);
100 //char* req = strdup(request);
103 char* cur_tok = strtok( req, " " );
105 if( cur_tok == NULL )
108 while(cur_tok != NULL) {
109 words[i++] = cur_tok;
110 cur_tok = strtok( NULL, " " );
115 // not sure why (strtok?), but this is necessary
116 memset( words + i, 0, COMMAND_BUFSIZE - i );
118 /* pass off to the top level command */
119 if( !strcmp(words[0],"router") )
120 ret_val = handle_router( words );
122 else if( !strcmp(words[0],"time") )
123 ret_val = handle_time( words );
125 else if (!strcmp(words[0],"request"))
126 ret_val = handle_request( words );
128 else if (!strcmp(words[0],"help"))
132 return parse_error( words );
139 int handle_router( char* words[] ) {
147 if( !strcmp(words[1],"query") ) {
149 if( words[2] && !strcmp(words[2],"servers") ) {
150 for(i=3; i < COMMAND_BUFSIZE - 3 && words[i]; i++ ) {
151 router_query_servers( words[i] );
162 int handle_request( char* words[] ) {
168 char* server = words[1];
169 char* method = words[2];
171 growing_buffer* buffer = buffer_init(128);
173 buffer_add(buffer, "[");
174 for(i = 3; words[i] != NULL; i++ ) {
175 buffer_add( buffer, words[i] );
176 buffer_add(buffer, " ");
178 buffer_add(buffer, "]");
180 return send_request( server, method, buffer );
186 int send_request( char* server, char* method, growing_buffer* buffer ) {
187 if( server == NULL || method == NULL )
191 if( buffer != NULL && buffer->n_used > 0 )
192 params = json_tokener_parse(buffer->buf);
194 osrf_app_session* session = osrf_app_client_session_init(server);
195 double start = get_timestamp_millis();
197 if(!osrf_app_session_connect(session)) {
198 warning_handler( "Unable to connect to remote service %s\n", server );
202 int req_id = osrf_app_session_make_request( session, params, method, 1 );
204 osrf_message* omsg = osrf_app_session_request_recv( session, req_id, 8 );
207 printf("Received no data from server\n");
211 if(omsg->result_content) {
212 char* content = json_printer( omsg->result_content );
213 printf( "Received Data: %s\n",content );
217 printf( "Received Message but no result data\n");
219 osrf_message_free(omsg);
220 omsg = osrf_app_session_request_recv( session, req_id, 5 );
224 if( osrf_app_session_request_complete( session, req_id ))
225 printf("[Request Completed Successfully]\n");
227 double end = get_timestamp_millis();
229 printf("Request Time in seconds: %f\n", end - start );
231 osrf_app_session_disconnect( session );
238 int handle_time( char* words[] ) {
245 printf( "%s\n", buf );
250 time_t epoch = (time_t)atoi( words[1] );
251 char* localtime = strdup( ctime( &epoch ) );
252 printf( "%s => %s", words[1], localtime );
263 int router_query_servers( char* router_server ) {
265 if( ! router_server || strlen(router_server) == 0 )
270 sprintf(rbuf,"router@%s/router", router_server );
272 transport_message* send =
273 message_init( "servers", NULL, NULL, rbuf, NULL );
274 message_set_router_info( send, NULL, NULL, NULL, "query", 0 );
276 client_send_message( client, send );
277 message_free( send );
279 transport_message* recv = client_recv( client, -1 );
281 fprintf(stderr, "NULL message received from router\n");
284 "---------------------------------------------------------------------------------\n"
285 "Received from 'server' query on %s\n"
286 "---------------------------------------------------------------------------------\n"
287 "original reg time | latest reg time | last used time | class | server\n"
288 "---------------------------------------------------------------------------------\n"
290 "---------------------------------------------------------------------------------\n"
291 , router_server, recv->body );
293 message_free( recv );
301 "---------------------------------------------------------------------------------\n"
303 "---------------------------------------------------------------------------------\n"
304 "help - Display this message\n"
305 "last - Re-performs the last command\n"
306 "time - Prints the current time\n"
307 "time <timestamp> - Formats seconds since epoch into readable format\n"
308 "---------------------------------------------------------------------------------\n"
309 "router query servers <server1 [, server2, ...]>\n"
310 " - Returns stats on connected services\n"
311 "reqeust <service> <method> [ <json formatted string of params> ]\n"
312 " - Anything passed in will be wrapped in a json array\n"
313 "---------------------------------------------------------------------------------\n"
321 char* tabs(int count) {
322 growing_buffer* buf = buffer_init(24);
324 for(i=0;i!=count;i++)
325 buffer_add(buf, " ");
327 char* final = buffer_data( buf );
332 char* json_printer( json* object ) {
336 char* string = json_object_to_json_string(object);
338 growing_buffer* buf = buffer_init(64);
341 for(i=0; i!= strlen(string); i++) {
343 if( string[i] == '{' ) {
345 buffer_add(buf, "\n");
346 char* tab = tabs(tab_var);
347 buffer_add(buf, tab);
349 buffer_add( buf, "{");
351 buffer_add( buf, "\n" );
353 buffer_add( buf, tab );
356 } else if( string[i] == '[' ) {
358 buffer_add(buf, "\n");
359 char* tab = tabs(tab_var);
360 buffer_add(buf, tab);
362 buffer_add( buf, "[");
364 buffer_add( buf, "\n" );
366 buffer_add( buf, tab );
369 } else if( string[i] == '}' ) {
372 buffer_add(buf, "\n");
373 char* tab = tabs(tab_var);
374 buffer_add(buf, tab);
376 buffer_add( buf, "}");
377 buffer_add( buf, "\n" );
379 buffer_add( buf, tab );
382 } else if( string[i] == ']' ) {
385 buffer_add(buf, "\n");
386 char* tab = tabs(tab_var);
387 buffer_add(buf, tab);
389 buffer_add( buf, "]");
390 buffer_add( buf, "\n" );
392 buffer_add( buf, tab );
399 buffer_add( buf, b );
404 char* result = buffer_data(buf);