#!/bin/bash
#============================================================================
# Title       : asmstat
# Description : Wrapper for iostat that maps ASM devices
# Author      : Bart Sjerps <bart@dirty-cache.com>
# License     : GPLv3+
# ---------------------------------------------------------------------------

# Translate -? or --help into manpage
case $1 in
  -\?|--help) man $(basename $0) ; exit ;;
esac

#============================================================================
# Initialization - Logging - Etc.
# ---------------------------------------------------------------------------
# Filter device-mapper and non-disk devices
sedstring="/dm-/d;/scd/d;"

#============================================================================
# Main
# ---------------------------------------------------------------------------

if ! ls /dev/oracleasm/* &>/dev/null ; then
  iostat $@
else
  for asmdev in /dev/oracleasm/*
  do
    maj=$(echo "ibase=16; $(stat -Lc '%t' ${asmdev}|tr 'a-z' 'A-Z')"|bc)
    min=$(echo "ibase=16; $(stat -Lc '%T' ${asmdev}|tr 'a-z' 'A-Z')"|bc)
    # get location of dev
    # old method:
    # dev=$(egrep -l "${maj}:${min}$" /sys/devices/{*,*/*,*/*/*}/host*/{*/*,*/*/*}/block/*/dev 2>/dev/null | head -1)
    # better method (!?):
    dev=$(readlink $(find /sys/dev/block -name "${maj}:${min}" | sed -n "1p" )|sed "s/.*\///")
    [[ "$dev" == "" ]] && continue
    disk=$(echo $dev | awk -F'/' '{print $(NF-1)}')
    asmvol=${asmdev##*/}
    # get size of largest string
    len=${#disk} ; (( ${#asmvol} > len)) && len=${#asmvol}
    # align asm volume name to 6 chars
    # translate /dev/sdX into /dev/oracleasm/<vol>
    sedstring="${sedstring}$(printf "s/%-${len}s/%-${len}s/;\n" $disk $asmvol)"
  done
  # run iostat command with translation
  iostat $@ | sed -u "$sedstring"
fi

