#!/bin/sh

WITHOUT_RC_COMPAT=1
. /etc/init.d/functions

action_begin_msg() {
	[ -z "$*" ] || printf '%s ' "$*"
}

action_end_msg() {
	local rc=$1
	if [ "$BOOTUP" = color ]; then
		[ $rc = 0 ] && echo_success || echo_failure
	fi
	echo
}

unset action
action() {
	action_begin_msg "$1"
	shift
	$*
	local rc=$?
	action_end_msg "$rc"
	return $rc
}

udevtrigger_list=
save_udevtrigger() {
	local r='sysreport.udevtrigger'
	printf "# %s\n# 'udevtrigger --dry-run --verbose' output\n\n" "$(date 2>&1)" > "$r"
	udevtrigger --dry-run --verbose >>"$r" 2>&1 || return
	udevtrigger_list="$r"
}

save_modalias() {
	[ -s "$udevtrigger_list" ] || return 0
	local p r='sysreport.modalias'
	grep -v '^#' "$udevtrigger_list" |
	while read p; do
		[ ! -f "/sys/$p/modalias" ] || cat "/sys/$p/modalias"
	done |sort -u -o "$r"
}

save_lspci() {
	local r='sysreport.lspci'
	printf "# %s\n# 'lspci -vvnn' output\n\n" "$(date 2>&1)" > "$r"
	lspci -vvnn >>"$r" 2>&1 || return
}

save_lsmod() {
	local r='sysreport.lsmod'
	printf "# %s\n# 'lsmod' output\n\n" "$(date 2>&1)" > "$r"
	lsmod >>"$r" 2>&1 || return
}

save_dmesg() {
	local r='sysreport.dmesg'
	printf "# %s\n# 'dmesg' output\n\n" "$(date 2>&1)" > "$r"
	dmesg >>"$r" 2>&1 || return
}

save_commoninfo() {
	local r='sysreport.systeminfo'
	printf "# %s\n\n# 'uname -a'\n" "$(date 2>&1)" > "$r"
	uname -a >>"$r" 2>&1 || return

	for f in /proc/cmdline /proc/meminfo /proc/cpuinfo \
		 /proc/filesystems /proc/mdstat; do
		printf "\n# 'cat %s'\n" "$f" >> "$r"
		cat "$f" 2>&1 >> "$r" || return
	done
	printf \\n >> "$r"
}

save_evmsinfo() {
	local r='sysreport.evmsplugins'
	evms_activate >> "$r" 2>&1 || return

	printf "# %s\n# 'evms_query plugins -i' output\n\n" "$(date 2>&1)" > "$r"
	evms_query plugins -i >> "$r" 2>&1 || return

	r='sysreport.evms'
	printf "# %s\n# 'evms_query info' output\n\n" "$(date 2>&1)" > "$r"
	evms_query info >> "$r" 2>&1 || return

	printf "\n# 'evms_query disks' output\n" >> "$r"
	evms_query disks 2>&1 >> "$r" || return

	local d
	for d in `evms_query disks`; do
		printf "\n# 'evms_query volumes $d' output\n" >> "$r"
		evms_query volumes "$d" 2>&1 >> "$r" || return
	done

	for d in `evms_query volumes`; do
		printf "\n# 'evms_query info $d' output\n" >> "$r"
		evms_query info "$d" 2>&1 >> "$r" || return
	done

	[ ! -s "/var/log/evms-engine.log" ] ||
		cp -p /var/log/evms-engine.log "sysreport.evms-engine.log"
}

save_fdisk() {
	local r='sysreport.fdisk'
	printf "# %s\n# 'fdisk -l' output\n\n" "$(date 2>&1)" > "$r"
	fdisk -l >> "$r" 2>&1 || return
}

if [ "$#" -eq 0 ]; then
	echo "Usage: ${0##*/} <output-dir>" >&2
	exit 1
fi
outdir="$(readlink -ev "$1")"
cd "$outdir"

action 'Obtaining system information'		save_commoninfo
action 'Obtaining kernel modules list'		save_lsmod
action 'Obtaining kernel ring buffer'		save_dmesg
action 'Obtaining kernel devices events'	save_udevtrigger
action 'Obtaining modalias'			save_modalias
action 'Obtaining PCI device list'		save_lspci
action 'Obtaining EVMS information'		save_evmsinfo
action 'Obtaining FDISK information'		save_fdisk

archv="sysreport-$(date +"%Y%m%d").tar.bz2"
action "Saving system information to $archv"	tar -cjf "$archv" sysreport.*
rm -f sysreport.*

printf '\n\nPlease submit %s to sysreport@altlinux.org\n\n' "$outdir/$archv"
