Binary files Cmds_sel_minus_powermonitoring/ipmitool-1.8.9.tar.gz and Cmds_sel/ipmitool-1.8.9.tar.gz differ diff -rup Cmds_sel_minus_powermonitoring/lib/ipmi_delloem.c Cmds_sel/lib/ipmi_delloem.c --- Cmds_sel_minus_powermonitoring/lib/ipmi_delloem.c 2008-02-21 02:56:58.000000000 -0600 +++ Cmds_sel/lib/ipmi_delloem.c 2008-02-21 02:49:53.000000000 -0600 @@ -13,7 +13,7 @@ #include #include #include -#include /*( _MIN and _MAX*/ +#include /* _MIN and _MAX*/ #include #include #include @@ -52,6 +52,7 @@ ipmi_sel_reserve(struct ipmi_intf * intf SDRType* ipmi_sdr_get_test(struct ipmi_intf *intf, uint16_t reserveId, uint8_t* datapt, uint16_t recordId); SDRType* ipmi_sdr_get_test2(struct ipmi_intf *intf, uint16_t reserveId, uint8_t* datapt, uint16_t recordId); SDRType* ipmi_sdr_get_test3(struct ipmi_intf *intf, uint16_t reserveId, uint8_t* datapt, uint16_t recordId); +static int ipmi_powermgmt(struct ipmi_intf* intf); static void ipmi_time_to_str(time_t rawTime, char* strTime); static char * @@ -711,6 +712,209 @@ ipmi_sel_reserve(struct ipmi_intf * intf + +static int ipmi_powermgmt(struct ipmi_intf* intf) +{ + time_t now; + struct tm* tm; + struct tm* tm2; + char* dte; + + struct ipmi_rs * rsp; + struct ipmi_rq req; + uint8_t msg_data[2]; + uint32_t cumStartTimeConv; + uint32_t cumReadingConv; + uint32_t maxPeakStartTimeConv; + uint32_t ampPeakTimeConv; + uint16_t ampReadingConv; + uint32_t wattPeakTimeConv; + uint32_t wattReadingConv; + + + IPMI_POWER_MONITOR* pwrMonitorInfo; + char* cumStartTimeStr; + char* maxPeakStartTimeStr; + char* ampPeakTimeStr; + char* wattPeakTimeStr; + char cumStartTime[25]; + char maxPeakStartTime[25]; + char ampPeakTime[25]; + char wattPeakTime[25]; + float cumReading; + int ampReading; + int wattReading; + int ampReadingRemainder; + + cumStartTimeStr = &cumStartTime[0]; + maxPeakStartTimeStr = &maxPeakStartTime[0]; + ampPeakTimeStr = &PeakTime[0]; + wattPeakTimeStr = &wattPeakTime[0]; + + now = time(0); + tm = gmtime(&now); + dte = asctime(tm); + + + + /* get current BMC time info*/ + time_t bmcTime; + time_t* pBmcTime; + char* bmcTimeStr; + + + pBmcTime = &bmcTime; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_STORAGE; + req.msg.cmd = IPMI_CMD_GET_SEL_TIME; + + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + lprintf(LOG_ERR, " Error getting BMC time info.\n"); + return -1; + } + if (rsp->ccode != 0) { + printf("Error getting power management information, return code %x\n", rsp->ccode); + return -1; + } + + memcpy(pBmcTime, rsp->data, sizeof(time_t)); + + + tm2 = gmtime(pBmcTime); + + /* get powermanagement info*/ + req.msg.netfn = 0x30; + req.msg.lun = 0x0; + req.msg.cmd = 0x9c; + req.msg.data = msg_data; + req.msg.data_len = 2; + + + + memset(msg_data, 0, 2); + /*printf("##########netfn = %x\n", req.msg.netfn);*/ + msg_data[0] = 0x07; + msg_data[1] = 0x01; + + + + + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + lprintf(LOG_ERR, " Error getting power management information.\n"); + return -1; + } + if (rsp->ccode == 0xc1) { + lprintf(LOG_ERR, " Error getting power management information, command not supported on this system.\n"); + return -1; + }else if (rsp->ccode != 0) { + printf("Error getting power management information, return code %x\n", rsp->ccode); + return -1; + } + + + + pwrMonitorInfo = (IPMI_POWER_MONITOR*)rsp->data; + + + + cumStartTimeConv = pwrMonitorInfo->cumStartTime; + cumReadingConv = pwrMonitorInfo->cumReading; + maxPeakStartTimeConv = pwrMonitorInfo->maxPeakStartTime; + ampPeakTimeConv = pwrMonitorInfo->ampPeakTime; + ampReadingConv = pwrMonitorInfo->ampReading; + wattPeakTimeConv = pwrMonitorInfo->wattPeakTime; + wattReadingConv = pwrMonitorInfo->wattReading; + + + ipmi_time_to_str(cumStartTimeConv, cumStartTimeStr); + ipmi_time_to_str(maxPeakStartTimeConv, maxPeakStartTimeStr); + ipmi_time_to_str(ampPeakTimeConv, ampPeakTimeStr); + ipmi_time_to_str(wattPeakTimeConv, wattPeakTimeStr); + + now = time(0); + + int round; + int round2; + int remainder; + + + remainder = (cumReadingConv % 1000); + cumReadingConv = cumReadingConv / 1000; + remainder = (remainder + 50) / 100; + + ampReading = ampReadingConv; + ampReading = ampReading/10; + ampReadingRemainder = ampReading%10; + + wattReading = wattReadingConv; + + printf("Power Tracking Statistics\n"); + printf("Statistic : Energy Consumption\n"); + printf("Measurement Start Time : %s", cumStartTimeStr); + printf("Measurement Finish Time : %s", /*bmcTimeStr*/asctime(tm)); + printf("Reading : %d.%d kWh\n\n", cumReadingConv, remainder); + + printf("Statistic : System Peak Power\n"); + printf("Measurement Start Time : %s", maxPeakStartTimeStr); + printf("Peak Time : %s", wattPeakTimeStr); + printf("Peak Reading : %d W\n\n", wattReading); + + printf("Statistic : System Peak Amperage\n"); + printf("Measurement Start Time : %s", maxPeakStartTimeStr); + printf("Peak Time : %s", ampPeakTimeStr); + printf("Reading : %d.%d A\n", ampReading, ampReadingRemainder); + + return 0; + +} + +static int +ipmi_powermgmt_clear(struct ipmi_intf* intf, int8_t clearValue) +{ + struct ipmi_rs * rsp; + struct ipmi_rq req; + uint8_t clearType; + uint8_t msg_data[3]; + + if (clearValue) { + clearType = 2; + } else { + clearType = 1; + } + + /* clear powermanagement info*/ + req.msg.netfn = 0x30; + req.msg.lun = 0; + req.msg.cmd = 0x9d; + req.msg.data = msg_data; + req.msg.data_len = 3; + + + memset(msg_data, 0, 3); + msg_data[0] = 0x07; + msg_data[1] = 0x01; + msg_data[2] = clearType; + + + + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + lprintf(LOG_ERR, " Error clearing power values.\n"); + return -1; + } else if (rsp->ccode == 0xc1) { + lprintf(LOG_ERR, " Error clearing power values, command not supported on this system.\n"); + return -1; + } else if (rsp->ccode != 0){ + lprintf(LOG_ERR, " Error clearing power values: %s", + val2str(rsp->ccode, completion_code_vals)); + return -1; + } + +} + static void ipmi_time_to_str(time_t rawTime, char* strTime) { @@ -740,6 +944,21 @@ ipmi_sel_usage(void) lprintf(LOG_NOTICE, ""); } + +static void +ipmi_powermonitor_usage(void) +{ + lprintf(LOG_NOTICE, ""); + lprintf(LOG_NOTICE, " powermonitor"); + lprintf(LOG_NOTICE, " Shows power tracking statistics "); + lprintf(LOG_NOTICE, ""); + lprintf(LOG_NOTICE, " powermonitor clear cumulativepower"); + lprintf(LOG_NOTICE, " Reset cumulative power reading"); + lprintf(LOG_NOTICE, ""); + lprintf(LOG_NOTICE, " powermonitor clear peakpower"); + lprintf(LOG_NOTICE, " Reset peak power reading"); + lprintf(LOG_NOTICE, ""); +} static void @@ -751,6 +970,7 @@ usage(void) lprintf(LOG_NOTICE, "commands:"); lprintf(LOG_NOTICE, " sel"); lprintf(LOG_NOTICE, " sensor"); + lprintf(LOG_NOTICE, " powermonitor"); lprintf(LOG_NOTICE, ""); lprintf(LOG_NOTICE, "For help on individual commands type:"); lprintf(LOG_NOTICE, "delloem help"); @@ -767,7 +987,7 @@ ipmi_delloem_main(struct ipmi_intf * int usage(); return 0; } - /* start sel processing*/ + // start sel processing else if (strncmp(argv[current_arg], "sel\0", 4) == 0) { current_arg++; if (argc == 1) { @@ -823,7 +1043,31 @@ ipmi_delloem_main(struct ipmi_intf * int ipmi_sel_usage(); return -1; } - /*Powermanagement report processing*/ + /* Powermanagement report processing*/ + } else if (strncmp(argv[current_arg], "powermonitor\0", 13) == 0) { + current_arg++; + if (argc == 1) { + rc = ipmi_powermgmt(intf); + } else if (strncmp(argv[current_arg], "status\0", 7) == 0) { + rc = ipmi_powermgmt(intf); + } else if (strncmp(argv[current_arg], "clear\0", 6) == 0) { + current_arg++; + if (argv[current_arg] == NULL) { + ipmi_powermonitor_usage(); + return -1; + }else if (strncmp(argv[current_arg], "peakpower\0", 10) == 0) { + rc = ipmi_powermgmt_clear(intf, 1); + } else if (strncmp(argv[current_arg], "cumulativepower\0", 16) == 0) { + rc = ipmi_powermgmt_clear(intf, 0); + } else { + ipmi_powermonitor_usage(); + return -1; + } + + } else { + ipmi_powermonitor_usage(); + return -1; + } } else if (strncmp(argv[current_arg], "test\0", 5) == 0) { rc = ipmi_sdr_build_table(intf);