Merged revisions 962-977 via svnmerge.
authorasmodai <asmodai@9efc2488-bf62-4759-914b-345cdb29e865>
Tue, 26 Jun 2007 08:57:58 +0000 (08:57 +0000)
committerasmodai <asmodai@9efc2488-bf62-4759-914b-345cdb29e865>
Tue, 26 Jun 2007 08:57:58 +0000 (08:57 +0000)
git-svn-id: svn://svn.open-ils.org/OpenSRF/branches/autotools@978 9efc2488-bf62-4759-914b-345cdb29e865

include/opensrf/log.h
src/libopensrf/log.c
src/router/osrf_router.c

index 4aafad3..9096d86 100644 (file)
@@ -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__
 
index 35d2756..10f2d30 100644 (file)
@@ -1,6 +1,6 @@
 #include <opensrf/log.h>
 
-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));
 
 }
 
index 8308851..4fdc053 100644 (file)
@@ -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 );