Index: /branches/rel_avx_2_7_5/src/backend/sys_cmd.c
===================================================================
--- /branches/rel_avx_2_7_5/src/backend/sys_cmd.c	(revision 9133)
+++ /branches/rel_avx_2_7_5/src/backend/sys_cmd.c	(working copy)
@@ -1428,6 +1428,12 @@
     char buf[MAXPATHLEN];
     char str_temp[16] = {'\0'};
     int  temp = 0;
+    FILE *stream = NULL;
+    char cmd[128] = {0};
+    char psu_buf[256] = {0};
+    char *psu_detail = NULL;
+    char *next = NULL;
+    int len;
 
     if (access(AVX_MONITOR_PROC, F_OK) != 0) {
         printf("The system monitor doesn't launch!\n");
@@ -1467,7 +1473,33 @@
                     printf("%s overheat\n", buf);
                 }
             } else if (strstr(buf, "Powersupply") != NULL) {
-                printf("One of the power supplies has failed\n");
+                printf("One of the power supplies has failed.");
+                sprintf(cmd, "ipmitool -c sdr type 0x08");
+                stream = popen(cmd, "r");
+		if (stream == NULL) {
+			continue;
+		}
+		while (fgets(psu_buf, sizeof(psu_buf), stream) != NULL) {
+		        psu_detail = strtok_r(psu_buf, ",", &next);
+			if (!psu_detail) {
+			     pclose(stream);
+			     break;
+			}
+		        if (next && (strstr(next, "Fail") || strstr(next, "lost"))) {
+			     len = strlen(psu_detail); 
+			     /* Handle different ipmitool output formats for different models
+			      * PSU 1 Status
+			      * PSU0_Status
+			      * PS1 Status  
+			     */
+			     if (len > 7 && strcasecmp(psu_detail + len - 6, "Status") == 0 && (psu_detail[len - 7] == '_' || psu_detail[len - 7] == ' ')) {
+				psu_detail[len - 7] = '\0';
+                           }
+			   printf(" %s has failed.", psu_detail);
+			}
+		}
+		printf("\n");
+		pclose(stream);
             }
         }
 		
Index: /branches/rel_avx_2_7_5/src/library/avx_log/avx_log.c
===================================================================
--- /branches/rel_avx_2_7_5/src/library/avx_log/avx_log.c	(revision 9133)
+++ /branches/rel_avx_2_7_5/src/library/avx_log/avx_log.c	(working copy)
@@ -102,7 +102,7 @@
 		NULL, NULL},
 	{LOG_IDX_MONITOR_SYSTEM_OVERHEAT, AVXLOG_ALERT, 0, "System overheat", 
 		NULL, NULL},
-	{LOG_IDX_MONITOR_POWER_FAIL, AVXLOG_ALERT, 0, "Backup power fail", 
+	{LOG_IDX_MONITOR_POWER_FAIL, AVXLOG_ALERT, 1, "Backup power(%s) fail", 
 		NULL, NULL},
 	{LOG_IDX_MONITOR_CPU_FAN_FAIL_RECOVER, AVXLOG_ALERT, 1,
 		"CPU \"%d\" fan has recovered from failure", NULL, NULL},
Index: /branches/rel_avx_2_7_5/src/monitord/avx_monitor.c
===================================================================
--- /branches/rel_avx_2_7_5/src/monitord/avx_monitor.c	(revision 9133)
+++ /branches/rel_avx_2_7_5/src/monitord/avx_monitor.c	(working copy)
@@ -282,6 +282,48 @@
 	
 }
 
+int
+get_failed_psu(char* failed_psu, int result_len) {
+
+        FILE *stream = NULL;
+        char cmd[128] = {0};
+        char buf[256] = {0};
+        char *psu_detail = NULL;
+        char *next = NULL;
+        int write_pos = 0;
+        int len;
+        sprintf(cmd, "ipmitool -c sdr type 0x08");
+        stream = popen(cmd, "r");
+        if (stream == NULL) {
+                syslog(LOG_ERR, "get_failed_psu popen failed, errno:%d", errno);
+                return -1;
+        }
+        while (fgets(buf, sizeof(buf), stream) != NULL) {
+                psu_detail = strtok_r(buf, ",", &next);
+                if (!psu_detail) {
+                     break;
+                }
+                if (next && (strstr(next, "Fail") || strstr(next,"lost"))) {
+                     len = strlen(psu_detail);
+                     /* Handle different ipmitool output formats for different models
+                               PSU 1 Status
+                               PSU0_Status
+                               PS1 Status
+                     */
+                     if (len > 7 && strcasecmp(psu_detail + len - 6, "Status") == 0 && (psu_detail[len - 7] == '_' || psu_detail[len - 7] == ' '))
+                     {
+                             psu_detail[len - 7] = '\0';
+                             if (write_pos > 0) {
+                                     write_pos += snprintf(failed_psu + write_pos, result_len-write_pos, ", ");
+                             }
+                             write_pos += snprintf(failed_psu + write_pos, result_len-write_pos,"%s", psu_detail);
+                     }
+                }
+        }
+        pclose(stream);
+        return 0;
+}
+
 static int
 avx_helper(int fd)
 {
@@ -292,6 +334,7 @@
 	int warnning_flag = 0;
 	char cmd[256] = {'\0'};
 	int array_id = -1;
+        char failed_psu[256]={'\0'};
 
 	fp = fdopen(fd, "r");
 	if (!fp) {
@@ -347,8 +390,14 @@
 			if (rc != avx_ms[i].val) {
 				avx_ms[i].val = rc;
 				if ((rc != 0)) {
-					// log error
-					avx_log(avx_ms[i].logid[0], avx_ms[i].argn, avx_ms[i].id);
+				         if (strncmp(pbuf, "Powersupply", keylen) == 0) {
+						get_failed_psu(failed_psu, sizeof(failed_psu));
+						avx_log(LOG_IDX_MONITOR_POWER_FAIL, 1, failed_psu);
+                                         }
+					 else { 
+						// log error
+						avx_log(avx_ms[i].logid[0], avx_ms[i].argn, avx_ms[i].id);
+					 }
 				} else {
 					avx_log(avx_ms[i].logid[1], avx_ms[i].argn, avx_ms[i].id);
 				}
