#!/usr/bin/env bash

# Maintainer: Dmitry Razumov <asmeron@ublinux.com>

# Contributor: Alexander Betkher <UIRD>
# Contributor: Anton Goroshkin <UIRD>

VERSION_SCRIPT=1.7

usage() {
    cat <<EOF
${0##*/}  version ${VERSION_SCRIPT}
Build UBLinux initrd UIRD 

Usage: ${0##*/} [OPTIONS...]

OPTIONS:
 -h, --help	      	    This help 
     --show 	      	    Show dracut cmdline, but not run dracut
     --kmod        	    Build initrd with kernel modules only
     --addon       	    Build initrd with addon only (see ublinux-uird.conf, ExtraDM line)
 -u, --upgrade		    Take action to upgrade initrd
 -H, --hostonly    	    Host-Only mode, install only what is needed for booting the local host
 -l, --locales 	      	    Add locales (use with -e plymouth)
 -n, --name        	    Initrd file name
 -t, --plymouth_theme=NAME  Select theme for Plymouth
  Available method NAME:
	    auto	    Detect plymouth theme from distrib name
 -k, --kernel=NAME  	    Kernel name, to build initrd for it.
                            It is possible to use the full kernel name: 5.17.2-5-ublinux 
                            or the kernel package name: linux517
 -c, --config=PATH_FILE	    Path to config file ublinux-uird (/etc/ublinux-uird.conf.d/ubmkuird.conf)
 -C, --configos=FILE 	    Path to config file OS init (ublinux)
 -g, --changes=PATH 	    Path to changes for initrd root
 -o, --outdir=PATH_DIR      Path to finished initrd
 -e, --exclude=LIST	    Exclude from initrd, separator ',' (see /etc/ublinux-uird.conf.d/ubmkuird.conf)
 Examples LIST
	    -		    All group
	    no		    Reset global excluded
	    KM_base	    Group kernel modules base
	    KM_network	    Group kernel modules network
	    KM_dev	    Group kernel modules device
	    KM_crypto	    Group kernel modules crypto
	    KM_compAlg      Group kernel modules compressions algoritm
	    FS_KM	    Group kernel modules file systems
	    DM_uird	    Group UIRD core
	    DM_base	    Group UIRD additional base
	    BIN_base	    Group all bin's base
	    BIN_network	    Group all bin's network
	    BIN_filesystem  Group all bin's filesystems
	    BIN_extra	    Group all bin's manual
	    INST_all	    Group manual files
	    ExtraDM	    Group only options "--addon" only
 -L, --logdir=PATH_FILE     Path to logs
 -m, --kmodpath=PATH        Kernel modules path (/lib/modules) 
 -s, --secure=NUMBER	    Secure level, from 0 to 5 (paranoic)
  Available levels NUMBER:
        		0   Default level, allow all
			1   deny: eval cmdline
			2   1 + deny: ub.run
			3   2 + deny: internal shells (qs, qse, etc)
			4   reserved
			5   4 + deny: initrd cmdline parameters except ub.basecfg
 -p, --passwd=PASSWORD      Add password for initrd root user, without the option password will not be set 
 Available methods PASSWORD:	    
	    ***		    Get password from current root user and apply if "mkpasswd" not found
     --hash=HASH 	    Password HASH method, default sha512crypt
 Available methods HASH:
	    yescrypt        Yescrypt
    	    gost-yescrypt   GOST Yescrypt
    	    scrypt          scrypt
    	    bcrypt          bcrypt
    	    bcrypt-a        bcrypt (obsolete 2a version)
          * sha512crypt     SHA-512
    	    sha256crypt     SHA-256
    	    sunmd5          SunMD5
    	    md5crypt        MD5
    	    bsdicrypt       BSDI extended DES-based crypt(3)
    	    descrypt        standard 56 bit DES-based crypt(3)
    	    nt              NT-Hash
Examples:
  ubmkuird -lu --passwd "ublinux-live" --secure 3
  ubmkuird -l --passwd "ublinux-live" --secure 3 -e aria2c -k 5.17.2-5-ublinux -o /boot
  ubmkuird -l -e aria2c -k linux61 -o /boot
  ubmkuird -l -c /path/mkuird_ublinux.cfg -d /path/dracut_ublinux.cfg -n ublinux-5.17.2-5 -k 5.17.2-5-ublinux -e aria2c,plymouth -C ublinux
  ubmkuird -l -e KM_base,KM_network,KM_dev,KM_crypto,KM_compAlg,kernel-modules -C ublinux
  ubmkuird --addon
  ubmkuird --kmod
Use for current kernel and low power hardware (without animation boot):
  ubmkuird -Hlu --passwd "***" --secure 3 -e KM_network,BIN_network,BIN_extra,plymouth
Use for current kernel and current hardware:
  ubmkuird -Hlu --passwd "***" --secure 3 -e KM_network,BIN_network,BIN_extra
EOF
    check_deps
    exit 0
}

arguments() {
# Pre-process options to:
# - expand -xyz into -x -y -z
# - expand --longopt=arg into --longopt arg
    local ARGV=()
    local END_OF_OPT=
    while [[ $# -gt 0 ]]; do
        arg="$1"; shift
        case "${END_OF_OPT}${arg}" in
            --) ARGV+=("$arg"); END_OF_OPT=1 ;;
            --*=*)ARGV+=("${arg%%=*}" "${arg#*=}") ;;
            --*) ARGV+=("$arg") ;;
            -*) for i in $(seq 2 ${#arg}); do ARGV+=("-${arg:i-1:1}"); done ;;
            *) ARGV+=("$arg") ;;
        esac
    done
# Apply pre-processed options
    set -- "${ARGV[@]}"
# Parse options
    local END_OF_OPT=
    local POSITIONAL_ARGS=()
    [[ -z $@ ]] && usage && exit 0
    while [[ $# -gt 0 ]]; do
        case "${END_OF_OPT}${1}" in
            -h | --help | help)	usage ;;
	         --show) 	SHOW=yes ;;
	    -c | --config) 	shift; CONFIG="$1" ;;
	    -C | --configos)	shift; CONFIG_OS="$1" ;;
	    -g | --changes)	shift; CHANGESDIR="$1" ;;
	    -H | --hostonly)	HOSTONLY="-H" ;;
	    -o | --outdir) 	shift; OUTDIR="$1" ;;
	    -e | --exclude) 	shift; EXCLUDE="$1" ;;
	    -n | --name) 	shift; NAME="$1" ;;
	    -t | --plymouth_theme) shift; PLYMOUTH_THEME="$1" ;;
	    -k | --kernel) 	shift; KERNEL="$1" ;;
	    -m | --kmodpath) 	shift; KMODPATH="$1" ;;
	    -L | --logdir) 	shift; LOGD="$1" ;;
		 --kmod) 	BUILD=kmod ;;
		 --addon) 	BUILD=addon ;;
	    -l | --locales) 	ADDLOCALES=yes ;;
	    -p | --passwd) 	shift; PASSWD="$1" ;;
	         --hash) 	shift; PASSWD_HASH_METHOD="$1" ;;
	    -s | --secure) 	shift; SECLEVEL="$1" ;;
	    -u | --upgrade)	UPGRADE=yes ;;
            --)                 END_OF_OPT=1 ;;
            -* | --*)           echo "WARNING: Unrecognized argument, skiped: $1" >&2  ;;
            *)                  POSITIONAL_ARGS+=("$1") ;;
        esac
        shift
    done
