Hi list,
We're trying to work with the above board and with supermicro's ipmi 2.0
card. Our kernel is 2.4.27 (with some patches including the relevant
ones for ipmi).
After trying the ipmitool 1.8.2 version (some time ago) and got these
results:
[EMAIL PROTECTED] tmp]# ./ipmitool182 sensor
CPU 1 | 36.000 | degrees C | ok | na |
na | na | 76.000 | 78.000 | 80.000
CPU 2 | 34.000 | degrees C | ok | na |
na | na | 76.000 | 78.000 | 80.000
System | 31.000 | degrees C | ok | na |
na | na | 76.000 | 78.000 | 80.000
1.5V | 0xbf | discrete | 0xc0c0| na |
na | na | na | na | na
3.3V | 0xc3 | discrete | 0xc0c0| na |
na | na | na | na | na
3.3VSB | 0xc5 | discrete | 0xc0c0| na |
na | na | na | na | na
5V | 0xc5 | discrete | 0xc0c0| na |
na | na | na | na | na
12V | 0xc5 | discrete | 0xc0c0| na |
na | na | na | na | na
-12V | 0x30 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 1 | 0x69 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 2 | 0x68 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 3 | 0x68 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 4 | 0x6a | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 5 | 0x0 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 6 | 0x0 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 7 | 0x0 | discrete | 0xc0c0| na |
na | na | na | na | na
FAN 8 | 0x0 | discrete | 0xc0c0| na |
na | na | na | na | na
Intrusion | 0.000 | unspecified | nc | 0.000 |
na | 0.000 | 0.000 | na | na
Power Supply | 0.000 | unspecified | cr | 0.000 |
na | 0.000 | 0.000 | na | na
after tweaking with the code a bit (attached is the diff file) we
received the following results:
[EMAIL PROTECTED] tmp]# ./ipmitool182 sensor
Name Reading Units status lnr lcr
lnc unc ucr unr
-------------------------------------------------------------------------------------------------------
CPU 1 | 36.00 | degrees C | ok | na | na |
na | 76.00| 78.00| 80.00
CPU 2 | 35.00 | degrees C | ok | na | na |
na | 76.00| 78.00| 80.00
System | 31.00 | degrees C | ok | na | na |
na | 76.00| 78.00| 80.00
1.5V | 1.49 | Volts | ok | 1.32| 1.33|
1.33| 1.65| 1.66| 1.67
3.3V | 3.35 | Volts | ok | 2.91| 2.92|
2.94| 3.65| 3.66| 3.68
3.3VSB | 3.39 | Volts | ok | 2.91| 2.92|
2.94| 3.65| 3.66| 3.68
5V | 5.12 | Volts | ok | 4.39| 4.42|
4.45| 5.51| 5.54| 5.56
12V | 12.41 | Volts | ok | 10.65| 10.71|
10.77| 13.36| 13.42| 13.48
-12V | -12.43 | Volts | ok | -13.30| -13.28|
-13.25| -10.78| -10.75| -10.72
FAN 1 | 6300.00 | RPM | ok | 1080.00| 1200.00|
1320.00| na | na | na
FAN 2 | 6240.00 | RPM | ok | 1080.00| 1200.00|
1320.00| na | na | na
FAN 3 | 6240.00 | RPM | ok | 1080.00| 1200.00|
1320.00| na | na | na
FAN 4 | 6360.00 | RPM | ok | 1080.00| 1200.00|
1320.00| na | na | na
FAN 5 | 0.00 | RPM | nr | 1080.00| 1200.00|
1320.00| na | na | na
FAN 6 | 0.00 | RPM | nr | 1080.00| 1200.00|
1320.00| na | na | na
FAN 7 | 0.00 | RPM | nr | 1080.00| 1200.00|
1320.00| na | na | na
FAN 8 | 0.00 | RPM | nr | 1080.00| 1200.00|
1320.00| na | na | na
Intrusion | 0.00 | unspecified | us | na | na |
na | na | na | na
Power Supply | 0.00 | unspecified | ok | na | na |
na | na | na | na
We later tried the 1.8.8 version with similar results to the 1.8.2
original version (I can recreate the patch for 1.8.8 if anyone is
interested).
We got most of the parameters we needed except for the Power Supply. All
we get there (after manually disconnecting the power cables or the units
themselves) is one byte that changes from 0 to 2 (we do this with our
added raw command). There's no indication which PSU has failed. Another
problem is that if we power up a computer with one PSU missing although
there's a red led there'sno indication for that in the ipmitool. We use
supermicro's cases (3U -
http://www.supermicro.com/products/chassis/3U/933/SC933T-R760.cfm and 2U
- http://www.supermicro.com/products/chassis/2U/823/SC823T-R500LP.cfm).
If you have any experience with this board your help is greatly
appreciated,
We will be happy to run patches and tests,
thanks,
Dror at xiv dot co dot il
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/lib/ipmi_chassis.c
ipmitool-1.8.2-xiv/lib/ipmi_chassis.c
--- ipmitool-1.8.2/lib/ipmi_chassis.c 2005-05-11 08:47:53.000000000 +0300
+++ ipmitool-1.8.2-xiv/lib/ipmi_chassis.c 2006-08-09 11:56:46.000000000
+0300
@@ -430,6 +430,7 @@ ipmi_chassis_get_bootparam(struct ipmi_i
printf("Boot parameter %d is %s\n", rsp->data[1] & 0x7f,
(rsp->data[1] & 0x80) ? "invalid/locked" : "valid/unlocked");
printf("Boot parameter data: %s\n", buf2str(rsp->data+2, rsp->data_len
- 2));
+ return 0;
}
static int
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/lib/ipmi_event.c
ipmitool-1.8.2-xiv/lib/ipmi_event.c
--- ipmitool-1.8.2/lib/ipmi_event.c 2005-05-17 23:57:38.000000000 +0300
+++ ipmitool-1.8.2-xiv/lib/ipmi_event.c 2006-08-09 11:56:46.000000000 +0300
@@ -80,6 +80,8 @@ ipmi_event_msg_print(struct ipmi_intf *
ipmi_sel_print_extended_entry_verbose(intf, &sel_event);
else
ipmi_sel_print_extended_entry(intf, &sel_event);
+
+ return 0;
}
static int
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/lib/ipmi_sdr.c
ipmitool-1.8.2-xiv/lib/ipmi_sdr.c
--- ipmitool-1.8.2/lib/ipmi_sdr.c 2005-05-18 01:49:02.000000000 +0300
+++ ipmitool-1.8.2-xiv/lib/ipmi_sdr.c 2006-08-09 11:56:46.000000000 +0300
@@ -148,10 +148,18 @@ sdr_convert_sensor_reading(struct sdr_re
result = (double)(((m * (int8_t)val) +
(b * pow(10, k1))) * pow(10, k2));
break;
- default:
+ case 3: /* discrete */
+ result = (double)(((m * val) +
+ (b * pow(10, k1))) * pow(10, k2));
+ break;
+
+ default:
/* Oops! This isn't an analog sensor. */
- return 0.0;
- }
+// return 0.0;
+
+ result = val ;
+ return result;
+ }
switch (sensor->linearization & 0x7f) {
default:
@@ -407,7 +415,16 @@ const char *
ipmi_sdr_get_status(struct sdr_record_full_sensor * sensor,
uint8_t stat)
{
- if (stat & SDR_SENSOR_STAT_LO_NR) {
+
+ if (strncmp(sensor->id_string,"Power",5) == 0) {
+ if (stat > 0)
+ return "ok";
+ else
+ return "fail";
+
+ }
+
+ if (stat & SDR_SENSOR_STAT_LO_NR) {
if (verbose)
return "Lower Non-Recoverable";
else if (sdr_extended)
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/lib/ipmi_sel.c
ipmitool-1.8.2-xiv/lib/ipmi_sel.c
--- ipmitool-1.8.2/lib/ipmi_sel.c 2005-05-18 01:22:10.000000000 +0300
+++ ipmitool-1.8.2-xiv/lib/ipmi_sel.c 2006-08-09 11:56:46.000000000 +0300
@@ -48,6 +48,8 @@
#include <ipmitool/ipmi_fru.h>
#include <ipmitool/ipmi_sensor.h>
+int raw_print = 0 ;
+
extern int verbose;
static int sel_extended = 0;
@@ -84,7 +86,7 @@ ipmi_sel_timestamp(uint32_t stamp)
return tbuf;
}
-static char *
+char *
ipmi_sel_timestamp_date(uint32_t stamp)
{
static uint8_t tbuf[11];
@@ -93,7 +95,7 @@ ipmi_sel_timestamp_date(uint32_t stamp)
return tbuf;
}
-static char *
+char *
ipmi_sel_timestamp_time(uint32_t stamp)
{
static uint8_t tbuf[9];
@@ -245,6 +247,30 @@ ipmi_sel_get_info(struct ipmi_intf * int
return 0;
}
+int
+ipmi_sel_get_no_of_entries(struct ipmi_intf * intf)
+{
+
+ struct ipmi_rs * rsp;
+ struct ipmi_rq req;
+
+ memset(&req, 0, sizeof(req));
+ req.msg.netfn = IPMI_NETFN_STORAGE;
+ req.msg.cmd = IPMI_CMD_GET_SEL_INFO;
+
+ rsp = intf->sendrecv(intf, &req);
+ if (rsp == NULL) {
+ lprintf(LOG_ERR, "Get SEL Info command failed");
+ return -1;
+ }
+ if (rsp->ccode > 0) {
+ lprintf(LOG_ERR, "Get SEL Info command failed: %s",
+ val2str(rsp->ccode, completion_code_vals));
+ return -1;
+ }
+ return(buf2short(rsp->data + 1));
+
+}
uint16_t
ipmi_sel_get_std_entry(struct ipmi_intf * intf, uint16_t id,
struct sel_event_record * evt)
@@ -799,10 +825,17 @@ __ipmi_sel_savelist_entries(struct ipmi_
break;
}
- if (verbose)
- ipmi_sel_print_std_entry_verbose(intf, &evt);
- else
- ipmi_sel_print_std_entry(intf, &evt);
+ if (raw_print) {
+ printf("%4X %2X %8X %4X %2X %2X %2X
%2X %2X %2X %2X %2X\n",
+
evt.record_id,evt.record_type,evt.timestamp,evt.gen_id,evt.evm_rev,evt.sensor_type,
+
evt.sensor_num,evt.event_dir,evt.event_type,evt.event_data[0],evt.event_data[1],evt.event_data[2]);
+ } else {
+ if (verbose)
+ ipmi_sel_print_std_entry_verbose(intf, &evt);
+ else
+ ipmi_sel_print_std_entry(intf, &evt);
+
+ }
if (fp != NULL) {
ipmi_sel_print_event_file(intf, &evt, fp);
@@ -819,6 +852,57 @@ __ipmi_sel_savelist_entries(struct ipmi_
return 0;
}
+
+static int
+ipmi_sel_show_last_entry(struct ipmi_intf * intf)
+{
+ struct ipmi_rs * rsp;
+ struct ipmi_rq req;
+ uint16_t next_id = 0;
+ struct sel_event_record evt;
+
+ memset(&req, 0, sizeof(req));
+ req.msg.netfn = IPMI_NETFN_STORAGE;
+ req.msg.cmd = IPMI_CMD_GET_SEL_INFO;
+
+ rsp = intf->sendrecv(intf, &req);
+ if (rsp == NULL) {
+ lprintf(LOG_ERR, "Get SEL Info command failed");
+ return -1;
+ }
+ if (rsp->ccode > 0) {
+ lprintf(LOG_ERR, "Get SEL Info command failed: %s",
+ val2str(rsp->ccode, completion_code_vals));
+ return -1;
+ }
+
+ if (rsp->data[1] == 0 && rsp->data[2] == 0) {
+ lprintf(LOG_ERR, "SEL has no entries");
+ return -1;
+ }
+
+ memset(&req, 0, sizeof(req));
+ req.msg.netfn = IPMI_NETFN_STORAGE;
+ req.msg.cmd = IPMI_CMD_RESERVE_SEL;
+
+ rsp = intf->sendrecv(intf, &req);
+ if (rsp == NULL) {
+ lprintf(LOG_ERR, "Reserve SEL command failed");
+ return -1;
+ }
+ if (rsp->ccode > 0) {
+ lprintf(LOG_ERR, "Reserve SEL command failed: %s",
+ val2str(rsp->ccode, completion_code_vals));
+ return -1;
+ }
+
+ next_id = ipmi_sel_get_std_entry(intf, 0xffff, &evt);
+ ipmi_sel_print_extended_entry(intf, &evt);
+ return 0;
+}
+
+
+
static int
ipmi_sel_list_entries(struct ipmi_intf * intf, int count)
{
@@ -964,7 +1048,7 @@ ipmi_sel_set_time(struct ipmi_intf * int
-static int
+int
ipmi_sel_clear(struct ipmi_intf * intf)
{
struct ipmi_rs * rsp;
@@ -1027,7 +1111,7 @@ ipmi_sel_delete(struct ipmi_intf * intf,
msg_data[0] = id & 0xff;
msg_data[1] = id >> 8;
- for (argc; argc != 0; argc--)
+ for (/*argc*/; argc != 0; argc--)
{
id = atoi(argv[argc-1]);
msg_data[2] = id & 0xff;
@@ -1157,7 +1241,7 @@ int ipmi_sel_main(struct ipmi_intf * int
if (argc == 0)
rc = ipmi_sel_get_info(intf);
else if (strncmp(argv[0], "help", 4) == 0)
- lprintf(LOG_ERR, "SEL Commands: info clear delete list elist
get time save");
+ lprintf(LOG_ERR, "SEL Commands: info clear delete list elist
get time save last");
else if (strncmp(argv[0], "info", 4) == 0)
rc = ipmi_sel_get_info(intf);
else if (strncmp(argv[0], "save", 4) == 0) {
@@ -1168,7 +1252,8 @@ int ipmi_sel_main(struct ipmi_intf * int
rc = ipmi_sel_save_entries(intf, 0, argv[1]);
}
else if (strncmp(argv[0], "list", 4) == 0 ||
- strncmp(argv[0], "elist", 5) == 0) {
+ strncmp(argv[0], "elist", 5) == 0 ||
+ strncmp(argv[0], "rlist", 5) == 0) {
/*
* Usage:
* list - show all SEL entries
@@ -1179,6 +1264,10 @@ int ipmi_sel_main(struct ipmi_intf * int
int sign = 1;
char *countstr = NULL;
+ if (strncmp(argv[0], "rlist", 5) == 0) {
+ raw_print = 1;
+ printf("rec_id rec_type timestamp gen_id evm_rev sen_type sen_num
event_dir event_type d0 d1 d2\n");
+ }
if (strncmp(argv[0], "elist", 5) == 0)
sel_extended = 1;
else
@@ -1238,7 +1327,10 @@ int ipmi_sel_main(struct ipmi_intf * int
lprintf(LOG_ERR, "sel time commands: get set");
}
}
- else {
+ else if (strncmp(argv[0], "last", 4) == 0) {
+ rc = ipmi_sel_show_last_entry(intf);
+ }
+ else {
lprintf(LOG_ERR, "Invalid SEL command: %s", argv[0]);
rc = -1;
}
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/lib/ipmi_sensor.c
ipmitool-1.8.2-xiv/lib/ipmi_sensor.c
--- ipmitool-1.8.2/lib/ipmi_sensor.c 2005-05-15 08:14:49.000000000 +0300
+++ ipmitool-1.8.2-xiv/lib/ipmi_sensor.c 2006-08-09 14:21:07.923354611
+0300
@@ -86,6 +86,7 @@ ipmi_sensor_set_sensor_thresholds(struct
return intf->sendrecv(intf, &req);
}
+/*
static int
ipmi_sensor_print_full_discrete(struct ipmi_intf * intf,
struct sdr_record_full_sensor * sensor)
@@ -93,7 +94,7 @@ ipmi_sensor_print_full_discrete(struct i
char id[17];
char * unitstr = "discrete";
int validread=1;
- uint8_t val = 0;
+ int val = 0;
struct ipmi_rs * rsp;
if (sensor == NULL)
@@ -102,9 +103,9 @@ ipmi_sensor_print_full_discrete(struct i
memset(id, 0, sizeof(id));
memcpy(id, sensor->id_string, 16);
- /*
- * Get current reading
- */
+
+ // Get current reading
+
rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
sensor->keys.sensor_num,
sensor->keys.owner_id);
@@ -115,23 +116,23 @@ ipmi_sensor_print_full_discrete(struct i
} else if (rsp->ccode > 0 || (rsp->data[1] & READING_UNAVAILABLE)) {
validread = 0;
} else {
- /* convert RAW reading into units */
- val = rsp->data[0];
+ // convert RAW reading into units
+ val = (int )sdr_convert_sensor_reading(sensor, rsp->data[0]);
}
if (csv_output)
{
- /* NOT IMPLEMENTED */
+ // NOT IMPLEMENTED
}
else
{
if (verbose == 0) {
- /* output format
- * id value units status thresholds....
- */
+ // output format
+ // id value units status thresholds....
+
printf("%-16s ", id);
if (validread) {
- printf("| 0x%-8x | %-10s | 0x%02x%02x",
+ printf("| %-8d | %-11s | 0x%02x%02x",
val,
unitstr,
rsp->data[2],
@@ -163,8 +164,77 @@ ipmi_sensor_print_full_discrete(struct i
}
return 0;
+} */
+
+
+/* ipmi_sensor_get_status - Return 2-character status indicator
+ *
+ * @stat: ipmi SDR status field
+ *
+ * returns
+ * cr = critical
+ * nc = non-critical
+ * nr = non-recoverable
+ * ok = ok
+ * us = unspecified (not used)
+ */
+const char *
+ipmi_sensor_get_status(struct sdr_record_full_sensor * sensor,
+ uint8_t val , struct ipmi_rs * rsp)
+{
+ if (strncmp(sensor->id_string,"Power",5) == 0) {
+ if ( rsp->data[2]> 0)
+ return "ok";
+ else
+ return "fail";
+ }
+ if (strncmp(sensor->id_string,"Intru",5) == 0) {
+ return "us";
+ }
+
+
+ if ((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED) && (val <= rsp->data[3])) {
+ if (verbose)
+ return "Lower Non-Recoverable";
+ else
+ return "nr";
+ }
+ if ((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED) && (val >= rsp->data[6])) {
+ if (verbose)
+ return "Upper Non-Recoverable";
+ else
+ return "nr";
+ }
+
+ if ((rsp->data[0] & LOWER_CRIT_SPECIFIED) && (val <= rsp->data[2])) {
+ if (verbose)
+ return "Lower Critical";
+ else
+ return "cr";
+ }
+ if ((rsp->data[0] & UPPER_CRIT_SPECIFIED) && (val >= rsp->data[5])) {
+ if (verbose)
+ return "Upper Critical";
+ else
+ return "cr";
+ }
+ if ((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED) && (val <= rsp->data[1])) {
+ if (verbose)
+ return "Lower Non-Critical";
+ else
+ return "nc";
+ }
+ if ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED) && (val >= rsp->data[4])) {
+ if (verbose)
+ return "Upper Non-Critical";
+ else
+ return "nc";
+ }
+ return "ok";
}
+
+
static int
ipmi_sensor_print_full_analog(struct ipmi_intf * intf,
struct sdr_record_full_sensor * sensor)
@@ -174,6 +244,7 @@ ipmi_sensor_print_full_analog(struct ipm
double val = 0.0;
struct ipmi_rs * rsp;
char * status = NULL;
+ int reading = 0 ;
if (sensor == NULL)
return -1;
@@ -201,10 +272,25 @@ ipmi_sensor_print_full_analog(struct ipm
validread = 0;
} else {
/* convert RAW reading into units */
- val = (rsp->data[0] > 0)
+ reading = rsp->data[0];
+ val = (rsp->data[0] > 0)
? sdr_convert_sensor_reading(sensor, rsp->data[0])
: 0;
- status = (char*)ipmi_sdr_get_status(sensor, rsp->data[2]);
+
+ if (strncmp(sensor->id_string,"Power",5) == 0) {
+ thresh_available = 0;
+ if ( rsp->data[2]> 0)
+ status = "ok";
+ else
+ status = "fail";
+ }
+ if (strncmp(sensor->id_string,"Intru",5) == 0) {
+ thresh_available = 0;
+ status = "us";
+ }
+
+
+ // status = (char*)ipmi_sdr_get_status(sensor, rsp->data[2]);
}
/*
@@ -233,10 +319,16 @@ ipmi_sensor_print_full_analog(struct ipm
/*
* Get sensor thresholds
*/
- rsp = ipmi_sdr_get_sensor_thresholds(intf, sensor->keys.sensor_num);
- if (rsp == NULL)
- thresh_available = 0;
+ if (thresh_available) {
+ rsp = ipmi_sdr_get_sensor_thresholds(intf, sensor->keys.sensor_num);
+ if (rsp == NULL) {
+ thresh_available = 0;
+ status = "us" ;
+ } else {
+ status = (char*)ipmi_sensor_get_status(sensor, reading , rsp);
+ }
+ }
if (csv_output)
{
/* NOT IPMLEMENTED */
@@ -250,42 +342,42 @@ ipmi_sensor_print_full_analog(struct ipm
*/
printf("%-16s ", id);
if (validread) {
- printf("| %-10.3f | %-10s | %-6s",
+ printf("|%8.2f | %-11s | %-6s",
val, unitstr, status ? : "");
} else {
- printf("| %-10s | %-10s | %-6s",
+ printf("| %-7s | %-11s | %-6s",
"na", unitstr, "na");
}
if (thresh_available)
{
if (rsp->data[0] & LOWER_NON_RECOV_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[3]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[3]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
if (rsp->data[0] & LOWER_CRIT_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[2]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[2]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
if (rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[1]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[1]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
if (rsp->data[0] & UPPER_NON_CRIT_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[4]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[4]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
if (rsp->data[0] & UPPER_CRIT_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[5]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[5]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
if (rsp->data[0] & UPPER_NON_RECOV_SPECIFIED)
- printf("| %-10.3f",
sdr_convert_sensor_reading(sensor, rsp->data[6]));
+ printf("|%8.2f",
sdr_convert_sensor_reading(sensor, rsp->data[6]));
else
- printf("| %-10s", "na");
+ printf("| %-7s", "na");
}
else
{
- printf("| %-10s| %-10s| %-10s| %-10s| %-10s|
%-10s",
+ printf("| %-7s| %-7s| %-7s| %-7s| %-7s| %-7s",
"na", "na", "na", "na", "na", "na");
}
@@ -305,7 +397,7 @@ ipmi_sensor_print_full_analog(struct ipm
printf(" Sensor Reading : ");
if (validread) {
uint16_t raw_tol = __TO_TOL(sensor->mtol);
- double tol = sdr_convert_sensor_reading(sensor,
raw_tol * 2);
+ double tol = sdr_convert_sensor_reading(sensor, raw_tol * 2);
printf("%.*f (+/- %.*f) %s\n",
(val==(int)val) ? 0 : 3,
val,
@@ -371,14 +463,43 @@ ipmi_sensor_print_full_analog(struct ipm
return 0;
}
+
+static int
+ipmi_sensor_print_reading(struct ipmi_intf * intf,
+ struct sdr_record_full_sensor * sensor)
+{
+ double val = 0.0;
+ struct ipmi_rs * rsp;
+
+ if (sensor == NULL) return -1;
+ /*
+ * Get current reading
+ */
+ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
+ sensor->keys.sensor_num,
+ sensor->keys.owner_id);
+ if (rsp == NULL) return -1;
+ if (rsp->ccode || (rsp->data[1] & READING_UNAVAILABLE)) return -1;
+
+ val = (rsp->data[0] > 0) ? sdr_convert_sensor_reading(sensor,
rsp->data[0]) : 0;
+ printf("%6.1f |",val);
+ return 0;
+}
+
+
int
ipmi_sensor_print_full(struct ipmi_intf * intf,
struct sdr_record_full_sensor * sensor)
{
- if (sensor->unit.analog != 3)
+ /*
+ if (sensor->unit.analog != 3)
return ipmi_sensor_print_full_analog(intf, sensor);
else
return ipmi_sensor_print_full_discrete(intf, sensor);
+
+ */
+ return ipmi_sensor_print_full_analog(intf, sensor);
+
}
int
@@ -471,7 +592,10 @@ ipmi_sensor_list(struct ipmi_intf * intf
lprintf(LOG_ERR, "Unable to open SDR for reading");
return -1;
}
-
+ if (verbose == 0) {
+ printf("Name Reading Units status lnr
lcr lnc unc ucr unr\n");
+
printf("-------------------------------------------------------------------------------------------------------\n");
+ }
while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL)
{
int r = 0;
@@ -503,6 +627,166 @@ ipmi_sensor_list(struct ipmi_intf * intf
return rc;
}
+static int
+ipmi_sensor_one_line(struct ipmi_intf * intf , char * node)
+{
+ struct sdr_get_rs * header;
+ struct ipmi_sdr_iterator * itr;
+ int rc = 0;
+
+ lprintf(LOG_DEBUG, "Querying SDR for sensor list");
+
+ itr = ipmi_sdr_start(intf);
+ if (itr == NULL) {
+ lprintf(LOG_ERR, "Unable to open SDR for reading");
+ return -1;
+ }
+ printf("%5s :",node);
+ while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL)
+ {
+ int r = 0;
+ uint8_t * rec;
+
+ rec = ipmi_sdr_get_record(intf, header, itr);
+ if (rec == NULL) continue;
+ r = ipmi_sensor_print_reading(intf, (struct sdr_record_full_sensor
*)rec);
+ free(rec);
+
+ /* save any errors */
+ rc = (r == 0) ? rc : r;
+ }
+
+ ipmi_sdr_end(intf, itr);
+ printf("\n");
+ return rc;
+}
+
+
+
+static int
+ipmi_sensor_raw(struct ipmi_intf * intf)
+{
+ struct sdr_get_rs * header;
+ struct ipmi_sdr_iterator * itr;
+ int rc = 0;
+ int i ;
+ struct sdr_record_full_sensor * sensor ;
+ struct ipmi_rs * rsp;
+
+ lprintf(LOG_DEBUG, "Querying SDR for sensor raw");
+
+ itr = ipmi_sdr_start(intf);
+ if (itr == NULL) {
+ lprintf(LOG_ERR, "Unable to open SDR for reading");
+ return -1;
+ }
+
+// printf("name id next ver type len ccode data\n");
+ printf("name id len data
thresholds\n");
+
printf("--------------------------------------------------------------------------------------------------\n");
+ while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL)
+ {
+// int r = 0;
+ uint8_t * rec;
+
+ rec = ipmi_sdr_get_record(intf, header, itr);
+ if (rec == NULL)
+ continue;
+ sensor = (struct sdr_record_full_sensor *)rec;
+// printf("%-16s %04X %04X %02X %02X %02X
",sensor->id_string,header->id,header->next,header->version,header->type,header->length);
+ printf("%-16s %04X %02X
",sensor->id_string,header->id,header->length);
+ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
+ sensor->keys.sensor_num,
+ sensor->keys.owner_id);
+ for (i= 0 ; i < 16 ; i++) {
+ printf("%02X ",rsp->data[i]);
+ }
+ printf(" ");
+ rsp = ipmi_sdr_get_sensor_thresholds(intf, sensor->keys.sensor_num);
+ if (rsp != NULL) {
+ for (i= 0 ; i < 7 ; i++) {
+ printf("%02X ",rsp->data[i]);
+ }
+ }
+ printf("\n");
+ free(rec);
+
+ }
+
+ ipmi_sdr_end(intf, itr);
+
+ return rc;
+}
+
+static int
+ipmi_sensor_status(struct ipmi_intf * intf, int argc, char ** argv)
+{
+ struct sdr_get_rs * header;
+ struct ipmi_sdr_iterator * itr;
+ int rc = 0;
+ char * status;
+ int val ;
+ struct sdr_record_full_sensor * sensor ;
+ struct ipmi_rs * rsp;
+ int fans = 8 , j =0 , fails = 0;
+
+ if (argc > 0) {
+ fans = atoi(argv[0]);
+ }
+
+ lprintf(LOG_DEBUG, "Querying SDR for sensor status");
+
+ itr = ipmi_sdr_start(intf);
+ if (itr == NULL) {
+ lprintf(LOG_ERR, "Unable to open SDR for reading");
+ return -1;
+ }
+
+ printf("name id status\n");
+ printf("----------------------------\n");
+ while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL)
+ {
+// int r = 0;
+ uint8_t * rec;
+
+ rec = ipmi_sdr_get_record(intf, header, itr);
+ if (rec == NULL)
+ continue;
+ sensor = (struct sdr_record_full_sensor *)rec;
+ if ((strncmp(sensor->id_string,"Intru",5) != 0) &&
+ ((strncmp(sensor->id_string,"FAN",3) != 0) || (j < fans))) {
+ if (strncmp(sensor->id_string,"FAN",3) == 0) j++;
+ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
+ sensor->keys.sensor_num,
+ sensor->keys.owner_id);
+ val = rsp->data[0];
+ if (strncmp(sensor->id_string,"Power",5) == 0) {
+ if ( rsp->data[2]> 0)
+ status = "ok";
+ else
+ status = "fail";
+ } else {
+ rsp = ipmi_sdr_get_sensor_thresholds(intf,
sensor->keys.sensor_num);
+ status = (char*)ipmi_sensor_get_status(sensor, val , rsp);
+ }
+ printf("%-16s %04X %s\n",sensor->id_string,header->id,status);
+ if (strncmp(status,"ok",2) != 0) fails++;
+ }
+ free(rec);
+ }
+
+ ipmi_sdr_end(intf, itr);
+ if (fails > 0) {
+ printf("Alarm on\n");
+ } else {
+ printf("Alarm off\n");
+ }
+
+ return rc;
+}
+
+
+
static const struct valstr threshold_vals[] = {
{ UPPER_NON_RECOV_SPECIFIED, "Upper Non-Recoverable" },
{ UPPER_CRIT_SPECIFIED, "Upper Critical" },
@@ -689,6 +973,43 @@ ipmi_sensor_set_threshold(struct ipmi_in
return ret;
}
+/* ipmi_sensor_get_int_status
+
+ input: intf , sensor_id (string)
+ output: -1 - cannot read or not exist
+ 0 - outside threshold
+ 1 - ok
+ */
+
+int ipmi_sensor_get_int_status(struct ipmi_intf * intf, char * sensor_id)
+{
+ struct sdr_record_list * sdr;
+ struct ipmi_rs * rsp;
+ int reading ;
+
+ sdr = ipmi_sdr_find_sdr_byid(intf, sensor_id);
+ if (sdr == NULL) return -1 ; //not found
+ if (sdr->record.full == NULL) return -1 ;
+ if (sdr->record.full->linearization>=SDR_SENSOR_L_NONLINEAR) return -1 ;
+ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
+ sdr->record.full->keys.sensor_num,
+ sdr->record.full->keys.owner_id);
+ if (rsp == NULL) return -1 ;
+ if (rsp->ccode || (rsp->data[1] & READING_UNAVAILABLE)) return -1 ;
+ if (strncmp(sdr->record.full->id_string,"Power",5) == 0) return
((rsp->data[2]> 0)?1 :0);
+ reading = rsp->data[0];
+ rsp = ipmi_sdr_get_sensor_thresholds(intf,
sdr->record.full->keys.sensor_num);
+ if (rsp == NULL) return -1 ;
+ if (((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED) && (reading <=
rsp->data[3])) ||
+ ((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED) && (reading >=
rsp->data[6])) ||
+ ((rsp->data[0] & LOWER_CRIT_SPECIFIED) && (reading <= rsp->data[2]))
||
+ ((rsp->data[0] & UPPER_CRIT_SPECIFIED) && (reading >= rsp->data[5]))
||
+ ((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED) && (reading <=
rsp->data[1])) ||
+ ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED) && (reading >=
rsp->data[4])) ) return 0 ; // fail
+ return 1 ; // ok
+
+}
+
static int
ipmi_sensor_get(struct ipmi_intf * intf, int argc, char ** argv)
{
@@ -753,7 +1074,7 @@ ipmi_sensor_main(struct ipmi_intf * intf
rc = ipmi_sensor_list(intf);
}
else if (strncmp(argv[0], "help", 4) == 0) {
- lprintf(LOG_NOTICE, "Sensor Commands: list thresh get");
+ lprintf(LOG_NOTICE, "Sensor Commands: list thresh get raw
status");
}
else if (strncmp(argv[0], "list", 4) == 0) {
rc = ipmi_sensor_list(intf);
@@ -763,7 +1084,16 @@ ipmi_sensor_main(struct ipmi_intf * intf
}
else if (strncmp(argv[0], "get", 3) == 0) {
rc = ipmi_sensor_get(intf, argc-1, &argv[1]);
- }
+ }
+ else if (strncmp(argv[0], "raw", 3) == 0) {
+ rc = ipmi_sensor_raw(intf);
+ }
+ else if (strncmp(argv[0], "line", 4) == 0) {
+ rc = ipmi_sensor_one_line(intf ,argv[1]);
+ }
+ else if (strncmp(argv[0], "status", 6) == 0) {
+ rc = ipmi_sensor_status(intf,argc-1, &argv[1]);
+ }
else {
lprintf(LOG_ERR, "Invalid sensor command: %s",
argv[0]);
diff -urNp -X ipmi.dontdiff ipmitool-1.8.2/src/plugins/bmc/bmc_intf.h
ipmitool-1.8.2-xiv/src/plugins/bmc/bmc_intf.h
--- ipmitool-1.8.2/src/plugins/bmc/bmc_intf.h 2005-03-17 02:12:08.000000000
+0200
+++ ipmitool-1.8.2-xiv/src/plugins/bmc/bmc_intf.h 2006-08-09
11:56:46.000000000 +0300
@@ -37,7 +37,7 @@
#ifndef _BMC_INTF_H
#define _BMC_INTF_H
-#pragma ident "@(#)bmc_intf.h 1.2 05/03/07 SMI"
+// #pragma ident "@(#)bmc_intf.h 1.2 05/03/07 SMI"
#ifdef __cplusplus
extern "C" {
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel