#!/bin/bash
WORKDIR=./
CONFIG=${WORKDIR}mkuird.cfg
[ -f $CONFIG ] || CONFIG=/etc/mkuird.cfg

RUNPWD=$(pwd)
OUTD=$RUNPWD
CFG=legacy
EXCLUDE=qqqqqqqqqqq
BUILD=uird
KERNEL=$(uname -r)
ADDLOCALES=""
DCONFIG=dracut.conf
date > ./not_found.log

#find config for mkuird
for arg in $@
do
  case "${arg}" in
    "-c" | "--config" ) config=yes;;
    *) [ "${config}" == "yes" ] && CONFIG="${arg}"
        config="no"
  esac
done

. $CONFIG

#find another parameters
for arg in $@
do
  case "${arg}" in
    "-s" | "--show" ) SHOW=yes;;
    "-c" | "--config" ) true;;
    "-o" | "--outdir" ) outdir=yes;;
    "-d" | "--dracut-config" ) dconfig=yes;;
    "-e" | "--exclude" ) exclude=yes;;
    "-n" | "--name" ) name=yes;;
    "-k" | "--kernel" ) kernel=yes;;
    "-m" | "--kmodpath" ) kmodpath=yes;;
    "-l" | "--i18n" ) ADDLOCALES="-i i18n /";;
    "--kmod" ) BUILD=kmod;;
    "--addon" ) BUILD=addon;;
    "-"*[A-Za-z]*) echo "$(basename "$0"): invalid option -- '$(echo ${arg} | tr -d '-')'" >&2; exit 1;;
    *) if [ "${exclude}" == "yes" ]; then EXCLUDE="${arg}"
		elif [ "${dconfig}" == "yes" ]; then DCONFIG="${arg}"
		elif [ "${outdir}" == "yes" ]; then OUTD="${arg}"
		elif [ "${name}" == "yes" ]; then NAME="${arg}"
		elif [ "${kernel}" == "yes" ]; then KERNEL="${arg}"
		elif [ "${kmodpath}" == "yes" ]; then KMODPATH="${arg}"
		else CFG="${arg}" ; fi
        outdir="no" ; exclude="no"; name="no" ; kernel="no" ; kmodpath="no"; dconfig="no" ;;
  esac
done

[ -d  $(realpath ${KMODPATH}/$KERNEL 2>/dev/null) ] && ln -s $(realpath ${KMODPATH}/$KERNEL) /lib/modules/$KERNEL
if ! [ -d /lib/modules/$KERNEL -o -L /lib/modules/$KERNEL  ] ; then
	echo "Kernel modules for $KERNEL were not found"
	exit 1
fi

if ! depmod -A "$KERNEL" ; then
	echo  "depmod error..."
	exit 2
fi

if [ -f /lib/modules/$KERNEL/build/.config ] ;then
    KERNELCFG="/lib/modules/$KERNEL/build/.config"
elif [ -f "/boot/config-$KERNEL" ] ; then
    KERNELCFG="/boot/config-$KERNEL"
fi

if [ $KERNELCFG ] ; then
 	KRNAUFS=$(egrep 'CONFIG_AUFS.*=[ym]' $KERNELCFG)
	KRNSQFS=$(egrep 'CONFIG_SQUASHFS.*=[ym]' $KERNELCFG)
	if [ $(echo "$KRNAUFS" |wc -l) -eq 1 ] ; then
	    echo "$KERNEL built with no AUFS, continue?" 
	    echo "(ENTER to continue or ctrl+c to abort)"
	    read qqq
	fi
	echo -e "\n${KRNAUFS}\n\n${KRNSQFS}\n"
	
else
	echo "Kernel config for $KERNEL not found" 
fi

EXCLUDE=$(echo "$EXCLUDE" |sed "s/,/|/g")

if ! [ -f $WORKDIR/configs/uird_configs/$CFG ]; then
	echo "$WORKDIR/configs/uird_configs/$CFG is not exist"
	exit 3
fi


