#!/bin/sh /etc/rc.common
# shellcheck disable=SC2039

START=99

uniq_machine_id()
{
	dropbearkey -y -f "/etc/dropbear/dropbear_rsa_host_key" | \
	grep "Fingerprint:" | cut -d' ' -f3
}

kernel_version()
{
	uname -a
}

box_hardware()
{
	if [ -e "/tmp/sysinfo/model" ]; then
		cat "/tmp/sysinfo/model"
	else
		echo "unknown hardware - $(uname -m)"
	fi
}

openwrt_revision()
{
	if [ -e "/etc/openwrt_version" ]; then
		cat /etc/openwrt_version
	else
		echo "unknown version"
	fi
}

build_data()
{
	file="$1"
	id="$(uniq_machine_id)"
	version="$(openwrt_revision)"
	kernel="$(kernel_version)"
	hardware="$(box_hardware)"

	echo "crashlog $(cat /proc/sys/kernel/hostname)-$hardware"
	echo "$version"
	echo "$kernel"
	echo "$id"
	echo "$hardware"

	cat "$file"
}

start()
{
	local funcname="crashlog_apport"		# enforce a crash with 'echo c >/proc/sysrq-trigger'
	local file="/sys/kernel/debug/crashlog"		# crashlog.o works since r32788
	local server_addr="buildbot.weimarnetz.de"
	local server_port="2323"
	local answer="false"
	local maxtry=10
	local pause=30

	if [ -e "$file" ]; then
		while [ $maxtry -gt 0 ]; do {
			logger "$funcname: found log in $file, reporting to server ${server_addr}:${server_port}"
			answer="$( build_data "$file" | nc "$server_addr" "$server_port" )"

			case "$answer" in
				*ok)
					break
				;;
				*)
					maxtry=$(( maxtry - 1 ))
					logger "$funcname: error during send (answer: '$answer'), trying again in $pause sec"
					sleep $pause
				;;
			esac
		} done

		[ $maxtry -eq 0 ] && {
			cat "$file" >"/www/crashlog.$( cat /proc/uptime ).$$"
		}
	else
		return 0
	fi
}

# vim: set filetype=sh ai noet ts=4 sw=4 sts=4 :
