#!/bin/bash

# Can i reboot?
# USAGE:
# modify the constants by ovveriding them inside /etc/can-i-reboot.conf

# CONSTANTS:
FILE_REBOOT_REQUIRED="/var/run/reboot-required"
MAX_ACTIVE_USERS=0
MAX_PROCESS_CPU=20  # %
MAX_NET_TRANSFER=100  # kiB/s


# Code that should be unchanged
[ -f "/etc/can-i-reboot.conf" ] && . /etc/can-i-reboot.conf

function current-transferred-kilobytes() {
	# kiB
	echo "$(ip -s link | grep -E "^\s+[0-9]+\s+" | sed -Ee 's/^\s+([0-9]+).*$/\1/' | paste -sd+ | bc) / 1024" | bc
}

function current-net-transfer() {
	before="$(current-transferred-kilobytes)"
	sleep 1
	echo "$(current-transferred-kilobytes)-$before" | bc
}

function current-active-users {
	who | wc -l
}

function current-max-process-cpu {
	ps aux | sort -nrk 3,3 | head -n 1 | xargs | cut -d' ' -f 3 | sed -Ee 's/^(.+)\..*$/\1/'
}

function test-active-users() {
	n="$(current-active-users)"
	echo "$n users"
	[ "$n" -le "$MAX_ACTIVE_USERS" ] || (
	    echo "required, but $n users (max $MAX_ACTIVE_USERS)" >&2
	    false
	)
}

function test-max-process-cpu() {
	n="$(current-max-process-cpu)"
	echo "$n cpu"
	[ "$n" -le "$MAX_PROCESS_CPU" ] || (
	    echo "required, but $n CPU (max $MAX_PROCESS_CPU)" >&2
	    false
	)
}

function test-net-transfer() {
	n="$(current-net-transfer)"
	echo "$n net (kiB/s)"
	[ "$n" -le "$MAX_NET_TRANSFER" ]|| (
	    echo "required, but $n KiB/s (max $MAX_NET_TRANSFER)" >&2
	    false
	)
}

function test-rebot-required() {
	if [ -f "$FILE_REBOOT_REQUIRED" ]; then
		echo "required"
	else
		echo "not required"
		false
	fi
}

test-rebot-required &&
test-active-users &&
test-max-process-cpu &&
# 10 sec test
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer &&
test-net-transfer && (
    [ "$1" = "--reboot" ] && reboot
    true
)

