Update of /cvsroot/sblim/cmpi-base In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2372 Modified Files: AUTHORS ChangeLog Makefile.am README cmpiOSBase_ComputerSystemProvider.c configure.ac Added Files: OSBase_OperatingSystemStatisticalData.c OSBase_OperatingSystemStatisticalData.h cmpiOSBase_OperatingSystemStatisticalData.c cmpiOSBase_OperatingSystemStatisticalData.h cmpiOSBase_OperatingSystemStatisticalDataProvider.c cmpiOSBase_OperatingSystemStatisticsProvider.c Log Message: feature request# 1186592: support for OS statistical information added ... contribution by Michael Schuele :) ... thx --- NEW FILE: cmpiOSBase_OperatingSystemStatisticalData.c --- /* * cmpiOSBase_OperatingSystemStatisticalData.c * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Interface Type : Common Magabeablity Programming Interface ( CMPI ) * * Description: * This is the factory implementation for creating instances of CIM * class Linux_OperatingSystemStatisticalData. * */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/time.h> #include "cmpidt.h" #include "cmpimacs.h" #include "cmpiOSBase_Common.h" #include "OSBase_Common.h" #include "cmpiOSBase_OperatingSystemStatisticalData.h" /* ---------------------------------------------------------------------------*/ /* private declarations */ /* ---------------------------------------------------------------------------*/ // stores the time when ResetSelectedStats has been called (function call not yet supported) */ // static unsigned long long last_reset = 0; /* ---------------------------------------------------------------------------*/ /* Factory functions */ /* ---------------------------------------------------------------------------*/ /* ---------- method to create a CMPIObjectPath of this class ----------------*/ CMPIObjectPath * _makePath_OperatingSystemStatisticalData( CMPIBroker * _broker, CMPIContext * ctx, CMPIObjectPath * ref, CMPIStatus * rc) { CMPIObjectPath * op = NULL; char * instanceID = NULL; char * hostname = NULL; _OSBASE_TRACE(2,("--- _makePath_OperatingSystemStatisticalData() called")); if (!get_os_name()) { CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, "no OS name found"); _OSBASE_TRACE(2,("--- _makePath_OperatingSystemStatisticalData() failed : %s",CMGetCharPtr(rc->msg))); goto exit; } op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(ref,rc)), _ClassName, rc ); if (CMIsNullObject(op)) { CMSetStatusWithChars( _broker, rc, CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); _OSBASE_TRACE(2,("--- _makePath_OperatingSystemStatisticalData() failed : %s",CMGetCharPtr(rc->msg))); goto exit; } /* keys are unique identifiers for an instance */ // instanceID: Linux:<hostname> hostname = get_system_name(); instanceID = calloc(_INSTANCE_PREFIX_LENGTH + strlen(hostname) + 1, sizeof(char)); strcpy(instanceID, _INSTANCE_PREFIX); strcat(instanceID, hostname); CMAddKey(op, "InstanceID", instanceID, CMPI_chars); if (instanceID) free(instanceID); exit: _OSBASE_TRACE(2,("--- _makePath_OperatingSystemStatisticalData() exited")); return op; } /* ----------- method to create a CMPIInstance of this class ----------------*/ CMPIInstance * _makeInst_OperatingSystemStatisticalData( CMPIBroker * _broker, CMPIContext * ctx, CMPIObjectPath * ref, const char ** properties, CMPIStatus * rc) { CMPIObjectPath * op = NULL; CMPIInstance * ci = NULL; const char ** keys = NULL; int keyCount = 0; unsigned short status = 2; /* Enabled */ int stats_avail = 0; CMPIDateTime * dt = NULL; char * instanceID = NULL; char * hostname = NULL; unsigned long long usecs = 0; struct os_statistics statistics; _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() called")); stats_avail = get_os_statistics(&statistics); if (stats_avail != 0) { _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() get_os_statistics failed")); CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, "no OS statistics available"); _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() failed : %s",CMGetCharPtr(rc->msg))); goto exit; } op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(ref,rc)), _ClassName, rc ); if (CMIsNullObject(op)) { CMSetStatusWithChars( _broker, rc, CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() failed : %s",CMGetCharPtr(rc->msg))); goto exit; } ci = CMNewInstance( _broker, op, rc); if (CMIsNullObject(ci)) { CMSetStatusWithChars( _broker, rc, CMPI_RC_ERR_FAILED, "Create CMPIInstance failed." ); _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() failed : %s",CMGetCharPtr(rc->msg))); goto exit; } /* set property filter */ /* keys = calloc(3,sizeof(char*)); keys[0] = strdup("CreationClassName"); keys[1] = strdup("Name"); keys[2] = NULL; CMSetPropertyFilter(ci,properties,keys); for( ;keys[keyCount]!=NULL;keyCount++) { free((char*)keys[keyCount]); } free(keys); */ // Linux:<hostname> hostname = get_system_name(); instanceID = calloc(_INSTANCE_PREFIX_LENGTH + strlen(hostname) + 1, sizeof(char)); strcpy(instanceID, _INSTANCE_PREFIX); strcat(instanceID, hostname); CMSetProperty(ci, "InstanceID", instanceID, CMPI_chars); if (instanceID) free(instanceID); /* from CIM_ManagedElement */ CMSetProperty(ci, "Caption", _ClassName, CMPI_chars); CMSetProperty(ci, "Description", "statistical information about operating system", CMPI_chars); CMSetProperty(ci, "ElementName", get_os_name(), CMPI_chars); /* ResetSelectedStats is not yet supported so StartStatisticTime is always set to boottime */ usecs = _get_os_boottime(); usecs *= 1000000; /* the following can be used when ResetSelectedStats is supported * (last_reset should be updated in reset function) */ /* if (last_reset == 0) { usecs = _get_os_boottime(); usecs *= 1000000; _OSBASE_TRACE(5,("--- _makeInst_OperatingSystemStatisticalData(): 1st run: boottime:%llu us", usecs)); } else { usecs = last_reset; _OSBASE_TRACE(5,("--- _makeInst_OperatingSystemStatisticalData(): using last update: %llu us", usecs)); } */ dt = CMNewDateTimeFromBinary(_broker,(CMPIUint64)usecs,CMPI_false,rc); /* from CIM_StatisticalData */ CMSetProperty(ci, "StartStatisticTime", (CMPIValue*)&(dt), CMPI_dateTime); dt = CMNewDateTime(_broker,rc); CMSetProperty(ci, "StatisticTime", (CMPIValue*)&(dt), CMPI_dateTime); // there's no consistent time interval //CMSetProperty(ci, "SampleInterval", NULL, CMPI_uint64); /* additional properties */ CMSetProperty(ci, "CPUUserTime", (CMPIValue*)&statistics.user_time, CMPI_uint64); CMSetProperty(ci, "CPUSystemTime", (CMPIValue*)&statistics.system_time, CMPI_uint64); CMSetProperty(ci, "CPUWaitTime", (CMPIValue*)&statistics.wait_time, CMPI_uint64); CMSetProperty(ci, "CPUIdleTime", (CMPIValue*)&statistics.idle_time, CMPI_uint64); CMSetProperty(ci, "RunQueueLength", (CMPIValue*)&statistics.run_queue_length, CMPI_uint64); CMSetProperty(ci, "BlockQueueLength", (CMPIValue*)&statistics.block_queue_length, CMPI_uint64); CMSetProperty(ci, "PagesPagedIn", (CMPIValue*)&statistics.pages_in, CMPI_uint64); CMSetProperty(ci, "PagesPagedOut", (CMPIValue*)&statistics.pages_out, CMPI_uint64); exit: _OSBASE_TRACE(2,("--- _makeInst_OperatingSystemStatisticalData() exited")); return ci; } /* ---------------------------------------------------------------------------*/ /* end of cmpiOSBase_OperatingSystemStatisticalData.c */ /* ---------------------------------------------------------------------------*/ --- NEW FILE: cmpiOSBase_OperatingSystemStatisticsProvider.c --- /* * cmpiOSBase_OperatingSystemStatisticsProvider.c * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Interface Type : Common Manageability Programming Interface ( CMPI ) * * Description: * */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "cmpidt.h" #include "cmpift.h" #include "cmpimacs.h" #include "OSBase_Common.h" #include "cmpiOSBase_Common.h" static CMPIBroker * _broker; /* ---------------------------------------------------------------------------*/ /* private declarations */ /* ---------------------------------------------------------------------------*/ static char * _ClassName = "Linux_OperatingSystemStatistics"; static char * _RefLeft = "ManagedElement"; static char * _RefRight = "Stats"; static char * _RefLeftClass = "Linux_OperatingSystem"; static char * _RefRightClass = "Linux_OperatingSystemStatisticalData"; /* ---------------------------------------------------------------------------*/ /* ---------------------------------------------------------------------------*/ /* Instance Provider Interface */ /* ---------------------------------------------------------------------------*/ CMPIStatus OSBase_OperatingSystemStatisticsProviderCleanup( CMPIInstanceMI * mi, CMPIContext * ctx) { _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); CMReturn(CMPI_RC_OK); } CMPIStatus OSBase_OperatingSystemStatisticsProviderEnumInstanceNames( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref) { CMPIStatus rc = {CMPI_RC_OK, NULL}; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 1,0,&rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() failed",_ClassName)); } return rc; } CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderEnumInstances( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref, char ** properties) { CMPIStatus rc = {CMPI_RC_OK, NULL}; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 1,1,&rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() failed",_ClassName)); } return rc; } CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderGetInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char ** properties) { CMPIInstance * ci = NULL; CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); ci = _assoc_get_inst( _broker,ctx,cop,_ClassName,_RefLeft,_RefRight,&rc); if( ci == NULL ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI GetInstance() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI GetInstance() failed",_ClassName)); } return rc; } CMReturnInstance( rslt, ci ); CMReturnDone(rslt); _OSBASE_TRACE(1,("--- %s CMPI GetInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderCreateInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, CMPIInstance * ci) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderSetInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, CMPIInstance * ci, char **properties) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI SetInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI SetInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderDeleteInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticsProviderExecQuery( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref, char * lang, char * query) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); return rc; } /* ---------------------------------------------------------------------------*/ /* Associator Provider Interface */ /* ---------------------------------------------------------------------------*/ CMPIStatus OSBase_OperatingSystemStatisticsProviderAssociationCleanup( CMPIAssociationMI * mi, CMPIContext * ctx) { _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() called",_ClassName)); _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() exited",_ClassName)); CMReturn(CMPI_RC_OK); } /* * The intention of associations is to show the relations between different * classes and their instances. Therefore an association has two properties. * Each one representing a reference to a certain instance of the specified * class. We can say, that an association has a left and the right "end". * * OperatingSystemStatistics : * < role > -> < class > * "_RefLeft" -> "_RefLeftClass" * "_RefRight" -> "_RefRightClass" * */ /* * general API information * * cop : * Specifies the CMPIObjectPath to the CMPIInstance of the known end of * the association. Its absolutelly necessary to define this anchor point, * from where the evaluation of the association starts. * assocPath : * If not NULL, it contains the name of the association the caller is * looking for. The provider should only return values, when the assocPath * contains the name(s) of the association(s) he is responsible for ! * role : * The caller can specify that the source instance ( cop ) has to play * a certain <role> in the association. The <role> is specified by the * association definition (see above). That means, role has to contain * the same value as the <role> the source instance plays in this assoc. * If this requirement is not true, the provider returns nothing. */ /* * specification of associators() and associatorNames() * * These methods return CMPIInstance ( in the case of associators() ) or * CMPIObjectPath ( in the case of associatorNames() ) object(s) of the * opposite end of the association. * * resultRole : * The caller can specify that the target instance(s) has/have to play * a certain <role> in the association. The <role> is specified by the * association definition (see above). That means, resultRole has to * contain the same value as the <role> the target instance(s) plays * in this assoc. If this requirement is not true, the provider returns * nothing. * resultClass : * The caller can specify that the target instance(s) has/have to be * instances of a certain <class>. The <class> is specified by the * association definition (see above). That means, resultClass has to * contain the same value as the <class> of the target instance(s). * If this requirement is not true, the provider returns nothing. */ CMPIStatus OSBase_OperatingSystemStatisticsProviderAssociators( CMPIAssociationMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char * assocClass, char * resultClass, char * role, char * resultRole, char ** propertyList ) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIObjectPath * op = NULL; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI Associators() called",_ClassName)); if( assocClass ) { op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), _ClassName, &rc ); } if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, _RefLeftClass,_RefRightClass, resultClass,role,resultRole, &rc ) == 0 ) { goto exit; } refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 1, 1, &rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI Associators() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI Associators() failed",_ClassName)); } return rc; } } exit: CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI Associators() exited",_ClassName)); CMReturn(CMPI_RC_OK); } CMPIStatus OSBase_OperatingSystemStatisticsProviderAssociatorNames( CMPIAssociationMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char * assocClass, char * resultClass, char * role, char * resultRole) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIObjectPath * op = NULL; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() called",_ClassName)); if( assocClass ) { op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), _ClassName, &rc ); } if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, _RefLeftClass,_RefRightClass, resultClass,role,resultRole, &rc ) == 0 ) { goto exit; } refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 0, 1, &rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() failed",_ClassName)); } return rc; } } exit: CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() exited",_ClassName)); CMReturn(CMPI_RC_OK); } /* * specification of references() and referenceNames() * * These methods return CMPIInstance ( in the case of references() ) or * CMPIObjectPath ( in the case of referenceNames() ) object(s) of th * association itself. */ CMPIStatus OSBase_OperatingSystemStatisticsProviderReferences( CMPIAssociationMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char * assocClass, char * role, char ** propertyList ) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIObjectPath * op = NULL; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI References() called",_ClassName)); if( assocClass ) { op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), _ClassName, &rc ); } if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, _RefLeftClass,_RefRightClass, NULL,role,NULL, &rc ) == 0 ) { goto exit; } refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 1, 0, &rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI References() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI References() failed",_ClassName)); } return rc; } } exit: CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI References() exited",_ClassName)); CMReturn(CMPI_RC_OK); } CMPIStatus OSBase_OperatingSystemStatisticsProviderReferenceNames( CMPIAssociationMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char * assocClass, char * role) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIObjectPath * op = NULL; int refrc = 0; _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() called",_ClassName)); if( assocClass ) { op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), _ClassName, &rc ); } if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, _RefLeftClass,_RefRightClass, NULL,role,NULL, &rc ) == 0 ) { goto exit; } refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, _ClassName,_RefLeftClass,_RefRightClass, _RefLeft,_RefRight, 0, 0, &rc); if( refrc != 0 ) { if( rc.msg != NULL ) { _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed",_ClassName)); } return rc; } } exit: CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() exited",_ClassName)); CMReturn(CMPI_RC_OK); } /* ---------------------------------------------------------------------------*/ /* Provider Factory */ /* ---------------------------------------------------------------------------*/ CMInstanceMIStub( OSBase_OperatingSystemStatisticsProvider, OSBase_OperatingSystemStatisticsProvider, _broker, CMNoHook); CMAssociationMIStub( OSBase_OperatingSystemStatisticsProvider, OSBase_OperatingSystemStatisticsProvider, _broker, CMNoHook); /* ---------------------------------------------------------------------------*/ /* end of cmpiOSBase_OperatingSystemStatisticsProvider */ /* ---------------------------------------------------------------------------*/ Index: ChangeLog =================================================================== RCS file: /cvsroot/sblim/cmpi-base/ChangeLog,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- ChangeLog 14 Apr 2005 14:37:04 -0000 1.4 +++ ChangeLog 20 Apr 2005 11:34:55 -0000 1.5 @@ -78,3 +78,11 @@ the monitored OS OperationalStatus property was delivered // =================================================================== +// new in version 1.5.0 : + +* feature request# 1186592 : added support for class + Linux_OperatingSystemStatisticalData and association + Linux_OperatingSystemStatistics + ... contribution by Michael Schuele ... thx :) + +// =================================================================== --- NEW FILE: cmpiOSBase_OperatingSystemStatisticalData.h --- #ifndef _CMPIOSBASE_OPERATINGSYSTEMSTATISTICALDATA_H_ #define _CMPIOSBASE_OPERATINGSYSTEMSTATISTICALDATA_H_ /* * cmpiOSBase_OperatingSystemStatisticalData.h * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Interface Type : Common Magabeablity Programming Interface ( CMPI ) * * Description: * This file defines the interfaces for the factory implementation of the * CIM class Linux_OperatingSystemStatisticalData. * */ /* ---------------------------------------------------------------------------*/ #include "cmpidt.h" #include "OSBase_OperatingSystemStatisticalData.h" /* ---------------------------------------------------------------------------*/ static char * _ClassName = "Linux_OperatingSystemStatisticalData"; static const char * _INSTANCE_PREFIX = "Linux:"; static int _INSTANCE_PREFIX_LENGTH = 6; /* ---------------------------------------------------------------------------*/ /* method to create a CMPIObjectPath of this class */ CMPIObjectPath * _makePath_OperatingSystemStatisticalData(CMPIBroker * _broker, CMPIContext * ctx, CMPIObjectPath * cop, CMPIStatus * rc); /* method to create a CMPIInstance of this class */ CMPIInstance * _makeInst_OperatingSystemStatisticalData(CMPIBroker * _broker, CMPIContext * ctx, CMPIObjectPath * cop, const char ** properties, CMPIStatus * rc); /* ---------------------------------------------------------------------------*/ #endif Index: AUTHORS =================================================================== RCS file: /cvsroot/sblim/cmpi-base/AUTHORS,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- AUTHORS 6 Apr 2005 16:29:38 -0000 1.1 +++ AUTHORS 20 Apr 2005 11:34:55 -0000 1.2 @@ -1,2 +1,8 @@ The cmpi-base provider package was originally written by Heidi Neumann <hei...@de...>. + +Contributions: + +support for class Linux_OperatingSytemStatisticalData and the association +Linux_OperatingSystemStatistics was done by Michael Schuele +<sch...@de...> ... thx :) Index: configure.ac =================================================================== RCS file: /cvsroot/sblim/cmpi-base/configure.ac,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- configure.ac 13 Apr 2005 13:01:11 -0000 1.4 +++ configure.ac 20 Apr 2005 11:34:56 -0000 1.5 @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(SBLIM BaseOS Providers Base, 1.4.3t, sbl...@li...,sblim-cmpi-base) +AC_INIT(SBLIM BaseOS Providers Base, 1.5.0, sbl...@li...,sblim-cmpi-base) AC_CONFIG_SRCDIR([OSBase_Common.c]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE Index: Makefile.am =================================================================== RCS file: /cvsroot/sblim/cmpi-base/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Makefile.am 15 Apr 2005 09:00:52 -0000 1.4 +++ Makefile.am 20 Apr 2005 11:34:56 -0000 1.5 @@ -43,11 +43,13 @@ # OSBase CMPI provider libraries provider_LTLIBRARIES = libcmpiOSBase_ComputerSystemProvider.la \ libcmpiOSBase_OperatingSystemProvider.la \ + libcmpiOSBase_OperatingSystemStatisticalDataProvider.la \ libcmpiOSBase_UnixProcessProvider.la \ libcmpiOSBase_ProcessorProvider.la \ libcmpiOSBase_BaseBoardProvider.la \ libcmpiOSBase_RunningOSProvider.la \ libcmpiOSBase_OSProcessProvider.la \ + libcmpiOSBase_OperatingSystemStatisticsProvider.la \ libcmpiOSBase_CSProcessorProvider.la \ libcmpiOSBase_CSBaseBoardProvider.la @@ -69,6 +71,13 @@ # This gcc/ld specific flag is ugly - need to check in configure libcmpiOSBase_OperatingSystemProvider_la_LDFLAGS = -Wc,-nostartfiles +# Operating System Statistical Data +libcmpiOSBase_OperatingSystemStatisticalDataProvider_la_SOURCES = \ + cmpiOSBase_OperatingSystemStatisticalDataProvider.c \ + cmpiOSBase_OperatingSystemStatisticalData.c \ + OSBase_OperatingSystemStatisticalData.c +libcmpiOSBase_OperatingSystemStatisticalDataProvider_la_LIBADD = -lcmpiOSBase_Common + # Unix Process libcmpiOSBase_UnixProcessProvider_la_SOURCES = \ cmpiOSBase_UnixProcessProvider.c \ @@ -94,6 +103,8 @@ libcmpiOSBase_RunningOSProvider_la_LIBADD = -lcmpiOSBase_Common libcmpiOSBase_OSProcessProvider_la_SOURCES = cmpiOSBase_OSProcessProvider.c libcmpiOSBase_OSProcessProvider_la_LIBADD = -lcmpiOSBase_Common +libcmpiOSBase_OperatingSystemStatisticsProvider_la_SOURCES = cmpiOSBase_OperatingSystemStatisticsProvider.c +libcmpiOSBase_OperatingSystemStatisticsProvider_la_LIBADD = -lcmpiOSBase_Common libcmpiOSBase_CSProcessorProvider_la_SOURCES = cmpiOSBase_CSProcessorProvider.c libcmpiOSBase_CSProcessorProvider_la_LIBADD = -lcmpiOSBase_Common libcmpiOSBase_CSBaseBoardProvider_la_SOURCES = cmpiOSBase_CSBaseBoardProvider.c @@ -120,12 +131,14 @@ # Non-Installable Header Files noinst_HEADERS = OSBase_ComputerSystem.h \ OSBase_OperatingSystem.h \ + OSBase_OperatingSystemStatisticalData.h \ OSBase_UnixProcess.h \ OSBase_Processor.h \ OSBase_BaseBoard.h \ cmpiOSBase_Util.h \ cmpiOSBase_ComputerSystem.h \ cmpiOSBase_OperatingSystem.h \ + cmpiOSBase_OperatingSystemStatisticalData.h \ cmpiOSBase_UnixProcess.h \ cmpiOSBase_Processor.h \ cmpiOSBase_BaseBoard.h @@ -196,6 +209,8 @@ test/cim/Linux_ComputerSystem.cim \ test/cim/Linux_OSProcess.cim \ test/cim/Linux_OperatingSystem.cim \ + test/cim/Linux_OperatingSystemStatisticalData.cim \ + test/cim/Linux_OperatingSystemStatistics.cim \ test/cim/Linux_Processor.cim \ test/cim/Linux_RunningOS.cim \ test/cim/Linux_UnixProcess.cim --- NEW FILE: OSBase_OperatingSystemStatisticalData.h --- #ifndef _LINUX_OPERATINGSYSTEMSTATISTICALDATA_H_ #define _LINUX_OPERATINGSYSTEMSTATISTICALDATA_H_ /* * Linux_OperatingSystemStatisticalData.h * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Description: * This file defines the interfaces for the resource access implementation * of the CIM class Linux_OperatingSystemStatisticalData. * */ /* ---------------------------------------------------------------------------*/ #include <sys/types.h> #ifdef __cplusplus extern "C" { #endif /* ---------------------------------------------------------------------------*/ struct os_statistics { unsigned long long user_time; unsigned long long system_time; unsigned long long wait_time; unsigned long long idle_time; unsigned long long run_queue_length; unsigned long long block_queue_length; unsigned long long pages_in; unsigned long long pages_out; }; /** * Returns the current values for the following OS properties: * CPU user time (msec) * CPU system time (msec) * CPU wait time (msec) * CPU idle time (msec) * run queue length * block queue length * page in rate (absolute amount of pages since startup) * page out rate (absolute amount of pages since startup) * param stats on success points to a structure with current values * return 0 if data is available, 1 if an error occured */ int get_os_statistics(struct os_statistics *stats); /* ---------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif /* ---------------------------------------------------------------------------*/ #endif --- NEW FILE: cmpiOSBase_OperatingSystemStatisticalDataProvider.c --- /* * cmpiOSBase_OperatingSystemStatisticalDataProvider.c * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Interface Type : Common Manageability Programming Interface ( CMPI ) * * Description: * */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "cmpidt.h" #include "cmpift.h" #include "cmpimacs.h" #include "OSBase_Common.h" #include "cmpiOSBase_Common.h" #include "cmpiOSBase_OperatingSystemStatisticalData.h" static CMPIBroker * _broker; /* ---------------------------------------------------------------------------*/ /* private declarations */ /* ---------------------------------------------------------------------------*/ /* ---------------------------------------------------------------------------*/ /* Instance Provider Interface */ /* ---------------------------------------------------------------------------*/ CMPIStatus OSBase_OperatingSystemStatisticalDataProviderCleanup( CMPIInstanceMI * mi, CMPIContext * ctx) { _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); CMReturn(CMPI_RC_OK); } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderEnumInstanceNames( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIObjectPath *op = NULL; _OSBASE_TRACE(3,("CMPI EnumInstanceNames() called",_ClassName)); op = _makePath_OperatingSystemStatisticalData(_broker,ctx,ref,&rc); if (op == NULL) { if (rc.msg != NULL) { _OSBASE_TRACE(1,("--%s CMPI EnumInstanceNames() failed : %s", _ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--%s CMPI EnumInstanceNames() failed", _ClassName)); } return rc; } CMReturnObjectPath(rslt, op); CMReturnDone(rslt); _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderEnumInstances( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref, char ** properties) { CMPIStatus rc = {CMPI_RC_OK, NULL}; CMPIInstance * ci = NULL; _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); ci = _makeInst_OperatingSystemStatisticalData(_broker, ctx, ref, properties, &rc); if (ci == NULL) { if (rc.msg != NULL) { _OSBASE_TRACE(1,("--%s CMPI EnumInstances() failed : %s", _ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--%s CMPI EnumInstances() failed", _ClassName)); } return rc; } CMReturnInstance(rslt, ci); CMReturnDone( rslt ); _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderGetInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, char ** properties) { CMPIInstance * ci = NULL; CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); ci = _makeInst_OperatingSystemStatisticalData(_broker, ctx, cop, properties, &rc); if (ci == NULL) { if (rc.msg != NULL) { _OSBASE_TRACE(1,("--%s CMPI GetInstance() failed : %s", _ClassName,CMGetCharPtr(rc.msg))); } else { _OSBASE_TRACE(1,("--%s CMPI GetInstance() failed", _ClassName)); } return rc; } CMReturnInstance( rslt, ci ); CMReturnDone(rslt); _OSBASE_TRACE(1,("--- %s CMPI GetInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderCreateInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, CMPIInstance * ci) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderSetInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop, CMPIInstance * ci, char **properties) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI SetInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI SetInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderDeleteInstance( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); return rc; } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderExecQuery( CMPIInstanceMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref, char * lang, char * query) { CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); return rc; } /* ---------------------------------------------------------------------------*/ /* Method Provider Interface */ /* ---------------------------------------------------------------------------*/ CMPIStatus OSBase_OperatingSystemStatisticalDataProviderMethodCleanup( CMPIMethodMI * mi, CMPIContext * ctx) { _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() called",_ClassName)); _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() exited",_ClassName)); CMReturn(CMPI_RC_OK); } CMPIStatus OSBase_OperatingSystemStatisticalDataProviderInvokeMethod( CMPIMethodMI * mi, CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * ref, const char * methodName, CMPIArgs * in, CMPIArgs * out) { CMPIString * class = NULL; CMPIStatus rc = {CMPI_RC_OK, NULL}; _OSBASE_TRACE(1,("--- %s CMPI InvokeMethod() called",_ClassName)); class = CMGetClassName(ref, &rc); if( strcasecmp(CMGetCharPtr(class), _ClassName) == 0 && strcasecmp("ResetSelectedStats",methodName) == 0 ) { CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_SUPPORTED, methodName ); } else { CMSetStatusWithChars( _broker, &rc, CMPI_RC_ERR_NOT_FOUND, methodName ); } _OSBASE_TRACE(1,("--- %s CMPI InvokeMethod() exited",_ClassName)); return rc; } /* ---------------------------------------------------------------------------*/ /* Provider Factory */ /* ---------------------------------------------------------------------------*/ CMInstanceMIStub( OSBase_OperatingSystemStatisticalDataProvider, OSBase_OperatingSystemStatisticalDataProvider, _broker, CMNoHook); CMMethodMIStub( OSBase_OperatingSystemStatisticalDataProvider, OSBase_OperatingSystemStatisticalDataProvider, _broker, CMNoHook); /* ---------------------------------------------------------------------------*/ /* end of cmpiOSBase_OperatingSystemStatisticalDataProvider */ /* ---------------------------------------------------------------------------*/ Index: README =================================================================== RCS file: /cvsroot/sblim/cmpi-base/README,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- README 15 Apr 2005 11:23:01 -0000 1.11 +++ README 20 Apr 2005 11:34:56 -0000 1.12 @@ -18,6 +18,7 @@ -------------------------------------- + Introduction ------------ @@ -29,14 +30,17 @@ - Linux_ComputerSystem - Linux_BaseBoard - Linux_OperatingSystem +- Linux_OperatingSystemStatisticalData - Linux_UnixProcess - Linux_Processor - Linux_RunningOS - Linux_OSProcess +- Linux_OperatingSystemStatistics - Linux_CSProcessor - Linux_CSBaseBoard + Package Contents ---------------- @@ -66,7 +70,7 @@ Building CIMOM and CMPI for this CIMOM -......................................... +...................................... Please follow the instructions in the README.cmpi file of the cmpi-adapter package. CMPI support is available for OpenPegasus, OpenCimom (former @@ -103,8 +107,6 @@ ./configure CIMSERVER=pegasus PROVIDERDIR=$PEGASUS_HOME/lib - - Load Schema into CIMOM's repository ................................... @@ -121,6 +123,7 @@ schemata have to be loaded into the repository. + Common Libraries ---------------- @@ -138,6 +141,7 @@ ROOT ACCESS RIGHTS NEEDED TO EXECUTE + Class/Association specific Libraries ------------------------------------ @@ -148,7 +152,7 @@ - OSBase_ComputerSystem.c/.h class Linux_BaseBoard -.......................... +..................... - cmpiOSBase_BaseBoardProvider.c - cmpiOSBase_BaseBoard.c/.h - OSBase_BaseBoard.c/.h @@ -159,6 +163,12 @@ - cmpiOSBase_OperatingSystem.c/.h - OSBase_OperatingSystem.c/.h +class Linux_OperatingSystemStatisticalData +.......................................... +- cmpiOSBase_OperatingSystemStatisticalDataProvider.c +- cmpiOSBase_OperatingSystemStatisticalData.c/.h +- OSBase_OperatingSystemStatisticalData.c/.h + class Linux_UnixProcess ....................... - cmpiOSBase_UnixProcessProvider.c @@ -180,15 +190,20 @@ ........................... - cmpiOSBase_OSProcessProvider.c +association Linux_OperatingSystemStatistics +........................................... +- cmpiOSBase_OperatingSystemStatisticsProvider.c + association Linux_CSProcessor -........................... +............................. - cmpiOSBase_CSProcessorProvider.c association Linux_CSBaseBoard -........................... +............................. - cmpiOSBase_CSBaseBoardProvider.c + Automated Function Verifcation Test ----------------------------------- --- NEW FILE: OSBase_OperatingSystemStatisticalData.c --- /* * Linux_OperatingSystemStatisticalData.c * * (C) Copyright IBM Corp. 2005 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Common Public License from * http://oss.software.ibm.com/developerworks/opensource/license-cpl.html * * Author: Michael Schuele <sch...@de...> * Contributors: * * Description: * This shared library provides resource access functionality for the class * Linux_OperatingSystemStatisticalData. * It is independent from any specific CIM technology. */ /* ---------------------------------------------------------------------------*/ #include "OSBase_OperatingSystemStatisticalData.h" #include "OSBase_Common.h" /* logging */ #include <unistd.h> #include <errno.h> #include <dirent.h> #include <sys/utsname.h> #define PROC_DIR "/proc" #define DATA_FILE "/proc/stat" #define PAGE_FILE_26 "/proc/vmstat" /* ---------------------------------------------------------------------------*/ // private declarations /* ---------------------------------------------------------------------------*/ /** * Checks if the currently running kernel is of version 2.6 * @return 1 if kernel is of version 2.6, 0 otherwise */ int is_kernel26() { int res = 0; _OSBASE_TRACE(3,("is_kernel26() called")); res = kernel_release() >= 26000; _OSBASE_TRACE(4,("is_kernel26(): %d",res)); _OSBASE_TRACE(3,("is_kernel26() exited")); return res; } /** * Updates the field stats->wait_time supposing that the * currently running kernel is of version 2.4. * @param stats the structure whose field will be updated * @return 1 on success, 0 otherwise */ int get_wait_time_24(struct os_statistics *stats) { int res = 0; double uptime = 0; FILE *f = NULL; _OSBASE_TRACE(3,("get_wait_time_24() called")); if ((f = fopen("/proc/uptime","r")) != NULL) { fscanf(f,"%lf",&uptime); stats->wait_time = 0; //stats->wait_time = uptime*1000 - stats->user_time - stats->system_time - stats->idle_time; fclose(f); res = 1; } else { _OSBASE_TRACE(1,("get_queue_info: could not open /proc/uptime: %s",strerror(errno))); } _OSBASE_TRACE(4,("get_wait_time_24() res: %d", res)); _OSBASE_TRACE(3,("get_wait_time_24() exited")); return res; } /** * WARNING: block_queue_length is currently not supported and will be set to zero! * Updates the fields stats->run_queue_length and stats->block_queue_length * supposing that the currently running kernel is of version 2.4. * @param stats the structure whose fields will be updated. * @return 1 on success, 0 otherwise */ int get_queue_info_24(struct os_statistics *stats) { int res = 0; FILE *f = NULL; char buf[127]; char *strptr = NULL; _OSBASE_TRACE(3,("get_queue_info_24() called")); stats->run_queue_length = 0; /** * /proc/loadavg * 0.11 0.10 0.09 <running_processes>/111 26002 * */ if ((f = fopen("/proc/loadavg","r")) != NULL) { fgets(buf,127,f); strptr = strstr(buf,"/"); *strptr = '\0'; while (*strptr != ' ') { strptr--; } stats->run_queue_length = atoll(strptr); fclose(f); res = 1; } else { _OSBASE_TRACE(1,("get_queue_info: could not open /proc/loadavg: %s",strerror(errno))); } #warning block_queue_length for kernel 2.4 not supported // not supported stats->block_queue_length = 0; _OSBASE_TRACE(4,("get_queue_info_24() res: %d",res)); _OSBASE_TRACE(3,("get_queue_info_24() exited")); return res; } /** * Updates the fields stats->user_time, stats->system_time, stats->idle_time, * stats->pages_in and stats->pages_out supposing that the * currently running kernel is of version 2.4. * @param stats the structure whose fields will be updated. * @return 1 on success, 0 otherwise */ int get_cpu_page_data_24(struct os_statistics *stats) { int res = 0; FILE *f = NULL; char buf[4096]; char *strptr = NULL; unsigned long long user = 0; unsigned long long userlow = 0; unsigned long long sys = 0; unsigned long long idle = 0; unsigned long long pages_in = 0; unsigned long long pages_out = 0; _OSBASE_TRACE(3,("get_cpu_page_data_24() called")); int read_count = 0; if ((f = fopen(DATA_FILE,"r")) != NULL) { read_count = fread(buf,sizeof(char),sizeof(buf)-1,f); buf[read_count] = '\0'; /* read cpu data * * /proc/stat * cpu <user> <user_low_prio> <system> <idle> in jiffies (1/100ths of a second) */ if (sscanf(buf,"cpu %lld %lld %lld %lld",&user,&userlow,&sys, &idle) == 4) { stats->user_time = (user + userlow) * 10; stats->system_time = sys * 10; stats->idle_time = idle * 10; stats->wait_time = 0; strptr = strstr(buf,"page"); /* read page data * * page <in> <out> */ if (sscanf(strptr,"page %lld %lld",&pages_in, &pages_out) == 2) { stats->pages_in = pages_in; stats->pages_out = pages_out; res = 1; } else { _OSBASE_TRACE(1,("get_cpu_page_data_24(): could not find page in/out data")); } } else { _OSBASE_TRACE(1,("get_cpu_page_data_24(): could not find cpu data")); } } else { _OSBASE_TRACE(1,("get_cpu_page_data_24():could not open %s: %s",DATA_FILE,strerror(errno))); } _OSBASE_TRACE(4,("get_cpu_page_data_24() res. %d",res)); _OSBASE_TRACE(3,("get_cpu_page_data_24() exited")); return res; } /** * Updates the fields stats->user_time, stats->system_time, stats->idle_time, * stats->wait_time, stats->pages_in and stats->pages_out supposing that the * currently running kernel is of version 2.6. * @param stats the structure whose fields will be updated. * They won't be changed if an error occured. * @return 1 on success, 0 otherwise */ int get_cpu_queue_data_26(struct os_statistics *stats) { int res = 0; FILE *f = NULL; char buf[4096]; char *strptr = NULL; unsigned long long user = 0; unsigned long long userlow = 0; unsigned long long sys = 0; unsigned long long idle = 0; unsigned long long wait = 0; unsigned long long p_running = 0; unsigned long long p_blocked = 0; _OSBASE_TRACE(3,("get_cpu_queue_data_26() called")); int read_count = 0; if ((f = fopen(DATA_FILE,"r")) != NULL) { read_count = fread(buf,sizeof(char),sizeof(buf)-1,f); buf[read_count] = '\0'; /* read cpu data * * /proc/stat * cpu <user> <user_low_prio> <system> <idle> <wait> in jiffies (1/100ths of a second) */ if (sscanf(buf,"cpu %lld %lld %lld %lld %lld",&user,&userlow,&sys,&idle,&wait) == 5) { stats->user_time = (user + userlow) * 10; stats->system_time = sys * 10; stats->idle_time = idle * 10; stats->wait_time = wait * 10; /* read queue data * procs_running <number> * procs_blocked <number> */ strptr = strstr(buf,"procs_running"); if (strptr != NULL && sscanf(strptr,"procs_running %lld\nprocs_blocked %lld",&p_running,&p_blocked) == 2) { stats->run_queue_length = p_running; stats->block_queue_length = p_blocked; res = 1; } else { _OSBASE_TRACE(1,("get_cpu_queue_data_26(): could not find queue info")); } } else { _OSBASE_TRACE(1,("get_cpu_queue_data_26(): could not find cpu info")); } fclose(f); } else { _OSBASE_TRACE(1,("get_cpu_queue_data_26(): could not open %s: %s",DATA_FILE,strerror(errno))); } _OSBASE_TRACE(4,("get_cpu_queue_data_26() res: %d",res)); _OSBASE_TRACE(3,("get_cpu_queue_data_26() exited")); return res; } /** * Updates the fields stats->pages_in and stats->pages_out * supposing that the currently running kernel is of version 2.6. * @param stats the structure whose fields will be updated. * They won't be changed if an error occured. * @return 1 on success, 0 otherwise */ int get_pages_26(struct os_statistics *stats) { int res = 0; FILE *f = NULL; char buf[1024]; char *strptr = NULL; int read_count = 0; _OSBASE_TRACE(3,("get_pages_26 called")); /* * pgpgin <number> * pgpgout <number> */ if ((f = fopen(PAGE_FILE_26,"r")) != NULL) { read_count = fread(buf,sizeof(char),sizeof(buf)-1,f); buf[read_count] = '\0'; strptr = strstr(buf,"pgpgin"); if (strptr != NULL && sscanf(strptr,"pgpgin %lld\npgpgout %lld",&(stats->pages_in),&(stats->pages_out)) == 2) { res = 1; } else { _OSBASE_TRACE(1,("get_pages_26(): could not find page in/out information")); } fclose(f); } else { _OSBASE_TRACE(1,("get_pages_26(): could not open %s: %s",PAGE_FILE_26,strerror(errno))); } _OSBASE_TRACE(4,("get_pages_26() res: %d",res)); _OSBASE_TRACE(3,("get_pages_26() exited")); return res; } /** * Updates all fields of the given structure. * @param stats the structure whose fields will be updated. * They will be set to zero if an error occured. */ int get_os_statistics(struct os_statistics *stats) { int res = 1; _OSBASE_TRACE(3,("get_os_statistics() called")); #ifdef CHECK_FCT_PARAMS if (stats == NULL) { return res; _OSBASE_TRACE(1,("get_os_statistics(): stats parameter is NULL")); } #endif stats->user_time = 0; stats->system_time = 0; stats->wait_time = 0; stats->idle_time = 0; stats->run_queue_length = 0; stats->block_queue_length = 0; stats->pages_in = 0; stats->pages_out = 0; if (is_kernel26()) { res = get_cpu_queue_data_26(stats); res = res && get_pages_26(stats); } else { res = get_cpu_page_data_24(stats); res = res && get_queue_info_24(stats); res = res && get_wait_time_24(stats); } _OSBASE_TRACE(4,("get_os_statistics() res: %d",res)); _OSBASE_TRACE(3,("get_os_statistics() exited")); return (res == 0); } /* ---------------------------------------------------------------------------*/ /* end of OSBase_OperatingSystemStatisticalData.c */ /* ---------------------------------------------------------------------------*/ Index: cmpiOSBase_ComputerSystemProvider.c =================================================================== RCS file: /cvsroot/sblim/cmpi-base/cmpiOSBase_ComputerSystemProvider.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- cmpiOSBase_ComputerSystemProvider.c 20 Sep 2004 12:15:43 -0000 1.7 +++ cmpiOSBase_ComputerSystemProvider.c 20 Apr 2005 11:34:56 -0000 1.8 @@ -147,7 +147,7 @@ _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() called",_ClassName)); CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() exited",_ClassName)); return rc; |