File net-snmp-5.7.3-host-mib-skip-autofs-entries.patch of Package net-snmp.22257

From cf41e6e910158fb4c4cb546c49acd587c5f58232 Mon Sep 17 00:00:00 2001
From: Josef Ridky <jridky@redhat.com>
Date: Wed, 24 Jul 2019 07:23:47 -0700
Subject: [PATCH] HOST-MIB: Skip autofs entries

Do not call statfs() for autofs entries.

See also https://sourceforge.net/p/net-snmp/patches/1350/.
See also https://sourceforge.net/p/net-snmp/bugs/2968/.

[ bvanassche: Made several small edits ]
---
 agent/mibgroup/hardware/fsys/fsys_mntctl.c |  8 ++++++--
 agent/mibgroup/hardware/fsys/fsys_mntent.c | 11 +++++++++++
 agent/mibgroup/hardware/fsys/mnttypes.h    |  3 +++
 agent/mibgroup/host/hr_filesys.c           | 21 +++++++++++++++++++++
 agent/mibgroup/host/hr_filesys.h           |  1 +
 agent/mibgroup/host/hr_storage.c           |  5 ++++-
 agent/mibgroup/host/hrh_filesys.c          |  6 ++++++
 agent/mibgroup/host/hrh_filesys.h          |  1 +
 agent/mibgroup/host/hrh_storage.c          |  5 ++++-
 include/net-snmp/agent/hardware/fsys.h     |  1 +
 10 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/agent/mibgroup/hardware/fsys/fsys_mntctl.c b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
index e7d9a1c5a..782c8edd2 100644
--- a/agent/mibgroup/hardware/fsys/fsys_mntctl.c
+++ b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
@@ -43,8 +43,9 @@ _fsys_type( int type)
 
         case  MNT_NFS:
         case  MNT_NFS3:
-        case  MNT_AUTOFS:
             return NETSNMP_FS_TYPE_NFS;
+        case  MNT_AUTOFS:
+            return NETSNMP_FS_TYPE_AUTOFS;
 
     /*
      *  The following code covers selected filesystems
@@ -155,12 +156,15 @@ netsnmp_fsys_arch_load( void )
          */
 
         /*
-         *  Optionally skip retrieving statistics for remote mounts
+         *  Skip retrieving statistics for AUTOFS and optionally for remote
+         *  mounts.
          */
         if ( (entry->flags & NETSNMP_FS_FLAG_REMOTE) &&
             netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
                                    NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES))
             continue;
+        if (entry->type == NETSNMP_FS_TYPE_AUTOFS)
+            continue;
 
         if ( statfs( entry->path, &stat_buf ) < 0 ) {
             snprintf( tmpbuf, sizeof(tmpbuf), "Cannot statfs %s", entry->path );
diff --git a/agent/mibgroup/hardware/fsys/fsys_mntent.c b/agent/mibgroup/hardware/fsys/fsys_mntent.c
index 3cdcea1fb..79e6e4f72 100644
--- a/agent/mibgroup/hardware/fsys/fsys_mntent.c
+++ b/agent/mibgroup/hardware/fsys/fsys_mntent.c
@@ -150,6 +150,13 @@ _fsys_type( char *typename )
               !strcmp(typename, MNTTYPE_LOFS))
        return NETSNMP_FS_TYPE_OTHER;
 
+    /* Detection of AUTOFS.
+     * This file system will be ignored by default
+     */ 
+    else if (!strcmp(typename, MNTTYPE_AUTOFS))
+        return NETSNMP_FS_TYPE_AUTOFS;
+
+
     /*    
      *  All other types are silently skipped
      */
@@ -239,6 +246,10 @@ netsnmp_fsys_arch_load( void )
                                    NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES))
             continue;
 
