From ac5399b3432cabca65ed362138ffcf4f8e917ebd Mon Sep 17 00:00:00 2001 From: "Michael J. Pounders" Date: Sat, 27 Sep 2014 21:11:53 -0400 Subject: [PATCH] Fix displayed idle and online time, add CHANGES files, and some code clean up --- shm_utils/mon-umurmurd/CHANGES | 3 + shm_utils/mon-umurmurd/README.md | 4 +- shm_utils/mon-umurmurd/mon-umurmurd.c | 122 +++++++++--------- shm_utils/umurmurd-websocket/CHANGES | 3 + .../src/uMurmurd_Websocket.c | 92 ++++++------- .../umurmurd-websocket/web/mon_umurmurd.html | 8 +- src/sharedmemory.c | 35 ++--- src/sharedmemory_struct.h | 6 +- 8 files changed, 146 insertions(+), 127 deletions(-) create mode 100644 shm_utils/mon-umurmurd/CHANGES create mode 100644 shm_utils/umurmurd-websocket/CHANGES diff --git a/shm_utils/mon-umurmurd/CHANGES b/shm_utils/mon-umurmurd/CHANGES new file mode 100644 index 0000000..606e46e --- /dev/null +++ b/shm_utils/mon-umurmurd/CHANGES @@ -0,0 +1,3 @@ +* code clean up and some comments added +* 100% of the useful client data shown +* outputs a more meaningful idle and online time, both are reported in secs \ No newline at end of file diff --git a/shm_utils/mon-umurmurd/README.md b/shm_utils/mon-umurmurd/README.md index 9d0d519..eaaeb2b 100644 --- a/shm_utils/mon-umurmurd/README.md +++ b/shm_utils/mon-umurmurd/README.md @@ -4,4 +4,6 @@ mon-umurmurd outputs server/client data to term useing the sharedmemory API added to umurmur for testing make -./mon-umurmurd \ No newline at end of file +./mon-umurmurd + + diff --git a/shm_utils/mon-umurmurd/mon-umurmurd.c b/shm_utils/mon-umurmurd/mon-umurmurd.c index 046050f..444456c 100644 --- a/shm_utils/mon-umurmurd/mon-umurmurd.c +++ b/shm_utils/mon-umurmurd/mon-umurmurd.c @@ -11,46 +11,48 @@ struct shmid_ds buf; - -int wait = 0, opt; - enum{ NOP_SHM, WAIT_ATTACH_SHM, TRY_ATTACH_SHM, MAT_SHM, CLEAN_UP_SHM, RUN_SHM }; -unsigned int shm_statem = TRY_ATTACH_SHM; + void run_shm(void); + int main(int argc, char **argv) { - -key_t key = 0x53021d79; - - while ((opt = getopt(argc, argv, "w")) != -1) { - switch (opt) { + int wait = 0, opt; + unsigned int shm_statem = TRY_ATTACH_SHM; + + key_t key = 0x53021d79; + //key = ftok(".", 'S'); // using my own key for now. makes dev easier will fix + + while ((opt = getopt(argc, argv, "w")) != -1) + { + switch (opt) + { case 'w': wait = 1; break; default: /* '?' */ fprintf(stderr, "Usage: %s [-w]\n", argv[0]); fprintf(stderr, "\t-w - Wait for umurmurd to create shm area. useful if you need to start from init.d script\n" ); + //My version of this talks to custom PIC18 hardware acting as a i2c slave to a RaspberryPI to + //sound buzzer and turn on a LED when my umurmurd server has users in it. I leave this in here + //in case you need it. exit(EXIT_FAILURE); } } - //key = ftok(".", 'S'); // check if ftok works if both umurmur and mon-umurmur are in same dir - // using my own key for now. makes dev easier will fix - shmptr = NULL; + if( wait ) shm_statem = WAIT_ATTACH_SHM; while( shm_statem ) { - switch( shm_statem ) { - case RUN_SHM: run_shm(); break; @@ -70,69 +72,73 @@ key_t key = 0x53021d79; shm_statem = MAT_SHM; break; case MAT_SHM: - if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) ) ////MJP BUG? + if( ( shmptr = shmat( shmid, 0, 0 ) ) == (void *) (-1) ) { perror("shmat"); exit(EXIT_FAILURE); } printf( "shmid: %i\n\r", shmid ); - printf( "umumurd PID: %u\n\r", shmptr->umurmurd_pid ); + printf( "Connected to umumurd PID: %u\n\r", shmptr->umurmurd_pid ); + sleep( 1 ); shm_statem = RUN_SHM; break; case CLEAN_UP_SHM: shmdt( shmptr ); - break; - + break; } } - fflush(stdout); - return 0; + fflush(stdout); + return 0; } void run_shm(void) { + int cc; + + shmctl( shmid, IPC_STAT, &buf ); //MJP BUG check for errors here -int cc; - - - - shmctl( shmid, IPC_STAT, &buf ); //MJP BUG check for errors here - - printf("\033[2J\033[H"); //clear screen VT100 + printf("\033[2J\033[H"); //clear screen VT100 - printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients ); - for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ ) - { - - if( !shmptr->client[cc].authenticated ) + printf( "attach: %lu SCC: %i SMC: %i\n", (unsigned long int)buf.shm_nattch, shmptr->clientcount, shmptr->server_max_clients ); + + for( cc = 0 ; cc < shmptr->server_max_clients ; cc++ ) + { + if( !shmptr->client[cc].authenticated ) continue; - printf( "%s@%s:%i in channel: %s\n\ - \tlastActivity/connectTime/idleTime: %llu/%llu/%llu idleTime: %llu \n\ - \tUDP_Avg/Var: %3.2f/%3.2f \n\ - \tTCP_Avg/Var: %3.2f/%3.2f \n\ - \tUDP_C/TCP_C: %lu/%lu\n", - + printf( "%s@%s:%i in channel: %s\n\ + \tOnline(secs): %lu Idle(secs): %lu\n\ + \tusingUDP=%i\n\ + \tdeaf=%i, mute=%i\n\ + \tself_deaf=%i, self_mute=%i\n\ + \trecording=%i\n\ + \tbOpus=%i\n\ + \tUDP_Avg/Var: %3.2f/%3.2f \n\ + \tTCP_Avg/Var: %3.2f/%3.2f \n\ + \tUDP_C/TCP_C: %lu/%lu\n", + shmptr->client[cc].username, + shmptr->client[cc].ipaddress, + shmptr->client[cc].udp_port, + shmptr->client[cc].channel, + shmptr->client[cc].online_secs, + shmptr->client[cc].idle_secs, + + shmptr->client[cc].bUDP, + shmptr->client[cc].deaf, + shmptr->client[cc].mute, + shmptr->client[cc].self_deaf, + shmptr->client[cc].self_mute, + shmptr->client[cc].recording, + shmptr->client[cc].bOpus, - - shmptr->client[cc].username, - shmptr->client[cc].ipaddress, - shmptr->client[cc].udp_port, - shmptr->client[cc].channel, - shmptr->client[cc].lastActivity, - shmptr->client[cc].connectTime, - shmptr->client[cc].idleTime, - (long long unsigned int)shmptr->client[cc].lastActivity - shmptr->client[cc].idleTime, - shmptr->client[cc].UDPPingAvg, - shmptr->client[cc].UDPPingVar, - shmptr->client[cc].TCPPingAvg, - shmptr->client[cc].TCPPingVar, - shmptr->client[cc].UDPPackets, - shmptr->client[cc].TCPPackets - ); fflush(stdout); // fflush need because of sleep() call - } - sleep( 1 ); // Sleep for 1 sec - - + shmptr->client[cc].UDPPingAvg, + shmptr->client[cc].UDPPingVar, + shmptr->client[cc].TCPPingAvg, + shmptr->client[cc].TCPPingVar, + shmptr->client[cc].UDPPackets, + shmptr->client[cc].TCPPackets + ); fflush(stdout); // fflush need because of sleep() call + } + sleep( 1 ); // Sleep for 1 sec } \ No newline at end of file diff --git a/shm_utils/umurmurd-websocket/CHANGES b/shm_utils/umurmurd-websocket/CHANGES new file mode 100644 index 0000000..bb0565b --- /dev/null +++ b/shm_utils/umurmurd-websocket/CHANGES @@ -0,0 +1,3 @@ +* added a new button to autoupdate web page every second. no ugly page reload +* code clean up +* outputs a more meaningful idle and online time, both are reported in secs \ No newline at end of file diff --git a/shm_utils/umurmurd-websocket/src/uMurmurd_Websocket.c b/shm_utils/umurmurd-websocket/src/uMurmurd_Websocket.c index b5e7e69..d532a1e 100644 --- a/shm_utils/umurmurd-websocket/src/uMurmurd_Websocket.c +++ b/shm_utils/umurmurd-websocket/src/uMurmurd_Websocket.c @@ -1,5 +1,5 @@ /* - * uMurmurd Websocket server - HTTP/JSON serverexample + * uMurmurd Websocket - HTTP/JSON server example * * Copyright (C) 2014 Michael P. Pounders <> * @@ -23,45 +23,33 @@ #endif #include +#include #include #include #include #include -#include -#include -#include #include - #include - #include +#include +#include #include - #include #include "../../../src/sharedmemory.h" -int max_poll_elements; - struct pollfd *pollfds; -int *fd_lookup; -int count_pollfds; -int force_exit = 0; +char *resource_path = "../web"; +int max_poll_elements, *fd_lookup, count_pollfds, force_exit = 0, autoupdate = 0; enum demo_protocols { /* always first */ PROTOCOL_HTTP = 0, - PROTOCOL_JSON_UMURMURD, - /* always last */ DEMO_PROTOCOL_COUNT }; - - -char *resource_path = "../web"; - /* * We take a strict whitelist approach to stop ../ attacks */ @@ -323,7 +311,8 @@ json_t *root = NULL, *server = NULL, *client, *clients; if( !shmptr->client[cc].authenticated ) continue; - client = json_pack( "{:s:s,s:s,s:i,s:s,s:I,s:I,s:I}", "username", + client = json_pack( "{:s:s,s:s,s:i,s:s,s:i,s:i}", + "username", shmptr->client[cc].username, "ipaddress", shmptr->client[cc].ipaddress, @@ -331,19 +320,19 @@ json_t *root = NULL, *server = NULL, *client, *clients; shmptr->client[cc].udp_port, "channel", shmptr->client[cc].channel, - "lastactivity", - shmptr->client[cc].lastActivity, - "connecttime", - shmptr->client[cc].connectTime, - "idleTime", - (long long unsigned int)shmptr->client[cc].lastActivity - shmptr->client[cc].idleTime + "online_secs", + shmptr->client[cc].online_secs, + "idle_secs", + shmptr->client[cc].idle_secs ); - json_array_append_new( jarr1, client ); + json_array_append_new( jarr1, client ); + } json_object_set_new( clients, "clients", jarr1 ); json_object_update( root, clients ); + } - json_dump_file(root, "json.txt", JSON_PRESERVE_ORDER | JSON_INDENT(4) ); + //json_dump_file(root, "json.txt", JSON_PRESERVE_ORDER | JSON_INDENT(4) ); result = json_dumps(root, JSON_PRESERVE_ORDER | JSON_COMPACT ); *n = sprintf( (char *)&buf[LWS_SEND_BUFFER_PRE_PADDING], "%s", result ); @@ -351,17 +340,19 @@ json_t *root = NULL, *server = NULL, *client, *clients; if( result ) free( result ); + + json_decref(root); return 0; } -struct per_session_data__umurmur_json { +struct per_session_data__umurmurd_json { int test; }; static int -callback_umurmur_json( struct libwebsocket_context *context, +callback_umurmurd_json( struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len) @@ -371,12 +362,12 @@ callback_umurmur_json( struct libwebsocket_context *context, unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 4096 + LWS_SEND_BUFFER_POST_PADDING]; - //struct per_session_data__umurmur_json *pss = (struct per_session_data__umurmur_json *)user; + //struct per_session_data__umurmurd_json *pss = (struct per_session_data__umurmurd_json *)user; switch (reason) { case LWS_CALLBACK_ESTABLISHED: - lwsl_info("callback_umurmur_json: LWS_CALLBACK_ESTABLISHED\n"); + lwsl_info("callback_umurmurd_json: LWS_CALLBACK_ESTABLISHED\n"); break; case LWS_CALLBACK_SERVER_WRITEABLE: @@ -389,12 +380,19 @@ callback_umurmur_json( struct libwebsocket_context *context, case LWS_CALLBACK_RECEIVE: //fprintf(stderr, "rx %d\n", (int)len); - if (len < 6) - break; - if (strcmp((const char *)in, "update\n") == 0) +// if (len < 6) +// break; + if( strcmp((const char *)in, "update\n") == 0 ) + { libwebsocket_callback_on_writable_all_protocol(libwebsockets_get_protocol( wsi )); + break; + } + else if( strcmp((const char *)in, "autoupdate\n") == 0 ) + { + autoupdate = !autoupdate; //toggle + break; + } - break; /* * this just demonstrates how to use the protocol filter. If you won't * study and reject connections based on header content, you don't need @@ -427,9 +425,9 @@ static struct libwebsocket_protocols protocols[] = { 0, /* max frame size / rx buffer */ }, { - "umurmur-json-protocol", - callback_umurmur_json, - sizeof(struct per_session_data__umurmur_json), + "umurmurd-json-protocol", + callback_umurmurd_json, + sizeof(struct per_session_data__umurmurd_json), 128, }, { NULL, NULL, 0, 0 } /* terminator */ @@ -461,7 +459,7 @@ int main(int argc, char **argv) int opts = 0; char interface_name[128] = ""; const char *iface = NULL; -// unsigned int oldus = 0; + uint64_t oldus = 0; struct lws_context_creation_info info; int syslog_options = LOG_PID | LOG_PERROR; @@ -600,12 +598,14 @@ key_t key = 0x53021d79; * live websocket connection using the DUMB_INCREMENT protocol, * as soon as it can take more packets (usually immediately) */ - -// if (((unsigned int)tv.tv_usec - oldus) > 50000) { -// libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_JSON_UMURMURD]); -// oldus = tv.tv_usec; -// } - + if( autoupdate ) + { + if(((unsigned int)tv.tv_sec - oldus) > 1 ) + { + libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_JSON_UMURMURD]); + oldus = tv.tv_sec; + } + } /* * If libwebsockets sockets are all we care about, @@ -623,7 +623,7 @@ key_t key = 0x53021d79; libwebsocket_context_destroy(context); - lwsl_notice("umurmur_websocket server exited cleanly\n"); + lwsl_notice("uMurmurd Websocket server exited cleanly\n"); shmdt( shmptr ); closelog(); diff --git a/shm_utils/umurmurd-websocket/web/mon_umurmurd.html b/shm_utils/umurmurd-websocket/web/mon_umurmurd.html index ae24d01..6547d28 100644 --- a/shm_utils/umurmurd-websocket/web/mon_umurmurd.html +++ b/shm_utils/umurmurd-websocket/web/mon_umurmurd.html @@ -12,6 +12,7 @@
+ @@ -66,10 +67,10 @@ function get_appropriate_ws_url() if (typeof MozWebSocket != "undefined") { socket_json = new MozWebSocket(get_appropriate_ws_url(), - "umurmur-json-protocol"); + "umurmurd-json-protocol"); } else { socket_json = new WebSocket(get_appropriate_ws_url(), - "umurmur-json-protocol"); + "umurmurd-json-protocol"); } @@ -89,6 +90,9 @@ function get_appropriate_ws_url() function update() { socket_json.send("update\n"); } +function autoupdate() { + socket_json.send("autoupdate\n"); +} \ No newline at end of file diff --git a/src/sharedmemory.c b/src/sharedmemory.c index 56e9cea..4ede9d3 100644 --- a/src/sharedmemory.c +++ b/src/sharedmemory.c @@ -25,42 +25,43 @@ void Sharedmemory_init(void) void Sharedmemory_update(void) { - static size_t bt_end = sizeof( bool_t ) * 8, //compute once - et_end = sizeof( etimer_t ) * 3, - pa_end = sizeof( float ) * 4, - pc_end = sizeof( uint32_t ) * 2; + static size_t bt_end = sizeof( bool_t ) * 8, //compute once + pa_end = sizeof( float ) * 4, + pc_end = sizeof( uint32_t ) * 2; unsigned int cc = 0; client_t *client_itr = NULL; + uint64_t now; memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients ); shmptr->clientcount = Client_count(); - - + if( shmptr->clientcount ) + { + Timer_init( &now ); while( Client_iterate(&client_itr) != NULL ) { - - - + if( client_itr->authenticated ) - { - + { channel_t *channel = client_itr->channel; - + strncpy( shmptr->client[cc].username, client_itr->username, 120 ); - strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ) , 45 ); + strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 ); shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr ); shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr ); strncpy( shmptr->client[cc].channel, channel->name, 120 ); + + shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL; + shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL; + memcpy( &shmptr->client[cc].bUDP, &client_itr->bUDP, bt_end ); - memcpy( &shmptr->client[cc].lastActivity, &client_itr->lastActivity, et_end ); memcpy( &shmptr->client[cc].UDPPingAvg, &client_itr->UDPPingAvg, pa_end ); memcpy( &shmptr->client[cc].UDPPackets, &client_itr->UDPPackets, pc_end ); } - cc++; - + cc++; } - + +} } void Sharedmemory_deinit(void) diff --git a/src/sharedmemory_struct.h b/src/sharedmemory_struct.h index 88eb0c5..a4011b3 100644 --- a/src/sharedmemory_struct.h +++ b/src/sharedmemory_struct.h @@ -5,7 +5,7 @@ typedef struct int tcp_port, udp_port; char channel[121]; bool_t bUDP, authenticated, deaf, mute, self_deaf, self_mute, recording, bOpus; - etimer_t lastActivity, connectTime, idleTime; + uint32_t online_secs, idle_secs; float UDPPingAvg, UDPPingVar, TCPPingAvg, TCPPingVar; uint32_t UDPPackets, TCPPackets; @@ -15,7 +15,7 @@ typedef struct { int clientcount, server_max_clients; - unsigned int umurmurd_pid; //Use this to make sure umurmurd is still running so I can allow more than one connection. - shmclient_t client[]; //MJP BUG: Use max usersetting from conf file + unsigned int umurmurd_pid; + shmclient_t client[]; }shm_t; \ No newline at end of file -- 2.30.2