diff options
Diffstat (limited to 'contrib/mrtgext.pl')
-rw-r--r-- | contrib/mrtgext.pl | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/contrib/mrtgext.pl b/contrib/mrtgext.pl new file mode 100644 index 00000000..b9e9f6b9 --- /dev/null +++ b/contrib/mrtgext.pl @@ -0,0 +1,291 @@ +#!/usr/bin/perl -w +# +# mrtgext.pl v0.3 +# (c)2000 Cliff Woolley, Washington and Lee University +# jwoolley@wlu.edu +# +# A UNIX counterpart to Jim Drews' MRTG Extension for netware servers +# Mimics output of mrtgext.nlm using output of various standard UNIX +# programs (df, uptime, and uname) +# +# Dependencies: I make some assumptions about the output format of +# your df and uptime commands. If you have nonstandard outputs for +# any of these, either pick a different command that gives more +# standard output or modify the script below. Example: use /usr/bin/bdf +# on HP-UX instead of /usr/bin/df, because bdf follows the output format +# I expect while df does not. This was written on Linux and tested on +# HP-UX 10.20 (with changes to the subroutines at the bottom of the +# program to reflect HP's command parameters); similar tweaking could +# well be required to port this to other platforms. If you get it +# working on your platform, please send me any changes you had to +# make so I can try to incorporate them. +# +# +# Following is what I expect the programs' outputs to look like: +# +# ======= df ======== +# Filesystem 1k-blocks Used Available Use% Mounted on +# /dev/sda1 1014696 352708 609612 37% / +# /dev/sda2 2262544 586712 1559048 27% /apps +# /dev/sda3 4062912 566544 3286604 15% /share +# /dev/sr0 651758 651758 0 100% /cdrom +# =================== +# +# ===== uptime ====== +# 3:17pm up 15 days, 4:40, 5 users, load average: 0.12, 0.26, 0.33 +# =================== +# + +############################################################### +# Configuration section +############################################################### + +$dfcmd = "/bin/df 2>/dev/null"; +$uptimecmd = "/usr/bin/uptime"; +%customcmds = ( "PROCS" => "numprocesses", + "ZOMBIES" => "numzombies", + "MEMFREE" => "memfree", + "SWAPUSED" => "swapused", + "TCPCONNS" => "tcpconns", + "CLIENTS" => "ipclients" ); + # These are functions that you can + # define and customize for your system. + # You probably need to change the provided + # subroutines to work on your system (if + # not Linux). + +$rootfsnickname = "root"; # this is necessary as a kludge to + # better match the netware behavior. + # if you already have a _filesystem_ + # mounted as /root, then you'll need + # to change this to something else +$DEBUG = 0; +$recvtimeout = 30; + + +############################################################### +# Program section +############################################################### + +require 5.004; + +use Sys::Hostname; + + +$DEBUG = $ARGV[0] unless ($DEBUG); +$SIG{'ALRM'} = sub { exit 1; }; + +# some things never change +$hostname = hostname; + + +if ( $DEBUG ) { + $| = 1; + print scalar localtime,": mrtgext.pl started\n"; +} + +# timeout period +alarm($recvtimeout); +my $items = <STDIN>; +alarm(0); + +$items =~ s/[\r\n]//g; +( $DEBUG ) && print scalar localtime,": request: \"$items\"\n"; +my @items = split (/\s+/,"$items"); +( $DEBUG ) && print scalar localtime,": ",scalar @items," item(s) to process\n"; + +my $uptime = `$uptimecmd`; +my @df = grep {/^\//} `$dfcmd`; + +my $processed = 1; + +foreach $_ (@items) { + ( $DEBUG ) && print scalar localtime,": processing item #$processed: \"$_\"\n"; + $_ = uc; #convert $_ to upper case + if ( /^UTIL1$/ ) { + $uptime =~ /load average: ([^,]+),/; + print $1 * 100,"\n"; + } + elsif ( /^UTIL5$/ ) { + $uptime =~ /load average: [^,]+, ([^,]+)/; + print $1 * 100,"\n"; + } + elsif ( /^UTIL15$/ ) { + $uptime =~ /load average: [^,]+, [^,]+, ([^,]+)/; + print $1 * 100,"\n"; + } + elsif ( /^CONNECT$/ ) { + $uptime =~ /(\d+) users?,/; + print "$1\n"; + } + elsif ( /^NAME$/ ) { + print "$hostname\n"; + } + elsif ( /^UPTIME$/ ) { + $uptime =~ /up (.*),\s+\d+\s+users?,/; + print "$1\n"; + } + elsif ( /^VOLUMES$/ ) { + foreach $dfline (@df) { + my $volname = (split(/\s+/, "$dfline"))[5]; + $volname =~ s/^\/$/$rootfsnickname/; + $volname =~ s/^\///; + $volname =~ s/\//_/g; + print "$volname\n"; + } + } + elsif ( /^VF(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print (($dfline[1]-$dfline[2]) * 1024,"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^VU(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print ($dfline[2] * 1024,"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^VS(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print ($dfline[1] * 1024,"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^VKF(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print (($dfline[1]-$dfline[2]),"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^VKU(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print ($dfline[2],"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^VKS(\w*)$/ ) { + my $volname = ("$1" eq uc("$rootfsnickname")) ? "/" : "$1"; + foreach $dfline (@df) { + my @dfline = split(/\s+/, "$dfline"); + if ($dfline[5] =~ /^\/?$volname$/i ) { + print ($dfline[1],"\n"); + goto done; + } + } + ( $DEBUG ) && print scalar localtime,": ERROR: volume not found.\n"; + print "-1\n"; + } + elsif ( /^ZERO$/ ) { + print "0\n"; + } + elsif (exists( $customcmds{"$_"} )) { + my $cmdsub = "$customcmds{$_}"; + print &$cmdsub."\n"; + } + else { + print "-1\n"; + } + done: $processed++; +} +( $DEBUG ) && print scalar localtime,": done.\n"; + + +############################################################### +# CUSTOMIZED PROCEDURES +############################################################### + +sub numprocesses { + + my $num = `/bin/ps -eaf | /usr/bin/tail -n +2 | /usr/bin/wc -l`; + chomp ($num); + $num =~ s/\s+//g; + + $num; +} + +sub numzombies { + + my $num = `/bin/ps -afx | /usr/bin/awk '{print \$3}' | /usr/bin/grep Z | /usr/bin/tail -n +2 | /usr/bin/wc -l`; + chomp ($num); + $num =~ s/\s+//g; + + $num; +} + +sub tcpconns { + + my $num = `/bin/netstat -nt | /usr/bin/tail -n +3 | /usr/bin/wc -l`; + chomp ($num); + $num =~ s/\s+//g; + + $num; +} + +sub ipclients { + + my $num = `/bin/netstat -nt | /usr/bin/tail -n +3 | /usr/bin/awk '{print \$5}' | /bin/cut -d : -f 1 | /usr/bin/sort -nu | /usr/bin/wc -l`; + chomp ($num); + $num =~ s/\s+//g; + + $num; +} + +sub memfree { + + open( FP, "/proc/meminfo" ); + my @meminfo = <FP>; + close(FP); + + # total: used: free: shared: buffers: cached: + # Mem: 994615296 592801792 401813504 91193344 423313408 93118464 + # Swap: 204791808 0 204791808 + my ($total,$free,$buffers,$cache) = (split(/ +/,$meminfo[1]))[1,3,5,6]; + + int(($free+$buffers+$cache)/$total*100); +} + +sub swapused { + + open( FP, "/proc/meminfo" ); + my @meminfo = <FP>; + close(FP); + + # total: used: free: shared: buffers: cached: + # Mem: 994615296 592424960 402190336 89821184 423313408 93077504 + # Swap: 204791808 0 204791808 + + my ($total,$used) = (split(/ +/,$meminfo[2]))[1,2]; + + int($used/$total*100); +} |