From d8329888a44073c450225f61a678de512a49fde7 Mon Sep 17 00:00:00 2001 From: asmodai Date: Tue, 26 Jun 2007 08:57:58 +0000 Subject: [PATCH] Merged revisions 962-977 via svnmerge. git-svn-id: svn://svn.open-ils.org/OpenSRF/branches/autotools@978 9efc2488-bf62-4759-914b-345cdb29e865 --- include/opensrf/log.h | 1 + src/libopensrf/log.c | 73 +++++++++++++++++++++--------------- src/router/osrf_router.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 29 deletions(-) diff --git a/include/opensrf/log.h b/include/opensrf/log.h index 4aafad3..9096d86 100644 --- a/include/opensrf/log.h +++ b/include/opensrf/log.h @@ -18,6 +18,7 @@ #define OSRF_LOG_TYPE_FILE 1 #define OSRF_LOG_TYPE_SYSLOG 2 +#define OSRF_LOG_TYPE_STDERR 3 #define OSRF_LOG_MARK __FILE__, __LINE__ diff --git a/src/libopensrf/log.c b/src/libopensrf/log.c index 35d2756..10f2d30 100644 --- a/src/libopensrf/log.c +++ b/src/libopensrf/log.c @@ -1,6 +1,6 @@ #include -static int _osrfLogType = -1; +static int _osrfLogType = OSRF_LOG_TYPE_STDERR; static int _osrfLogFacility = LOG_LOCAL0; static int _osrfLogActFacility = LOG_LOCAL1; static char* _osrfLogFile = NULL; @@ -14,8 +14,8 @@ static char* _osrfLogXidPfx = NULL; /* xid prefix string */ static void osrfLogSetType( int logtype ); static void _osrfLogDetail( int level, const char* filename, int line, char* msg ); -static void _osrfLogToFile( char* msg, ... ); -static void _osrfLogSetXid(char* xid); +static void _osrfLogToFile( const char* msg, ... ); +static void _osrfLogSetXid( const char* xid ); #define OSRF_LOG_GO(f,li,m,l) \ if(!m) return; \ @@ -24,7 +24,10 @@ static void _osrfLogSetXid(char* xid); void osrfLogCleanup() { free(_osrfLogAppname); + _osrfLogAppname = NULL; free(_osrfLogFile); + _osrfLogFile = NULL; + _osrfLogType = OSRF_LOG_TYPE_STDERR; } @@ -36,7 +39,7 @@ void osrfLogInit( int type, const char* appname, int maxlevel ) { openlog(_osrfLogAppname, 0, _osrfLogFacility ); } -static void _osrfLogSetXid(char* xid) { +static void _osrfLogSetXid( const char* xid ) { if(xid) { if(_osrfLogXid) free(_osrfLogXid); _osrfLogXid = strdup(xid); @@ -74,13 +77,20 @@ void osrfLogSetIsClient(int is) { } /** Sets the type of logging to perform. See log types */ -static void osrfLogSetType( int logtype ) { - if( logtype != OSRF_LOG_TYPE_FILE && - logtype != OSRF_LOG_TYPE_SYSLOG ) { - fprintf(stderr, "Unrecognized log type. Logging to stderr\n"); - return; +static void osrfLogSetType( int logtype ) { + + switch( logtype ) + { + case OSRF_LOG_TYPE_FILE : + case OSRF_LOG_TYPE_SYSLOG : + case OSRF_LOG_TYPE_STDERR : + _osrfLogType = logtype; + break; + default : + fprintf(stderr, "Unrecognized log type. Logging to stderr\n"); + _osrfLogType = OSRF_LOG_TYPE_STDERR; + break; } - _osrfLogType = logtype; } void osrfLogSetFile( const char* logfile ) { @@ -146,38 +156,38 @@ static void _osrfLogDetail( int level, const char* filename, int line, char* msg if(!msg) return; if(!filename) filename = ""; - char* l = "INFO"; /* level name */ + char* label = "INFO"; /* level name */ int lvl = LOG_INFO; /* syslog level */ int fac = _osrfLogFacility; switch( level ) { case OSRF_LOG_ERROR: - l = "ERR "; + label = "ERR "; lvl = LOG_ERR; break; case OSRF_LOG_WARNING: - l = "WARN"; + label = "WARN"; lvl = LOG_WARNING; break; case OSRF_LOG_INFO: - l = "INFO"; + label = "INFO"; lvl = LOG_INFO; break; case OSRF_LOG_DEBUG: - l = "DEBG"; + label = "DEBG"; lvl = LOG_DEBUG; break; case OSRF_LOG_INTERNAL: - l = "INT "; + label = "INT "; lvl = LOG_DEBUG; break; case OSRF_LOG_ACTIVITY: - l = "ACT"; + label = "ACT"; lvl = LOG_INFO; fac = _osrfLogActFacility; break; @@ -185,7 +195,14 @@ static void _osrfLogDetail( int level, const char* filename, int line, char* msg char* xid = (_osrfLogXid) ? _osrfLogXid : ""; - if(_osrfLogType == OSRF_LOG_TYPE_SYSLOG ) { + int logtype = _osrfLogType; + if( logtype == OSRF_LOG_TYPE_FILE && !_osrfLogFile ) + { + // No log file defined? Temporarily reroute to stderr + logtype = OSRF_LOG_TYPE_STDERR; + } + + if( logtype == OSRF_LOG_TYPE_SYSLOG ) { char buf[1536]; memset(buf, 0x0, 1536); /* give syslog some breathing room, and be cute about it */ @@ -194,41 +211,39 @@ static void _osrfLogDetail( int level, const char* filename, int line, char* msg buf[1533] = '.'; buf[1534] = '.'; buf[1535] = '\0'; - syslog( fac | lvl, "[%s:%ld:%s:%d:%s] %s", l, (long) getpid(), filename, line, xid, buf ); + syslog( fac | lvl, "[%s:%ld:%s:%d:%s] %s", label, (long) getpid(), filename, line, xid, buf ); } - else if( _osrfLogType == OSRF_LOG_TYPE_FILE ) - _osrfLogToFile("[%s:%ld:%s:%d:%s] %s", l, (long) getpid(), filename, line, xid, msg ); + else if( logtype == OSRF_LOG_TYPE_FILE ) + _osrfLogToFile( "[%s:%ld:%s:%d:%s] %s", label, (long) getpid(), filename, line, xid, msg ); + else if( logtype == OSRF_LOG_TYPE_STDERR ) + fprintf( stderr, "[%s:%ld:%s:%d:%s] %s\n", label, (long) getpid(), filename, line, xid, msg ); } -static void _osrfLogToFile( char* msg, ... ) { +static void _osrfLogToFile( const char* msg, ... ) { if(!msg) return; if(!_osrfLogFile) return; VA_LIST_TO_STRING(msg); if(!_osrfLogAppname) _osrfLogAppname = strdup("osrf"); - int l = strlen(VA_BUF) + strlen(_osrfLogAppname) + 36; - char buf[l]; - bzero(buf,l); char datebuf[36]; - bzero(datebuf,36); time_t t = time(NULL); struct tm* tms = localtime(&t); - strftime(datebuf, 36, "%Y-%m-%d %H:%M:%S", tms); + strftime(datebuf, sizeof( datebuf ), "%Y-%m-%d %H:%M:%S", tms); FILE* file = fopen(_osrfLogFile, "a"); if(!file) { - fprintf(stderr, "Unable to fopen file %s for writing\n", _osrfLogFile); + fprintf(stderr, "Unable to fopen log file %s for writing\n", _osrfLogFile); return; } fprintf(file, "%s %s %s\n", _osrfLogAppname, datebuf, VA_BUF ); if( fclose(file) != 0 ) - osrfLogWarning(OSRF_LOG_MARK, "Error closing log file: %s", strerror(errno)); + fprintf( stderr, "Error closing log file: %s", strerror(errno)); } diff --git a/src/router/osrf_router.c b/src/router/osrf_router.c index 8308851..4fdc053 100644 --- a/src/router/osrf_router.c +++ b/src/router/osrf_router.c @@ -6,6 +6,10 @@ #define ROUTER_REQUEST_CLASS_LIST "opensrf.router.info.class.list" +#define ROUTER_REQUEST_STATS_NODE_FULL "opensrf.router.info.stats.class.node.all" +#define ROUTER_REQUEST_STATS_CLASS_FULL "opensrf.router.info.stats.class.all" +#define ROUTER_REQUEST_STATS_CLASS "opensrf.router.info.stats.class" +#define ROUTER_REQUEST_STATS_CLASS_SUMMARY "opensrf.router.info.stats.class.summary" osrfRouter* osrfNewRouter( char* domain, char* name, @@ -555,6 +559,98 @@ int osrfRouterProcessAppRequest( osrfRouter* router, transport_message* msg, osr osrfStringArrayFree(keys); + } else if(!strcmp( omsg->method_name, ROUTER_REQUEST_STATS_CLASS_SUMMARY )) { + + osrfRouterClass* class; + osrfRouterNode* node; + int count = 0; + + char* classname = jsonObjectToSimpleString( jsonObjectGetIndex( omsg->_params, 0 ) ); + + if (!classname) { + free(classname); + return -1; + } + + class = osrfHashGet(router->classes, classname); + + osrfHashIterator* node_itr = osrfNewHashIterator(class->nodes); + while( (node = osrfHashIteratorNext(node_itr)) ) { + count += node->count; + //jsonObjectSetKey( class_res, node->remoteId, jsonNewNumberObject( (double) node->count ) ); + } + osrfHashIteratorFree(node_itr); + + jresponse = jsonNewNumberObject( (double) count ); + + } else if(!strcmp( omsg->method_name, ROUTER_REQUEST_STATS_CLASS )) { + + osrfRouterClass* class; + osrfRouterNode* node; + + char* classname = jsonObjectToSimpleString( jsonObjectGetIndex( omsg->_params, 0 ) ); + + if (!classname) { + free(classname); + return -1; + } + + jresponse = jsonParseString("{}"); + class = osrfHashGet(router->classes, classname); + + osrfHashIterator* node_itr = osrfNewHashIterator(class->nodes); + while( (node = osrfHashIteratorNext(node_itr)) ) { + jsonObjectSetKey( jresponse, node->remoteId, jsonNewNumberObject( (double) node->count ) ); + } + osrfHashIteratorFree(node_itr); + + } else if(!strcmp( omsg->method_name, ROUTER_REQUEST_STATS_CLASS_FULL )) { + + osrfRouterClass* class; + osrfRouterNode* node; + jresponse = jsonParseString("{}"); + + osrfHashIterator* class_itr = osrfNewHashIterator(router->classes); + while( (class = osrfHashIteratorNext(class_itr)) ) { + + jsonObject* class_res = jsonParseString("{}"); + char* classname = class_itr->current; + + osrfHashIterator* node_itr = osrfNewHashIterator(class->nodes); + while( (node = osrfHashIteratorNext(node_itr)) ) { + jsonObjectSetKey( class_res, node->remoteId, jsonNewNumberObject( (double) node->count ) ); + } + osrfHashIteratorFree(node_itr); + + jsonObjectSetKey( jresponse, classname, class_res ); + } + + osrfHashIteratorFree(class_itr); + + } else if(!strcmp( omsg->method_name, ROUTER_REQUEST_STATS_NODE_FULL )) { + + osrfRouterClass* class; + osrfRouterNode* node; + int count; + jresponse = jsonParseString("{}"); + + osrfHashIterator* class_itr = osrfNewHashIterator(router->classes); + while( (class = osrfHashIteratorNext(class_itr)) ) { + + count = 0; + char* classname = class_itr->current; + + osrfHashIterator* node_itr = osrfNewHashIterator(class->nodes); + while( (node = osrfHashIteratorNext(node_itr)) ) { + count += node->count; + } + osrfHashIteratorFree(node_itr); + + jsonObjectSetKey( jresponse, classname, jsonNewNumberObject( (double) count ) ); + } + + osrfHashIteratorFree(class_itr); + } else { return osrfRouterHandleMethodNFound( router, msg, omsg ); -- 2.11.0