#!/bin/sh
# (C) 2001 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
# Hardware Profiles for rc-scripts TOTALNEW.
# $Id: hwprofile 6492 2005-10-26 16:57:25Z baggins $

PROFDIR="/etc/sysconfig/hwprofiles"
QUIET=0

. /etc/rc.d/init.d/functions
. /etc/sysconfig/hwprof

[ -z "${EDITOR}" ] && EDITOR=vi

if [ "$(id -u)" != "0" ]; then
	echo "Need superuser privileges. Can't continue!"
	exit 1
fi

checkprofdir()
{
	if [ ! -d ${PROFDIR} -o ! -d ${PROFDIR}/data ]; then
		echo "${PROFDIR} or ${PROFDIR}/data not found. Can't continue!"
		echo "Check /etc/sysconfig/hwprof and hwprofile -h."
		exit 1
	fi
}

myecho()
{
	if [ $QUIET -eq 0 ]; then
		echo $@
	fi
}

showhelp()
{
echo '
no opts      - show help
-a           - add profile
-d           - delete profile
-r foo       - run specified profile or "default" if such exist
-s           - save/update running profile
-f           - find proper profile and run it
-l           - list configured profiles
-q           - be quiet (used only in few modes)

Please send all bug reports to:
pld-rc-scripts@pld-linux.org.
'
}

# This function probably must be enhanced.
md5sumgen()
{
	( \
		grep -v "MHz" /proc/cpuinfo 2> /dev/null \
		grep -v "Latency" /proc/pci 2> /dev/null \
	) | md5sum | awk ' { gsub(/ .*$/,NIL); print $0 } '
}

