From 1f8ca8181f271113c6f100a96036c1b6a6c80c13 Mon Sep 17 00:00:00 2001
From: Adam Wujek <adam.wujek@cern.ch>
Date: Wed, 8 Apr 2015 17:10:03 +0200
Subject: [PATCH] userspace/snmpd: add wrsBootSuccessful to wrsOSStatusGroup

wrsBootSuccessful object check content of wrsOSStatusGroup

Signed-off-by: Adam Wujek <adam.wujek@cern.ch>
---
 userspace/snmpd/WR-SWITCH-MIB.txt  | 20 +++++++
 userspace/snmpd/wrsOSStatusGroup.c | 87 +++++++++++++++++++++++++++++-
 userspace/snmpd/wrsOSStatusGroup.h |  8 +++
 3 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt
index d2b3aa457..70ad1f75f 100644
--- a/userspace/snmpd/WR-SWITCH-MIB.txt
+++ b/userspace/snmpd/WR-SWITCH-MIB.txt
@@ -57,6 +57,26 @@ wrsDetailedStatusesGroup   OBJECT IDENTIFIER ::= { wrsStatus 2 }
 -- wrsOSStatusGroup (.6.2.1)
 wrsOSStatusGroup           OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 1 }
 
+wrsBootSuccessful OBJECT-TYPE
+    SYNTAX         INTEGER {
+                        na(0),
+                        ok(1),
+                        error(2),
+                        warning(3),
+                        warningNA(4),
+                        bug(5)
+    }
+    MAX-ACCESS     read-only
+    STATUS         current
+    DESCRIPTION
+            "Grouped status of wrsBootStatusGroup
+            ok - values in wrsBootStatusGroup are correct
+            error - there is an error in wrsBootStatusGroup
+            warning - there is a warning in wrsBootStatusGroup
+            warningNA - there is N/A field in wrsBootStatusGroup
+            bug - bug in checking conditions of wrsBootStatusGroup, please report"
+    ::= { wrsOSStatusGroup 1 }
+
 wrsTemperatureWarning OBJECT-TYPE
     SYNTAX         INTEGER {
                         na(0),
diff --git a/userspace/snmpd/wrsOSStatusGroup.c b/userspace/snmpd/wrsOSStatusGroup.c
index 73b9beb74..48c078fff 100644
--- a/userspace/snmpd/wrsOSStatusGroup.c
+++ b/userspace/snmpd/wrsOSStatusGroup.c
@@ -1,4 +1,5 @@
 #include "wrsSnmp.h"
+#include "wrsBootStatusGroup.h"
 #include "wrsTemperatureGroup.h"
 #include "wrsOSStatusGroup.h"
 
@@ -13,17 +14,99 @@ time_t wrsOSStatus_data_fill(void)
 {
 	static time_t time_update; /* time of last update */
 	time_t time_temp; /* time when temperature data was updated */
+	time_t time_boot; /* time when boot data was updated */
+	struct wrsBootStatus_s *b;
 
+	time_boot = wrsBootStatus_data_fill();
 	time_temp = wrsTemperature_data_fill();
 
-	if (time_temp <= time_update) {
+	if (time_boot <= time_update
+		&& time_temp <= time_update) {
 		/* cache not updated, return last update time */
 		return time_update;
 	}
 	time_update = time(NULL);
 
 	memset(&wrsOSStatus_s, 0, sizeof(wrsOSStatus_s));
-	/* wrsTemperatureWarning */
+	/*********************************************************************\
+	|************************* wrsBootSuccessful *************************|
+	\*********************************************************************/
+	b = &wrsBootStatus_s;
+	if ( /* check if error */
+		b->wrsBootCnt == 0
+		|| b->wrsRestartReason == WRS_RESTART_REASON_ERROR
+		|| b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_ERROR
+		|| b->wrsBootConfigStatus == WRS_CONFIG_STATUS_ERROR
+		|| b->wrsBootConfigStatus == WRS_CONFIG_STATUS_DL_ERROR
+		|| b->wrsBootConfigStatus == WRS_CONFIG_STATUS_CHECK_ERROR
+		|| b->wrsBootHwinfoReadout == WRS_BOOT_HWINFO_ERROR
+		|| b->wrsBootLoadFPGA == WRS_BOOT_LOAD_FPGA_ERROR
+		|| b->wrsBootLoadFPGA == WRS_BOOT_LOAD_FPGA_FILE_NOT_FOUND
+		|| b->wrsBootLoadLM32 == WRS_BOOT_LOAD_LM32_ERROR
+		|| b->wrsBootLoadLM32 == WRS_BOOT_LOAD_LM32_FILE_NOT_FOUND
+		|| b->wrsBootKernelModulesMissing > 0 /* contain number of missing modules */
+		|| b->wrsBootUserspaceDaemonsMissing > 0 /* contain number of missing deamons */
+	) {
+		wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_ERROR;
+
+	} else if ( /* check if warning */
+		b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_ERROR_MINOR
+		|| b->wrsBootConfigStatus == WRS_CONFIG_STATUS_ERROR_MINOR
+		|| b->wrsBootHwinfoReadout == WRS_BOOT_HWINFO_ERROR_MINOR
+		|| b->wrsBootHwinfoReadout == WRS_BOOT_HWINFO_WARNING
+		|| b->wrsBootLoadFPGA == WRS_BOOT_LOAD_FPGA_ERROR_MINOR
+		|| b->wrsBootLoadLM32 == WRS_BOOT_LOAD_LM32_ERROR_MINOR
+	) { /* warning */
+		wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_WARNING;
+
+	} else if ( /* check if any of fields equal to 0 */
+		b->wrsRestartReason == 0
+		|| b->wrsConfigSource == 0
+		|| b->wrsBootConfigStatus == 0
+		|| b->wrsBootHwinfoReadout == 0
+		|| b->wrsBootLoadFPGA == 0
+		|| b->wrsBootLoadLM32 == 0
+	) { /* warning NA */
+		wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_WARNING_NA;
+
+	} else if ( /* check if OK */
+		b->wrsBootCnt != 0
+		&& b->wrsRestartReason != WRS_RESTART_REASON_ERROR
+		&& b->wrsConfigSource != WRS_CONFIG_SOURCE_PROTO_ERROR
+		&& b->wrsConfigSource != WRS_CONFIG_SOURCE_PROTO_ERROR_MINOR /* warning */
+		&& b->wrsBootConfigStatus == WRS_CONFIG_STATUS_OK
+		&& b->wrsBootHwinfoReadout == WRS_BOOT_HWINFO_OK
+		&& b->wrsBootLoadFPGA == WRS_BOOT_LOAD_FPGA_OK
+		&& b->wrsBootLoadLM32 == WRS_BOOT_LOAD_LM32_OK
+		&& b->wrsBootKernelModulesMissing == 0
+		&& b->wrsBootUserspaceDaemonsMissing == 0
+	) { /* OK, but check source */
+		/* additional check of source */
+		if (
+			b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_LOCAL
+			|| (
+				(
+					b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_TFTP
+					|| b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_HTTP
+					|| b->wrsConfigSource == WRS_CONFIG_SOURCE_PROTO_FTP
+				)
+				&& strnlen(b->wrsConfigSourceHost, WRS_CONFIG_SOURCE_HOST_LEN + 1)
+				&& strnlen(b->wrsConfigSourceFilename, WRS_CONFIG_SOURCE_FILENAME_LEN + 1)
+			)
+		) { /* OK */
+			/* when dotconfig is local or (remote and host not empty and filename not empty) */
+			wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_OK;
+		} else { /* error because of source */
+			wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_ERROR;
+		}
+	} else { /* probably bug in previous conditions,
+		  * this should never happen */
+		wrsOSStatus_s.wrsBootSuccessful = WRS_BOOT_SUCCESSFUL_BUG;
+	}
+
+	/*********************************************************************\
+	|*********************** wrsTemperatureWarning ***********************|
+	\*********************************************************************/
 	if (!wrsTemperature_s.temp_fpga_thold
 	    && !wrsTemperature_s.temp_pll_thold
 	    && !wrsTemperature_s.temp_psl_thold
diff --git a/userspace/snmpd/wrsOSStatusGroup.h b/userspace/snmpd/wrsOSStatusGroup.h
index 6ba7ab65d..cc3900040 100644
--- a/userspace/snmpd/wrsOSStatusGroup.h
+++ b/userspace/snmpd/wrsOSStatusGroup.h
@@ -3,6 +3,14 @@
 
 #define WRSOSSTATUS_OID WRS_OID, 6, 2, 1
 
+#define WRS_BOOT_SUCCESSFUL_OK 1			/* ok */
+#define WRS_BOOT_SUCCESSFUL_ERROR 2			/* error */
+#define WRS_BOOT_SUCCESSFUL_WARNING 3			/* warning */
+#define WRS_BOOT_SUCCESSFUL_WARNING_NA 4 /* warning, at least one field is
+					  * equal to 0 (NA),shouldn't happen in
+					  * normal operation */
+#define WRS_BOOT_SUCCESSFUL_BUG 5			/* warning */
+
 #define WRS_TEMPERATURE_WARNING_THOLD_NOT_SET 1		/* warning */
 #define WRS_TEMPERATURE_WARNING_OK 2			/* ok */
 #define WRS_TEMPERATURE_WARNING_TOO_HIGH 3		/* warning */
-- 
GitLab