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

Reply via email to