You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

832 lines
28 KiB

#!/bin/bash
# Functions library :: for install scripts
# Author: crims0n. <http://minios.ru>
#
# =================================================================
# =================================================================
# ========================= 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 <<EOF >/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 <<EOF >$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 <<EOF
. /functions
read_config /$LIVEKITNAME.conf DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS LIVE_TYPE DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE
export DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS LIVE_TYPE DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE
${@:2}
EOF
}
# =================================================================
# =================================================================
# ======================= MODULES FUNCTIONS =======================
# =================================================================
# =================================================================
# =================================================================
#
#
# =================================================================
function module_check_mounted() {
echo -e "=====> 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 <<EOF
truncate -s 0 /etc/machine-id
EOF
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
chroot $MODULE_MERGED_DIR /bin/bash -x <<EOF
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
EOF
else
chroot $MODULE_MERGED_DIR /bin/bash -x <<EOF
rm /sbin/initctl >>$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
}