#!/bin/bash

storm_peak=${1:-20000}

get_inter() {
	interrupts="$(cat /proc/interrupts)"
	echo "$interrupts" >&2
	cpu_cnt="$(echo "$interrupts" | head -1 | wc -w)"
	read awkcpu <<< $(for i in `seq 2 1 $((cpu_cnt+1))`; do echo -n "\$$i\"\\\t\""; done)
	x=`awk "{print $awkcpu }" <<< "$(grep "^ *[0-9]" <<< "$(echo "$interrupts")")"`
	echo $x | tr ' ' '\n'
}

error_msg() {
	echo 'Обнаружен "шторм прерываний"!'
	echo 'Скорее всего проблема с аппаратной частью!'
}

usage() {
	if [ "$1" = '--help' ]; then
		echo "$0 [storm_peak]"
		echo '  storm_peak - maximum interrupts per seconds, default 20000'
		exit 0
	fi
}

main() {
	usage "$@"
	echo "Шторм прерываний..."
	RES=0
	read -a arx <<< $(get_inter 2>/tmp/interrupts1)
	sleep 2
	read -a ary <<< $(get_inter 2>/tmp/interrupts2)
	itcnt=$(($(wc -l <<< "$(get_inter 2>/dev/null)")-1))

	for ((i=0;i<=$itcnt;i++)); do
		if [ "$((${ary[$i]}-${arx[$i]}))" -ge "$storm_peak" ]; then
			grep ${arx[$i]} /tmp/interrupts1
			grep ${ary[$i]} /tmp/interrupts2
			RES=1
			echo "$((${ary[$i]}-${arx[$i]})) in 2 seconds"
		fi
	done

	if [ $RES != 0 ]; then
		error_msg >&2
	fi
	return $RES
}

main "$@"
