From edf76bfaa0b976c4437edebbfcf5fa581f0a7de2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rg=20Sachse?= <joerg.sachse@slub-dresden.de>
Date: Mon, 14 Apr 2025 13:28:03 +0200
Subject: [PATCH] feat: implement fully functional Check_MK monitoring of
 NetApp NFS shares including history data and dynamic alert thresholds

---
 ansible.cfg                                   |  3 +-
 .../local/600/check_netapp_nfs_shares.sh      | 37 ++++---------------
 tasks/install_checkmk_plugins.yml             | 21 +++++------
 tasks/main.yml                                |  2 +-
 .../check_mk/check_netapp_nfs_shares.cfg.j2   | 18 ++-------
 5 files changed, 24 insertions(+), 57 deletions(-)

diff --git a/ansible.cfg b/ansible.cfg
index 145b36d..b4be8d3 100644
--- a/ansible.cfg
+++ b/ansible.cfg
@@ -33,7 +33,8 @@ roles_path = ./:../:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
 # https://docs.ansible.com/ansible/latest/reference_appendices/config.html#display-skipped-hosts
 # DEFAULT: display_skipped_hosts = true
 display_skipped_hosts = false
-display_ok_hosts = false
+# display_ok_hosts = false
+display_ok_hosts = true
 
 use_persistent_connections=true
 
diff --git a/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh b/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh
index dd3e1fa..a88ed3d 100755
--- a/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh
+++ b/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh
@@ -37,8 +37,9 @@
 #DOC# - https://www.ssh.com/ssh/keygen/
 #DOC# - https://docs.netapp.com/ontap-9/index.jsp?topic=%2Fcom.netapp.doc.dot-cm-cmpr-910%2Fvolume__show.html
 
-if [[ ! ( ${BASH_VERSINFO[0]} -eq 4 ) && ( ${BASH_VERSINFO[1]} -ge 2 ) || \
-      ! ( ${BASH_VERSINFO[0]} -gt 4 ) ]]; then
+BASH_MIN_VERSION="4.2"
+# This sorts ascending by version number. If the first version number in the sorted list is equal to our minimal version number, then we can be sure that the installed version of Bash is newer.
+if [[ "${BASH_MIN_VERSION}" == "$( echo -e "${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}\n${BASH_MIN_VERSION}" | sort -V | tail -n1 )" ]]; then
 	echo "Only Bash versions 4.2 or above are supported. Aborting execution."
 	exit 1
 fi
@@ -62,6 +63,7 @@ NETAPP_FIELDS="size,available,used,percent-used"
 # Include config file not using variable path
 # based on http://mywiki.wooledge.org/BashFAQ/028
 if [[ -e "/etc/check_mk/check_netapp_nfs_shares.cfg" ]]; then
+	# shellcheck disable=SC1091
 	source "/etc/check_mk/check_netapp_nfs_shares.cfg"
 else
 	echo "Configuration at ${CONFIGFILE} expected, but not found. Aborting execution." && exit 1
@@ -74,46 +76,23 @@ function help () {
 	sed -rn 's/^#DOC# ?//;T;p' "$0"
 }
  