# Restore positional parameters
    set -- "${POSITIONAL_ARGS[@]}"
}
check_root() {
# Если скрипт запущен от пользователя, то перезапускаем от root
    if [[ $(id -u) != 0 ]]; then 
       echo -e "\e[1;31mВнимание:\e[0m Скрипт запущен от пользователя, перезапускаю от root!" 
       arg="$@" && sudo /usr/bin/bash -c "$0 ${arg}" 
       exit -1
    fi
}
check_deps() {
    PKG_GROUP1="
	linux-firmware
	amd-ucode
	intel-ucode
        whois"
    PKG_GROUP2="
	plymouth
        plymouth-theme-ublinux
	qemu-headless
        git
	cpio
        aria2
	curlftpfs
        rsync
	squashfs-tools
        sshfs
	ttf-opensans
        pigz"
    PKG_GROUP3="
	exfatprogs
        dosfstools
	ntfs-3g
        jfsutils
	f2fs-tools
        reiserfsprogs
	btrfs-progs
        xfsprogs"
    echo "---------------------------------------------------------------------------------"
    local RESULT_PKG_GROUP1=$(pacman -Qqm ${PKG_GROUP1} 2>&1 | sed 's/^.*: //g')
    [[ -n ${RESULT_PKG_GROUP1} ]] && echo -e "==> Recommended packages that include microcodes and firmware (group1):\n${RESULT_PKG_GROUP1}"
    local RESULT_PKG_GROUP2=$(pacman -Qqm ${PKG_GROUP2} 2>&1 | sed 's/^.*: //g')
    [[ -n ${RESULT_PKG_GROUP2} ]] && echo -e "==> Recommended packages that include additional features (group2):\n${RESULT_PKG_GROUP1}"
    local RESULT_PKG_GROUP3=$(pacman -Qqm ${PKG_GROUP3} 2>&1 | sed 's/^.*: //g')
    [[ -n ${RESULT_PKG_GROUP3} ]] && echo -e "==> Recommended packages that include support for additional file systems (group3):\n${RESULT_PKG_GROUP1}"
    echo "---------------------------------------------------------------------------------"
}
show_settings() {
    echo "Current settings:
CONFIG=${CONFIG}
CONFIG_DRACUT=${CONFIG_DRACUT}
WORKDIR=${WORKDIR}
CHANGESDIR=${CHANGESDIR}
BINBUSYBOX=${BINBUSYBOX}
DRACUTMODDIR=${DRACUTMODDIR}
PASSWD=${PASSWD}
SECLEVEL=${SECLEVEL}
EXCLUDE=${EXCLUDE}
OUTDIR=${OUTDIR}
NAME=${NAME}
KERNEL=${KERNEL}
KMODPATH=${KMODPATH}
LOGDIR=${LOGDIR}
UPGRADE=${UPGRADE}
UPGRADEDIR=${UPGRADEDIR}
PLYMOUTH_THEME=${PLYMOUTH_THEME}
"
}
check_config_os() {
    if [[ ! -f ${CONFIG_OS} ]]; then
	echo "ERROR: ${CONFIG_OS} is not exist"
	exit 3
    fi
}
check_busybox() {
    if  [[ ! -x "${BINBUSYBOX}" ]]; then
	echo "ERROR: Busybox binary '${BINBUSYBOX}' not found!"
	exit 1
    else 
	export BINBUSYBOX
    fi
}
check_dracut() {
    if [[ ! -x /usr/bin/dracut ]]; then
        echo "ERROR: Dracut an event driven initramfs infrastructure not found!"
	exit
    fi
}
check_kmod() {
    KMODPATH_KERNEL=$(realpath ${KMODPATH}/${KERNEL} 2>/dev/null)
    [[ -d ${KMODPATH_KERNEL} && ${KMODPATH_KERNEL} != "/usr/lib/modules/${KERNEL}" ]] && ln -s ${KMODPATH_KERNEL} /usr/lib/modules/${KERNEL}
    if [[ ! -d /usr/lib/modules/${KERNEL} ]]; then
	echo "ERROR: Kernel modules for '${KERNEL}' were not found!"
	exit 1
    fi
}
check_depmod() {
    if ! depmod -A "${KERNEL}"; then
    	echo  "ERROR: Depmod for '${KERNEL}' error!"
    fi
}
check_aufs_sqfs() {
    if [[ -f /lib/modules/${KERNEL}/build/.config ]]; then
	KERNELCFG="/lib/modules/${KERNEL}/build/.config"
    elif [[ -f "/lib/modules/${KERNEL}/config-${KERNEL}" ]]; then
	KERNELCFG="/lib/modules/${KERNEL}/config-${KERNEL}"
    elif [[ -f "/boot/config-${KERNEL}" ]]; then
	KERNELCFG="/boot/config-${KERNEL}"
    fi
    if [[ -n ${KERNELCFG} ]]; then
 	KRNAUFS=$(grep -E 'CONFIG_AUFS.*=[ym]' ${KERNELCFG})
	KRNSQFS=$(grep -E 'CONFIG_SQUASHFS.*=[ym]' ${KERNELCFG})
	[[ $(echo "${KRNAUFS}" | wc -l) -eq 1 ]] && echo -e "\n${KRNAUFS}\n" && "WARNING: '${KERNEL}' built with no AUFS, continue" 
	[[ $(echo "${KRNSQFS}" | wc -l) -eq 1 ]] && echo -e "\n${KRNSQFS}\n" && "WARNING: '${KERNEL}' built with no SQUASHFS, continue" 
    else
	echo "WARNING: not found kernel config file for '${KERNEL}' to check support AUFS and SQUASHFS !" 
    fi
}
parser() {
    test_mod() {
	type=$1; mod=$2
	if [[ "${type}" == "KM" || "${type}" == "FS" ]]; then
	    if echo ${mod} | grep -Eq "^=" ; then 
		return 0 
	    elif /usr/bin/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 ${DRACUTMODDIR}/ | grep -Eq "..${mod}$" && return 0
	elif [[ ${type} == "INST" ]]; then
	    [ -f "$mod" ] && return 0
	fi
	echo "Not found: ${type} - ${mod}" | tee -a ${LOGDIR}/not_found.log
	return 1
    }
    PREFIX=$1
    for item in $(cat ${CONFIG} | grep ^$1 | awk -F= '{print $1}'); do
	if echo "${item}" | grep -Eq "${EXCLUDE//[, ]/|}"; then 
	    echo "Excluded all: ${item}"
	    continue
	fi
	for mod in ${!item}; do
	    if echo "${mod}" | grep -Eq  "${EXCLUDE//[, ]/|}"; then 
		echo "Excluded: ${PREFIX} - ${mod}"
		continue
	    fi
	    if test_mod ${PREFIX} ${mod}; then 
		eval ${PREFIX}="\" \${$PREFIX} ${mod} \"" 
	    fi
	done
    done
}
option_secure() {
    if [[ -n ${PASSWD} || -n ${SECLEVEL} ]]; then
	SECUREDIR=$(mktemp -d /tmp/ublinux-uird.XXXX)
	cp -ra ${SHAREDIR}/secure/* ${SECUREDIR}/
	if [[ -n ${PASSWD} ]]; then
	    if [[ ${PASSWD} == "***" ]]; then
		PASSWORD_HASH=$(grep "root:" /etc/shadow | cut -d: -f2)
	    elif [[ -x /usr/bin/mkpasswd2 ]]; then
		PASSWORD_HASH=$(/usr/bin/mkpasswd2 -m "${PASSWD_HASH_METHOD}" --stdin <<< "${PASSWD}")
		[[ -z "${PASSWORD_HASH}" ]] && echo "ERROR: failure 'mkpasswd2 -m ${PASSWD_HASH_METHOD}'"
	    elif [[ -x /usr/bin/mkpasswd ]]; then
		PASSWORD_HASH=$(/usr/bin/mkpasswd -m "${PASSWD_HASH_METHOD}" --stdin <<< "${PASSWD}")
		[[ -z "${PASSWORD_HASH}" ]] && echo "ERROR: failure 'mkpasswd -m ${PASSWD_HASH_METHOD}'"
	    else
		echo "WARNING: 'mkpasswd' not found"
		PASSWORD_HASH=
	    fi
	    sed -i "s|^root:[!]*:|root:x:|" ${SECUREDIR}/etc/passwd
	    sed -i "s|^root::|root:${PASSWORD_HASH}:|" ${SECUREDIR}/etc/shadow
	fi
	echo "${SECLEVEL:=0}" > ${SECUREDIR}/secure
    fi
}
option_plymouth_theme() {
    set_plymouth_theme() {
	if [[ -d /usr/share/plymouth/themes/$1 ]]; then
        cat <<EOF > /etc/plymouth/plymouthd.conf
# Set your plymouth configuration here.
[Daemon]
Theme=$1
ShowDelay=0
DeviceTimeout=8
EOF
	    #sed -Ei "s/.*Theme=.*/Theme=$1/" /etc/plymouth/plymouthd.conf
    	else    
    	    echo "WARNING: Plymouth theme $1 not found!"
	fi
    }
    if [[ -n ${PLYMOUTH_THEME} ]]; then
	[[ -f /etc/plymouth/plymouthd.conf ]] || install -Dm0644 /usr/share/plymouth/plymouthd.defaults /etc/plymouth/plymouthd.conf
	if [[ ${PLYMOUTH_THEME} == "auto" ]]; then
	    [[ -n ${PLYMOUTH_THEME_POWERON} ]] || PLYMOUTH_THEME_POWERON="$(${PATH_LIB_UBBOOT}/ubdistconv -p | head -1)"
	    [[ -n ${PLYMOUTH_THEME_POWEROFF} ]] || PLYMOUTH_THEME_POWEROFF="$(${PATH_LIB_UBBOOT}/ubdistconv -p | head -n 2 |tail -1)"
	else
	    [[ -n ${PLYMOUTH_THEME_POWERON} ]] || PLYMOUTH_THEME_POWERON="${PLYMOUTH_THEME}"
	    [[ -n ${PLYMOUTH_THEME_POWEROFF} ]] || PLYMOUTH_THEME_POWEROFF="$(grep "^Theme=" /etc/plymouth/plymouthd.conf 2>/dev/null | cut -d= -f2)"
	fi
	if [[ $1 == "POWERON" && -n ${PLYMOUTH_THEME_POWERON} ]]; then
	    set_plymouth_theme "${PLYMOUTH_THEME_POWERON}"
    	    echo "INFO: Set $1 plymouth theme ${PLYMOUTH_THEME_POWERON}"
	elif [[ $1 == "POWEROFF" && -n ${PLYMOUTH_THEME_POWEROFF} ]]; then
	    set_plymouth_theme "${PLYMOUTH_THEME_POWEROFF}"
    	    echo "INFO: Set $1 plymouth theme ${PLYMOUTH_THEME_POWEROFF}"
	fi
    fi
}
option_upgrade() {
    if [[ -n ${UPGRADE} ]]; then
	if [[ -d ${UPGRADEDIR} ]]; then
	    [[ -f $1 ]] && cp -Lf "$1" "${UPGRADEDIR}/" && echo "UPGRADE: initrd for upgrade '${UPGRADEDIR}/${1##*/}'"
	else 
	    echo "ERROR: '${UPGRADEDIR}' path for upgrade not exist"
	fi
    fi
}

