From cb091c08bd3671b73a8fbdf9f9fe30f278eb5f9e Mon Sep 17 00:00:00 2001
From: Adam Wujek <adam.wujek@cern.ch>
Date: Tue, 7 Apr 2015 13:34:41 +0200
Subject: [PATCH] userspace/snmpd: add wrsBootHwinfoReadout to
 wrsBootStatusGroup

Provide information about hwinfo readout

Signed-off-by: Adam Wujek <adam.wujek@cern.ch>
---
 userspace/snmpd/WR-SWITCH-MIB.txt    | 17 +++++++++++
 userspace/snmpd/wrsBootStatusGroup.c | 43 ++++++++++++++++++++++++++++
 userspace/snmpd/wrsBootStatusGroup.h |  6 ++++
 3 files changed, 66 insertions(+)

diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt
index 21273cb32..3bd778c86 100644
--- a/userspace/snmpd/WR-SWITCH-MIB.txt
+++ b/userspace/snmpd/WR-SWITCH-MIB.txt
@@ -318,6 +318,23 @@ wrsBootConfigStatus  OBJECT-TYPE
         errorMinor - cannot read status file, problem is probably somewhere else"
     ::= { wrsBootStatusGroup 9 }
 
+wrsBootHwinfoReadout  OBJECT-TYPE
+    SYNTAX       INTEGER {
+                        na(0),
+                        ok(1),
+                        error(2),
+                        errorMinor(3),
+                        warning(4)
+    }
+    MAX-ACCESS    read-only
+    STATUS        current
+    DESCRIPTION
+        "Result of hwinfo readout
+        error - hwinfo readout failed
+        errorMinor - cannot read status file, problem is probably somewhere else
+        warning - no hwinfo partition"
+    ::= { wrsBootStatusGroup 10 }
+
 -- wrsTemperatureGroup (.7.1.3)
 wrsTemperatureGroup     OBJECT IDENTIFIER ::= { wrsOperationStatus 3 }
 
diff --git a/userspace/snmpd/wrsBootStatusGroup.c b/userspace/snmpd/wrsBootStatusGroup.c
index 5d35ca278..7063851ba 100644
--- a/userspace/snmpd/wrsBootStatusGroup.c
+++ b/userspace/snmpd/wrsBootStatusGroup.c
@@ -10,6 +10,7 @@
 #define DOTCONFIG_FILENAME "dot-config_filename"
 #define DOTCONFIG_DOWNLOAD "dot-config_status"
 
+#define HWINFO_FILE "/tmp/hwinfo_read_status"
 /* Macros for fscanf function to read line with maximum of "x" characters
  * without new line. Macro expands to something like: "%10[^\n]" */
 #define LINE_READ_LEN_HELPER(x) "%"#x"[^\n]"
@@ -29,6 +30,7 @@ static struct pickinfo wrsBootStatus_pickinfo[] = {
 	FIELD(wrsBootStatus_s, ASN_OCTET_STR, wrsConfigSourceHost),
 	FIELD(wrsBootStatus_s, ASN_OCTET_STR, wrsConfigSourceFilename),
 	FIELD(wrsBootStatus_s, ASN_INTEGER, wrsBootConfigStatus),
+	FIELD(wrsBootStatus_s, ASN_INTEGER, wrsBootHwinfoReadout),
 };
 
 struct wrsBootStatus_s wrsBootStatus_s;
@@ -190,6 +192,44 @@ static void get_dotconfig_source(void)
 	}
 }
 
+/* get status of execution of following scripts:
+ * /etc/init.d/S90hwinfo
+ * */
+static void get_boot_scripts_status(void){
+	static int run_once = 0;
+	FILE *f;
+	char buff[21]; /* 1 for null char */
+
+	if (run_once) {
+		/* HWinfo, load of FPGA and LM32 is done only at boot */
+		return;
+	}
+	run_once = 1;
+
+	/* read result of S90hwinfo (HWinfo) execution */
+	f = fopen(HWINFO_FILE, "r");
+	if (f) {
+		/* readline without newline */
+		fscanf(f, LINE_READ_LEN(20), buff);
+		fclose(f);
+		if (!strncmp(buff, "hwinfo_ok", 20))
+			wrsBootStatus_s.wrsBootHwinfoReadout =
+						WRS_BOOT_HWINFO_OK;
+		else if (!strncmp(buff, "hwinfo_warning", 20))
+			wrsBootStatus_s.wrsBootHwinfoReadout =
+						WRS_BOOT_HWINFO_WARNING;
+		else /*  */
+			wrsBootStatus_s.wrsBootHwinfoReadout =
+						WRS_BOOT_HWINFO_ERROR;
+	} else {
+		/* status file not found, probably something else caused
+		 * a problem */
+		wrsBootStatus_s.wrsBootHwinfoReadout =
+					WRS_BOOT_HWINFO_ERROR_MINOR;
+	}
+}
+
+
 time_t wrsBootStatus_data_fill(void)
 {
 	static time_t time_update;
@@ -208,6 +248,9 @@ time_t wrsBootStatus_data_fill(void)
 	/* get dotconfig source information */
 	get_dotconfig_source();
 
+	/* get result of execution of hwinfo script */
+	get_boot_scripts_status();
+
 	/* there was an update, return current time */
 	return time_update;
 }
diff --git a/userspace/snmpd/wrsBootStatusGroup.h b/userspace/snmpd/wrsBootStatusGroup.h
index d2070b300..4d7ee9e3f 100644
--- a/userspace/snmpd/wrsBootStatusGroup.h
+++ b/userspace/snmpd/wrsBootStatusGroup.h
@@ -22,6 +22,11 @@
 #define WRS_CONFIG_STATUS_CHECK_ERROR 4		/* error */
 #define WRS_CONFIG_STATUS_ERROR_MINOR 5		/* warning */
 
+#define WRS_BOOT_HWINFO_OK 1			/* ok */
+#define WRS_BOOT_HWINFO_ERROR 2			/* error */
+#define WRS_BOOT_HWINFO_ERROR_MINOR 3		/* warning */
+#define WRS_BOOT_HWINFO_WARNING 4		/* warning */
+
 struct wrsBootStatus_s {
 	uint32_t wrsBootCnt;		/* boots since power-on must be != 0 */
 	uint32_t wrsRebootCnt;		/* soft reboots since hard reboot
@@ -33,6 +38,7 @@ struct wrsBootStatus_s {
 	char wrsConfigSourceHost[WRS_CONFIG_SOURCE_HOST_LEN+1];
 	char wrsConfigSourceFilename[WRS_CONFIG_SOURCE_FILENAME_LEN+1];
 	int32_t wrsBootConfigStatus;
+	int32_t wrsBootHwinfoReadout;
 };
 
 extern struct wrsBootStatus_s wrsBootStatus_s;
-- 
GitLab