-function get_mgmt_ip_from_network () {
-	case ${1} in
-		${PATTERN_VLAN11})
-			echo "${MGMT_VLAN11}"
-			;;
-		${PATTERN_VLAN13})
-			echo "${MGMT_VLAN13}"
-			;;
-		${PATTERN_VLAN14})
-			echo "${MGMT_VLAN14}"
-			;;
-		${PATTERN_VLAN20})
-			echo "${MGMT_VLAN20}"
-			;;
-		*)
-			echo "unsupported subnet"
-			;;
-	esac
-}
-
 # IMPORTANT: Set lock using "flock", NOT "touch"!!! It's atomic and doesn't have to be cleared after the script ran.
 (
 flock -n 9 || exit 1
-	NFS_SHARES=$( mount | grep "type nfs"  | cut -d " " -f 1 )
+	NFS_SHARES=$( findmnt --raw --noheadings --types "nfs4" | cut -d " " -f 2 )
 	for SHARE in ${NFS_SHARES}; do
-		VOLUME_IP=$( echo "${SHARE}" | cut -d ":" -f 1 )
-		MGMT_IP=$( get_mgmt_ip_from_network "${VOLUME_IP}" )
-			[[ "${MGMT_IP}" == "unsupported subnet" ]] && echo "There's no NetApp management IP for this subnet." && next
 		NETAPP_VOLUME=$( echo "${SHARE}" | cut -d ":" -f 2 | cut -d '/' -f 3 )
-		RESULT=$( ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${MGMT_IP}" -C -i "${IDENTITY_FILE}" "${NETAPP_SETTINGS} volume show -vserver ${NETAPP_VSERVER} -volume ${NETAPP_VOLUME} -fields $NETAPP_FIELDS" )
+		RESULT=$( ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${MGMT}" -C -i "${IDENTITY_FILE}" "${NETAPP_SETTINGS} volume show -vserver ${NETAPP_VSERVER} -volume ${NETAPP_VOLUME} -fields $NETAPP_FIELDS" )
 			[[ -z "${RESULT}" ]] && echo "Didn't get a valid answer from NetApp system for ${NETAPP_VOLUME}."
 		RESULT=$( echo "${RESULT}" | tail -n 2 | tr -d '\r' )
 		OLDIFS=${IFS}
 		IFS=";"
 		echo "${RESULT}" | while read -r RES_VSERVER RES_VOLUME RES_SIZE RES_AVAILABLE RES_USED RES_PERCENT; do
 			status="P"	# Status dynamisch berechnen
-			itemname="NFS-Share_/vol/${RES_VOLUME}/@${RES_VSERVER}"
+			itemname="NFS-Share ${RES_VOLUME}/@${RES_VSERVER}"
 			perf_values="Size=${RES_SIZE}|Used=${RES_USED}|Available=${RES_AVAILABLE}|PercentUsed=${RES_PERCENT::-1};80;90"
 			statustext="NFS share fill levels as read from NetApp storage system from vServer ${RES_VSERVER} for volume '/vol/${RES_VOLUME}'. Size: $(( RES_SIZE/1024/1024/1024 )) GB, Used: $(( RES_USED/1024/1024/1024 )) GB, Available: $(( RES_AVAILABLE/1024/1024/1024 )) GB, Percent Used: ${RES_PERCENT}.\\n"
-			echo "${status} ${itemname} ${perf_values} ${statustext}"
+			echo "${status} '${itemname}' ${perf_values} ${statustext}"
 		done
 		IFS=${OLDIFS}
 	done
diff --git a/tasks/install_checkmk_plugins.yml b/tasks/install_checkmk_plugins.yml
index 37deb02..4bd38f9 100644
--- a/tasks/install_checkmk_plugins.yml
+++ b/tasks/install_checkmk_plugins.yml
@@ -1,7 +1,7 @@
 ---
-- name: CMK installieren
+- name: Install ChecK_MK and dependencies.
   ansible.builtin.package:
-    name: "check-mk-agent"
+    name: ["check-mk-agent", "needrestart"]
     state: latest
 
 - name: Ordner für Check_MK-Plugins anlegen
@@ -30,15 +30,14 @@
   loop:
     - name: "nrpe/check_needrestart.sh"
     - name: "local/600/check_netapp_nfs_shares.sh"
-  when: ansible_distribution == "Debian"
 
-# - name: install SSH private key for NetApp NFS share monitoring
-#   copy:
-#     src: "{{ role_path }}/../ansible_vaults/{{ role_name }}/.ssh/id_ed25519_netapp_report"
-#     dest: "/usr/lib/check_mk_agent/.ssh/id_ed25519_netapp_report"
-#     owner: "root"
-#     group: "root"
-#     mode: "0400"
+- name: Install SSH private key for NetApp NFS share monitoring.
+  ansible.builtin.copy:
+    src: "{{ role_path }}/../ansible_vaults/{{ role_name }}/.ssh/id_ed25519_netapp_report"
+    dest: "/usr/lib/check_mk_agent/.ssh/id_ed25519_netapp_report"
+    owner: "root"
+    group: "root"
+    mode: "0400"
 
 - name: Check_MK-Plugins installieren (offizielle Plugins)
   ansible.builtin.get_url:
@@ -101,4 +100,4 @@
     dest: "/etc/check_mk/check_netapp_nfs_shares.cfg"
     owner: "root"
     group: "root"
-    mode: "0600"
+    mode: "0o600"
diff --git a/tasks/main.yml b/tasks/main.yml
index 52bc0e6..b9ec76b 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -101,7 +101,7 @@
 
 - name: Check_MK-Plugins installieren
   ansible.builtin.import_tasks: "install_checkmk_plugins.yml"
-  tags: [monitoring]
+  tags: [cmk, checkmk, check_mk, check-mk, monitoring]
 
 - name: root-Shell einrichten
   ansible.builtin.import_tasks: "configure_root_shell.yml"
diff --git a/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2 b/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2
index 018fbda..3d3283a 100644
--- a/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2
+++ b/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2
@@ -32,23 +32,11 @@ IDENTITY_PATH="/usr/lib/check_mk_agent/.ssh/"
 # Mandatory: yes
 IDENTITY_FILE="${IDENTITY_PATH}id_${IDENTITY_ALGORITHM}_netapp_report"
 
-### Subnet patterns for determining management IP.
-### Use subnet string with Bash glob "*" at the end as shown in example.
+### NetApp management Hostname.
+### IPs are automatically resolved for the correct host subnet by DNS.
 # Default: (none)
 # Mandatory: yes
-# PATTERN_EXAMPLE="123.34.45.*"
-PATTERN_VLAN11="{{ check_netapp_nfs_shares.vault_pattern_vlan11 }}"
-PATTERN_VLAN13="{{ check_netapp_nfs_shares.vault_pattern_vlan13 }}"
-PATTERN_VLAN14="{{ check_netapp_nfs_shares.vault_pattern_vlan14 }}"
-PATTERN_VLAN20="{{ check_netapp_nfs_shares.vault_pattern_vlan20 }}"
-
-### NetApp management IPs for each VLAN.
-# Default: (none)
-# Mandatory: yes
-MGMT_VLAN11="{{ check_netapp_nfs_shares.vault_mgmt_vlan11 }}"
-MGMT_VLAN13="{{ check_netapp_nfs_shares.vault_mgmt_vlan13 }}"
-MGMT_VLAN14="{{ check_netapp_nfs_shares.vault_mgmt_vlan14 }}"
-MGMT_VLAN20="{{ check_netapp_nfs_shares.vault_mgmt_vlan20 }}"
+MGMT="{{ check_netapp_nfs_shares.vault_mgmt }}"
 
 #### NetApp output settings
 # Default: NETAPP_SETTINGS="set -showallfields false;set -showseparator \";\";set -rows 0; set -units raw;"
-- 
GitLab