Blame agent/mibgroup/hardware/fsys/fsys_mntent.c

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
}