#!/bin/bash

declare -a hammer_pid
maxhammers=25
numhammers=0

if [ -z "$1" ]; then
	SF_HOSTNAME=www.flyn.org
else
	SF_HOSTNAME=$1
fi

hammer_shm() {
	for ((i = 1; i <= 100; i++)); do
		./programs/shmpipe $i $((i+1)) $((i+1)) &
	done
	./programs/shmwrite 1 foo 0 &
	./programs/shmread $i $((i+1)) > /dev/null
}

hammer() {
	echo $BASHPID hammer starting
	trap "" SIGTERM SIGQUIT EXIT

	while true; do
		# Get hammers out-of-sync with randomization.
		next=$(($RANDOM % 7))
		case $next in
		0)
			echo $BASHPID ping $SF_HOSTNAME
			ping -c 1 $SF_HOSTNAME > /dev/null
			;;
		1)
			hammer_wget=$(mktemp /tmp/hammer.wget.XXXXXX)
			echo $BASHPID wget https://$SF_HOSTNAME/
			wget --no-check-certificate https://$SF_HOSTNAME/ --quiet -O $hammer_wget
			rm $hammer_wget
			;;
		2)
			hammer_dd=$(mktemp /tmp/hammer.dd.XXXXXX)
			echo $BASHPID dd
			dd bs=1M count=10 if=/dev/urandom of=/tmp/hammer.dd status=none
			rm $hammer_dd
			;;
		3)
			echo $BASHPID mkdir
			hammer_mkdir=$(mktemp -d /tmp/hammer.mkdir.XXXXXX)
			rmdir $hammer_mkdir
			;;
		4)
			echo $BASHPID ssh
			ssh localhost true
			;;
		5)
			echo $BASHPID ps
			ps auxZ > /dev/null
			;;
		6)
			echo $BASHPID shm
			hammer_shm
			;;
		esac
	done
}

reap() {
	for ((i = 0; i < $numhammers; i++)); do
		echo $BASHPID kill ${hammer_pid[$i]}
		kill -9 ${hammer_pid[$i]}
	done
}

trap reap SIGTERM SIGQUIT EXIT

for ((i = 0; i < $maxhammers; i++)); do
	hammer &
	hammer_pid[$i]=$!
	((numhammers++))
	echo "$BASHPID spawn hammer $numhammers (${hammer_pid[$i]})"
	sleep 1
done

wait