##################
##	MAIN	##
##################

    PKGNAME=${0##*/}
    WORKDIR=${PWD}
    KERNEL=$(uname -r)
    BINBUSYBOX="/usr/bin/busybox"
    DRACUTMODDIR="/usr/lib/dracut/modules.d"
    LOGDIR="/var/log/ublinux-uird"
    SHAREDIR="/usr/share/ublinux-uird"
    OUTDIR="/usr/lib/modules/${KERNEL}"
    PATH_LIB_UBBOOT="/usr/lib/ubboot"
    UPGRADEDIR="/mnt/upgrade"
    CONFIG_DRACUT="/etc/ublinux-uird.conf.d/ubdracut.conf"
    CONFIG="/etc/ublinux-uird.conf.d/ubmkuird.conf"    
    CONFIG_OS="${SHAREDIR}/configs/uird_configs/ublinux"
    LOCALESDIR="${SHAREDIR}/i18n"
    EXCLUDE="nothing"
    HOSTONLY="-N"
    PASSWD_HASH_METHOD="sha512crypt"

    source ${CONFIG} 2>/dev/null || source ${CONFIG##*/} 2>/dev/null || echo "ERROR: '${CONFIG}' configuration file not found"
    arguments $@
    check_root
    check_deps
    # Если имя ядра указано коротким по имени пакета, то предаставить полное имя ядра 
    if [[ ! -d "/usr/lib/modules/${KERNEL}" ]]; then 
        KERNEL_KVER=$(find /usr/lib/modules/ -maxdepth 2 -type f -iname "${KERNEL}-*.kver" -exec cut -d' ' -f1 {} \; 2>/dev/null | head -1)
        [[ -d "/usr/lib/modules/${KERNEL_KVER}" ]] && KERNEL=${KERNEL_KVER}
    fi    
    [[ -d "/usr/lib/modules/${KERNEL}" ]] && OUTDIR="/usr/lib/modules/${KERNEL}"
    [[ -d ${OUTDIR} ]] || OUTDIR=$(mktemp -d /tmp/ublinux-uird.XXXX)
    [[ -f ${CONFIG_DRACUT} ]] || CONFIG_DRACUT="/etc/ubdracut.conf"
    [[ -f "${WORKDIR}/${CONFIG_DRACUT##*/}" ]] && CONFIG_DRACUT="${WORKDIR}/${CONFIG_DRACUT##*/}"
    [[ -f ${CONFIG} ]] || CONFIG="/etc/ubmkuird.conf"
    [[ -f "${WORKDIR}/${CONFIG##*/}" ]] && CONFIG="${WORKDIR}/${CONFIG##*/}"
    [[ -d ${LOGDIR} ]] || install -dm 0755 -o root -g root "${LOGDIR}"
    NAME_INITRD_KMOD="kmod-${KERNEL//-ublinux/}"
    NAME_INITRD_ADDON="addon-${KERNEL//-ublinux/}"
    NAME_INITRD="${CONFIG_OS##*/}-${KERNEL//-ublinux/}"

    date | tee ${LOGDIR}/not_found.log
    show_settings
    check_config_os
    check_busybox
    check_dracut    
    check_kmod
    check_depmod
    check_aufs_sqfs
    option_secure
    option_plymouth_theme "POWERON"
#   ln -s $(realpath "$WORKDIR")/modules.d/* ${DRACUTMODDIR}/ 2>/dev/null
    [[ -n ${CHANGESDIR} ]] && CHANGESDIR="-i ${CHANGESDIR} /"
    BUILTIN=$(cat /lib/modules/${KERNEL}/modules.builtin | sed 's|.*/||; s|.ko$||')
    if [[ "${BUILD}" == "kmod" ]]; then
	parser KM ; parser FS ; parser DM
	echo "Making Initrd --kmod, using '$(which dracut)', path '${OUTDIR}' ..."
	/usr/bin/dracut ${HOSTONLY} -f -m "$DM_base" \
	    -d "${KM}" \
	    --filesystems "${FS}" \
	    --kernel-only \
	    ${CHANGESDIR} \
	    --conf ${CONFIG_DRACUT} -v -M ${OUTDIR}/${NAME:=kmod} ${KERNEL} > ${LOGDIR}/dracut_kmod.log 2>&1
	if [[ ${NAME} == "kmod" ]]; then
	    ln -sf ${NAME} ${OUTDIR}/${NAME_INITRD_KMOD}
	    option_upgrade "${OUTDIR}/${NAME_INITRD_KMOD}"
	fi
    elif [[ "${BUILD}" == "addon" ]]; then
	echo "Making Initrd --addon, using $(which dracut), path '${OUTDIR}' ..."
	/usr/bin/dracut ${HOSTONLY} -f -m "${ExtraDM}" \
	    --no-kernel \
	    ${CHANGESDIR} \
	    --conf ${CONFIG_DRACUT} -v -M ${OUTDIR}/${NAME:=addon} ${KERNEL} > ${LOGDIR}/dracut_addon.log 2>&1
	if [[ ${NAME} == "addon" ]]; then
	    ln -sf ${NAME} ${OUTDIR}/${NAME_INITRD_ADDON}
	    option_upgrade "${OUTDIR}/${NAME_INITRD_ADDON}"
	fi
    else
	parser KM ; parser FS ; parser DM ; parser BIN ; parser INST
	UIRD_BINS="${BIN}"; export UIRD_BINS
	echo "Making Initrd '${CONFIG_OS##*/}' using $(which dracut), path '${OUTDIR}' ..."
	echo							 > ${LOGDIR}/dracut_run 
	echo "${HOSTONLY} --strip -f"				>> ${LOGDIR}/dracut_run 
	echo "--conf '${CONFIG_DRACUT}'"			>> ${LOGDIR}/dracut_run
	echo "-m '${DM}'"					>> ${LOGDIR}/dracut_run	
	echo "-d '${KM}'"					>> ${LOGDIR}/dracut_run
	echo "-I '${INST}'"					>> ${LOGDIR}/dracut_run
	echo "--filesystems '$FS'"				>> ${LOGDIR}/dracut_run
	echo "--omit-drivers '${EXCLUDE//[,|]/ }'"		>> ${LOGDIR}/dracut_run
	echo "-i '${SHAREDIR}/initrd' /"			>> ${LOGDIR}/dracut_run
	echo "-i '${SHAREDIR}/configs' /"			>> ${LOGDIR}/dracut_run
	echo "-i '${SHAREDIR}/keys' /"				>> ${LOGDIR}/dracut_run
	[[ -n ${ADDLOCALES} ]] \
	    && echo "-i '${LOCALESDIR}' /"			>> ${LOGDIR}/dracut_run
	[[ -n ${SECUREDIR} ]] \
	    && echo "-i '${SECUREDIR}' /"			>> ${LOGDIR}/dracut_run
	echo "${CHANGESDIR}"	        			>> ${LOGDIR}/dracut_run
	echo "--kernel-cmdline 'ub.basecfg=/uird_configs/${CONFIG_OS##*/}'" >> ${LOGDIR}/dracut_run
	echo "-v -M ${OUTDIR}/${NAME:=ublinux} ${KERNEL}" 	>> ${LOGDIR}/dracut_run
	sed -i 's/"\ */"/g' ${LOGDIR}/dracut_run
	sed -i '/^[[:space:]]*$/d'  ${LOGDIR}/dracut_run 
	if [[ -n ${SHOW} ]]; then
	    cat ${LOGDIR}/dracut_run
	else
	    cat ${LOGDIR}/dracut_run | xargs /usr/bin/dracut > ${LOGDIR}/dracut.log 2>&1
	fi
	[[ -n ${SECUREDIR} ]] && rm -rdf ${SECUREDIR}
	if [[ ${NAME} == "ublinux" ]]; then
	    ln -sf ${NAME} ${OUTDIR}/${NAME_INITRD}
	    option_upgrade "${OUTDIR}/${NAME_INITRD}"
	fi
    fi    
    [[ -n ${KMODPATH} && -L "/usr/lib/modules/${KERNEL}" ]] && rm -f /usr/lib/modules/${KERNEL} 2>/dev/null
    option_plymouth_theme "POWEROFF"
    true
