#!/bin/bash

if [ -z "$2" ]; then
  echo "Usage: $0 target_directory '*'"
  exit
fi

DIR="$1"
shift

declare -A srcds unit range
srcds[bytes]=1
srcds[iops]=3
unit[bytes]=B
unit[iops]=IO
range[bytes]=k
range[iops]=""

for drive in "$@"; do
  if [ "$drive" = "*" ]; then
    DN=""
  else
    DN="$drive"
  fi
  for src in bytes iops; do
    PARAMS=""
    LINER="CDEF:r_total=0"
    LINEW="CDEF:w_total=0"
    DS1=${srcds[$src]}
    DS2=$(($DS1+1))

    for fn in `ls /var/lib/pnp4nagios/*/*diskio_$drive.rrd`; do
      if rrdtool info $fn | grep -q 'ds\[4\]'; then
        dir=`dirname $fn`
        name=`basename $dir`
        drivename=`basename $fn`
        drivename=${drivename%.rrd} # remove filename extension
        drivename=${drivename/nrpe_} # strip nrpe_
        drivename=${drivename/diskio_} # strip diskio_
        name16="${name}_${drivename}_______________"
        name16=${name16:0:16}
        name=${name//[.-]/_}$drivename
        #echo $name
        PARAMS="$PARAMS
          DEF:r_$name=$fn:$DS1:AVERAGE
          DEF:w_$name=$fn:$DS2:AVERAGE
          CDEF:rku_$name=r_$name,1024,/
          CDEF:wku_$name=w_$name,1024,/
          CDEF:rk_$name=rku_$name,UN,0,rku_$name,IF
          CDEF:wk_$name=wku_$name,UN,0,wku_$name,IF
          GPRINT:r${range[$src]}_$name:AVERAGE:${name16}%9.2lf
          GPRINT:w${range[$src]}_$name:AVERAGE:%9.2lf
          GPRINT:r${range[$src]}_$name:MAX:%9.2lf
          GPRINT:w${range[$src]}_$name:MAX:%9.2lf\n
        "
        LINER="$LINER,r_$name,+"
        LINEW="$LINEW,w_$name,+"
      fi
    done

    mkgraph() {
      rrdtool graph --title "$src disk$DN" \
        $DIR/$src$DN-$1.png --start -$((3600*$2)) \
        "COMMENT:[Units\\: ${range[$src]}${unit[$src]}/s]    avg read   avg write  max read   max write\n" \
        $PARAMS "$LINER" "$LINEW" \
        "LINE1:r_total#CC0000" "LINE1:w_total#00CC00" > /dev/null
    }
    mkgraph 4h 4
    mkgraph day 24
    mkgraph week $((24*7))
    mkgraph month $((24*30))
    mkgraph year $((24*365))
  done
done
