#include #include #include "Linux_Fan.h" #include "globals.h" #include "fan.h" static const CMPIBroker* _cb = NULL; #include #include #include void print_backtrace(int signal) { fprintf(stderr, "BackTrace\n"); int ppid = getpid(); int pid = fork(); if (pid == 0) { // Child process char *strpid; asprintf(&strpid, "%d", ppid); execl("/usr/bin/gdb", "/usr/bin/gdb", "-p", strpid, NULL); } else { int status; waitpid(pid, &status, 0); system("/usr/bin/pkill -9 sfcbd"); } } static void Linux_FanInitialize() { init_linux_fan_module(); signal(SIGSEGV, print_backtrace); } static CMPIStatus Linux_FanCleanup( CMPIInstanceMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Linux_FanEnumInstanceNames( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { return KDefaultEnumerateInstanceNames( _cb, mi, cc, cr, cop); } static CMPIStatus Linux_FanEnumInstances( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { const char *ns = KNameSpace(cop); char buf[200]; struct fanlist *lptr = NULL; struct fanlist *fans = NULL; struct cim_fan *sptr; if (enum_all_fans(&fans)) { KReturn2(_cb, ERR_FAILED, "Could not list fans."); } // iterate fan list lptr = fans; while (lptr != NULL) { sptr = lptr->f; Linux_Fan w; Linux_Fan_Init(&w, _cb, ns); Linux_Fan_Set_CreationClassName(&w, "Linux_Fan"); Linux_Fan_Set_SystemCreationClassName(&w, get_system_creation_class_name()); Linux_Fan_Set_SystemName(&w, get_system_name()); Linux_Fan_Set_DeviceID(&w, sptr->device_id); Linux_Fan_Set_Caption(&w, "Computer's fan"); Linux_Fan_Set_Description(&w,"Computer's fan."); snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name, sptr->chip_name); Linux_Fan_Set_ElementName(&w, buf); // ManagedSystemElement Linux_Fan_Set_Name(&w, sptr->name); Linux_Fan_Init_OperationalStatus(&w, 2); Linux_Fan_Set_OperationalStatus(&w, 0, sptr->fault ? Linux_Fan_OperationalStatus_Error : Linux_Fan_OperationalStatus_OK); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { Linux_Fan_Set_OperationalStatus(&w, 1, Linux_Fan_OperationalStatus_Stressed); } Linux_Fan_Init_StatusDescriptions(&w, 2); Linux_Fan_Set_StatusDescriptions(&w, 0, sptr->fault ? "Chip indicates, that fan is in fault state." " Possible causes are open diodes, unconnected fan etc." " Thus the measurement for this channel should not be trusted." : "Fan seems to be functioning correctly."); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { snprintf(buf, 200, "These alarm flags are set by the fan's chip:" " alarm=%s, min_alarm=%s, max_alarm=%s", sptr->alarm ? "1":"0", sptr->alarm_min ? "1":"0", sptr->alarm_max ? "1":"0"); Linux_Fan_Set_StatusDescriptions(&w, 1, buf); } Linux_Fan_Set_HealthState(&w, sptr->fault ? Linux_Fan_HealthState_Major_failure : Linux_Fan_HealthState_OK); Linux_Fan_Set_OperatingStatus(&w, sptr->fault ? Linux_Fan_OperatingStatus_Stopped : Linux_Fan_OperatingStatus_In_Service); Linux_Fan_Set_PrimaryStatus(&w, sptr->fault ? Linux_Fan_PrimaryStatus_Error : Linux_Fan_PrimaryStatus_OK); // EnabledLogicalElement Linux_Fan_Init_OtherIdentifyingInfo(&w, 2); Linux_Fan_Set_OtherIdentifyingInfo(&w, 0, sptr->chip_name); Linux_Fan_Set_OtherIdentifyingInfo(&w, 1, sptr->sys_path); Linux_Fan_Init_IdentifyingDescriptions(&w, 2); Linux_Fan_Set_IdentifyingDescriptions(&w, 0, "ChipName - name of fan's chip."); Linux_Fan_Set_IdentifyingDescriptions(&w, 1, "SysPath - system path of fan's chip."); Linux_Fan_Set_ActiveCooling(&w, true); uint32_t i = 1; int index = 0; debug("accessible_features: %d", sptr->accessible_features); Linux_Fan_Init_AccessibleFeatures(&w, 8); while (i <= CIM_FAN_AF_FEATURE_MAX) { if (i & sptr->accessible_features) { Linux_Fan_Set_AccessibleFeatures(&w, index++, i); } i = i << 1; } if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { Linux_Fan_Set_MinSpeed(&w, (uint64_t) sptr->min_speed); } if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { Linux_Fan_Set_MaxSpeed(&w, (uint64_t) sptr->max_speed); } if (sptr->accessible_features & CIM_FAN_AF_DIV) { Linux_Fan_Set_Divisor(&w, sptr->divisor); } if (sptr->accessible_features & CIM_FAN_AF_PULSES) { Linux_Fan_Set_Pulses(&w, sptr->pulses); } if (sptr->accessible_features & CIM_FAN_AF_BEEP) { Linux_Fan_Set_Beep(&w, sptr->beep); } if (sptr->accessible_features & CIM_FAN_AF_ALARM) { Linux_Fan_Set_Alarm(&w, sptr->alarm); } if (sptr->accessible_features & CIM_FAN_AF_ALARM_MIN) { Linux_Fan_Set_MinAlarm(&w, sptr->alarm_min); } if (sptr->accessible_features & CIM_FAN_AF_ALARM_MAX) { Linux_Fan_Set_MaxAlarm(&w, sptr->alarm_max); } KReturnInstance(cr, w); lptr = lptr->next; } free_fanlist(fans); KReturn(OK); } static CMPIStatus Linux_FanGetInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { return KDefaultGetInstance( _cb, mi, cc, cr, cop, properties); } static CMPIStatus Linux_FanCreateInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Linux_FanModifyInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci, const char** properties) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Linux_FanDeleteInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Linux_FanExecQuery( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* lang, const char* query) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } CMInstanceMIStub( Linux_Fan, Linux_Fan, _cb, Linux_FanInitialize()) static CMPIStatus Linux_FanMethodCleanup( CMPIMethodMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Linux_FanInvokeMethod( CMPIMethodMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* meth, const CMPIArgs* in, CMPIArgs* out) { return Linux_Fan_DispatchMethod( _cb, mi, cc, cr, cop, meth, in, out); } CMMethodMIStub( Linux_Fan, Linux_Fan, _cb, Linux_FanInitialize()) KUint32 Linux_Fan_RequestStateChange( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KUint16* RequestedState, KRef* Job, const KDateTime* TimeoutPeriod, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_SetPowerState( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KUint16* PowerState, const KDateTime* Time, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_Reset( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_EnableDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KBoolean* Enabled, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_OnlineDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KBoolean* Online, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_QuiesceDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KBoolean* Quiesce, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_SaveProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_RestoreProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Linux_Fan_SetSpeed( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Linux_FanRef* self, const KUint64* DesiredSpeed, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KONKRET_REGISTRATION( "root/cimv2", "Linux_Fan", "Linux_Fan", "instance method")