#! /bin/sh
# Copyright (c) 1997-2001 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#

tmp=/tmp/$$
trap "rm -f $tmp.*; exit" 0 1 2 3  15
rm -f $tmp.*

. $PCP_DIR/etc/pcp.env
. $PCP_SHARE_DIR/lib/pmview-args

_usage()
{
    echo >$tmp.msg 'Usage: '$prog' [options]

options:
  -c   version    Monitor NFS version (integer) client metrics [default 2]
  -m   maxrate    maximum request rate expected (integer) [default 120]
  -s   version    Monitor NFS version (integer) server metrics [default 2]
  -V              verbose/diagnostic output  

pmview(1) options:'

    _pmview_usage >>$tmp.msg
    echo >>$tmp.msg
    echo 'Default title is: NFS Version 2 Request Traffic for host' >>$tmp.msg
    _pmview_info -f $tmp.msg
}

max=120
client=2
server=2
type=total
Type=Total
verbose=false
version=2

# build WM_COMMAND X(1) property for restart after login/logout
#
echo -n "pmview Version 2.1 \"nfsvis\"" >$tmp.conf
for arg
do
    echo -n " \"$arg\"" >>$tmp.conf
done

_pmview_args "$@"

if [ -n "$otherArgs" ]
then
    while getopts "?c:m:s:v:V" c $otherArgs
    do
	case $c
	in
	    c)
		client=$OPTARG
		if [ "$client" != 2 -a "$client" != 3 ]
		then
		    _pmview_error "$prog: only NFS 2 and NFS 3 client metrics supported"
		    # NOTREACHED
		fi
		;;
	    m)
		_pmview_unsigned $c
		max=$OPTARG
		;;
	    s)
		server=$OPTARG
		if [ "$server" != 2 -a "$server" != 3 ]
		then
		    _pmview_error "$prog: only NFS 2 and NFS 3 server metrics supported"
		    # NOTREACHED
		fi
		;;

	    v)
		version=$OPTARG
		if [ $version = "1" ]
		then
		    _pmview_warning "$prog: pmview version 1 no longer supported, using version 2"
		    version=2
		elif [ $version != "2" ]
		then
		    _pmview_error "$prog: only version 2 supported for -v"
		    # NOTREACHED
		fi
		;;

	    V)
		verbose=true
		;;
	    ?)
		_usage
		exit 1
		;;
	esac
    done
    set - $otherArgs
    shift `expr $OPTIND - 1`
    if [ $# -gt 0 ]
    then
	_usage
	exit 1
    fi
fi

if [ "$client" = "2" ]
then
    # NFS V2 client stats
    #
    if _pmview_fetch_indom nfs.client.reqs
    then
	:
    else
	_pmview_fetch_fail "get NFS Version 2 client metrics"
	# NOTREACHED
    fi
else
    # NFS V3 client stats
    #
    if _pmview_fetch_indom nfs3.client.reqs
    then
	:
    else
	_pmview_fetch_fail "get NFS Version 3 client metrics"
	# NOTREACHED
    fi
fi 

# handle fsstat alias statfs
#
c_statfs=statfs
grep fsstat $tmp.pmview_result >/dev/null && c_statfs=fsstat

if [ "$server" = "2" ]
then
    # NFS V2 server stats
    #
    if _pmview_fetch_indom nfs.server.reqs
    then
	:
    else
	_pmview_fetch_fail "get NFS Version 2 server metrics"
	# NOTREACHED
    fi
else
    # NFS V3 server stats
    #
    if _pmview_fetch_indom nfs3.server.reqs
    then
	:
    else
	_pmview_fetch_fail "get NFS Verion 3 server metrics"
	# NOTREACHED
    fi
fi 

# handle fsstat alias statfs
#
s_statfs=statfs
grep fsstat $tmp.pmview_result >/dev/null && s_statfs=fsstat

if [ -z "$titleArg" ]
then
    titleArg="PCP: NFS Client V$client & Server V$server Request Traffic for host $host"
fi


cat << End-of-File >> $tmp.conf

#
# nfsvis
#
_colorlist colors (red1 green1 blue1)
_grid hide (
	_label 2 0 _down _large "Client"
	_bar 0 0 _east _groupByMetric (
		_metrics (
End-of-File

if [ "$client" = "2" ]
then
    cat << End-of-File >> $tmp.conf
			nfs.client.reqs[create,remove,rename,link,symlink,mkdir,rmdir] $max "dir"
			nfs.client.reqs[getattr,setattr,lookup,readdir,$c_statfs,root] $max "attr"
			nfs.client.reqs[readlink,read,write,wrcache] $max "data"
		)
		_baseLabel "Requests by NFS2 Client\nNormalized to $max requests / second"
End-of-File
else
    cat << End-of-File >> $tmp.conf
			nfs3.client.reqs[create,remove,rename,link,symlink,mkdir,rmdir,mknod] $max "dir"
			nfs3.client.reqs[getattr,setattr,lookup,readdir,$c_statfs,access,readdir+,fsinfo,pathconf] $max "attr"
			nfs3.client.reqs[readlink,read,write,commit] $max "data"
		)
		_baseLabel "Requests by NFS3 Client\nNormalized to $max requests / second"
End-of-File
fi
cat << End-of-File >> $tmp.conf
		_colorlist colors
	)
	_label 2 2 _down _large "Server"
	_bar 0 2 _east (
		_metrics (
End-of-File
if [ "$server" = "2" ]
then
    cat << End-of-File >> $tmp.conf
			nfs.server.reqs[create,remove,rename,link,symlink,mkdir,rmdir] $max "dir"
			nfs.server.reqs[getattr,setattr,lookup,readdir,$s_statfs,root] $max "attr"
			nfs.server.reqs[readlink,read,write,wrcache] $max "data"
		)
		_baseLabel "Requests to NFS2 Server\nNormalized to $max requests / second"
End-of-File
else
    cat << End-of-File >> $tmp.conf
			nfs3.server.reqs[create,remove,rename,link,symlink,mkdir,rmdir,mknod] $max "dir"
			nfs3.server.reqs[getattr,setattr,lookup,readdir,$s_statfs,access,readdir+,fsinfo,pathconf] $max "attr"
			nfs3.server.reqs[readlink,read,write,commit] $max "data"
		)
		_baseLabel "Requests to NFS3 Server\nNormalized to $max requests / second"
End-of-File
fi

cat << End-of-File >> $tmp.conf
		_colorlist colors
	)
)
End-of-File

$verbose && cat $tmp.conf

eval $PMVIEW <$tmp.conf $args -title "'$titleArg'" -xrm "'*iconName:nfsvis'"

exit