while getopts adfhlsqr: opt "$@"; do
	case "$opt" in
	  a)
		checkprofdir

		echo "Adding new profile..."

		if [ -f /var/run/hwprofile ]; then
		 	echo -n "Current profile is: "
			cat /var/run/hwprofile
		fi

		PROFILE=
		while [ -z "${PROFILE}" ]; do
			echo -n "Enter profile name: "
			read PROFILE

			if [ -f ${PROFDIR}/${PROFILE}.md5 ]; then
				echo "Profile ${PROFILE} exist. Try other name."
				PROFILE=
			fi
		done

		rm -rf ${PROFDIR}/${PROFILE}.* ${PROFDIR}/data/${PROFILE}/
		md5sumgen > ${PROFDIR}/${PROFILE}.md5
		LANG=C LC_ALL=C date > ${PROFDIR}/${PROFILE}.date
		mkdir -p ${PROFDIR}/data/${PROFILE}/
		chmod 700 ${PROFDIR}/data/${PROFILE}/

		echo -n "Enter profile description (PROFDIR/${PROFILE}.desc): "
		read DESCRIPTION
		[ -z "${DESCRIPTION}" ] && DESCRIPTION="${PROFILE}"
		echo "${DESCRIPTION}" > ${PROFDIR}/${PROFILE}.desc
		echo "Now, editor will be started and you need to enter list of files"
		echo "for this profile (later as ${EDITOR} ${PROFDIR}/${PROFILE}.files)."
		echo "Press Enter."
		read

		if [ -f ${PROFDIR}/files -o ! -f ${PROFDIR}/${PROFILE}.files ]; then
			cat ${PROFDIR}/files > ${PROFDIR}/${PROFILE}.files;
		fi
		${EDITOR} ${PROFDIR}/${PROFILE}.files

		FILES=
		echo "Validating and copying valid files for this profile:"
		for file in $(grep -v "^#" ${PROFDIR}/${PROFILE}.files); do
			if [ ! -f ${file} -o "${file}" = "/etc/sysconfig/hwprof" ]; then
				echo "${file}: invalid, skipping"
				continue
			fi

			bfile=$(basename ${file})
			echo "Copying ${file} to ${PROFDIR}/data/${PROFILE}/${file}..."
			cp -dp --parents ${file} ${PROFDIR}/data/${PROFILE}/
			FILES="${file}\n${FILES}"
		done

		echo -e "${FILES}" > ${PROFDIR}/${PROFILE}.files
		rm -f ${PROFDIR}/${PROFILE}.*~

		echo "New profile ready."
		break
		;;
	  d)
		checkprofdir

		echo "Deleting existing profile..."

		PROFILE=
		while [ -z ${PROFILE} ]; do
			echo -n "Enter profile name: "
			read PROFILE

			if [ ! -f ${PROFDIR}/${PROFILE}.md5 ]; then
				echo "Profile ${PROFILE} doesn't exist. Try other name."
				PROFILE=
			fi
		done

		echo -n "Are you sure? [y/N]: "
		read YN
		case "${YN}" in
		  y | Y | t | T )
			# ok
			;;
		  *)
			echo "Exiting then."
			exit 1
			;;
		esac

		rm -rf ${PROFDIR}/${PROFILE}.* ${PROFDIR}/data/${PROFILE}/
		echo "Done."
		break
		;;
	  r)

		checkprofdir

		PROFILE="${OPTARG}"

		if [ -z "${PROFILE}" -o ! -f ${PROFDIR}/${PROFILE}.files ]; then
			echo "Can't setup ${PROFILE}. No required data."
			exit 1
		fi

		echo -n "Setting up profile \"${PROFILE}\" "
		myecho "";

		for file in $(grep -v "^#" ${PROFDIR}/${PROFILE}.files); do
			if [ ! -f ${file} -o "${file}" = "/etc/sysconfig/hwprof" ]; then
				myecho "${file}: invalid, skipping"
				continue
			fi
			echo -n ".";

			myecho "Copying ${PROFDIR}/data/${PROFILE}/${file} to ${file}..."
			cp -dp ${PROFDIR}/data/${PROFILE}/${file} ${file} 2>/dev/null
		done

		echo ${PROFILE} > /var/run/hwprofile
		echo " Done.";
		myecho "Profile \"${PROFILE}\" running."
		break
		;;
	  f)
		checkprofdir

		PROFILE=
		PROFILEMD5=$(md5sumgen)

		myecho "Trying to find proper profile..."
		for prof in $(ls -1 ${PROFDIR}/*.md5 2> /dev/null); do
			prof=$(basename ${prof})
			CURRENTMD5="$(cat ${PROFDIR}/${prof} 2> /dev/null)"
			# echo "$prof ${CURRENTMD5} ${PROFILEMD5}";
			[ -z "${CURRENTMD5}" ] && continue

			if [ "${CURRENTMD5}" = "${PROFILEMD5}" ]; then
				PROFILE=$(echo ${prof} | awk ' { gsub(/\.md5/,NIL); print $0 } ')
				break;
			fi
		done

		if [ -z "${PROFILE}" ]; then
			if is_yes "${ASKFORPROFILE}"; then
				echo "Available profiles:";
				PS3='Enter profile number: ';
				LISTA=$(ls ${PROFDIR}/*.desc 2> /dev/null);
				for i in ${LISTA}; do
					a=$(basename $i .desc);
					LISTA1="${a} ${LISTA1}";
				done
				LISTA1="${LISTA1} Default";

				select PROFILE in $LISTA1; do
					if [ -n "${PROFILE}" ]; then
						break
					fi
				done

				if [ "${PROFILE}" = "Default" ]; then
					PROFILE=
				fi
			fi
		fi

		if [ -z "${PROFILE}" ]; then
			if [ ! -f ${PROFDIR}/default.md5 ]; then
				echo "Valid profile not found. Starting with current files."
				exit 0
			else
				echo "Valid profile not found. Starting with \"default\" profile."
				PROFILE=default
			fi
		fi

		if [ ! -z "${PROFILE}" ]; then
			myecho "Found profile \"${PROFILE}\" with md5sum \"${PROFILEMD5}\"."
			if [ $QUIET -eq 0 ]; then
				$0 -r ${PROFILE};
			else
				$0 -qr ${PROFILE};
			fi
		fi
		break
		;;
	  s)
		checkprofdir

		PROFILE=$(cat /var/run/hwprofile 2> /dev/null)

		if [ -z "${PROFILE}" ]; then
			echo "No profile currenty running."
			exit 1
		fi

		if [ ! -f ${PROFDIR}/${PROFILE}.files ]; then
			echo "${PROFILE}.files is missing. Can't continue."
			exit 1
		fi

		echo -n "Saving/updating current [${PROFILE}] profile "
		md5sumgen > ${PROFDIR}/${PROFILE}.md5
		myecho "";
		for file in $(grep -v "^#" ${PROFDIR}/${PROFILE}.files); do
			echo -n ".";

			if [ ! -f ${file} -o "${file}" = "/etc/sysconfig/hwprof" ]; then
				myecho "${file}: invalid, skipping"
				continue
			fi

			myecho "Copying ${file} to ${PROFDIR}/data/${PROFILE}/${file}"
			cp -dp --parents ${file} ${PROFDIR}/data/${PROFILE}/
		done
		echo " Done."
		break
		;;
	  l)
		echo "List of configured profiles:"

		for prof in $(ls -1 ${PROFDIR}/*.md5 2> /dev/null); do
			prof=$(basename ${prof})
			profname=$(echo ${prof} | awk ' { gsub(/\.md5/,NIL); print $0 } ')
			echo    "Name    : ${profname}"
			echo -n "Desc    : "
			if [ -f ${PROFDIR}/${profname}.md5 ]; then
				cat ${PROFDIR}/${profname}.desc
			else
				echo "MISSING"
			fi
			echo -n "Created : "
			if [ -f ${PROFDIR}/${profname}.date ]; then
				cat ${PROFDIR}/${profname}.date
			else
				echo "MISSING"
			fi
			echo -n "md5sum  : "
			if [ -f ${PROFDIR}/${profname}.md5 ]; then
				cat ${PROFDIR}/${profname}.md5
			else
				echo "MISSING"
			fi
			echo -n "Files   : "
			if [ -f ${PROFDIR}/${profname}.files ]; then
				cat ${PROFDIR}/${profname}.files | xargs
			else
				echo "MISSING"
			fi
			echo
		done
		echo "End."
		break
		;;
	  q)
		QUIET=1; export QUIET;
		;;
	  *)
		showhelp
		exit 1
		break
		;;
	esac
done

if [ "$#" -le "0" -o "$OPTIND" -eq 1 ]; then
	showhelp
	exit 1
fi

exit 0

# This must be last line !
# vi:syntax=sh
