#!/bin/bash # Functions library :: for install scripts # Author: crims0n. # # ================================================================= # ================================================================= # ========================= VARIABLES ============================= # ================================================================= # ================================================================= function common_variables() { if [ $DISTRIBUTION_ARCH = "amd64" ]; then KERNEL_ARCH="amd64" #PACKAGE_VARIANT="standard" elif [ $DISTRIBUTION_ARCH = "i386" ]; then KERNEL_ARCH="686-pae" #PACKAGE_VARIANT="minimal" elif [ $DISTRIBUTION_ARCH = "arm64" ]; then KERNEL_ARCH="arm64" fi } # ================================================================= # ================================================================= # ===================== COMMON FUNCTIONS ========================== # ================================================================= # ================================================================= function current_process() { echo -e "${LIGHTYELLOW}=====> running ${CYAN}${CMD[ii]}${ENDCOLOUR}${LIGHTYELLOW} ...${ENDCOLOUR}" } # ================================================================= # beautiful console # красивая консоль # ================================================================= function console_colours() { RED="\e[31m" GREEN="\e[32m" YELLOW="\e[33m" BLUE="\e[34m" MAGENTA="\e[35m" CYAN="\e[36m" LIGHTGRAY="\e[37m" DARKGRAY="\e[90m" LIGHTRED="\e[91m" LIGHTGREEN="\e[92m" LIGHTYELLOW="\e[93m" LIGHTBLUE="\e[94m" LIGHTMAGENTA="\e[95m" LIGHTCYAN="\e[96m" BOLD="\e[1m" DIM="\e[2m" UNDERLINED="\e[4m" BLINK="\e[5m" REVERSE="\e[7m" HIDDEN="\e[8m" ENDCOLOUR="\e[0m" } # ================================================================= # help functions # функции помощи # ================================================================= function help() { # if $1 is set, use $1 as headline message in help() if [ -f /etc/default/locale ]; then if grep -q 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then if [ -z ${1+x} ]; then echo -e "${LIGHTYELLOW}Этот скрипт собирает модули для $SYSTEMNAME.${ENDCOLOUR}" echo -e else echo -e $1 echo fi echo -e "Поддерживаемые команды : ${CYAN}${CMD[*]}${ENDCOLOUR}" echo -e echo -e "Синтаксис: ${MAGENTA}$0${ENDCOLOUR} [start_cmd] [-] [end_cmd]" if [ -L /usr/bin/$LIVEKITNAME-install ] && [ "$0" != "/usr/bin/$LIVEKITNAME-install" ]; then echo -e "\t${CYAN}$LIVEKITNAME-install${ENDCOLOUR} [start_cmd] [-] [end_cmd]" fi echo -e "\tзапуск от start_cmd до end_cmd" echo -e "\tесли start_cmd опущен, выполняются все команды, начиная с первой" echo -e "\tесли end_cmd опущен, выполняются все команды до последней" echo -e "\tвведите одну команду, чтобы запустить определенную команду" echo -e "\tвведите '-' как единственный аргумент для запуска всех команд" echo -e "\t" echo -e "\tСкрипты установки должны находиться в папке с именем будущего модуля." echo -e "\tНапример, чтобы собрать модуль с именем 06-vscode, скрипты сборки" echo -e "\tдолжны находиться по следующему пути: ${LIGHTYELLOW}$CURRENT_DIR/modules/06-vscode${ENDCOLOUR}" echo -e "\tПримеры:" echo -e "\t${LIGHTYELLOW}$0 build_modules${ENDCOLOUR} сборка модулей" echo -e "\t${LIGHTYELLOW}$0 repack_system${ENDCOLOUR} перепаковка системы с типом сжатия, указанным" echo -e "\tв /etc/$LIVEKITNAME/config в переменной COMP_TYPE" echo -e "\t${LIGHTYELLOW}$0 -${ENDCOLOUR} эта команда запустит обе функции поочерёдно" exit 0 else if [ -z ${1+x} ]; then echo -e "${LIGHTYELLOW}This script builds modules for $SYSTEMNAME.${ENDCOLOUR}" echo -e else echo -e $1 echo fi echo -e "Supported commands : ${CYAN}${CMD[*]}${ENDCOLOUR}" echo -e echo -e "Syntax: ${MAGENTA}$0${ENDCOLOUR} [start_cmd] [-] [end_cmd]" if [ -L /usr/bin/$LIVEKITNAME-install ] && [ "$0" != "/usr/bin/$LIVEKITNAME-install" ]; then echo -e "\t${CYAN}$LIVEKITNAME-install${ENDCOLOUR} [start_cmd] [-] [end_cmd]" fi echo -e "\trun from start_cmd to end_cmd" echo -e "\tif start_cmd is omitted, start from first command" echo -e "\tif end_cmd is omitted, end with last command" echo -e "\tenter single cmd to run the specific command" echo -e "\tenter '-' as only argument to run all commands" echo -e "\t" echo -e "\tThe installation scripts must be in the folder with the" echo -e "\tname of the future module. For example, to build a module" echo -e "\tnamed 06-vscode, build scripts should be in the following" echo -e "\tpath: ${LIGHTYELLOW}$CURRENT_DIR/modules/06-vscode${ENDCOLOUR}" echo -e "\tExamples:" echo -e "\t${LIGHTYELLOW}$0 build_modules ${ENDCOLOUR} build modules" echo -e "\t${LIGHTYELLOW}$0 repack_system ${ENDCOLOUR} repack the system with the" echo -e "\tcompression type specified by /etc/$LIVEKITNAME/config in COMP_TYPE variable" echo -e "\t${LIGHTYELLOW}$0 - ${ENDCOLOUR} this command will run both functions alternately" exit 0 fi fi } # ================================================================= # parsing input commands # разбор входных команд # ================================================================= function find_index() { local ret local i for ((i = 0; i < ${#CMD[*]}; i++)); do if [ "${CMD[i]}" == "$1" ]; then index=$i return fi done help "Command not found : $1" } # ================================================================= # creating a symbolic link to the executable file for using # autocompletion on the command line # создание символической ссылки на исполняемый файл для # использования автодополнения в командной строке # ================================================================= function create_livekitname_install_symlink() { if [ -L /usr/bin/$LIVEKITNAME-install ]; then if [ "$(readlink /usr/bin/$LIVEKITNAME-install)" != "$SCRIPT_DIR/install" ]; then rm -f /usr/bin/$LIVEKITNAME-install ln -s $SCRIPT_DIR/install /usr/bin/$LIVEKITNAME-install if grep 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then echo -e "Символическая ссылка ${MAGENTA}/usr/bin/$LIVEKITNAME-install${ENDCOLOUR} была обновлена." echo -e "Теперь она указывает на ${MAGENTA}$SCRIPT_DIR/install${ENDCOLOUR}." else echo -e "The ${MAGENTA}/usr/bin/$LIVEKITNAME-install${ENDCOLOUR} symbolic link has been updated." echo -e "It now points to ${MAGENTA}$SCRIPT_DIR/install${ENDCOLOUR}." fi fi if [ "$0" != "/usr/bin/$LIVEKITNAME-install" ]; then if grep 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then echo -e "Вы можете использовать команду ${CYAN}$LIVEKITNAME-install${ENDCOLOUR} для запуска этой программы." else echo -e "You can use the ${CYAN}$LIVEKITNAME-install${ENDCOLOUR} command to run this program." fi fi else ln -s $SCRIPT_DIR/install /usr/bin/$LIVEKITNAME-install if grep 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then echo -e "Символическая ссылка ${MAGENTA}/usr/bin/$LIVEKITNAME-install${ENDCOLOUR} была добавлена" echo -e "для ${MAGENTA}$SCRIPT_DIR/install${ENDCOLOUR}." else echo -e "The ${MAGENTA}/usr/bin/$LIVEKITNAME-install${ENDCOLOUR} symbolic link has been added" echo -e "for ${MAGENTA}$SCRIPT_DIR/install${ENDCOLOUR}." fi fi } # ================================================================= # creating autocompletion on the command line # создание автодополнения в командной строке # ================================================================= function create_completion() { if [ -d /etc/bash_completion.d ]; then if [ ! -f /etc/bash_completion.d/$LIVEKITNAME-install ] || ! grep "${CMD[*]}" /etc/bash_completion.d/$LIVEKITNAME-install >>$OUTPUT; then cat </etc/bash_completion.d/$LIVEKITNAME-install #/usr/bin/env bash complete -W "${CMD[*]}" $LIVEKITNAME-install EOF fi if [ "$0" != "/usr/bin/$LIVEKITNAME-install" ]; then if grep 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then echo -e "Дополнение команд работает только при использовании команды ${CYAN}$LIVEKITNAME-install${ENDCOLOUR}." echo -e else echo -e "Command completion only works when using the ${CYAN}$LIVEKITNAME-install${ENDCOLOUR} command." echo -e fi fi fi } # ================================================================= # only allow 'root' to run the script # разрешаем запуск скрипта только пользователю 'root' # ================================================================= function allow_root_only() { if [ $(id -u) -ne 0 ]; then echo -e "${BOLD}${RED}This script should be run as 'root'!${ENDCOLOUR}" exit 1 fi export HOME=/root export LC_ALL=C } # ================================================================= # check that we are inside chroot # проверяем, что мы внутри chroot # ================================================================= function check_is_in_chroot() { if [ $(stat -c %i /)="2" ]; then echo -e "${BOLD}${RED}This script should be run inside chroot only!${ENDCOLOUR}" exit 1 fi } # Unzip gzipped files (man pages), so LZMA can compress 2times better. # First we fix symlinks, then uncompress files # $1 = search directory uncompress_files() { local LINK LINE find "$1" -type l -name "*.gz" | while read LINE; do LINK="$(readlink "$LINE" | sed -r 's/.gz$//')" FILE="$(echo "$LINE" | sed -r 's/.gz$//')" ln -sfn "$LINK" "$FILE" rm -f "$LINE" done find "$1" -type f -name "*.gz" | xargs -r gunzip } # remove broken links # $1 = search directory remove_broken_links() { find "$1" -type l -exec test ! -e {} \; -print | xargs rm -vf } function add_chroot_configuration_files() { cat <$1/$LIVEKITNAME.conf OUTPUT=$OUTPUT LOGPATH=$LOGPATH BUILD_TEST_ISO=$BUILD_TEST_ISO CREATE_BACKUP=$CREATE_BACKUP DEBIAN_FRONTEND_TYPE=$DEBIAN_FRONTEND_TYPE APT_CMD=$APT_CMD APT_OPTIONS=$APT_OPTIONS LIVE_TYPE=$LIVE_TYPE DISTRIBUTION=$DISTRIBUTION DISTRIBUTION_TYPE=$DISTRIBUTION_TYPE PACKAGE_VARIANT=$PACKAGE_VARIANT COMP_TYPE=$COMP_TYPE KERNEL_ARCH=$KERNEL_ARCH USER_NAME=$USER_NAME EOF cat <<'EOF' >$1/functions #!/bin/bash # ================================================================= # beautiful console # красивая консоль # ================================================================= function console_colours() { RED="\e[31m" GREEN="\e[32m" YELLOW="\e[33m" BLUE="\e[34m" MAGENTA="\e[35m" CYAN="\e[36m" LIGHTGRAY="\e[37m" DARKGRAY="\e[90m" LIGHTRED="\e[91m" LIGHTGREEN="\e[92m" LIGHTYELLOW="\e[93m" LIGHTBLUE="\e[94m" LIGHTMAGENTA="\e[95m" LIGHTCYAN="\e[96m" BOLD="\e[1m" DIM="\e[2m" UNDERLINED="\e[4m" BLINK="\e[5m" REVERSE="\e[7m" HIDDEN="\e[8m" ENDCOLOUR="\e[0m" } # ================================================================= # reading configuration file # чтение конфигурационного файла # ================================================================= function read_config() { # read_config file.cfg var_name1 var_name2 # ref: https://stackoverflow.com/a/20815951 shopt -s extglob # needed the "one of these"-match below local configfile="${1?No configuration file given}" local keylist="${@:2}" # positional parameters 2 and following if [[ ! -f "$configfile" ]]; then echo >&2 "\"$configfile\" is not a file!" exit 1 fi if [[ ! -r "$configfile" ]]; then echo >&2 "\"$configfile\" is not readable!" exit 1 fi keylist="${keylist// /|}" # this will generate a regex 'one of these' # lhs : "left hand side" : Everything left of the '=' # rhs : "right hand side": Everything right of the '=' # # "lhs" will hold the name of the key you want to read. # The value of "rhs" will be assigned to that key. while IFS='= ' read -r lhs rhs; do # IF lhs in keylist # AND rhs not empty if [[ "$lhs" =~ ^($keylist)$ ]] && [[ -n $rhs ]]; then rhs="${rhs%\"*}" # Del opening string quotes rhs="${rhs#\"*}" # Del closing string quotes rhs="${rhs%\'*}" # Del opening string quotes rhs="${rhs#\'*}" # Del closing string quotes eval $lhs=\"$rhs\" # The magic happens here fi # tr used as a safeguard against dos line endings done <<<$(tr -d '\r' <$configfile) shopt -u extglob # Switching it back off after use } EOF } function chroot_run() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." add_chroot_configuration_files $1 chroot $1 /bin/bash < the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." if grep -qs "$MODULE_MERGED_DIR" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/dev" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/run" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/proc" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/sys" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/dev/pts" /proc/mounts || grep -qs "$MODULE_MERGED_DIR/tmp" /proc/mounts; then echo -e "${BOLD}${LIGHTYELLOW}Chroot contains mounted filesystems.${ENDCOLOUR}" if [ "$UNATTENDED" = "1" ]; then module_chroot_umount_fs else read -r -p "$(echo -e ""Do you want to ${GREEN}unmount them${ENDCOLOUR}? [${BOLD}${GREEN}Y${ENDCOLOUR}/n])" response response=${response,,} if [[ "$response" =~ ^(no|n)$ ]]; then exit 1 else module_chroot_umount_fs fi fi fi } # ================================================================= # # # ================================================================= function module_check_build_dir() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." if [ "$UNATTENDED" = "1" ]; then #echo -e "${RED}!!!Unattended installation!!!${ENDCOLOUR}" echo -e "The working directory is ${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR}." if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then module_cleanup module_check_mounted fi else # ▼ должно быть только перенаправление ошибки! if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} is not empty." module_cleanup module_check_mounted echo -e "The working directory is ${MAGENTA}$MODULE_MERGED_DIR${ENDCOLOUR}." else module_check_mounted echo -e "The working directory is ${MAGENTA}$MODULE_MERGED_DIR${ENDCOLOUR}." fi fi } # ================================================================= # # # ================================================================= function module_chroot_mount_fs() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." local MODULES MODULE_LOWER_DIR module_check_mounted mkdir -p $MODULES_DIR mount -t tmpfs none $MODULES_DIR MODULES_LIST="" MODULES=(/run/initramfs/memory/bundles/*.$BEXT) for ((i = ${#MODULES[@]} - 1; i >= 0; i--)); do MODULE_LOWER_DIR=$(basename ${MODULES[$i]} .$BEXT) mkdir -p $MODULES_DIR/lower/$MODULE_LOWER_DIR-lower mount -o bind ${MODULES[$i]} $MODULES_DIR/lower/$MODULE_LOWER_DIR-lower MODULES_LIST=$MODULES_LIST":""$MODULES_DIR/lower/$MODULE_LOWER_DIR-lower" done MODULES_LIST=${MODULES_LIST:1} mkdir -p $MODULE_UPPER_DIR $MODULE_WORK_DIR $MODULE_MERGED_DIR mount -t overlay overlay -o lowerdir=$MODULES_LIST,upperdir=$MODULE_UPPER_DIR,workdir=$MODULE_WORK_DIR $MODULE_MERGED_DIR if [ ! -d $MODULE_MERGED_DIR/dev ]; then mkdir -p $MODULE_MERGED_DIR/dev fi if [ ! -d $MODULE_MERGED_DIR/run ]; then mkdir -p $MODULE_MERGED_DIR/run fi if [ ! -d $MODULE_MERGED_DIR/proc ]; then mkdir -p $MODULE_MERGED_DIR/proc fi if [ ! -d $MODULE_MERGED_DIR/sys ]; then mkdir -p $MODULE_MERGED_DIR/sys fi if [ ! -d $MODULE_MERGED_DIR/tmp ]; then mkdir -p $MODULE_MERGED_DIR/tmp fi mount --bind /dev $MODULE_MERGED_DIR/dev echo "nameserver 8.8.8.8" >$MODULE_MERGED_DIR/etc/resolv.conf mount none -t proc $MODULE_MERGED_DIR/proc mount none -t sysfs $MODULE_MERGED_DIR/sys mount none -t devpts $MODULE_MERGED_DIR/dev/pts mount none -t tmpfs $MODULE_MERGED_DIR/tmp } # ================================================================= # # # ================================================================= function module_chroot_umount_fs() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." local MODULES MODULE_LOWER_DIR set +e if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then umount $MODULE_MERGED_DIR/proc umount $MODULE_MERGED_DIR/sys umount $MODULE_MERGED_DIR/dev/pts umount $MODULE_MERGED_DIR/tmp umount $MODULE_MERGED_DIR/dev rm -f $MODULE_UPPER_DIR/etc/resolv.conf umount $MODULE_MERGED_DIR umount $MODULES_DIR/lower/* umount $MODULES_DIR else umount $MODULE_MERGED_DIR/proc >>$OUTPUT 2>&1 umount $MODULE_MERGED_DIR/sys >>$OUTPUT 2>&1 umount $MODULE_MERGED_DIR/dev/pts >>$OUTPUT 2>&1 umount $MODULE_MERGED_DIR/tmp >>$OUTPUT 2>&1 umount $MODULE_MERGED_DIR/dev >>$OUTPUT 2>&1 rm -f $MODULE_UPPER_DIR/etc/resolv.conf >>$OUTPUT 2>&1 umount $MODULE_MERGED_DIR >>$OUTPUT 2>&1 umount $MODULES_DIR/lower/* >>$OUTPUT 2>&1 umount $MODULES_DIR >>$OUTPUT 2>&1 fi set -e module_check_mounted } # ================================================================= # # # ================================================================= function module_cleanup() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." if [ "$UNATTENDED" = "1" ]; then module_check_mounted rm -rf $MODULE_UPPER_DIR if [ -d "$MODULE_UPPER_DIR" ]; then module_cleanup fi else read -r -p "$(echo -e ""Do you want to ${BOLD}${RED}completely remove content${ENDCOLOUR} of ${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR}? [y/${BOLD}${GREEN}N${ENDCOLOUR}])" response response=${response,,} if [[ "$response" =~ ^(yes|y)$ ]]; then module_check_mounted rm -rf $MODULE_UPPER_DIR if [ -d "$MODULE_UPPER_DIR" ]; then module_cleanup fi else echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} should be empty to continue." exit 1 fi fi } # ================================================================= # # # ================================================================= function module_chroot_finish_up() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." chroot $MODULE_MERGED_DIR /bin/bash -x <>$OUTPUT 2>&1 dpkg-divert --rename --remove /sbin/initctl >>$OUTPUT 2>&1 EOF fi if [ -d $MODULE_UPPER_DIR/home/live ]; then chown 1000:1000 $MODULE_UPPER_DIR/home/live chown -R 1000:1000 $MODULE_UPPER_DIR/home/live fi } function chroot_cleanup() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." set +eu rm -f $1/functions rm -f $1/$LIVEKITNAME.conf rm -f $1/preinstall rm -f $1/install rm -f $1/install2 rm -f $1/cleanup rm -f $1/$PACKAGE_VARIANT.list rm -f $1/postinstall rm -rf $1/rootcopy-install rm -rf $1/rootcopy rm -rf $1/patches rm -f $1/etc/fstab rm -f $1/etc/mtab rm -f $1/etc/apt/sources.list~ rm -Rf $1/etc/systemd/system/timers.target.wants rm -f $1/etc/systemd/system/multi-user.target.wants/ssh.service rm -f $1/etc/systemd/system/multi-user.target.wants/dnsmasq.service rm -f $1/etc/ssh/ssh_host* rm -f $1/var/backups/* rm -f $1/var/cache/ldconfig/* rm -f $1/var/cache/debconf/* rm -f $1/var/cache/fontconfig/* rm -f $1/var/lib/apt/extended_states rm -f $1/var/lib/systemd/random-seed rm -f $1/var/lib/apt/lists/deb.* rm -Rf $1/root/.local/share/mc rm -Rf $1/root/.cache rm -f $1/root/.wget-hsts rm -f $1/var/lib/dpkg/*-old rm -f $1/var/log/* rm -f $1/var/log/*/* rm -f $1/var/log/*/*/* rm -f $1/var/cache/apt/archives/*.deb rm -f $1/var/cache/apt/*.bin rm -f $1/var/cache/debconf/*-old rm -f $1/var/lib/dhcp/dhclient.leases rm -f $1/root/.bash_history rm -f $1/root/.wget-hsts rm -Rf $1/usr/share/doc/* rm -Rf $1/usr/share/info/* rm -f $1/usr/share/images/fluxbox/debian-squared.jpg rm -Rf $1/usr/share/fluxbox/nls/??* rm -Rf $1/usr/share/gnome/help rm -Rf $1/usr/share/locale/?? rm -Rf $1/usr/share/locale/??_* rm -Rf $1/usr/share/locale/??@* rm -Rf $1/usr/share/locale/??? rm -Rf $1/usr/share/i18n/locales/*_* rm -Rf $1/usr/share/man/?? rm -Rf $1/usr/share/man/*_* rm -Rf $1/usr/share/icons/elementaryXubuntu-dark rm -Rf $1/usr/share/icons/gnome/256x256 rm $1/usr/share/applications/compton.desktop rm $1/usr/share/applications/debian-uxterm.desktop rm $1/usr/share/applications/debian-xterm.desktop rm $1/usr/share/applications/htop.desktop rm $1/usr/share/applications/mc.desktop rm $1/usr/share/applications/mcedit.desktop rm $1/usr/share/applications/pcmanfm-desktop-pref.desktop rm $1/usr/share/applications/python2.7.desktop rm $1/usr/share/applications/python3.7.desktop rm $1/usr/share/applications/vim.desktop uncompress_files $1/etc/alternatives uncompress_files $1/usr/share/man remove_broken_links $1/etc/alternatives remove_broken_links $1/usr/share/man set -eu } # ================================================================= # # # ================================================================= function module_build_cleanup() { echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..." if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then chroot_cleanup $MODULE_UPPER_DIR else chroot_cleanup $MODULE_UPPER_DIR >>$OUTPUT 2>&1 fi } # ================================================================= # # # ================================================================= function build_modules() { current_process MODULES_DIR=$CURRENT_DIR/build if [ -d $CURRENT_DIR/modules ]; then cd $CURRENT_DIR/modules else help fi for MODULE in *; do MODULE_UPPER_DIR="$MODULES_DIR/$MODULE-upper" MODULE_WORK_DIR="$MODULES_DIR/$MODULE-work" MODULE_MERGED_DIR="$MODULES_DIR/$MODULE-merged" module_check_build_dir module_chroot_mount_fs if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then chroot_run $MODULE_MERGED_DIR $APT_CMD update else chroot_run $MODULE_MERGED_DIR $APT_CMD update >>$OUTPUT 2>&1 fi # run pre-install script if [ -f $SCRIPT_DIR/linux-live/modules/$MODULE/preinstall ]; then if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then cp $SCRIPT_DIR/linux-live/modules/$MODULE/preinstall $MODULE_MERGED_DIR/preinstall chmod +x $MODULE_MERGED_DIR/preinstall chroot_run $MODULE_MERGED_DIR /preinstall else cp $SCRIPT_DIR/linux-live/modules/$MODULE/preinstall $MODULE_MERGED_DIR/preinstall chmod +x $MODULE_MERGED_DIR/preinstall chroot_run $MODULE_MERGED_DIR /preinstall >>$OUTPUT 2>&1 fi fi # copy files if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then if [ "$(ls -A $CURRENT_DIR/modules/$MODULE/rootcopy-install)" != "" ]; then (cd $CURRENT_DIR/modules/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/) fi else if [ "$(ls -A $CURRENT_DIR/modules/$MODULE/rootcopy-install)" != "" ] >>$OUTPUT 2>&1; then (cd $CURRENT_DIR/modules/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/) fi fi # run install script if [ -f $CURRENT_DIR/modules/$MODULE/install ]; then cp $CURRENT_DIR/modules/$MODULE/install $MODULE_MERGED_DIR/install chmod +x $MODULE_MERGED_DIR/install if [ -f $CURRENT_DIR/modules/$MODULE/cleanup ]; then cp $CURRENT_DIR/modules/$MODULE/cleanup $MODULE_MERGED_DIR/cleanup fi if [ -f $CURRENT_DIR/modules/$MODULE/$PACKAGE_VARIANT.list ]; then cp $CURRENT_DIR/modules/$MODULE/$PACKAGE_VARIANT.list $MODULE_MERGED_DIR/$PACKAGE_VARIANT.list fi if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then chroot_run $MODULE_MERGED_DIR /install else chroot_run $MODULE_MERGED_DIR /install >>$OUTPUT 2>&1 fi fi # run install2 script if [ -f $CURRENT_DIR/modules/$MODULE/install2 ]; then cp $CURRENT_DIR/modules/$MODULE/install2 $MODULE_MERGED_DIR/install2 chmod +x $MODULE_MERGED_DIR/install2 if [ "$(ls -A $CURRENT_DIR/modules/$MODULE/patches)" != "" ] >>$OUTPUT 2>&1; then mkdir $MODULE_MERGED_DIR/patches (cd $CURRENT_DIR/modules/$MODULE/patches && cp --parents -afr * $MODULE_MERGED_DIR/patches/) fi if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then chroot_run $MODULE_MERGED_DIR /install2 else chroot_run $MODULE_MERGED_DIR /install2 >>$OUTPUT 2>&1 fi fi # copy files if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then if [ "$(ls -A $CURRENT_DIR/modules/$MODULE/rootcopy-postinstall)" != "" ]; then (cd $CURRENT_DIR/modules/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/) fi else if [ "$(ls -A $CURRENT_DIR/modules/$MODULE/rootcopy-postinstall)" != "" ] >>$OUTPUT 2>&1; then (cd $CURRENT_DIR/modules/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/) fi fi # run post-install script if [ -f $CURRENT_DIR/modules/$MODULE/postinstall ]; then cp $CURRENT_DIR/modules/$MODULE/postinstall $MODULE_MERGED_DIR/postinstall chmod +x $MODULE_MERGED_DIR/postinstall if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then chroot_run $MODULE_MERGED_DIR /postinstall else chroot_run $MODULE_MERGED_DIR /postinstall >>$OUTPUT 2>&1 fi fi module_chroot_finish_up module_build_cleanup if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then mksquashfs $MODULE_UPPER_DIR $CURRENT_DIR/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit else echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} ${RED}is empty${ENDCOLOUR}. Nothing to do." fi module_chroot_umount_fs done } function repack_module() { cd $CURRENT_DIR OLD_MODULE=$MODULE MODULE=${MODULE%"-$OLD_COMP_TYPE.$BEXT"} if [ $COMP_TYPE = $OLD_COMP_TYPE ]; then echo "The module is already in the required compression format." && exit fi if (ls $CURRENT_DIR/*.$BEXT | grep -q $MODULE 2>/dev/null); then echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}" echo -e "Please remove $CURRENT_DIR/$MODULE-$COMP_TYPE.$BEXT${ENDCOLOUR} if you want to build ${MAGENTA}$MODULE${ENDCOLOUR}." echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}" else mksquashfs /run/initramfs/memory/bundles/$OLD_MODULE $CURRENT_DIR/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit fi } function repack_system() { current_process cd /run/initramfs/memory/bundles/ for MODULE in *; do if (ls /run/initramfs/memory/bundles/*-xz.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then OLD_COMP_TYPE="xz" repack_module elif (ls /run/initramfs/memory/bundles/*-lz4.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then OLD_COMP_TYPE="lz4" repack_module elif (ls /run/initramfs/memory/bundles/*-zstd.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then OLD_COMP_TYPE="zstd" repack_module fi done }