+        /* Skip AUTOFS entries */
+        if (entry->type == NETSNMP_FS_TYPE_AUTOFS)
+            continue;
+
 #ifdef irix6
         if ( NSFS_STATFS( entry->path, &stat_buf, sizeof(struct statfs), 0) < 0 )
 #else
diff --git a/agent/mibgroup/hardware/fsys/mnttypes.h b/agent/mibgroup/hardware/fsys/mnttypes.h
index bb1b40173..53f1cc896 100644
--- a/agent/mibgroup/hardware/fsys/mnttypes.h
+++ b/agent/mibgroup/hardware/fsys/mnttypes.h
@@ -165,6 +165,9 @@
 #ifndef MNTTYPE_APP
 #define MNTTYPE_APP      "app"
 #endif
+#ifndef MNTTYPE_AUTOFS
+#define MNTTYPE_AUTOFS   "autofs"
+#endif
 #ifndef MNTTYPE_DEVPTS
 #define MNTTYPE_DEVPTS   "devpts"
 #endif
diff --git a/agent/mibgroup/host/hr_filesys.c b/agent/mibgroup/host/hr_filesys.c
index 56c8b2095..8caeecf4e 100644
--- a/agent/mibgroup/host/hr_filesys.c
+++ b/agent/mibgroup/host/hr_filesys.c
@@ -834,6 +834,27 @@ Check_HR_FileSys_NFS (void)
     return 0;		/* no NFS file system */
 }
 
+/* This function checks whether current file system is an AutoFs
+ * HRFS_entry must be valid prior to calling this function
+ * return 1 if AutoFs, 0 otherwise
+ */
+int
+Check_HR_FileSys_AutoFs(void)
+{
+#if HAVE_GETFSSTAT
+    if (HRFS_entry->HRFS_type != NULL && 
+#if defined(MNTTYPE_AUTOFS)
+        !strcmp(HRFS_entry->HRFS_type, MNTTYPE_AUTOFS)
+#else
+        !strcmp(HRFS_entry->HRFS_type, "autofs")
+#endif
+        )
+#endif /* HAVE_GETFSSTAT */
+        return 1;  /* AUTOFS */
+
+    return 0; /* no AUTOFS */
+}
+
 void
 End_HR_FileSys(void)
 {
diff --git a/agent/mibgroup/host/hr_filesys.h b/agent/mibgroup/host/hr_filesys.h
index 2f00355f3..36cd7dd08 100644
--- a/agent/mibgroup/host/hr_filesys.h
+++ b/agent/mibgroup/host/hr_filesys.h
@@ -10,6 +10,7 @@ extern void     Init_HR_FileSys(void);
 extern FindVarMethod var_hrfilesys;
 extern int      Get_Next_HR_FileSys(void);
 extern int      Check_HR_FileSys_NFS(void);
+extern int      Check_HR_FileSys_AutoFs(void);
 
 extern int      Get_FSIndex(char *);
 extern long     Get_FSSize(char *);     /* Temporary */
diff --git a/agent/mibgroup/host/hr_storage.c b/agent/mibgroup/host/hr_storage.c
index a86898451..6b459ec51 100644
--- a/agent/mibgroup/host/hr_storage.c
+++ b/agent/mibgroup/host/hr_storage.c
@@ -544,6 +544,8 @@ really_try_next:
                                         NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) &&
                  Check_HR_FileSys_NFS())
                 return NULL;  /* or goto try_next; */
