summaryrefslogtreecommitdiff
path: root/agent/mibgroup/hardware/fsys/fsys_mntctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/hardware/fsys/fsys_mntctl.c')
-rw-r--r--agent/mibgroup/hardware/fsys/fsys_mntctl.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/agent/mibgroup/hardware/fsys/fsys_mntctl.c b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
new file mode 100644
index 0000000..a03019a
--- /dev/null
+++ b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
@@ -0,0 +1,179 @@
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/agent/hardware/fsys.h>
+
+#include <stdio.h>
+#if HAVE_SYS_MNTCTL_H
+#include <sys/mntctl.h>
+#endif
+#if HAVE_SYS_VMOUNT_H
+#include <sys/vmount.h>
+#endif
+#if HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+#if HAVE_SYS_STATVFS_H
+#include <sys/statvfs.h>
+#endif
+
+
+int
+_fsys_remote( char *device, int type, char *host )
+{
+ if (( type == NETSNMP_FS_TYPE_NFS) ||
+ ( type == NETSNMP_FS_TYPE_AFS))
+ return 1;
+ else
+ return 0;
+}
+
+int
+_fsys_type( int type)
+{
+ DEBUGMSGTL(("fsys:type", "Classifying %d\n", type));
+
+ switch ( type ) {
+ case MNT_AIX:
+ case MNT_JFS:
+ return NETSNMP_FS_TYPE_BERKELEY;
+
+ case MNT_CDROM:
+ return NETSNMP_FS_TYPE_ISO9660;
+
+ case MNT_NFS:
+ case MNT_NFS3:
+ case MNT_AUTOFS:
+ return NETSNMP_FS_TYPE_NFS;
+
+ /*
+ * The following code covers selected filesystems
+ * which are not covered by the HR-TYPES enumerations,
+ * but should still be monitored.
+ * These are all mapped into type "other"
+ *
+ */
+#ifdef MNT_NAMEFS
+ case MNT_NAMEFS:
+#endif
+#ifdef MNT_PROCFS
+ case MNT_PROCFS:
+#endif
+ case MNT_SFS:
+ case MNT_CACHEFS:
+ return NETSNMP_FS_TYPE_OTHER;
+
+ /*
+ * All other types are silently skipped
+ */
+ default:
+ return NETSNMP_FS_TYPE_IGNORE;
+ }
+ return NETSNMP_FS_TYPE_IGNORE; /* Not reached */
+}
+
+void
+netsnmp_fsys_arch_init( void )
+{
+ return;
+}
+
+void
+netsnmp_fsys_arch_load( void )
+{
+ int ret = 0, i = 0;
+ uint size = 0;
+
+ struct vmount *aixmnt, *aixcurr;
+ char *path;
+ struct statfs stat_buf;
+ netsnmp_fsys_info *entry;
+ char tmpbuf[1024];
+
+ /*
+ * Retrieve information about the currently mounted filesystems...
+ */
+ ret = mntctl(MCTL_QUERY, sizeof(uint), &size);
+ if ( ret != 0 || size<=0 ) {
+ snmp_log_perror( "initial mntctl failed" );
+ return;
+ }
+
+ aixmnt = (struct vmount *)malloc( size );
+ if ( aixmnt == NULL ) {
+ snmp_log_perror( "cannot allocate memory for mntctl data" );
+ return;
+ }
+
+ ret = mntctl(MCTL_QUERY, size, aixmnt );
+ if ( ret <= 0 ) {
+ free(aixmnt);
+ snmp_log_perror( "main mntctl failed" );
+ return;
+ }
+ aixcurr = aixmnt;
+
+
+ /*
+ * ... and insert this into the filesystem container.
+ */
+
+ for (i = 0;
+ i < ret;
+ i++, aixcurr = (struct vmount *) ((char*)aixcurr + aixcurr->vmt_length) ) {
+
+ path = vmt2dataptr( aixcurr, VMT_STUB );
+ entry = netsnmp_fsys_by_path( path, NETSNMP_FS_FIND_CREATE );
+ if (!entry) {
+ continue;
+ }
+
+ strlcpy(entry->path, path, sizeof(entry->path));
+ strlcpy(entry->device, vmt2dataptr(aixcurr, VMT_OBJECT),
+ sizeof(entry->device));
+ entry->type = _fsys_type( aixcurr->vmt_gfstype );
+
+ if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
+ entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
+
+ if ( _fsys_remote( entry->device, entry->type, vmt2dataptr( aixcurr, VMT_HOST) ))
+ entry->flags |= NETSNMP_FS_FLAG_REMOTE;
+ if ( aixcurr->vmt_flags & MNT_READONLY )
+ entry->flags |= NETSNMP_FS_FLAG_RONLY;
+ /*
+ * The root device is presumably bootable.
+ * Other partitions probably aren't!
+ */
+ if ((entry->path[0] == '/') && (entry->path[1] == '\0'))
+ entry->flags |= NETSNMP_FS_FLAG_BOOTABLE;
+
+ /*
+ * XXX - identify removeable disks
+ */
+
+ /*
+ * Optionally skip retrieving statistics for remote mounts
+ */
+ if ( (entry->flags & NETSNMP_FS_FLAG_REMOTE) &&
+ netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
+ NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES))
+ continue;
+
+ if ( statfs( entry->path, &stat_buf ) < 0 ) {
+ snprintf( tmpbuf, sizeof(tmpbuf), "Cannot statfs %s\n", entry->path );
+ snmp_log_perror( tmpbuf );
+ continue;
+ }
+ entry->units = stat_buf.f_bsize;
+ entry->size = stat_buf.f_blocks;
+ entry->used = (stat_buf.f_blocks - stat_buf.f_bfree);
+ entry->avail = stat_buf.f_bavail;
+ entry->inums_total = stat_buf.f_files;
+ entry->inums_avail = stat_buf.f_ffree;
+ netsnmp_fsys_calculate32(entry);
+ }
+ free(aixmnt);
+ aixmnt = NULL;
+ aixcurr = NULL;
+}
+