#!/bin/bash
# Record buddyinfo-related and fragmentation information over time
#
# License under the LGPL 2.1
# (c) Mel Gorman 2002

DELAY=10
OUTPUTSTREAM=/dev/null

# Print usage of command
usage() {
	echo "record-buddyinfo (c) Mel Gorman 2009"
	echo "This regularly logs information on external fragmentation"
	echo
	echo "Usage: record-buddyinfo [options]"
	echo "    -d, --delay   Delay between recordings (default: $DELAY seconds)"
	echo "    -o, --output  Copy output to filename (default: STDOUT only)"
	echo "    -h, --help    Print this help message"
	exit $1
}

die() {
	echo ERROR: $@
	exit -1
}

output() {
	PREFIX=$1
	DATE_UNIX=$2
	DATE_OFFSET=$3
	DATE_NORMAL=$4
	DATA=$5

	TIFS=$IFS
	IFS="
"
	for LINE in $DATA; do
		echo $PREFIX  $LINE;
		echo "$PREFIX  :: $DATE_OFFSET :: $DATE_UNIX :: $DATE_NORMAL :: $LINE" >> $OUTPUTSTREAM
	done
	IFS=$TIFS
}

# Parse command line arguements
ARGS=`getopt -o ho:d: --long help,output:,delay: -n sense-sizes.sh -- "$@"`
eval set -- "$ARGS"
while [ "$1" != "" ]; do
	case "$1" in
	-d|--delay)
		DELAY=$2
		shift 2
		;;
	-o|--output)
		OUTPUTSTREAM=$2
		shift 2
		;;
	-h|--help)
		usage 0
		;;
	--)
		shift
		;;
	*)
		die Unrecognised option: \"$1\"
		;;
	esac
done
echo -n > $OUTPUTSTREAM

DATE_START=`date +%s`

while [ 1 ]; do
	DATE_UNIX=`date +%s`
	DATE_NORMAL=`date`
	DATE_OFFSET=$(($DATE_UNIX-$DATE_START))
	BUDDYINFO_PROC=`show-buddyinfo -b` || die Failed to show-buddyinfo -b
	BUDDYINFO_LRU=`show-buddyinfo -l` || die Failed to show-buddyinfo -l
	BUDDYINFO_HUGE=`show-buddyinfo -s` || die Failed to show-buddyinfo -s
	BUDDYINFO_LRUHUGE=`show-buddyinfo -l -s` || die Failed to show-buddyinfo -l -s
	EXTFRAG_PROC=`echo "$BUDDYINFO_PROC" | pagealloc-extfrag` || die Failed to calc frag
	EXTFRAG_LRU=`echo "$BUDDYINFO_LRU" | pagealloc-extfrag` || die Failed to calc frag
	EXTFRAG_HUGE=`echo "$BUDDYINFO_HUGE" | pagealloc-extfrag` || die Failed to calc frag
	EXTFRAG_LRUHUGE=`echo "$BUDDYINFO_LRUHUGE" | pagealloc-extfrag` || die Failed to calc


	echo Record: $DATE_UNIX :: $DATE_NORMAL | tee -a $OUTPUTSTREAM
	output "buddyinfo_proc    " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$BUDDYINFO_PROC"
	output "buddyinfo_huge    " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$BUDDYINFO_HUGE"
	output "buddyinfo_lru     " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$BUDDYINFO_LRU"
	output "buddyinfo_lruhuge " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$BUDDYINFO_LRUHUGE"
	output "extfrag_proc      " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$EXTFRAG_PROC"
	output "extfrag_huge      " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$EXTFRAG_HUGE"
	output "extfrag_lru       " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$EXTFRAG_LRU"
	output "extfrag_lruhuge   " "$DATE_UNIX" "$DATE_OFFSET" "$DATE_NORMAL" "$EXTFRAG_LRUHUGE"

	echo ==== End Record ==== | tee -a $OUTPUTSTREAM
	sleep $DELAY || die Failed to sleep
	echo | tee -a $OUTPUTSTREAM
done
