From 425a1c432fef760a919ac9425d328ae722621b08 Mon Sep 17 00:00:00 2001 From: "Zane C. Bowers-Hadley" Date: Sat, 2 Mar 2024 09:31:40 -0600 Subject: [PATCH 1/5] initial nfs stuff for freebsd done --- snmp/nfs | 622 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 622 insertions(+) create mode 100755 snmp/nfs diff --git a/snmp/nfs b/snmp/nfs new file mode 100755 index 000000000..93e88ceca --- /dev/null +++ b/snmp/nfs @@ -0,0 +1,622 @@ +#!/usr/bin/env perl + +## +## +## General Notes +## +## +# +# FreeBSD used as the design basis given better stats produced and as well +# as actually documented. + +### +### +### Linux Notes +### +### +# +# What the following map to if if there is a FreeBSD equivalent is not clear. +# +# fs_locations +# test_stateid +# fsid_present +# open_conf +# confirm +# null + +use strict; +use warnings; +use Getopt::Std; +use Getopt::Long; +use File::Slurp; +use MIME::Base64; +use IO::Compress::Gzip qw(gzip $GzipError); +use Pod::Usage; +use JSON; + +#the version of returned data +my $VERSION = 1; + +my $pretty; +my $cache_base = '/var/cache/nfs.json'; +my $write; +my $compress = 1; +my $version; +my $help; +GetOptions( + p => \$pretty, + 'b=s' => \$compress, + 'o=s' => \$cache_base, + 'w' => \$write, + v => \$version, + version => \$version, + h => \$help, + help => \$help, +); + +if ($version) { + pod2usage( -exitval => 255, -verbose => 99, -sections => qw(VERSION), -output => \*STDOUT, ); + exit 255; +} + +if ($help) { + pod2usage( -exitval => 255, -verbose => 2, -output => \*STDOUT, ); + exit 255; +} + +#the data to return +my $to_return = { + 'version' => $VERSION, + 'error' => '0', + 'errorString' => '', +}; +my $data = { + is_client => 0, + is_server => 0, + mounts => [], + mounted_by => [], + stats => { + client_rpc_null => 0, + client_rpc_Getattr => 0, + client_rpc_Setattr => 0, + client_rpc_Lookup => 0, + client_rpc_Readlink => 0, + client_rpc_Read => 0, + client_rpc_Write => 0, + client_rpc_Create => 0, + client_rpc_Remove => 0, + client_rpc_Rename => 0, + client_rpc_Link => 0, + client_rpc_Symlink => 0, + client_rpc_Mkdir => 0, + client_rpc_Rmdir => 0, + client_rpc_Readdir => 0, + client_rpc_RdirPlus => 0, + client_rpc_Access => 0, + client_rpc_Mknod => 0, + client_rpc_Fsstat => 0, + client_rpc_FSinfo => 0, + client_rpc_pathConf => 0, + client_rpc_Commit => 0, + client_rpc_SetClId => 0, + client_rpc_SetClIdCf => 0, + client_rpc_Lock => 0, + client_rpc_LockT => 0, + client_rpc_LockU => 0, + client_rpc_Open => 0, + client_rpc_OpenCfr => 0, + client_rpc_OpenDownGr => 0, + client_rpc_Close => 0, + client_rpc_RelLckOwn => 0, + client_rpc_FreeStateID => 0, + client_rpc_PutRootFH => 0, + client_rpc_DelegRet => 0, + client_rpc_GetAcl => 0, + client_rpc_SetAcl => 0, + client_rpc_ExchangeId => 0, + client_rpc_CreateSess => 0, + client_rpc_DestroySess => 0, + client_rpc_DestroyClId => 0, + client_rpc_LayoutGet => 0, + client_rpc_GetDevInfo => 0, + client_rpc_LayoutCommit => 0, + client_rpc_LayoutReturn => 0, + client_rpc_ReclaimCompl => 0, + client_rpc_ReadDataS => 0, + client_rpc_WriteDataS => 0, + client_rpc_CommitDataS => 0, + client_rpc_OpenLayout => 0, + client_rpc_CreateLayout => 0, + client_rpc_BindConnSess => 0, + client_rpc_LookupOpen => 0, + client_rpc_IOAdvise => 0, + client_rpc_Allocate => 0, + client_rpc_Copy => 0, + client_rpc_Seek => 0, + client_rpc_SeekDataS => 0, + client_rpc_GetExtattr => 0, + client_rpc_SetExtattr => 0, + client_rpc_RmExtattr => 0, + client_rpc_ListExtattr => 0, + client_rpc_Deallocate => 0, + client_rpc_LayoutError => 0, + client_OpenOwner => 0, + client_Opens => 0, + client_LockOwner => 0, + client_Locks => 0, + client_Delegs => 0, + client_LocalOwn => 0, + client_LocalOpen => 0, + client_LocalLown => 0, + client_LocalLock => 0, + client_Layouts => 0, + client_rpc_info_TimedOut => 0, + client_rpc_info_Invalid => 0, + client_rpc_info_X_Replies => 0, + client_rpc_info_Retries => 0, + client_rpc_info_Requests => 0, + client_cache_Attr_Hits => 0, + client_cache_Attr_Misses => 0, + client_cache_Lkup_Hits => 0, + client_cache_Lkup_Misses => 0, + client_cache_BioR_Hits => 0, + client_cache_BioR_Misses => 0, + client_cache_BioW_Hits => 0, + client_cache_BioW_Misses => 0, + client_cache_BioRL_Hits => 0, + client_cache_BioRL_Misses => 0, + client_cache_BioD_Hits => 0, + client_cache_BioD_Misses => 0, + client_cache_DirE_Hits => 0, + client_cache_DirE_Misses => 0, + server_Getattr => 0, + server_Setattr => 0, + server_Lookup => 0, + server_Readlink => 0, + server_Read => 0, + server_Write => 0, + server_Create => 0, + server_Remove => 0, + server_Rename => 0, + server_Link => 0, + server_Symlink => 0, + server_Mkdir => 0, + server_Rmdir => 0, + server_Readdir => 0, + server_RdirPlus => 0, + server_Access => 0, + server_Mknod => 0, + server_Fsstat => 0, + server_FSinfo => 0, + server_pathConf => 0, + server_Commit => 0, + server_LookupP => 0, + server_SetClId => 0, + server_SetClIdCf => 0, + server_Open => 0, + server_OpenAttr => 0, + server_OpenDwnGr => 0, + server_OpenCfrm => 0, + server_DelePurge => 0, + server_DelRet => 0, + server_GetFH => 0, + server_Lock => 0, + server_LockT => 0, + server_LockU => 0, + server_Close => 0, + server_Verify => 0, + server_NVerify => 0, + server_PutFH => 0, + server_PutPubFH => 0, + server_PutRootFH => 0, + server_Renew => 0, + server_RestoreFH => 0, + server_SaveFH => 0, + server_Secinfo => 0, + server_RelLockOwn => 0, + server_V4Create => 0, + server_BackChannelCt => 0, + server_BindConnToSes => 0, + server_ExchangeID => 0, + server_CreateSess => 0, + server_DestroySess => 0, + server_FreeStateID => 0, + server_GetDirDeleg => 0, + server_GetDevInfo => 0, + server_GetDevList => 0, + server_layoutCommit => 0, + server_LayoutGet => 0, + server_LayoutReturn => 0, + server_GetDirDeleg => 0, + server_GetDevInfo => 0, + server_GetDevList => 0, + server_layoutCommit => 0, + server_LayoutGet => 0, + server_LayoutReturn => 0, + server_SecInfNoName => 0, + server_Sequence => 0, + server_SetSSV => 0, + server_TestStateID => 0, + server_WantDeleg => 0, + server_DestroyClId => 0, + server_ReclaimCompl => 0, + server_Allocate => 0, + server_Copy => 0, + server_CopyNotify => 0, + server_Deallocate => 0, + server_IOAdvise => 0, + server_LayoutError => 0, + server_LayoutStats => 0, + server_OffloadCncl => 0, + server_OffloadStat => 0, + server_ReadPlus => 0, + server_Seek => 0, + server_WriteSame => 0, + server_Clone => 0, + server_GetExtattr => 0, + server_SetExtattr => 0, + server_ListExtattr => 0, + server_RmExtattr => 0, + server_Clients => 0, + server_OpenOwner => 0, + server_Opens => 0, + server_LockOwner => 0, + server_Locks => 0, + server_Delegs => 0, + server_Layouts => 0, + server_cache_Inprog => 0, + 'server_cache_Non-idem' => 0, + server_cache_Misses => 0, + server_cache_CacheSize => 0, + server_cache_TCPPeak => 0, + } +}; + +#### +#### +#### handle getting stats for FreeBSD +#### +#### +if ( $^O eq 'freebsd' ) { + my $output_raw = `nfsstat -E`; + my @output_split = split( /\n/, $output_raw ); + my $previous_line = ''; + foreach my $line (@output_split) { + if ( $previous_line =~ /Getattr\ +Setattr\ +Lookup\ +Readlink\ +Read\ +Write/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_Getattr}, $data->{stats}{client_rpc_Setattr}, + $data->{stats}{client_rpc_Lookup}, $data->{stats}{client_rpc_Readlink}, + $data->{stats}{client_rpc_Read}, $data->{stats}{client_rpc_Write} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Create\ +Remove\ +Rename\ +Link\ +Symlink\ +Mkdir/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_Create}, $data->{stats}{client_rpc_Remove}, + $data->{stats}{client_rpc_Rename}, $data->{stats}{client_rpc_Link}, + $data->{stats}{client_rpc_Symlink}, $data->{stats}{client_rpc_Mkdir} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Rmdir\ +Readdir\ +RdirPlus\ +Access\ +Mknod\ +Fsstat/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_Rmdir}, $data->{stats}{client_rpc_Readdir}, + $data->{stats}{client_rpc_RdirPlus}, $data->{stats}{client_rpc_Access}, + $data->{stats}{client_rpc_Mknod}, $data->{stats}{client_rpc_Fsstat} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /FSinfo\ +pathConf\ +Commit\ +SetClId\ +SetClIdCf\ +Lock/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_FSinfo}, $data->{stats}{client_rpc_pathConf}, + $data->{stats}{client_rpc_Commit}, $data->{stats}{client_rpc_SetClId}, + $data->{stats}{client_rpc_SetClIdCf}, $data->{stats}{client_rpc_Lock} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /LockT\ +LockU\ +Open\ +OpenCfr/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_LockT}, $data->{stats}{client_rpc_LockU}, + $data->{stats}{client_rpc_Open}, $data->{stats}{client_rpc_OpenCfr} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /OpenDownGr\ +Close/ ) { + $line =~ s/^ +//; + ( $data->{stats}{client_rpc_OpenDownGr}, $data->{stats}{client_rpc_Close}, ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /RelLckOwn\ +FreeStateID\ +PutRootFH\ +DelegRet\ +GetAcl\ +SetAcl/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_RelLckOwn}, $data->{stats}{client_rpc_FreeStateID}, + $data->{stats}{client_rpc_PutRootFH}, $data->{stats}{client_rpc_DelegRet}, + $data->{stats}{client_rpc_GetAcl}, $data->{stats}{client_rpc_SetAcl} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /ExchangeId\ +CreateSess\ +DestroySess\ +DestroyClId\ +LayoutGet\ +GetDevInfo/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_ExchangeId}, $data->{stats}{client_rpc_CreateSess}, + $data->{stats}{client_rpc_DestroySess}, $data->{stats}{client_rpc_DestroyClId}, + $data->{stats}{client_rpc_LayoutGet}, $data->{stats}{client_rpc_GetDevInfo} + ) = split( / +/m, $line ); + } elsif ( + $previous_line =~ /LayoutCommit\ +LayoutReturn\ +ReclaimCompl\ +ReadDataS\ +WriteDataS\ +CommitDataS/ ) + { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_LayoutCommit}, $data->{stats}{client_rpc_LayoutReturn}, + $data->{stats}{client_rpc_ReclaimCompl}, $data->{stats}{client_rpc_ReadDataS}, + $data->{stats}{client_rpc_WriteDataS}, $data->{stats}{client_rpc_CommitDataS} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /OpenLayout\ +CreateLayout\ +BindConnSess\ +LookupOpen/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_OpenLayout}, $data->{stats}{client_rpc_CreateLayout}, + $data->{stats}{client_rpc_BindConnSess}, $data->{stats}{client_rpc_LookupOpen} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /IOAdvise\ +Allocate\ +Copy\ +Seek\ +SeekDataS\ +GetExtattr/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_IOAdvise}, $data->{stats}{client_rpc_Allocate}, + $data->{stats}{client_rpc_Copy}, $data->{stats}{client_rpc_Seek}, + $data->{stats}{client_rpc_SeekDataS}, $data->{stats}{client_rpc_GetExtattr} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /SetExtattr\ +RmExtattr\ +ListExtattr\ +Deallocate\ +LayoutError/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_SetExtattr}, $data->{stats}{client_rpc_RmExtattr}, + $data->{stats}{client_rpc_ListExtattr}, $data->{stats}{client_rpc_Deallocate}, + $data->{stats}{client_rpc_LayoutError} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /OpenOwner\ +Opens\ +LockOwner\ +Locks\ +Delegs\ +LocalOwn/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_OpenOwner}, $data->{stats}{client_Opens}, $data->{stats}{client_LockOwner}, + $data->{stats}{client_Locks}, $data->{stats}{client_Delegs}, $data->{stats}{client_LockOwner} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /LocalOpen\ +LocalLown\ +LocalLock\ +Layouts/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_LocalOpen}, $data->{stats}{client_LocalLown}, + $data->{stats}{client_LocalLock}, $data->{stats}{client_Layouts} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /TimedOut\ +Invalid\ +X\ Replies\ +Retries\ +Requests/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_rpc_info_TimedOut}, $data->{stats}{client_rpc_info_Invalid}, + $data->{stats}{client_rpc_info_X_Replies}, $data->{stats}{client_rpc_info_Retries}, + $data->{stats}{client_rpc_info_Requests} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Attr\ Hits\ +Attr\ Misses\ +Lkup\ Hits\ +Lkup\ Misses/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_cache_Attr_Hits}, $data->{stats}{client_cache_Attr_Misses}, + $data->{stats}{client_cache_Lkup_Hits}, $data->{stats}{client_cache_Lkup_Misses} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /BioR\ Hits\ +BioR\ Misses\ +BioW\ Hits\ +BioW\ Misses/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_cache_BioR_Hits}, $data->{stats}{client_cache_BioR_Misses}, + $data->{stats}{client_cache_BioW_Hits}, $data->{stats}{client_cache_BioW_Misses} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /BioRL\ Hits\ +BioRL\ Misse\ +BioD\ Hits\ +BioD\ Misses/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{client_cache_BioRL_Hits}, $data->{stats}{client_cache_BioRL_Misses}, + $data->{stats}{client_cache_BioD_Hits}, $data->{stats}{client_cache_BioD_Misses} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /DirE\ Hits\ +DirE\ Misses/ ) { + $line =~ s/^ +//; + ( $data->{stats}{client_cache_DirE_Hits}, $data->{stats}{client_cache_DirE_Misses}, ) + = split( / +/m, $line ); + } elsif ( $previous_line =~ /Getattr\ +Setattr\ +Lookup\ +Readlink\ +Read\ +Write/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Getattr}, $data->{stats}{server_Setattr}, $data->{stats}{server_Lookup}, + $data->{stats}{server_Readlink}, $data->{stats}{server_Read}, $data->{stats}{server_Write}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Create\ +Remove\ +Rename\ +Link\ +Symlink\ +Mkdir/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Create}, $data->{stats}{server_Remove}, $data->{stats}{server_Rename}, + $data->{stats}{server_Link}, $data->{stats}{server_Symlink}, $data->{stats}{server_Mkdir}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Rmdir\ +Readdir\ +RdirPlus\ +Access\ +Mknod\ +Fsstat/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Rmdir}, $data->{stats}{server_Readdir}, $data->{stats}{server_RdirPlus}, + $data->{stats}{server_Access}, $data->{stats}{server_Mknod}, $data->{stats}{server_Fsstat}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /FSinfo\ +pathConf\ +Commit\ +LookupP\ +SetClId\ +SetClIdCf/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_FSinfo}, $data->{stats}{server_pathConf}, $data->{stats}{server_Commit}, + $data->{stats}{server_LookupP}, $data->{stats}{server_SetClId}, $data->{stats}{server_SetClIdCf}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Open\ +OpenAttr\ +OpenDwnGr\ +OpenCfrm\ +DelePurge\ +DelRet/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Open}, $data->{stats}{server_OpenAttr}, $data->{stats}{server_OpenDwnGr}, + $data->{stats}{server_OpenCfrm}, $data->{stats}{server_DelePurge}, $data->{stats}{server_DelRet}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /GetFH\ +Lock\ +LockT\ +LockU\ +Close\ +Verify/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_GetFH}, $data->{stats}{server_Lock}, $data->{stats}{server_LockT}, + $data->{stats}{server_LockU}, $data->{stats}{server_Close}, $data->{stats}{server_Verify}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /NVerify\ +PutFH\ +PutPubFH\ +PutRootFH\ +Renew\ +RestoreFH/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_NVerify}, $data->{stats}{server_PutFH}, $data->{stats}{server_PutPubFH}, + $data->{stats}{server_PutRootFH}, $data->{stats}{server_Renew}, $data->{stats}{server_RestoreFH}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /SaveFH\ +Secinfo\ +RelLockOwn\ +V4Create/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_SaveFH}, $data->{stats}{server_Secinfo}, + $data->{stats}{server_RelLockOwn}, $data->{stats}{server_V4Create} + ) = split( / +/m, $line ); + } elsif ( $previous_line + =~ /BackChannelCt\ *BindConnToSes\ +ExchangeID\ +CreateSess\ +DestroySess\ +FreeStateID/ ) + { + $line =~ s/^ +//; + ( + $data->{stats}{server_BackChannelCt}, $data->{stats}{server_BindConnToSes}, + $data->{stats}{server_ExchangeID}, $data->{stats}{server_CreateSess}, + $data->{stats}{server_DestroySess}, $data->{stats}{server_FreeStateID}, + ) = split( / +/m, $line ); + } elsif ( + $previous_line =~ /GetDirDeleg\ +GetDevInfo\ +GetDevList\ +[lL]ayoutCommit\ +LayoutGet\ +LayoutReturn/ ) + { + $line =~ s/^ +//; + ( + $data->{stats}{server_GetDirDeleg}, $data->{stats}{server_GetDevInfo}, + $data->{stats}{server_GetDevList}, $data->{stats}{server_layoutCommit}, + $data->{stats}{server_LayoutGet}, $data->{stats}{server_LayoutReturn}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /SecInfNoName\ +Sequence\ +SetSSV\ +TestStateID\ +WantDeleg\ +DestroyClId/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_SecInfNoName}, $data->{stats}{server_Sequence}, + $data->{stats}{server_SetSSV}, $data->{stats}{server_TestStateID}, + $data->{stats}{server_WantDeleg}, $data->{stats}{server_DestroyClId}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /ReclaimCompl/ ) { + $line =~ s/^ +//; + ( $data->{stats}{server_ReclaimCompl} ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Allocate\ +Copy\ +CopyNotify\ +Deallocate\ +IOAdvise\ +LayoutError/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Allocate}, $data->{stats}{server_Copy}, + $data->{stats}{server_CopyNotify}, $data->{stats}{server_Deallocate}, + $data->{stats}{server_IOAdvise}, $data->{stats}{server_LayoutError}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /LayoutStats\ +OffloadCncl\ +OffloadStat\ +ReadPlus\ +Seek\ +WriteSame/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_LayoutStats}, $data->{stats}{server_OffloadCncl}, + $data->{stats}{server_OffloadStat}, $data->{stats}{server_ReadPlus}, + $data->{stats}{server_Seek}, $data->{stats}{server_WriteSame}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Clone\ +GetExtattr\ +SetExtattr\ +ListExtattr\ +RmExtattr/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Clone}, $data->{stats}{server_GetExtattr}, + $data->{stats}{server_SetExtattr}, $data->{stats}{server_ListExtattr}, + $data->{stats}{server_RmExtattr} + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /Clients\ +OpenOwner\ +Opens\ +LockOwner\ +Locks\ +Delegs/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_Clients}, $data->{stats}{server_OpenOwner}, $data->{stats}{server_Opens}, + $data->{stats}{server_LockOwner}, $data->{stats}{server_Locks}, $data->{stats}{server_Delegs}, + ) = split( / +/m, $line ); + } elsif ( $previous_line =~ /^ *Layouts *$/ ) { + $line =~ s/^ +//; + $line =~ s/ +$//; + $data->{stats}{server_Clients} = $line; + } elsif ( $previous_line =~ /Inprog\ +Non\-idem\ +Misses\ +CacheSize\ +TCPPeak/ ) { + $line =~ s/^ +//; + ( + $data->{stats}{server_cache_Inprog}, $data->{stats}{'server_cache_Non-idem'}, + $data->{stats}{server_cache_Misses}, $data->{stats}{server_cache_CacheSize}, + $data->{stats}{server_cache_TCPPeak} + ) = split( / +/m, $line ); + } + $previous_line = $line; + } ## end foreach my $line (@output_split) +} ## end if ( $^O eq 'freebsd' ) + +#### +#### +#### handle getting stats for Linux +#### +#### +if ( $^O eq 'linux' ) { + +} + +#### +#### +#### figure out if is a client and/or server +#### +#### +my @stat_keys = keys( %{ $data->{stats} } ); +foreach my $item (@stat_keys) { + if ($item=~/^client/ && $data->{stats}{$item} > 0) { + $data->{is_client}=1 + }elsif ($item=~/^server/ && $data->{stats}{$item} > 0) { + $data->{is_server}=1 + } +} + +#### +#### +#### if server, call showmount +#### +#### +if ($data->{is_server}) { + my $output_raw = `showmount -a`; + my @output_split = split( /\n/, $output_raw ); + foreach my $line (@output_split) { + if ($line=~/\:\//) { + my ($host, $path)=split(/\:\//, $line); + push(@{$data->{mounted_by}}, {host=>$host, path=>'/'.$path}); + } + } +} + +#### +#### +#### if client, call nfsstat -m +#### +#### +if ($data->{is_client}) { + if ($^O eq 'freebsd') { + my $output_raw = `nfsstat -m`; + my @output_split = split( /\n/, $output_raw ); + my $previous_line=''; + my $host; + my $rpath; + my $lpath; + foreach my $line (@output_split) { + if ($line =~ /\:\/.* on \//) { + $host=$line; + $host=~s/\:\/.*$//; + + $rpath=$line; + $rpath=~s/\ on\ \/.*$//; + $rpath=~s/^.*\:\///; + $rpath='/'.$rpath; + + $lpath=$line; + $lpath=~s/^.*\:\/.*\ on \///; + $lpath='/'.$lpath; + }elsif ($line =~ /\,/ && defined($host) && defined($rpath) && defined($lpath) ) { + my @flags; + my %opts; + my @line_split=split(/\,/, $line); + foreach my $item (@line_split) { + if ($item =~ /\=/) { + my ($var, $val)=split(/\=/, $item); + $opts{$var}=$val; + }else { + push(@flags, $item); + } + } + push(@{$data->{mounted}}, { host=>$host, rpath=>$rpath, lpath=>$lpath,flags=>\@flags, opts=>\%opts }); + } + } + }elsif ($^O eq 'linux') { + my $output_raw = `nfsstat -m`; + my @output_split = split( /\n/, $output_raw ); + } +} + +#add the data has to the return hash +$to_return->{data} = $data; + +#finally render the JSON +my $j = JSON->new; +if ($pretty) { + $j->pretty(1); +} +print $j->encode($to_return); +if ( !$pretty ) { + print "\n"; +} From 9f2d148fef470943cac82d5cc36b41bcd0ef3cd6 Mon Sep 17 00:00:00 2001 From: "Zane C. Bowers-Hadley" Date: Sat, 2 Mar 2024 09:43:48 -0600 Subject: [PATCH 2/5] remove Getopt::Std --- snmp/nfs | 1 - 1 file changed, 1 deletion(-) diff --git a/snmp/nfs b/snmp/nfs index 93e88ceca..1b0c4ac77 100755 --- a/snmp/nfs +++ b/snmp/nfs @@ -26,7 +26,6 @@ use strict; use warnings; -use Getopt::Std; use Getopt::Long; use File::Slurp; use MIME::Base64; From 824144e9d54486fa3bd8605bee3e5b035bba4d6a Mon Sep 17 00:00:00 2001 From: "Zane C. Bowers-Hadley" Date: Sat, 2 Mar 2024 14:55:59 -0600 Subject: [PATCH 3/5] nfsstat -m works for Linux now as well --- snmp/nfs | 121 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 41 deletions(-) diff --git a/snmp/nfs b/snmp/nfs index 1b0c4ac77..3a59ead22 100755 --- a/snmp/nfs +++ b/snmp/nfs @@ -36,6 +36,9 @@ use JSON; #the version of returned data my $VERSION = 1; +# ensure sbin is in the path +$ENV{PATH} = $ENV{PATH} . ':/sbin:/usr/sbin'; + my $pretty; my $cache_base = '/var/cache/nfs.json'; my $write; @@ -537,10 +540,10 @@ if ( $^O eq 'linux' ) { #### my @stat_keys = keys( %{ $data->{stats} } ); foreach my $item (@stat_keys) { - if ($item=~/^client/ && $data->{stats}{$item} > 0) { - $data->{is_client}=1 - }elsif ($item=~/^server/ && $data->{stats}{$item} > 0) { - $data->{is_server}=1 + if ( $item =~ /^client/ && $data->{stats}{$item} > 0 ) { + $data->{is_client} = 1; + } elsif ( $item =~ /^server/ && $data->{stats}{$item} > 0 ) { + $data->{is_server} = 1; } } @@ -549,63 +552,99 @@ foreach my $item (@stat_keys) { #### if server, call showmount #### #### -if ($data->{is_server}) { - my $output_raw = `showmount -a`; - my @output_split = split( /\n/, $output_raw ); +if ( $data->{is_server} ) { + my $output_raw = `showmount -a`; + my @output_split = split( /\n/, $output_raw ); foreach my $line (@output_split) { - if ($line=~/\:\//) { - my ($host, $path)=split(/\:\//, $line); - push(@{$data->{mounted_by}}, {host=>$host, path=>'/'.$path}); + if ( $line =~ /\:\// ) { + my ( $host, $path ) = split( /\:\//, $line ); + push( @{ $data->{mounted_by} }, { host => $host, path => '/' . $path } ); } } -} +} ## end if ( $data->{is_server} ) #### #### #### if client, call nfsstat -m #### #### -if ($data->{is_client}) { - if ($^O eq 'freebsd') { - my $output_raw = `nfsstat -m`; - my @output_split = split( /\n/, $output_raw ); - my $previous_line=''; +if ( $data->{is_client} ) { + if ( $^O eq 'freebsd' ) { + my $output_raw = `nfsstat -m`; + my @output_split = split( /\n/, $output_raw ); my $host; my $rpath; my $lpath; foreach my $line (@output_split) { - if ($line =~ /\:\/.* on \//) { - $host=$line; - $host=~s/\:\/.*$//; + if ( $line =~ /\:\/.* on \// ) { + $host = $line; + $host =~ s/\:\/.*$//; - $rpath=$line; - $rpath=~s/\ on\ \/.*$//; - $rpath=~s/^.*\:\///; - $rpath='/'.$rpath; + $rpath = $line; + $rpath =~ s/\ on\ \/.*$//; + $rpath =~ s/^.*\:\///; + $rpath = '/' . $rpath; - $lpath=$line; - $lpath=~s/^.*\:\/.*\ on \///; - $lpath='/'.$lpath; - }elsif ($line =~ /\,/ && defined($host) && defined($rpath) && defined($lpath) ) { + $lpath = $line; + $lpath =~ s/^.*\:\/.*\ on \///; + $lpath = '/' . $lpath; + } elsif ( $line =~ /\,/ && defined($host) && defined($rpath) && defined($lpath) ) { my @flags; my %opts; - my @line_split=split(/\,/, $line); + my @line_split = split( /\,/, $line ); foreach my $item (@line_split) { - if ($item =~ /\=/) { - my ($var, $val)=split(/\=/, $item); - $opts{$var}=$val; - }else { - push(@flags, $item); + if ( $item =~ /\=/ ) { + my ( $var, $val ) = split( /\=/, $item ); + $opts{$var} = $val; + } else { + push( @flags, $item ); } } - push(@{$data->{mounted}}, { host=>$host, rpath=>$rpath, lpath=>$lpath,flags=>\@flags, opts=>\%opts }); - } - } - }elsif ($^O eq 'linux') { - my $output_raw = `nfsstat -m`; - my @output_split = split( /\n/, $output_raw ); - } -} + push( + @{ $data->{mounted} }, + { host => $host, rpath => $rpath, lpath => $lpath, flags => \@flags, opts => \%opts } + ); + } ## end elsif ( $line =~ /\,/ && defined($host) && defined...) + } ## end foreach my $line (@output_split) + } elsif ( $^O eq 'linux' ) { + my $output_raw = `nfsstat -m`; + my @output_split = split( /\n/, $output_raw ); + my $host; + my $rpath; + my $lpath; + foreach my $line (@output_split) { + if ( $line =~ /^\/.*\ from\ .*\:\/.*/ ) { + $lpath = $line; + $lpath =~ s/\ from\ .*$//; + + $host = $line; + $host =~ s/.*\ from\ //; + $host =~ s/\:\/.*$//; + + $rpath = $line; + $rpath =~ s/^.*\:\///; + $rpath = '/' . $rpath; + } elsif ( $line =~ /Flags\:[\ \t]+/ && defined($lpath) && defined($host) && defined($rpath) ) { + $line =~ s/^.*Flags\:[\ \t]+//; + my @flags; + my %opts; + my @line_split = split( /\,/, $line ); + foreach my $item (@line_split) { + if ( $item =~ /\=/ ) { + my ( $var, $val ) = split( /\=/, $item ); + $opts{$var} = $val; + } else { + push( @flags, $item ); + } + } + push( + @{ $data->{mounted} }, + { host => $host, rpath => $rpath, lpath => $lpath, flags => \@flags, opts => \%opts } + ); + } ## end elsif ( $line =~ /Flags\:[\ \t]+/ && defined(...)) + } ## end foreach my $line (@output_split) + } ## end elsif ( $^O eq 'linux' ) +} ## end if ( $data->{is_client} ) #add the data has to the return hash $to_return->{data} = $data; From 5861eb8d7e362defc23295150a0e130ef757bafd Mon Sep 17 00:00:00 2001 From: "Zane C. Bowers-Hadley" Date: Sun, 3 Mar 2024 12:39:43 -0600 Subject: [PATCH 4/5] now works for Linux and FreeBSD --- snmp/nfs | 202 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 198 insertions(+), 4 deletions(-) diff --git a/snmp/nfs b/snmp/nfs index 3a59ead22..3adad5bc9 100755 --- a/snmp/nfs +++ b/snmp/nfs @@ -75,9 +75,23 @@ my $to_return = { my $data = { is_client => 0, is_server => 0, + os => $^O, mounts => [], mounted_by => [], stats => { + client_rpc_clone => 0, + client_rpc_layoutstats => 0, + client_rpc_getdevicelist => 0, + client_rpc_test_stateid => 0, + client_rpc_secinfo_no => 0, + client_rpc_get_lease_time => 0, + client_rpc_sequence => 0, + client_rpc_fsid_present => 0, + client_rpc_secinfo => 0, + client_rpc_fs_locations => 0, + client_rpc_server_caps => 0, + client_rpc_renew => 0, + client_rpc_confirm => 0, client_rpc_null => 0, client_rpc_Getattr => 0, client_rpc_Setattr => 0, @@ -271,6 +285,16 @@ my $data = { server_cache_Misses => 0, server_cache_CacheSize => 0, server_cache_TCPPeak => 0, + server_calls => 0, + server_badcalls => 0, + server_badfmt => 0, + server_badauth => 0, + server_badclnt => 0, + server_null => 0, + server_compound => 0, + 'server_op0-unused' => 0, + 'server_op1-unused' => 0, + 'server_op2-future' => 0, } }; @@ -530,8 +554,178 @@ if ( $^O eq 'freebsd' ) { #### #### if ( $^O eq 'linux' ) { - -} + my $output_raw = `nfsstat | sed 's/[0-9\.]*\%//g'`; + my @output_split = split( /\n/, $output_raw ); + my $previous_line = ''; + foreach my $line (@output_split) { + if ( $previous_line =~ /calls\ +badcalls\ +badfmt\ +badauth\ +badclnt/ ) { + ( + $data->{stats}{server_calls}, $data->{stats}{'server_badcalls'}, $data->{stats}{server_badfmt}, + $data->{stats}{server_badauth}, $data->{stats}{server_badclnt}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /null\ +compound/ ) { + ( $data->{stats}{server_null}, $data->{stats}{server_compound}, ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /op0\-unused\ +op1\-unused\ +op2\-future\ +access\ +close/ ) { + ( + $data->{stats}{'server_op0-unused'}, $data->{stats}{'server_op1-unused'}, + $data->{stats}{'server_op2-future'}, $data->{stats}{server_Access}, + $data->{stats}{server_Close}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /commit\ +create\ +delegpurge\ +delegreturn\ +getattr/ ) { + ( + $data->{stats}{server_Commit}, $data->{stats}{server_Create}, $data->{stats}{server_DelePurge}, + $data->{stats}{server_Delegs}, $data->{stats}{server_Getattr}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /getfh\ +link\ +lock\ +lockt\ +locku/ ) { + ( + $data->{stats}{server_GetFH}, $data->{stats}{server_Link}, $data->{stats}{server_Lock}, + $data->{stats}{server_LockT}, $data->{stats}{server_LockU}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /lookup\ +lookup_root\ +nverify\ +open\ +openattr/ ) { + ( + $data->{stats}{server_Lookup}, $data->{stats}{server_LookupP}, $data->{stats}{server_NVerify}, + $data->{stats}{server_Open}, $data->{stats}{server_OpenAttr}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /open_conf\ +open_dgrd\ +putfh\ putpubfh\ +putrootfh/ ) { + ( + $data->{stats}{server_OpenCfrm}, $data->{stats}{server_OpenDwnGr}, $data->{stats}{server_PutFH}, + $data->{stats}{server_PutPubFH}, $data->{stats}{server_PutRootFH}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /read\ +readdir\ +readlink\ +remove\ +rename/ ) { + ( + $data->{stats}{server_Read}, $data->{stats}{server_Readdir}, $data->{stats}{server_Readlink}, + $data->{stats}{server_Remove}, $data->{stats}{server_Rename}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /renew\ +restorefh\ +savefh\ +secinfo\ +setattr/ ) { + ( + $data->{stats}{server_Renew}, $data->{stats}{server_RestoreFH}, $data->{stats}{server_SaveFH}, + $data->{stats}{server_Secinfo}, $data->{stats}{server_Setattr}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /setcltid\ +setcltidconf\ +verify\ +write\ +rellockowner/ ) { + ( + $data->{stats}{server_SetClId}, $data->{stats}{server_SetClIdCf}, + $data->{stats}{server_Verify}, $data->{stats}{server_Write}, + $data->{stats}{server_RelLockOwn}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /bc_ctl\ +bind_conn\ +exchange_id\ +create_ses\ +destroy_ses/ ) { + ( + $data->{stats}{server_BackChannelCt}, $data->{stats}{server_BindConnToSes}, + $data->{stats}{server_ExchangeID}, $data->{stats}{server_CreateSess}, + $data->{stats}{server_DestroySess}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /free_stateid\ +getdirdeleg\ +getdevinfo\ +getdevlist\ +layoutcommit/ ) { + ( + $data->{stats}{server_FreeStateID}, $data->{stats}{server_GetDirDeleg}, + $data->{stats}{server_GetDevInfo}, $data->{stats}{server_GetDevList}, + $data->{stats}{server_layoutCommit}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /layoutget\ +layoutreturn\ +secinfononam\ +sequence\ +set_ssv/ ) { + ( + $data->{stats}{server_LayoutGet}, $data->{stats}{server_LayoutReturn}, + $data->{stats}{server_SecInfNoName}, $data->{stats}{server_Sequence}, + $data->{stats}{server_SetSSV}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /test_stateid\ +want_deleg\ +destroy_clid\ +reclaim_comp\ +allocate/ ) { + ( + $data->{stats}{server_TestStateID}, $data->{stats}{server_WantDeleg}, + $data->{stats}{server_DestroyClId}, $data->{stats}{server_ReclaimCompl}, + $data->{stats}{server_Allocate}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /copy\ +copy_notify\ +deallocate\ +ioadvise\ +layouterror/ ) { + ( + $data->{stats}{server_Copy}, $data->{stats}{server_CopyNotify}, + $data->{stats}{server_Deallocate}, $data->{stats}{server_IOAdvise}, + $data->{stats}{server_LayoutError}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /layoutstats\ +offloadcancel\ +offloadstatus\ +readplus\ +seek/ ) { + ( + $data->{stats}{server_Layouts}, $data->{stats}{server_OffloadCncl}, + $data->{stats}{server_OffloadStat}, $data->{stats}{server_ReadPlus}, + $data->{stats}{server_Seek}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /write_same/ ) { + ( $data->{stats}{server_WriteSame} ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /calls\ +retrans\ +authrefrsh/ ) { + ( + $data->{stats}{client_rpc_info_Requests}, + $data->{stats}{client_rpc_info_Retries}, + $data->{stats}{client_rpc_info_X_Replies} + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /null\ +read\ +write\ +commit\ +open/ ) { + ( + $data->{stats}{client_rpc_null}, $data->{stats}{client_rpc_Read}, + $data->{stats}{client_rpc_Write}, $data->{stats}{client_rpc_Commit}, + $data->{stats}{client_rpc_Open}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /open_conf\ +open_noat\ +open_dgrd\ +close\ +setattr/ ) { + ( + $data->{stats}{client_rpc_OpenCfr}, $data->{stats}{client_rpc_OpenLayout}, + $data->{stats}{client_rpc_OpenDownGr}, $data->{stats}{client_rpc_Commit}, + $data->{stats}{client_rpc_Open}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /fsinfo\ +renew\ +setclntid\ +confirm\ +lock/ ) { + ( + $data->{stats}{client_rpc_FSinfo}, $data->{stats}{client_rpc_renew}, + $data->{stats}{client_rpc_SetClId}, $data->{stats}{client_rpc_confirm}, + $data->{stats}{client_rpc_Lock}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /lockt\ +locku\ +access\ +getattr\ +lookup/ ) { + ( + $data->{stats}{client_rpc_LockT}, $data->{stats}{client_rpc_LockU}, + $data->{stats}{client_rpc_Access}, $data->{stats}{client_rpc_Getattr}, + $data->{stats}{client_rpc_Lookup}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /lookup_root\ +remove\ +rename\ +link\ +symlink/ ) { + ( + $data->{stats}{client_rpc_LookOpen}, $data->{stats}{client_rpc_Remove}, + $data->{stats}{client_rpc_Rename}, $data->{stats}{client_rpc_Link}, + $data->{stats}{client_rpc_Symlink}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /create\ +pathconf\ +statfs\ +readlink\ +readdir/ ) { + ( + $data->{stats}{client_rpc_Create}, $data->{stats}{client_rpc_pathConf}, + $data->{stats}{client_rpc_statfs}, $data->{stats}{client_rpc_Readlink}, + $data->{stats}{client_rpc_Readlink}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /server_caps\ +delegreturn\ +getacl\ +setacl\ +fs_locations/ ) { + ( + $data->{stats}{client_rpc_server_caps}, $data->{stats}{client_rpc_DelegRet}, + $data->{stats}{client_rpc_GetAcl}, $data->{stats}{client_rpc_SetAcl}, + $data->{stats}{client_rpc_fs_locations}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /rel_lkowner\ +secinfo\ +fsid_present\ +exchange_id\ +create_session/ ) { + ( + $data->{stats}{client_rpc_RelLckOwn}, $data->{stats}{client_rpc_secinfo}, + $data->{stats}{client_rpc_fsid_present}, $data->{stats}{client_rpc_ExchangeId}, + $data->{stats}{client_rpc_CreateSess}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /destroy_session\ +sequence\ +get_lease_time\ +reclaim_comp\ +layoutget/ ) { + ( + $data->{stats}{client_rpc_DestroySess}, $data->{stats}{client_rpc_sequence}, + $data->{stats}{client_rpc_get_lease_time}, $data->{stats}{client_rpc_ReclaimCompl}, + $data->{stats}{client_rpc_LayoutGet}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /getdevinfo\ +layoutcommit\ +layoutreturn\ +secinfo_no\ +test_stateid/ ) { + ( + $data->{stats}{client_rpc_GetDevInfo}, $data->{stats}{client_rpc_LayoutCommit}, + $data->{stats}{client_rpc_LayoutReturn}, $data->{stats}{client_rpc_secinfo_no}, + $data->{stats}{client_rpc_test_stateid}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /free_stateid\ +getdevicelist\ +bind_conn_to_ses\ +destroy_clientid\ +seek/ ) { + ( + $data->{stats}{client_rpc_FreeStateID}, $data->{stats}{client_rpc_getdevicelist}, + $data->{stats}{client_rpc_BindConnSess}, $data->{stats}{client_rpc_DestroyClId}, + $data->{stats}{client_rpc_Seek}, + ) = split( /[\ \t]+/m, $line ); + } elsif ( $previous_line =~ /allocate\ +deallocate\ +layoutstats\ +clone/ ) { + ( + $data->{stats}{client_rpc_Allocate}, $data->{stats}{client_rpc_Deallocate}, + $data->{stats}{client_rpc_layoutstats}, $data->{stats}{client_rpc_clone}, + ) = split( /[\ \t]+/m, $line ); + } + $previous_line = $line; + } ## end foreach my $line (@output_split) +} ## end if ( $^O eq 'linux' ) #### #### @@ -601,7 +795,7 @@ if ( $data->{is_client} ) { } } push( - @{ $data->{mounted} }, + @{ $data->{mounts} }, { host => $host, rpath => $rpath, lpath => $lpath, flags => \@flags, opts => \%opts } ); } ## end elsif ( $line =~ /\,/ && defined($host) && defined...) @@ -638,7 +832,7 @@ if ( $data->{is_client} ) { } } push( - @{ $data->{mounted} }, + @{ $data->{mounts} }, { host => $host, rpath => $rpath, lpath => $lpath, flags => \@flags, opts => \%opts } ); } ## end elsif ( $line =~ /Flags\:[\ \t]+/ && defined(...)) From 052c7c59142f3d41c6fea3a43588c6f2e133cdc5 Mon Sep 17 00:00:00 2001 From: "Zane C. Bowers-Hadley" Date: Sun, 3 Mar 2024 13:22:54 -0600 Subject: [PATCH 5/5] add nfs --- snmp/nfs | 110 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 12 deletions(-) diff --git a/snmp/nfs b/snmp/nfs index 3adad5bc9..82d9c449e 100755 --- a/snmp/nfs +++ b/snmp/nfs @@ -1,5 +1,59 @@ #!/usr/bin/env perl +=head1 NAME + +nfs - LibreNMS JSON style SNMP extend for NFS monitoring + +=head1 VERSION + +0.0.1 + +=head1 SYNOPSIS + +nfs [B<-w>] [B<-b>] [B<-o> ] + +nfs --help|-h + +nfs --version|-v + +=head1 SNMPD CONFIG + + extend nfs /etc/snmp/extends/nfs -b + +or if using cron... + + extend nfs cat /var/cache/nfs.json.snmp + +=head1 DESCRIPTION + +Uses showmount and nfsstat to gather information for the OSes below for NFS. + + FreeBSD + Linux + +=head1 FLAGS + +=head2 -w + +Write the results out. + +=head2 -b + +Print out the compressed data if GZip+Base64 is smaller. + +=head2 -o + +Where to write the results to. Defaults to '/var/cache/nfs.json', +meaning it will be written out to the two locations. + + /var/cache/nfs.json + /var/cache/nfs.json.snmp + +The later is for use with returning data for SNMP. Will be compressed +if possible. + +=cut + ## ## ## General Notes @@ -42,14 +96,13 @@ $ENV{PATH} = $ENV{PATH} . ':/sbin:/usr/sbin'; my $pretty; my $cache_base = '/var/cache/nfs.json'; my $write; -my $compress = 1; +my $compress; my $version; my $help; GetOptions( - p => \$pretty, - 'b=s' => \$compress, 'o=s' => \$cache_base, - 'w' => \$write, + w => \$write, + b => \$compress, v => \$version, version => \$version, h => \$help, @@ -844,11 +897,44 @@ if ( $data->{is_client} ) { $to_return->{data} = $data; #finally render the JSON -my $j = JSON->new; -if ($pretty) { - $j->pretty(1); -} -print $j->encode($to_return); -if ( !$pretty ) { - print "\n"; -} +my $raw_json = encode_json($to_return); +if ($write) { + write_file( $cache_base, $raw_json ); + # compress and write to the cache file for it + my $compressed_string; + gzip \$raw_json => \$compressed_string; + my $compressed = encode_base64($compressed_string); + $compressed =~ s/\n//g; + $compressed = $compressed . "\n"; + my $print_compressed = 0; + if ( length($compressed) > length($raw_json) ) { + write_file( $cache_base . '.snmp', $raw_json ); + } else { + write_file( $cache_base . '.snmp', $compressed ); + $print_compressed = 1; + } + + if ( $compress && $print_compressed ) { + print $compressed; + } else { + print $raw_json; + } +} else { + if ( !$compress ) { + print $raw_json. "\n"; + exit; + } + + # compress and write to the cache file for it + my $compressed_string; + gzip \$raw_json => \$compressed_string; + my $compressed = encode_base64($compressed_string); + $compressed =~ s/\n//g; + $compressed = $compressed . "\n"; + my $print_compressed = 0; + if ( length($compressed) > length($raw_json) ) { + print $raw_json; + } else { + print $compressed; + } +} ## end else [ if ($write) ]