cd ${WORKDIR}/dracut/modules.d
ln -s ../../modules.d/* ../modules.d/ 2>/dev/null
cd $RUNPWD


notfound() {
echo "Not found: $1 - $2"
echo "Not found: $1 - $2" >> ./not_found.log
}

testMOd () {
mod=$2 ; type=$1 
if [ "$type" == "KM" -o "$type" == "FS" ] ;then
		if echo $mod | egrep -q "^=" ; then 
			return 0 
		elif /sbin/modinfo $mod -k $KERNEL -n 2>/dev/null |grep -q $KERNEL >/dev/null 2>&1 ; then
			return 0
		elif for  a in $BUILTIN;do echo $a  ; done |grep -q $mod ; then
			echo "Built in kernel: $type - $mod"
			return 1
		fi
elif [ "$type" == "BIN" ] ;then
		which $mod >/dev/null 2>&1 && 	return 0
elif [ "$type" == "DM" ] ;then
		ls -1 ${WORKDIR}/dracut/modules.d |egrep -q "..${mod}$" && return 0
fi
notfound $type  $mod 
return 1
}

parser () {
PREFIX=$1
for item in $(cat $CONFIG |grep ^$1 |awk -F= '{print $1}') ; do
if echo "$item" | egrep -q "$EXCLUDE" ; then 
	echo "excluded all: $item"
	continue
fi
for   mod in ${!item} ; do
	if echo "$mod" | egrep -q  "$EXCLUDE" ; then 
		echo "excluded: ${PREFIX} - $mod"
		continue
	fi
	if testMOd $PREFIX $mod ; then 
			eval $PREFIX="\" \${$PREFIX} $mod \"" 
	fi
done
done
}

BUILTIN=$(cat /lib/modules/$KERNEL/modules.builtin |while read a ; do basename $a ; done |sed 's/.ko$//')
cd ${WORKDIR}
if [ "$BUILD" == "kmod" ] ; then
	parser KM ; parser FS ; parser DM
	echo "MAKE UIRD (Kernel modules only)...."
	uirdfile=${OUTD}/uird.kmod.cpio.xz
	dracut -l -N -f -m "$DM_base" \
	-d "$KM" \
	--filesystems "$FS" \
	--kernel-only \
	-c $DCONFIG -v -M $uirdfile $KERNEL >${RUNPWD}/dracut_kmod.log 2>&1
elif [ "$BUILD" == "addon" ] ; then
	echo "MAKE UIRD addon.... "
	uirdfile=${OUTD}/uird.addon.cpio.xz
	dracut -l -N -f -m "$ExtraDM" \
	--no-kernel \
	-c $DCONFIG -v -M $uirdfile $KERNEL >${RUNPWD}/dracut_addon.log 2>&1
else
	parser KM ; parser FS ; parser DM ; parser BIN
	UIRD_BINS="$BIN"
	export UIRD_BINS
	echo "MAKE UIRD ${CFG}...."
	uirdfile="${OUTD}/uird.$CFG.cpio.xz"
	echo "-l -N --strip -f"		> ./dracut_run 
	echo "-m \"$DM\""		>> ./dracut_run	
	echo "-d \"$KM\""		>> ./dracut_run
	echo "--filesystems \"$FS\""	>> ./dracut_run
	echo "-i initrd /"		>> ./dracut_run
	echo "-i configs /"		>> ./dracut_run
	echo "-i keys /"		>> ./dracut_run
	echo "$ADDLOCALES"		>> ./dracut_run
	echo "--kernel-cmdline \"uird.basecfg=/uird_configs/$CFG\""	>> ./dracut_run
	echo "-c $DCONFIG -v -M $uirdfile $KERNEL"			>> ./dracut_run
	sed -i 's/"\ */"/g' ./dracut_run
	sed -i '/^[[:space:]]*$/d'  ./dracut_run 
	if [ $SHOW ] ; then
		cat ./dracut_run	
	else
		cat ./dracut_run |xargs dracut >${RUNPWD}/dracut_uird.log 2>&1
	fi
fi
cd $RUNPWD
[ "$KMODPATH" -a -L "/lib/modules/$KERNEL"  ]  && rm /lib/modules/$KERNEL
[ "$NAME" ] && mv "$uirdfile" "$NAME"
