#!/bin/bash
#
# test_disk_space
#
# Schickt belegten Plattenplatz fuer alle lokalen Platten an Loggingdatenbank
# -n: include NFS mounts
# -q: send btrfs quota-groups
# -Q: include snapshots
#
#############################################################################
#
unset TMP_PATH SETULSHOSTNAME SECTION TESTSTEP NFS QA QS CONFIGDIR
while getopts h:s:t:d:C:T:nqQ op
 do
  case "$op" in
   n) NFS="|:";;
   q) QA=1;;
   Q) QS=1;;
   C) [[ -n "$OPTARG" ]] && CONFIGDIR="$OPTARG";;
   d) [[ -n "$OPTARG" ]] && TMP_PATH="-d $OPTARG";;
   h) [[ -n "$OPTARG" ]] && SETULSHOSTNAME="$OPTARG";;
   s) [[ -n "$OPTARG" ]] && SECTION="$OPTARG";;
   t) [[ -n "$OPTARG" ]] && TESTSTEP="$OPTARG";;
   T) ;;
   *) echo "usage: `basename $0` [-C <path>] [-d <path>] [-h <ulshostname>] [-s <section>] [-t <teststep>] [-n] [-q] [-Q]"
      exit 1;;
  esac
done
shift $(( $OPTIND -1))
#
. `dirname $0`/uls_header
#
df -mP `mount | awk '
($1 ~ "^/dev'$NFS'" || $(NF-1) ~ "btrfs|ext[234]|hfs|ntfs|vfat|xfs") && $3 !~ "media" && $(NF-1) !~ "9660" {
      if( !a[$1] && !b[$3] )
      { a[$1] = 1
        b[$3] = 1
        print $3
      }
    }'` | awk -v H="${SETULSHOSTNAME:-$ULSHOSTNAME}" -v SECTION="${SECTION:-System}" -v TESTSTEP="${TESTSTEP:-Disk Space}" -v DT="$DT" '
BEGIN { print "D;" DT ";" H ";" SECTION ";" }
$1 ~ "^/dev'$NFS'" { gsub("%", "", $5)
  if( $2 == 0 )
    f = 0
  else
  { f = 4 - log($2/1024)/2.3
    if( f < 0 )
      f = 0
  }
  printf("V;;;;%s:%s;size;%0.*f;GByte\n", TESTSTEP, $6, f, $2/1024)
  printf("V;;;;;used;%0.*f;GByte\n", f, $3/1024)
  printf("V;;;;;free;%0.*f;GByte\n", f, $4/1024)
  printf("V;;;;;%%used;%d;%%\n", $5)
}' | send_test_tab $TMP_PATH
#
# btrfs Quotas
if which btrfs >/dev/null 2>&1
 then
  ( echo "D;$DT;${SETULSHOSTNAME:-$ULSHOSTNAME};${SECTION:-System};"
    mount | awk '/^\/dev.* type btrfs/ {if(!a[$1]&&!b[$3]){print $3;a[$1]=1;b[$3]=1}}' | while read m
     do
      export m
      btrfs qgroup show -re "$m" | awk -v A=${QA:-0} -v S=${QS:-0} -v "MP=$m" '
BEGIN { c = "btrfs subvolume list " MP
        while( (c | getline) > 0 )
        { if( $NF == "@" )
            mp[$2] = MP
          else
            mp[$2] = MP $NF
        }
        close(c)
        g = 1073741824
      }
$1 ~ "/" && ($4 + $5 > 0 || A || S ) {
      split($1, a, "/")
      if( $5 > $4 )
        f = 4 - log($5/g)/2.3
      else
        f = 4 - log($4/g)/2.3
      if( f < 0 )
        f = 0
      if( $4 > 0 )
      { printf("V;;;;QGroups:%s;refer;%0.*f;GByte\n", mp[a[2]], f, $2/g)
        printf("V;;;;QGroups:%s;max_refer;%0.*f;GByte\n", mp[a[2]], f, $4/g)
        printf("V;;;;QGroups:%s;free_refer;%0.*f;GByte\n", mp[a[2]], f, ($4-$2)/g)
        printf("V;;;;QGroups:%s;%%used_refer;%d;%%\n", mp[a[2]], $2/$4*100)
        printf("V;;;;QGroups:%s;excl;%0.*f;GByte\n", mp[a[2]], f, $3/g)
      }
      else if( $5 > 0 )
      { printf("V;;;;QGroups:%s;refer;%0.*f;GByte\n", mp[a[2]], f, $2/g)
        printf("V;;;;QGroups:%s;excl;%0.*f;GByte\n", mp[a[2]], f, $3/g)
        printf("V;;;;QGroups:%s;max_excl;%0.*f;GByte\n", mp[a[2]], f, $5/g)
        printf("V;;;;QGroups:%s;free_excl;%0.*f;GByte\n", mp[a[2]], f, ($5-$3)/g)
        printf("V;;;;QGroups:%s;%%used_excl;%d;%%\n", mp[a[2]], $3/$5*100)
      }
      else if( mp[a[2]] ~ "/[.]snapshots" )
      { if( S )
        { printf("V;;;;QGroups:%s;refer;%0.*f;GByte\n", mp[a[2]], f, $2/g)
          printf("V;;;;QGroups:%s;excl;%0.*f;GByte\n", mp[a[2]], f, $3/g)
        }
      }
      else if( A && mp[a[2]] )
      { printf("V;;;;QGroups:%s;refer;%0.*f;GByte\n", mp[a[2]], f, $2/g)
        printf("V;;;;QGroups:%s;excl;%0.*f;GByte\n", mp[a[2]], f, $3/g)
      }
    }'
    done
  ) | send_test_tab $TMP_PATH
fi