+            if (Check_HR_FileSys_AutoFs())
+                return NULL;
 	    if (HRFS_statfs(HRFS_entry->HRFS_mount, &stat_buf) < 0) {
 		snmp_log_perror(HRFS_entry->HRFS_mount);
 		goto try_next;
@@ -683,7 +685,8 @@ Get_Next_HR_Store(void)
 		if (HRS_index >= 0) {
 			if (!(netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
 							NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) && 
-						Check_HR_FileSys_NFS())) {
+						Check_HR_FileSys_NFS()) &&
+                            !Check_HR_FileSys_AutoFs()) {
 				return HRS_index + NETSNMP_MEM_TYPE_MAX;	
 			}
 		} else {
diff --git a/agent/mibgroup/host/hrh_filesys.c b/agent/mibgroup/host/hrh_filesys.c
index 5ad82b20f..5d2102e24 100644
--- a/agent/mibgroup/host/hrh_filesys.c
+++ b/agent/mibgroup/host/hrh_filesys.c
@@ -429,3 +429,9 @@ Check_HR_FileSys_NFS (void)
 {
     return (HRFS_entry->flags & NETSNMP_FS_FLAG_REMOTE) ? 1 : 0;
 }
+
+int
+Check_HR_FileSys_AutoFs (void)
+{
+    return HRFS_entry->type == NETSNMP_FS_TYPE_AUTOFS;
+}
diff --git a/agent/mibgroup/host/hrh_filesys.h b/agent/mibgroup/host/hrh_filesys.h
index 568917e09..c0f5d6e8c 100644
--- a/agent/mibgroup/host/hrh_filesys.h
+++ b/agent/mibgroup/host/hrh_filesys.h
@@ -10,6 +10,7 @@ extern void     Init_HR_FileSys(void);
 extern FindVarMethod var_hrhfilesys;
 extern int      Get_Next_HR_FileSys(void);
 extern int      Check_HR_FileSys_NFS(void);
+extern int	Check_HR_FileSys_AutoFs(void);
 
 extern int      Get_FSIndex(char *);
 extern long     Get_FSSize(char *);     /* Temporary */
diff --git a/agent/mibgroup/host/hrh_storage.c b/agent/mibgroup/host/hrh_storage.c
index 810766946..6f8ff6c53 100644
--- a/agent/mibgroup/host/hrh_storage.c
+++ b/agent/mibgroup/host/hrh_storage.c
@@ -371,6 +371,8 @@ really_try_next:
                                    NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) &&
             Check_HR_FileSys_NFS())
             return NULL;
+        if (Check_HR_FileSys_AutoFs())
+            return NULL;
         if (store_idx <= NETSNMP_MEM_TYPE_MAX ) {
 	    mem = (netsnmp_memory_info*)ptr;
         }
@@ -508,7 +510,8 @@ Get_Next_HR_Store(void)
 		if (HRS_index >= 0) {
 			if (!(netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
 							NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES) && 
-						Check_HR_FileSys_NFS())) {
+						Check_HR_FileSys_NFS()) &&
+                         !Check_HR_FileSys_AutoFs()) {
 				return HRS_index + NETSNMP_MEM_TYPE_MAX;	
 			}
 		} else {
diff --git a/include/net-snmp/agent/hardware/fsys.h b/include/net-snmp/agent/hardware/fsys.h
index 3f2b28440..54ab9d806 100644
--- a/include/net-snmp/agent/hardware/fsys.h
+++ b/include/net-snmp/agent/hardware/fsys.h
@@ -41,6 +41,7 @@ typedef struct netsnmp_fsys_info_s netsnmp_fsys_info;
 #define NETSNMP_FS_TYPE_SYSFS	   4 | _NETSNMP_FS_TYPE_LOCAL | _NETSNMP_FS_TYPE_SKIP_BIT
 #define NETSNMP_FS_TYPE_TMPFS	   5 | _NETSNMP_FS_TYPE_LOCAL
 #define NETSNMP_FS_TYPE_USBFS	   6 | _NETSNMP_FS_TYPE_LOCAL
+#define NETSNMP_FS_TYPE_AUTOFS	   (7 | _NETSNMP_FS_TYPE_LOCAL | _NETSNMP_FS_TYPE_SKIP_BIT)
 
 #define NETSNMP_FS_FLAG_ACTIVE   0x01
 #define NETSNMP_FS_FLAG_REMOTE   0x02
-- 
2.16.4

openSUSE Build Service is sponsored by