#!/bin/bash
#
# sp_config_collect
#
# (c) 2012 SUSE Linux GmbH, Germany. Author: L.Pinne.
# GNU Public License. No warranty.
#
# Version: 2012-06-14 19:00
#

EXE="$0"
ERR=/dev/stderr
DATE=$(date +%Y%m%d_%H%M)

CFG="/etc/sysconfig/spock"
test -s $CFG && source $CFG

test -z "${DEBUG}" && DEBUG="no"
[ $DEBUG = "on" ] && set -x

test -z "${TEMP}" &&\
	TEMP="/dev/shm/spk.$RANDOM"

test -z "${LOGS}" &&\
	LOGS="
/var/log/messages
/var/log/rhn/*
/var/log/rhncfg
/var/log/koan/*
/var/log/osad
/var/log/yum.log
/var/log/up2date
/var/log/zypper.log
/var/log/YaST2/y2log
/var/log/nocpulse/*
/var/log/notification/*
/var/log/tomcat6/*
/var/log/apache2/error_log
/var/log/cobbler/*
/var/log/rhn/search/*
/var/log/rhn/reposync/*
/var/lib/tomcat6/webapps/rhn/WEB-INF/classes/log4j.properties
/usr/share/rhn/classes/log4j.properties
/var/log/susemanager*
"


function help() {
	echo "usage:	$(basename $0) [OPTION]"
	echo
	echo " --help		show help."
	echo " --version	show version."
	echo " --all		collect all."
	echo " --most		collect all, except file list and logs."
	echo " --filelist	collect file list."
	echo " --logs		collect log files."
	echo
	test $UID -gt 0 && echo "please call as root."
}


function file_list() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	# TODO: re-use from sp_config_sum
	# TODO: variable exclude
	# TODO: make exclude /proc/<num> work
	F="file.txt"
	/usr/bin/find / \
		-wholename "/srv/www/htdocs/repo" -prune \
		-wholename "/var/spacewalk" -prune \
		-wholename "/proc/[1-9]*" -prune \
		-o -exec ls -l {} \; >$F 2>>$ERR
	gzip $F
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


function run_supportconfig() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	/sbin/supportconfig 2>>$ERR
	F=$(ls /var/log/nts_*tbz | tail -1)
	mv $F . 2>>$ERR
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


function rpm_verify() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	# TODO: re-use from sp_config_sum or supportconfig
	F="rpm.txt"
	/bin/rpm -Va >$F 2>>$ERR
	gzip $F
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


function config_sum() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	F="sum.txt"
	/usr/bin/sp_config_sum >$F 2>>$ERR
	gzip $F
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


function log_tar() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	# TODO: generic tar function
	# TODO: which logfiles?
	F="log.tgz" 
	tar czf $F $LOGS 2>>$ERR
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


function etc_tar() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	# TODO: which config files (java, python, ruby, ...)?
	F="etc.tgz"
	tar czf $F /etc/ 2>>$ERR
	logger -t "sp_config_collect" "$FUNCNAME end" 
}
		

function final_tar() {
	echo "$FUNCNAME"
	logger -t "sp_config_collect" "$FUNCNAME start" 
	cd $OWD
	F="sp_${HOST}_${DATE}.tbz"
	# TODO: exclude temp path from tar
	# TODO: if DEBUG do not rm
	tar cjvf $F $TEMP 2>>$ERR && rm -rf $TEMP 2>>$ERR
	md5sum $F >$F.md5 2>>$ERR
	ls -l $F 2>>$ERR
	logger -t "sp_config_collect" "$FUNCNAME end" 
}


# main()
case $1 in
	-v|--version)
		echo -n "$(basename $EXE) "
        	head -11 $EXE | grep "^# Version: "
		exit
	;;
	# TODO: options --all --log --conf --file
	# TODO: what else is needed?
	# TODO: better logging, error logging
	# TODO: track $? and finally report it
	# TODO: better style
 	# TODO: should work on plain smt as well
	# TODO: configurable error file
	-f|--filelist|--file_list)
		test $UID -gt 0 && echo "please call as root." && exit

		logger -t "sp_config_collect" "main start" 
		OWD=$PWD
		mkdir $TEMP
		cd $TEMP

		file_list
		final_tar

		logger -t "sp_config_collect" "main end"
		exit		
	;;
	-l|--logs|--log_tar)
		test $UID -gt 0 && echo "please call as root." && exit

		logger -t "sp_config_collect" "main start" 
		OWD=$PWD
		mkdir $TEMP
		cd $TEMP

		log_tar
		final_tar

		logger -t "sp_config_collect" "main end"
		exit		
	;;
	-r|-a|--run|--all)
		test $UID -gt 0 && echo "please call as root." && exit

		logger -t "sp_config_collect" "main start" 
		OWD=$PWD
		mkdir $TEMP
		cd $TEMP

		run_supportconfig
		log_tar
		file_list
		rpm_verify
		config_sum
		etc_tar
		final_tar

		logger -t "sp_config_collect" "main end"
		exit
	;;
	-m|--most)
		test $UID -gt 0 && echo "please call as root." && exit

		logger -t "sp_config_collect" "main start" 
		OWD=$PWD
		mkdir $TEMP
		cd $TEMP

		run_supportconfig
		rpm_verify
		config_sum
		etc_tar
		final_tar

		logger -t "sp_config_collect" "main end"
		exit
	;;
	*)
		help
		exit
	;;
esac
#
