#!/usr/bin/env bash
#
# Description: Helper PKGBUILD for build ubm package
#
# Author: Dmitry Razumov <asmeron@ublinux.ru>
#
VERSION_SCRIPT=2.1

    build_container(){
	_prepare_container(){
    	    sudo cp -fa /etc/pacman.conf ${CONTAINER_ROOT}/etc/
    	    sudo sed "s/^SigLevel.*/SigLevel = Never/g" -i ${CONTAINER_ROOT}/etc/pacman.conf
    	    echo "Server=https://repo.ublinux.ru/${_DISTR_REPO_VER}/\$repo/\$arch" | sudo tee "${CONTAINER_ROOT}/etc/pacman.d/mirrorlist" &> /dev/null
    	    #sudo sed -i "s|^Include.*|Server=https://repo.ublinux.ru/${pkgver}/\$repo/\$arch|g" ${CONTAINER_ROOT}/etc/pacman.conf
	    sudo cp -fa /etc/makepkg.conf ${CONTAINER_ROOT}/etc/
    	    sudo sed "s/^[[:blank:]#]*MAKEFLAGS=.*/MAKEFLAGS=\"-j\$\(nproc\)\"/" -i ${CONTAINER_ROOT}/etc/makepkg.conf
    	    sudo sed "s/^[[:blank:]#]*COMPRESSZST=.*/COMPRESSZST=(zstd -T0 -c -z -v --ultra -20 -)/" -i ${CONTAINER_ROOT}/etc/makepkg.conf
    	    #echo 'ALL ALL=(ALL:ALL) NOPASSWD: ALL' | sudo tee --append "${CONTAINER_ROOT}/etc/sudoers.d/allnopasswd" &> /dev/null
	}
	_prepare_container2(){
    	    sudo cp -fa /etc/locale.conf ${CONTAINER_ROOT}/etc/
    	    sudo cp -fa /etc/locale.gen ${CONTAINER_ROOT}/etc/
    	    sudo cp -fa /usr/lib/locale/locale-archive ${CONTAINER_ROOT}/usr/lib/locale/locale-archive
    	    sudo cp -fa /etc/pacman.d/gnupg ${CONTAINER_ROOT}/etc/pacman.d/gnupg
            # Отключаем хуки pacman которые обновляют кеши
    	    #sudo sed -E "s/^[[:blank:]#]*HookDir .*/HookDir     = \/etc\/pacman\.d\/hooks\//" -i ${CONTAINER_ROOT}/etc/pacman.conf
            sudo install -dm755 ${CONTAINER_ROOT}/etc/pacman.d/hooks
            DISABLE_HOOKS=( 
        		    '30-systemd-daemon-reload.hook'
        		    '30-systemd-hwdb.hook'
        		    '30-systemd-sysctl.hook'
        		    '30-systemd-udev-reload.hook'
        		    '30-update-mime-database.hook'
        		    '40-fontconfig-config.hook'
        		    '40-update-ca-trust.hook'
        		    '80-atd.hook'
        		    '80-cronie.hook'
        		    '90-packagekit-refresh.hook'
        		    '90-update-appstream-cache.hook'
        		    'dbus-reload.hook'
        		    'fontconfig.hook'
        		    'gdk-pixbuf-query-loaders.hook'
        		    'gtk-update-icon-cache.hook'
        		    'glib-compile-schemas.hook'
        		    'update-vlc-plugin-cache.hook'
        		    'update-desktop-database.hook'
        		    'xorg-mkfontscale.hook'
        		    )
    	    for SELECT_HOOK in "${DISABLE_HOOKS[@]}"; do
        	sudo ln -fs /dev/null "${CONTAINER_ROOT}/etc/pacman.d/hooks/${SELECT_HOOK}"
    	    done
	    #sudo rm -f ${CONTAINER_ROOT}/usr/share/libalpm/hooks/90-packagekit-refresh.hook
	}
	# sudo ubcontainer --showlayers --mlist ${CONTAINER_MODULE}
	[[ ${_PATH_CHANGES_HDD} != "" ]] && ARG_CHANGES="--changes ${_PATH_CHANGES_HDD}/changes-${CONTAINER_NAME}" && CONTAINER_CHANGES="${_PATH_CHANGES_HDD}/changes-${CONTAINER_NAME}"
	[[ -z ${_DISTR_REPO_VER} || $(grep -E "VERSION_ID=" /etc/os-release | cut -d= -f2) == ${_DISTR_REPO_VER} ]] && ARG_PREPARE_CONTAINER="--prepare"
	sudo ubcontainer --build "${ARG_PREPARE_CONTAINER}" --name "${CONTAINER_NAME}" --type chroot --flist "${srcdir}/${_MODULES_SRC}" "${ARG_CHANGES}"
	[[ -z ${ARG_PREPARE_CONTAINER} ]] && _prepare_container
	_prepare_container2
    }
    prepare_container3(){
	#Определиться при каких условиях отключать перезапись пользователей, групп и временных каталогов
#    	sudo find /run/sysusers.d/ /run/tmpfiles.d/ -type l -delete
#    	sudo arch-chroot ${CONTAINER_ROOT} /usr/bin/bash -c 'pacman-key --init; pacman-key --populate $(ls /usr/share/pacman/keyrings/*.gpg | sed "s%.*/%%;s%\.[^.]*$%%")'
	true
    }
    remove_before_install_pkg(){
    # Удаляем пакеты из списка ${_PACKAGES_SRC} с меткой в префиксе имени '*'
	local REMOVE_BEFORE_INSTALL_PKG=$(sed "s/^\s*//g; /^$/d" ${srcdir}/${_PACKAGES_SRC} | grep -E "^\*[[:alnum:]]" | sed "s/^\**//")
	if [[ -n ${REMOVE_BEFORE_INSTALL_PKG} ]]; then 
	    echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -Rcs --noconfirm ${REMOVE_BEFORE_INSTALL_PKG//$'\n'/ }"
	    sudo arch-chroot ${CONTAINER_ROOT} pacman -Rcs --noconfirm ${REMOVE_BEFORE_INSTALL_PKG}
	fi
    }
    install_pkg(){
    # Устанавливаем пакеты из списка ${_PACKAGES_SRC}, игнорируя строки с префиксами '#' '*' '**' '%'
	local INSTALL_PKG=$(sed "s/^\s*//g; /^$/d" ${srcdir}/${_PACKAGES_SRC} | grep -Ev "^#|^\*|^%")
	if [[ -n ${INSTALL_PKG} ]]; then
	    echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -S --noconfirm  ${INSTALL_PKG//$'\n'/ }"
	    sudo arch-chroot ${CONTAINER_ROOT} pacman -Sy --noconfirm
	    sudo arch-chroot ${CONTAINER_ROOT} pacman -S --noconfirm ${INSTALL_PKG}
#	    sudo arch-chroot ${CONTAINER_ROOT} /usr/bin/bash -c "pacman -S --noconfirm ${INSTALL_PKG}"
#	    sudo pacstrap ${CONTAINER_ROOT} ${INSTALL_PKG}
	fi
    }
    install_overwrite_pkg(){
    # Устанавливаем пакеты из списка ${_PACKAGES_SRC} с меткой в префиксе имени '%', перезаписав имеющиеся файлы
	local INSTALL_OVERWRITE_PKG=$(sed "s/^\s*//g; /^$/d" ${srcdir}/${_PACKAGES_SRC} | grep -E "^%" | sed "s/^%//")
	if [[ -n ${INSTALL_OVERWRITE_PKG} ]]; then
	    echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -S --noconfirm --overwrite * ${INSTALL_OVERWRITE_PKG//$'\n'/ }"
	    sudo arch-chroot ${CONTAINER_ROOT} pacman -S --noconfirm --overwrite "*" ${INSTALL_OVERWRITE_PKG}
	fi
    }
    install_self_pkg(){
    # Устанавливаем в модуль пакет описания модуля
	_PKGBUILD_UBM=$(cat <<EOF
pkgname=${pkgname}
pkgver=${pkgver}
pkgrel=${pkgrel}
pkgdesc='${pkgdesc}'
arch=(${arch[@]})
url='${url}'
license=(${license[@]})
groups=(${groups[@]})
depends=(${depends[@]})
install='${install}'
source=("${_NAME_UBM}")

package() {
    install -dm 600 -o root -g root "\${pkgdir}${_PATH_UBM}"
    install -Dm 400 -o root -g root "\${srcdir}/${_NAME_UBM}" "\${pkgdir}${_PATH_UBM}/"
}
EOF
)
	_build_self_pkg(){
	    echo "${_PKGBUILD_UBM}" > PKGBUILD
	    [[ -f "${srcdir}/${install}" ]] && cp -af "${srcdir}/${install}" .
	    sudo rm -f ${_NAME_UBM} 
	    touch ${_NAME_UBM}
	    updpkgsums; PKGDEST="" makepkg -cCrdf
	    _SELF_PKGNAME=$(makepkg --packagelist)
	    sudo cp -af ${_SELF_PKGNAME##*/} ${CONTAINER_ROOT}/root/
	    _SELF_PKGNAME="/root/${_SELF_PKGNAME##*/}"
	}
	_build_self_pkg
	echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -Udd --dbonly --noconfirm ${_SELF_PKGNAME}"
	sudo arch-chroot ${CONTAINER_ROOT} pacman -Udd --dbonly --noconfirm ${_SELF_PKGNAME}
	sudo rm -f ${CONTAINER_ROOT}/${_SELF_PKGNAME}
    }
    manual_install_pkg(){
    # Устанавливаем пакеты  найденные в текущей папке по имени *.pkg.tar.*
	local MANUAL_INSTALL_PKG=$(cd ${srcdir}; ls -1 *.pkg.tar.* 2>/dev/null)
	if [[ -n ${MANUAL_INSTALL_PKG} ]]; then
	    echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -U --noconfirm ${MANUAL_INSTALL_PKG//$'\n'/ }"
	    sudo cp -afL ${srcdir}/*.pkg.tar.* -t ${CONTAINER_ROOT}/root/
	    sudo arch-chroot ${CONTAINER_ROOT} /usr/bin/bash -c "pacman -U --noconfirm /root/*.pkg.tar.*"
	    sudo rm -f ${CONTAINER_ROOT}/root/*.pkg.tar.*
	fi
    }
    manual_execute(){
    # Выполнение команд пользователя в контейнере
        #echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} /bin/bash"
        #sudo arch-chroot ${CONTAINER_ROOT} /bin/bash
        true
    }
    remove_after_install_pkg(){
    # Удаляем пакеты из списка ${_PACKAGES_SRC} с меткой в префиксе имени '**'
	#local REMOVE_AFTER_INSTALL_PKG=$(sed "s/\s//g" ${srcdir}/${_PACKAGES_SRC} | grep "^\*\*" | sed 's/^\**//g')
	local REMOVE_AFTER_INSTALL_PKG=$(sed "s/^\s*//g; /^$/d" ${srcdir}/${_PACKAGES_SRC} | grep -E "^\*\*" | sed "s/^\**//")
	if [[ -n ${REMOVE_AFTER_INSTALL_PKG} ]]; then
	    echo; msg "EXECUTE: sudo arch-chroot ${CONTAINER_ROOT} pacman -Rddcs --noconfirm ${REMOVE_AFTER_INSTALL_PKG//$'\n'/ }"
	    sudo arch-chroot ${CONTAINER_ROOT} pacman -Rddcs --noconfirm ${REMOVE_AFTER_INSTALL_PKG}
	fi
    }
    trim_container(){
    # Trim path
	local PATH_TRIM="$1"
	[[ ${PATH_TRIM} != "" && ${PATH_TRIM} != "/"  ]] || return 0
	echo
	[[ -f ${PATH_TRIM}/etc/passwd ]] && msg "Show /etc/passwd :" && cat ${PATH_TRIM}/etc/passwd
	[[ -f ${PATH_TRIM}/etc/group ]] && msg "Show /etc/group :" && cat ${PATH_TRIM}/etc/group
	if [[ -f ${PATH_TRIM}/etc/passwd || -f ${PATH_TRIM}/etc/group ]]; then
	    echo; msg "INFO: Проверьте отсутствие пользователей и групп с UID и GID в диапазоне 900-999. Если присутствуют, то поченить."; echo
	fi
	REMOVE_DIR=(
		    '/boot'
		    '/mnt'
		    '/media'
		    '/root'
		    '/usr/lib/locale'
		    '/var/lib/ubcontainer'
		    '/var/lib/pacman/sync'
		    '/var/cache/fontconfig'
		    '/var/cache/ldconfig'
		    '/var/cache/pacman/pkg'
		    '/var/cache'
    		    '/etc/pacman.d/gnupg'
		    # Спорная чистка проверить
		    '/var/lib/rpm'
		    )
	for SELECT_REMOVE_DIR in "${REMOVE_DIR[@]}"; do
	    [[ -d ${PATH_TRIM}${SELECT_REMOVE_DIR} ]] || continue
	    msg2 "REMOVE: ${SELECT_REMOVE_DIR}"
	    sudo find ${PATH_TRIM}${SELECT_REMOVE_DIR} | sed -e "s/[^─][^\/]*\//   │/g" -e "s/│\([^ ]\)/├── \1/"
	    sudo rm -rdf ${PATH_TRIM}${SELECT_REMOVE_DIR}
	done
	REMOVE_FILE=(
		    '/etc/sudoers.d/allnopasswd'
		    '/etc/locale.conf'
		    '/etc/locale.gen'
		    '/etc/lsb-release'
		    '/etc/ublinux-release'
		    '/etc/machine-id'
		    '/etc/ld.so.cache'
		    '/etc/hostname'
		    '/usr/lib/os-release'
		    '/usr/lib/udev/hwdb.bin'
		    '/usr/share/mime/mime.cache'
		    '/usr/share/glib-2.0/schemas/gschemas.compiled'
		    # Спорная чистка проверить
		    )
	for SELECT_REMOVE_FILE in "${REMOVE_FILE[@]}"; do
	    [[ -f ${PATH_TRIM}${SELECT_REMOVE_FILE} ]] || continue
	    msg2 "REMOVE: ${SELECT_REMOVE_FILE}"
	    sudo rm -f ${PATH_TRIM}${SELECT_REMOVE_FILE}
	done
	# Удалить отключённый хуки pacman
	sudo find ${PATH_TRIM}/etc/pacman.d/hooks/ -lname '/dev/null' -delete
#	sudo rm -rdf ${PATH_TRIM}/usr/share/libalpm
	#sudo rm -f ${PATH_TRIM}/etc/{passwd,passwd-,shadow,shadow-,group,group-,gshadow,gshadow-}
	#sudo rm -f ${PATH_TRIM}/usr/lib/modules/*/modules.*
    }
    trim_container_modules(){
    # Trim path modules
	local PATH_TRIM=$1
	sudo rm -rdfv ${PATH_TRIM}/usr/lib/modules/*/modules.*
    }
    trim_container_log(){
    # Trim path log
	local PATH_TRIM=$1
	REMOVE_DIR=(
    		    '/var/log'
		    )
	for SELECT_REMOVE_DIR in "${REMOVE_DIR[@]}"; do
	    [[ -d ${PATH_TRIM}${SELECT_REMOVE_DIR} ]] || continue
	    msg2 "REMOVE: ${SELECT_REMOVE_DIR}"
	    sudo find ${PATH_TRIM}${SELECT_REMOVE_DIR} | sed -e "s/[^─][^\/]*\//   │/g" -e "s/│\([^ ]\)/├── \1/"
	    sudo rm -rdf ${PATH_TRIM}${SELECT_REMOVE_DIR}
	done
    }
    trim_container_passwd(){
    # Trim passwd shadow group gshadow
	local PATH_TRIM=$1
	[[ ${PATH_TRIM} != "" && ${PATH_TRIM} != "/"  ]] || return 0
	REMOVE_FILE=(
		    '/etc/passwd'
		    '/etc/passwd-'
		    '/etc/shadow'
		    '/etc/shadow-'
		    '/etc/group'
		    '/etc/group-'
		    '/etc/gshadow'
		    '/etc/gshadow-'
		    )
	for SELECT_REMOVE_FILE in "${REMOVE_FILE[@]}"; do
	    [[ -f ${PATH_TRIM}${SELECT_REMOVE_FILE} ]] || continue
	    msg2 "REMOVE: ${SELECT_REMOVE_FILE}"
	    sudo rm -f ${PATH_TRIM}${SELECT_REMOVE_FILE}
	done
    }
    trim_container_pacman(){
    # Trim pacman
	local PATH_TRIM=$1
	[[ ${PATH_TRIM} != "" && ${PATH_TRIM} != "/"  ]] || return 0
	REMOVE_FILE=(
		    '/etc/pacman.d/mirrorlist'
		    '/etc/pacman.conf'
		    '/etc/makepkg.conf'
		    )
	for SELECT_REMOVE_FILE in "${REMOVE_FILE[@]}"; do
	    [[ -f ${PATH_TRIM}${SELECT_REMOVE_FILE} ]] || continue
	    msg2 "REMOVE: ${SELECT_REMOVE_FILE}"
	    sudo rm -f ${PATH_TRIM}${SELECT_REMOVE_FILE}
	done
    }
    trim_container_manual(){
    # Trim manual
	local PATH_TRIM=$1
#	test -n $(sudo find ${PATH_TRIM}/ -type d -empty -delete 2>/dev/null)
	true
    }
    save_changes_module(){
    # Save module with changes
	[[ -n ${_COMPRESSION} ]] && ARG_COMPRESSION="--comp ${_COMPRESSION}"
	[[ -n ${_BLOCKSIZE} ]] && ARG_BLOCKSIZE="--blocksize ${_BLOCKSIZE}"
	echo; msg "EXECUTE: sudo ubcontainer --destroy --name ${CONTAINER_NAME} ${ARG_COMPRESSION} ${ARG_BLOCKSIZE} ${_ARG_WH} --save ${_NAME_UBM}"
	sudo ubcontainer --destroy --name ${CONTAINER_NAME}  ${ARG_COMPRESSION} ${ARG_BLOCKSIZE} ${_ARG_WH} --save ${_NAME_UBM} || echo "ERROR: module ${_NAME_UBM} not build"
	#sudo mksquashfs "${CONTAINER_CHANGES}" "${_NAME_UBM}" -comp "${_COMPRESSION}" -b "${_BLOCKSIZE}" -noappend
	sudo rm -rdf ${CONTAINER_CHANGES}
	sync; sync; sync; echo 3 | sudo tee /proc/sys/vm/drop_caches &>/dev/null
    }
    
    build_module(){
	CONTAINER_NAME="${pkgname}-${RANDOM:0:4}"
	#CONTAINER_NAME="${pkgname}-1111"
	CONTAINER_ROOT="/memory/aufs-${CONTAINER_NAME}"
	CONTAINER_CHANGES="/memory/changes-${CONTAINER_NAME}"

	build_container
	prepare_container3
	remove_before_install_pkg
	install_pkg
	install_overwrite_pkg
	install_self_pkg
	manual_install_pkg
	manual_execute
	remove_after_install_pkg
	trim_container "${CONTAINER_CHANGES}"
	trim_container_modules "${CONTAINER_CHANGES}"
	trim_container_log "${CONTAINER_CHANGES}"
	trim_container_passwd "${CONTAINER_CHANGES}"
	trim_container_pacman "${CONTAINER_CHANGES}"
	trim_container_manual "${CONTAINER_CHANGES}"
	save_changes_module
    }
