|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/hardware/fsys.h>
|
|
Packit |
fcad23 |
#include "hw_fsys.h"
|
|
Packit |
fcad23 |
#include "hardware/fsys/hw_fsys_private.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <stdio.h>
|
|
Packit |
fcad23 |
#if HAVE_MNTENT_H
|
|
Packit |
fcad23 |
#include <mntent.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_MNTTAB_H
|
|
Packit |
fcad23 |
#include <sys/mnttab.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_VFS_H
|
|
Packit |
fcad23 |
#include <sys/vfs.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_PARAM_H
|
|
Packit |
fcad23 |
#include <sys/param.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_MOUNT_H
|
|
Packit |
fcad23 |
#include <sys/mount.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_STATFS_H
|
|
Packit |
fcad23 |
#include <sys/statfs.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_SYS_STATVFS_H
|
|
Packit |
fcad23 |
#include <sys/statvfs.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef solaris2
|
|
Packit |
fcad23 |
#define _NETSNMP_GETMNTENT_TWO_ARGS 1
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#undef _NETSNMP_GETMNTENT_TWO_ARGS
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Handle naming differences between getmntent() APIs
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#ifdef _NETSNMP_GETMNTENT_TWO_ARGS
|
|
Packit |
fcad23 |
/* Two-argument form (Solaris) */
|
|
Packit |
fcad23 |
#define NSFS_MNTENT struct mnttab
|
|
Packit |
fcad23 |
#define NSFS_PATH mnt_mountp
|
|
Packit |
fcad23 |
#define NSFS_DEV mnt_special
|
|
Packit |
fcad23 |
#define NSFS_TYPE mnt_fstype
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#define NSFS_STATFS statvfs
|
|
Packit |
fcad23 |
#define NSFS_SIZE f_frsize
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
/* One-argument form (everything else?) */
|
|
Packit |
fcad23 |
#define NSFS_MNTENT struct mntent
|
|
Packit |
fcad23 |
#define NSFS_PATH mnt_dir
|
|
Packit |
fcad23 |
#define NSFS_DEV mnt_fsname
|
|
Packit |
fcad23 |
#define NSFS_TYPE mnt_type
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#define NSFS_STATFS statfs
|
|
Packit |
fcad23 |
#define NSFS_SIZE f_bsize
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
_fsys_remote( char *device, int type )
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (( type == NETSNMP_FS_TYPE_NFS) ||
|
|
Packit |
fcad23 |
( type == NETSNMP_FS_TYPE_AFS))
|
|
Packit |
fcad23 |
return 1;
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
_fsys_type( char *typename )
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
DEBUGMSGTL(("fsys:type", "Classifying %s\n", typename));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ( !typename || *typename=='\0' )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_UNKNOWN;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include "mnttypes.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_FFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_BERKELEY;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_UFS) )
|
|
Packit |
fcad23 |
return _NETSNMP_FS_TYPE_UFS; /* either N_FS_TYPE_BERKELEY or N_FS_TYPE_SYSV */
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_SYSV) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_SYSV;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_PC) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_MSDOS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_FAT;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_HFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_HFS;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_MFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_MFS;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_NTFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_NTFS;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_ISO9660) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_CD9660) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_ISO9660;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_CDFS) )
|
|
Packit |
fcad23 |
return _NETSNMP_FS_TYPE_CDFS; /* either N_FS_TYPE_ISO9660 or N_FS_TYPE_ROCKRIDGE */
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_HSFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_ROCKRIDGE;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_NFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_NFS3) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_NFS4) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_CIFS) || /* i.e. SMB - ?? */
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_SMBFS) || /* ?? */
|
|
Packit |
fcad23 |
/* mvfs (IBM ClearCase) is nfs-like in nature */
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_MVFS))
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_NFS;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_NCPFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_NETWARE;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_AFS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_AFS;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_EXT2) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_EXT3) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_EXT4) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_EXT2FS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_EXT3FS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_EXT4FS) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_EXT2;
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_FAT32) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_VFAT) )
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_FAT32;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* The following code covers selected filesystems
|
|
Packit |
fcad23 |
* which are not covered by the HR-TYPES enumerations,
|
|
Packit |
fcad23 |
* but should still be monitored.
|
|
Packit |
fcad23 |
* These are all mapped into type "other"
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* (The systems listed are not fixed in stone,
|
|
Packit |
fcad23 |
* but are simply here to illustrate the principle!)
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
else if ( !strcmp(typename, MNTTYPE_TMPFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_GFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_GFS2) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_XFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_JFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_VXFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_REISERFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_OCFS2) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_CVFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_SIMFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_BTRFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_ZFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_NVMFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_ACFS) ||
|
|
Packit |
fcad23 |
!strcmp(typename, MNTTYPE_LOFS))
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_OTHER;
|
|
Packit |
fcad23 |
|
|
Packit Service |
0dac5f |
/* Detection of AUTOFS.
|
|
Packit Service |
0dac5f |
* This file system will be ignored by default
|
|
Packit Service |
0dac5f |
*/
|
|
Packit Service |
0dac5f |
else if ( !strcmp(typename, MNTTYPE_AUTOFS))
|
|
Packit Service |
0dac5f |
return NETSNMP_FS_TYPE_AUTOFS;
|
|
Packit Service |
0dac5f |
|
|
Packit Service |
0dac5f |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* All other types are silently skipped
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
return NETSNMP_FS_TYPE_IGNORE;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_fsys_arch_init( void )
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_fsys_arch_load( void )
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
FILE *fp=NULL;
|
|
Packit |
fcad23 |
#ifdef _NETSNMP_GETMNTENT_TWO_ARGS
|
|
Packit |
fcad23 |
struct mnttab mtmp;
|
|
Packit |
fcad23 |
struct mnttab *m = &mtmp;
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
struct mntent *m;
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
struct NSFS_STATFS stat_buf;
|
|
Packit |
fcad23 |
netsnmp_fsys_info *entry;
|
|
Packit |
fcad23 |
char *tmpbuf = NULL;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Retrieve information about the currently mounted filesystems...
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
fp = fopen( ETC_MNTTAB, "r" ); /* OR setmntent()?? */
|
|
Packit |
fcad23 |
if ( !fp ) {
|
|
Packit |
fcad23 |
if (asprintf(&tmpbuf, "Cannot open %s", ETC_MNTTAB) >= 0)
|
|
Packit |
fcad23 |
snmp_log_perror(tmpbuf);
|
|
Packit |
fcad23 |
free(tmpbuf);
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* ... and insert this into the filesystem container.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
while
|
|
Packit |
fcad23 |
#ifdef _NETSNMP_GETMNTENT_TWO_ARGS
|
|
Packit |
fcad23 |
((getmntent(fp, m)) == 0 )
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
((m = getmntent(fp)) != NULL )
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
entry = netsnmp_fsys_by_path( m->NSFS_PATH, NETSNMP_FS_FIND_CREATE );
|
|
Packit |
fcad23 |
if (!entry) {
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
strlcpy(entry->path, m->NSFS_PATH, sizeof(entry->path));
|
|
Packit |
fcad23 |
strlcpy(entry->device, m->NSFS_DEV, sizeof(entry->device));
|
|
Packit |
fcad23 |
entry->type = _fsys_type(m->NSFS_TYPE);
|
|
Packit |
fcad23 |
if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
|
|
Packit |
fcad23 |
entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ( _fsys_remote( entry->device, entry->type ))
|
|
Packit |
fcad23 |
entry->flags |= NETSNMP_FS_FLAG_REMOTE;
|
|
Packit |
fcad23 |
#if HAVE_HASMNTOPT
|
|
Packit |
fcad23 |
if (hasmntopt( m, "ro" ))
|
|
Packit |
fcad23 |
entry->flags |= NETSNMP_FS_FLAG_RONLY;
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
entry->flags &= ~NETSNMP_FS_FLAG_RONLY;
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* The root device is presumably bootable.
|
|
Packit |
fcad23 |
* Other partitions probably aren't!
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* XXX - what about /boot ??
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
if ((entry->path[0] == '/') &&
|
|
Packit |
fcad23 |
(entry->path[1] == '\0'))
|
|
Packit |
fcad23 |
entry->flags |= NETSNMP_FS_FLAG_BOOTABLE;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* XXX - identify removeable disks
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Optionally skip retrieving statistics for remote mounts
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
if ( (entry->flags & NETSNMP_FS_FLAG_REMOTE) &&
|
|
Packit |
fcad23 |
netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
|
|
Packit |
fcad23 |
NETSNMP_DS_AGENT_SKIPNFSINHOSTRESOURCES))
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
|
|
Packit Service |
0dac5f |
/* Skip AUTOFS enteries */
|
|
Packit Service |
0dac5f |
if ( entry->type == (NETSNMP_FS_TYPE_AUTOFS))
|
|
Packit Service |
0dac5f |
continue;
|
|
Packit Service |
0dac5f |
|
|
Packit |
fcad23 |
#ifdef irix6
|
|
Packit |
fcad23 |
if ( NSFS_STATFS( entry->path, &stat_buf, sizeof(struct statfs), 0) < 0 )
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
if ( NSFS_STATFS( entry->path, &stat_buf ) < 0 )
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
tmpbuf = NULL;
|
|
Packit |
fcad23 |
if (asprintf(&tmpbuf, "Cannot statfs %s", entry->path) >= 0)
|
|
Packit |
fcad23 |
snmp_log_perror(tmpbuf);
|
|
Packit |
fcad23 |
free(tmpbuf);
|
|
Packit |
fcad23 |
entry->units = stat_buf.NSFS_SIZE;
|
|
Packit |
fcad23 |
entry->size = 0;
|
|
Packit |
fcad23 |
entry->used = 0;
|
|
Packit |
fcad23 |
entry->avail = 0;
|
|
Packit |
fcad23 |
entry->inums_total = stat_buf.f_files;
|
|
Packit |
fcad23 |
entry->inums_avail = stat_buf.f_ffree;
|
|
Packit |
fcad23 |
netsnmp_fsys_calculate32(entry);
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
entry->units = stat_buf.NSFS_SIZE;
|
|
Packit |
fcad23 |
entry->size = stat_buf.f_blocks;
|
|
Packit |
fcad23 |
entry->used = (stat_buf.f_blocks - stat_buf.f_bfree);
|
|
Packit |
fcad23 |
/* entry->avail is currently unsigned, so protect against negative
|
|
Packit |
fcad23 |
* values!
|
|
Packit |
fcad23 |
* This should be changed to a signed field.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
if (stat_buf.f_bavail < 0)
|
|
Packit |
fcad23 |
entry->avail = 0;
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
entry->avail = stat_buf.f_bavail;
|
|
Packit |
fcad23 |
entry->inums_total = stat_buf.f_files;
|
|
Packit |
fcad23 |
entry->inums_avail = stat_buf.f_ffree;
|
|
Packit |
fcad23 |
netsnmp_fsys_calculate32(entry);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
fclose( fp );
|
|
Packit |
fcad23 |
}
|