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.
 
 
 
 
 
 

1860 lines
63 KiB

#!/bin/bash
# Functions library :: for install scripts
# Author: crims0n. <http://minios.ru>
#
# =================================================================
# =================================================================
# ========================= VARIABLES =============================
# =================================================================
# =================================================================
function common_variables() {
#
CONTAINER_TYPE="0"
set +u
if [ -z $container ]; then
container=""
fi
set -u
: 'if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
OUTPUT="/dev/stdout"
#CONTAINER="docker"
fi'
if [ -f /.dockerenv ] || [ "$container" = "podman" ] && [ ! -d /opt/minios-live ] && [ ! -f /.minios-live-container ]; then
CONTAINER_TYPE="1"
fi
if [[ (-f /.dockerenv || "$container" = "podman") && (-d /opt/minios-live || -f /.minios-live-container) ]]; then
CONTAINER_TYPE="2"
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 grep 'LANG="ru_RU.UTF-8"' /etc/default/locale >>$OUTPUT; then
if [ -z ${1+x} ]; then
echo -e "${LIGHTYELLOW}Этот скрипт собирает загружаемый ISO образ $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Примеры:${LIGHTYELLOW}$0 build_bootstrap - build_chroot${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 - build_chroot${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 build_bootstrap -${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 build_iso${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 -${ENDCOLOUR}"
exit 0
else
if [ -z ${1+x} ]; then
echo -e "${LIGHTYELLOW}This script builds bootable $SYSTEMNAME ISO image.${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 "\tExamples:${LIGHTYELLOW}$0 build_bootstrap - build_chroot${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 - build_chroot${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 build_bootstrap -${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 build_iso${ENDCOLOUR}"
echo -e "\t\t${LIGHTYELLOW}$0 -${ENDCOLOUR}"
exit 0
fi
}
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"
}
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
}
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
}
# =================================================================
# check if filesystems are unmounted inside chroot
# проверяем, размонтированы ли файловые системы внутри chroot
# =================================================================
function check_mounted() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if grep -qs "$BUILD_DIR/dev" /proc/mounts || grep -qs "$BUILD_DIR/run" /proc/mounts || grep -qs "$BUILD_DIR/proc" /proc/mounts || grep -qs "$BUILD_DIR/sys" /proc/mounts || grep -qs "$BUILD_DIR/dev/pts" /proc/mounts || grep -qs "$BUILD_DIR/tmp" /proc/mounts; then
echo -e "${BOLD}${LIGHTYELLOW}Сhroot contains mounted filesystems.${ENDCOLOUR}"
if [ "$UNATTENDED" = "1" ]; then
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
chroot_umount_fs
fi
fi
fi
}
# =================================================================
# check if the folder where the installation will be performed is empty
# проверяем, пуста ли папка, в которую будет производиться установка
# =================================================================
function check_build_dir() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ "$UNATTENDED" = "1" ]; then
#echo -e "${RED}!!!Unattended installation!!!${ENDCOLOUR}"
BUILD_DIR="/build/$DISTRIBUTION"
echo -e "The working directory is ${MAGENTA}$BUILD_DIR${ENDCOLOUR}."
if [ "$(ls -A $BUILD_DIR)" != "" ]; then
cleanup
check_mounted
fi
else
# ▼ должно быть только перенаправление ошибки!
if [ "$(ls -A $BUILD_DIR)" != "" ]; then
echo -e "${MAGENTA}$BUILD_DIR${ENDCOLOUR} is not empty."
cleanup
check_mounted
if [ ! -d "$BUILD_DIR" ]; then
mkdir -p $BUILD_DIR
fi
BUILD_DIR="$(
cd $BUILD_DIR
pwd
)"
echo $BUILD_DIR >$SCRIPT_DIR/.build_dir && chmod 644 $SCRIPT_DIR/.build_dir
echo -e "The working directory is ${MAGENTA}$BUILD_DIR${ENDCOLOUR}."
else
mkdir -p $BUILD_DIR
check_mounted
BUILD_DIR="$(
cd $BUILD_DIR
pwd
)"
echo $BUILD_DIR >$SCRIPT_DIR/.build_dir && chmod 644 $SCRIPT_DIR/.build_dir
echo -e "The working directory is ${MAGENTA}$BUILD_DIR${ENDCOLOUR}."
fi
fi
}
# =================================================================
# configure the build folder
# настраиваем папку для сборки
# =================================================================
function setup_build_dir() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ "$UNATTENDED" = "1" ] && [ "$BUILD_DIR" = "" ]; then
BUILD_DIR="/build/$DISTRIBUTION"
check_build_dir
else
if [ "$BUILD_DIR" = "" ]; then
if [ ! -f "$SCRIPT_DIR/.build_dir" ]; then
echo "Enter the address of the working directory where we will build the system"
read -r -p "$(echo -e "(Default is ${MAGENTA}$PARENT_DIR/$DISTRIBUTION${ENDCOLOUR}): ")" response
BUILD_DIR=${response,,}
if [ "$BUILD_DIR" = "" ]; then
BUILD_DIR=$PARENT_DIR/$DISTRIBUTION
fi
check_build_dir
else
LAST_BUILD_DIR=$(cat "$SCRIPT_DIR/.build_dir")
echo -e "Last time you used the build directory ${MAGENTA}$LAST_BUILD_DIR${ENDCOLOUR}."
read -r -p "$(echo -e ""Do you want to use it again? [${BOLD}${GREEN}Y${ENDCOLOUR}/n])" response
response=${response,,}
if [[ "$response" =~ ^(no|n)$ ]]; then
echo "Enter the address of the working directory where we will build the system"
read -r -p "$(echo -e "(Default is ${MAGENTA}$PARENT_DIR/$DISTRIBUTION${ENDCOLOUR}): ")" response
BUILD_DIR=${response,,}
if [ "$BUILD_DIR" = "" ]; then
BUILD_DIR=$PARENT_DIR/$DISTRIBUTION
fi
check_build_dir
else
BUILD_DIR="$LAST_BUILD_DIR"
check_build_dir
fi
fi
fi
fi
}
function cleanup() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ "${CMD[ii]}" = "setup_host" ] || [ "${CMD[ii]}" = "build_bootstrap" ] || [ "${CMD[ii]}" = "build_chroot" ]; then
if [ "$UNATTENDED" = "1" ]; then
check_mounted
rm -rf $BUILD_DIR
if [ -d "$BUILD_DIR" ]; then
cleanup
fi
else
read -r -p "$(echo -e ""Do you want to ${BOLD}${RED}completely remove content${ENDCOLOUR} of ${MAGENTA}$BUILD_DIR${ENDCOLOUR}? [y/${BOLD}${GREEN}N${ENDCOLOUR}])" response
response=${response,,}
if [[ "$response" =~ ^(yes|y)$ ]]; then
check_mounted
rm -rf $BUILD_DIR
if [ -d "$BUILD_DIR" ]; then
cleanup
fi
else
echo -e "${MAGENTA}$BUILD_DIR${ENDCOLOUR} should be empty to continue."
exit 1
fi
fi
fi
}
# =================================================================
# mount filesystems inside chroot
# монтируем файловые системы внутри chroot
# =================================================================
function chroot_mount_fs() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
#if [ ! -d $BUILD_DIR/dev ]; then
# mkdir $BUILD_DIR/dev
#fi
check_mounted
: 'if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
ln -s /dev $BUILD_DIR/dev
ln -s /run $BUILD_DIR/run
ln -s /proc $BUILD_DIR/proc
ln -s /sys $BUILD_DIR/sys
ln -s /tmp $BUILD_DIR/tmp
else'
mount --bind /dev $BUILD_DIR/dev
mount --bind /run $BUILD_DIR/run
mount none -t proc $BUILD_DIR/proc
mount none -t sysfs $BUILD_DIR/sys
mount none -t devpts $BUILD_DIR/dev/pts
mount none -t tmpfs $BUILD_DIR/tmp
#fi
}
# =================================================================
# unmount filesystems inside chroot
# размонтируем файловые системы внутри chroot
# =================================================================
function chroot_umount_fs() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
: 'if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
set +e
rm -f $BUILD_DIR/dev >>$OUTPUT 2>&1
rm -f $BUILD_DIR/run >>$OUTPUT 2>&1
rm -f $BUILD_DIR/proc >>$OUTPUT 2>&1
rm -f $BUILD_DIR/sys >>$OUTPUT 2>&1
rm -f $BUILD_DIR/tmp >>$OUTPUT 2>&1
set -e
else'
set +e
umount $BUILD_DIR/proc >>$OUTPUT 2>&1
umount $BUILD_DIR/sys >>$OUTPUT 2>&1
umount $BUILD_DIR/dev/pts >>$OUTPUT 2>&1
umount $BUILD_DIR/tmp >>$OUTPUT 2>&1
umount $BUILD_DIR/dev >>$OUTPUT 2>&1
umount $BUILD_DIR/run >>$OUTPUT 2>&1
set -e
#fi
check_mounted
}
function remove_log_file() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ -f $LOGPATH/$LIVEKITNAME.log ]; then
rm -f $LOGPATH/$LIVEKITNAME.log
fi
if [ -f $BUILD_DIR/$LIVEKITNAME.log ]; then
rm -f $BUILD_DIR/$LIVEKITNAME.log
fi
}
function create_backup() {
if [ $CREATE_BACKUP = "1" ]; then
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ ! -f $SCRIPT_DIR/.script_version ]; then
cat "1" >$SCRIPT_DIR/.script_version >>$OUTPUT 2>&1
chmod 644 $SCRIPT_DIR/.script_version >>$OUTPUT 2>&1
fi
DATE=$(date +%Y%m%d_%H%M)
CHANGED="0"
rm -rf $SCRIPT_DIR/iso >>$OUTPUT 2>&1
rm -f $SCRIPT_DIR/.build_dir >>$OUTPUT 2>&1
rm -f $SCRIPT_DIR/*.log >>$OUTPUT 2>&1
if [ ! -d $PARENT_DIR/minios-live-current ]; then
CHANGED="1"
mkdir -p $PARENT_DIR/minios-live-current
(cd $SCRIPT_DIR && cp --parents -afr * $PARENT_DIR/minios-live-current)
else
for file in $(find $SCRIPT_DIR -path $SCRIPT_DIR/.git -prune -false -o -type f | sed "s,$SCRIPT_DIR/,,g" | sed "s,.script_version,,g"); do
if ! cmp $SCRIPT_DIR/$file $PARENT_DIR/minios-live-current/$file >>$OUTPUT 2>&1; then
CHANGED="1"
echo -e "$file has been modified since last backup." >>$OUTPUT 2>&1
echo -e "Copying $SCRIPT_DIR/$file to $PARENT_DIR/minios-live-current/$file..." >>$OUTPUT 2>&1
cp -f $SCRIPT_DIR/$file $PARENT_DIR/minios-live-current/$file >>$OUTPUT 2>&1
fi
done
fi
if [ $CHANGED = "1" ]; then
SCRIPT_VERSION=$(cat $SCRIPT_DIR/.script_version)
echo $(($SCRIPT_VERSION + 1)) >$SCRIPT_DIR/.script_version
echo $(($SCRIPT_VERSION + 1)) >$PARENT_DIR/minios-live-current/.script_version
cd $SCRIPT_DIR >>$OUTPUT 2>&1
rm -f $PARENT_DIR/minios-live-current.tar.gz
tar -czf $PARENT_DIR/minios-live-current.tar.gz ./ >>$OUTPUT 2>&1
cp $PARENT_DIR/minios-live-current.tar.gz $PARENT_DIR/minios-live-v$SCRIPT_VERSION-$DATE.tar.gz >>$OUTPUT 2>&1
fi
fi
}
function new_run() {
DATE=$(date +"%Y.%m.%d %H:%M")
echo ""
echo "=================================================================" >>$OUTPUT 2>&1
echo "=================================================================" >>$OUTPUT 2>&1
echo "============================ NEW RUN ============================" >>$OUTPUT 2>&1
echo "======================== $DATE =======================" >>$OUTPUT 2>&1
echo "=================================================================" >>$OUTPUT 2>&1
echo "======= If during the installation you get an error that ========" >>$OUTPUT 2>&1
echo "=== /dev/stdout is not available, try using a bionic or xenial ==" >>$OUTPUT 2>&1
echo "================= based container to install. ===================" >>$OUTPUT 2>&1
echo "=================================================================" >>$OUTPUT 2>&1
echo "=================================================================" >>$OUTPUT 2>&1
echo ""
}
# =================================================================
# =================================================================
# ====================== HOST FUNCTIONS ===========================
# =================================================================
# =================================================================
function create_apt_list() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ ! -f $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list ]; then
cp -f $SCRIPT_DIR/linux-live/aptsources/sources.list $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list
sed -i "s,distro,$DISTRIBUTION,g" $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list
sed -i "s,http://ru.archive.ubuntu.com/ubuntu,$DISTRIBUTION_URL,g" $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list
fi
}
function build_bootstrap() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
debootstrap --arch=$DISTRIBUTION_ARCH --variant=$DISTRIBUTION_VARIANT $DISTRIBUTION $BUILD_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
}
function copy_build_scripts() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
if [ ! -d $BUILD_DIR/linux-live ]; then
mkdir -p $BUILD_DIR/linux-live
(cd $SCRIPT_DIR/linux-live && cp --parents -afr * $BUILD_DIR/linux-live)
else
#for file in $(ls $SCRIPT_DIR/linux-live -p | grep -v /); do
for file in $(find $SCRIPT_DIR/linux-live -type f | sed "s,$SCRIPT_DIR/linux-live/,,g"); do
if ! cmp $SCRIPT_DIR/linux-live/$file $BUILD_DIR/linux-live/$file >>$OUTPUT 2>&1; then
echo -e "$file has been modified since last build run." >>$OUTPUT 2>&1
echo -e "Copying $SCRIPT_DIR/linux-live/$file to $BUILD_DIR/linux-live/$file..." >>$OUTPUT 2>&1
cp -f $SCRIPT_DIR/linux-live/$file $BUILD_DIR/linux-live/$file >>$OUTPUT 2>&1
fi
done
fi
chmod +x $BUILD_DIR/linux-live/build
chmod +x $BUILD_DIR/linux-live/install_chroot
if [ "$DEV_SYSTEM" = "1" ]; then
if [ ! -d $BUILD_DIR/opt/minios-live ]; then
mkdir -p $BUILD_DIR/opt/minios-live
(cd $SCRIPT_DIR && cp --parents -afr * $BUILD_DIR/opt/minios-live)
else
for file in $(find $SCRIPT_DIR -path $SCRIPT_DIR/.git -prune -false -o -type f | sed "s,$SCRIPT_DIR/,,g"); do
if ! cmp $SCRIPT_DIR/$file $BUILD_DIR/opt/minios-live/$file >>$OUTPUT 2>&1; then
echo -e "$file has been modified since last build run." >>$OUTPUT 2>&1
echo -e "Copying $SCRIPT_DIR/$file to $BUILD_DIR/opt/minios-live/$file..." >>$OUTPUT 2>&1
cp -f $SCRIPT_DIR/$file $BUILD_DIR/opt/minios-live/$file >>$OUTPUT 2>&1
fi
done
fi
fi
}
function preserve_environment_variables() {
if [ -d /opt/minios-live ]; then
chroot $BUILD_DIR /usr/bin/env \
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
fi
}
function build_chroot() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
chroot_mount_fs
copy_build_scripts
create_apt_list
if [ "$OUTPUT"="$LOGPATH/$LIVEKITNAME.log" ] && [ -f /$LIVEKITNAME.log ]; then
mv -f /$LIVEKITNAME.log $BUILD_DIR/$LIVEKITNAME.log
fi
if [ "$OUTPUT"="$LOGPATH/$LIVEKITNAME.log" ] && [ -f $BUILD_DIR/$LIVEKITNAME.log ]; then
echo "===========================================" >>$BUILD_DIR/$LIVEKITNAME.log 2>&1
echo "===========================================" >>$BUILD_DIR/$LIVEKITNAME.log 2>&1
echo "=============== CHROOT LOG ================" >>$BUILD_DIR/$LIVEKITNAME.log 2>&1
echo "===========================================" >>$BUILD_DIR/$LIVEKITNAME.log 2>&1
echo "===========================================" >>$BUILD_DIR/$LIVEKITNAME.log 2>&1
fi
cp -f $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list $BUILD_DIR/etc/apt/sources.list
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
chroot $BUILD_DIR /usr/bin/env \
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 /linux-live/install_chroot -
else
chroot $BUILD_DIR /linux-live/install_chroot -
fi
chroot_umount_fs
if [ "$OUTPUT"="$LOGPATH/$LIVEKITNAME.log" ] && [ -f $BUILD_DIR/$LIVEKITNAME.log ]; then
mv -f $BUILD_DIR/$LIVEKITNAME.log $SCRIPT_DIR/$LIVEKITNAME.log
if [ -f $SCRIPT_DIR/$LIVEKITNAME.log ]; then
echo -e "Installation log was saved to ${MAGENTA}$SCRIPT_DIR/$LIVEKITNAME.log${ENDCOLOUR}"
fi
fi
}
function build_package() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
chroot_mount_fs
#copy_build_scripts
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
chroot $BUILD_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
chroot $BUILD_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/add_pkg.list | tr "\n" " ") >>$OUTPUT 2>&1
else
chroot $BUILD_DIR sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
chroot $BUILD_DIR sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/add_pkg.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
chroot_umount_fs
rm -f $BUILD_DIR/var/lib/apt/extended_states >>$OUTPUT 2>&1
rm -f $BUILD_DIR/var/lib/apt/lists/*Packages* >>$OUTPUT 2>&1
rm -f $BUILD_DIR/var/lib/apt/lists/*Translation* >>$OUTPUT 2>&1
rm -f $BUILD_DIR/var/lib/apt/lists/*InRelease >>$OUTPUT 2>&1
rm -f $BUILD_DIR/var/lib/apt/lists/deb.* >>$OUTPUT 2>&1
rm -f $BUILD_DIR/var/lib/dpkg/*-old >>$OUTPUT 2>&1
}
function build_initrd() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
(cd $SCRIPT_DIR/linux-live/rootcopy-casper && cp --parents -afr * $BUILD_DIR/)
chroot_mount_fs
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
chroot $BUILD_DIR /usr/bin/env \
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 update-initramfs -u
else
chroot $BUILD_DIR update-initramfs -u
fi
chroot_umount_fs
}
function build_live() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
remove_log_file
if [ $LIVE_TYPE = "livekit" ]; then
copy_build_scripts
check_build_dir
#(cd /linux-live/rootcopy && cp --parents -afr * /)
chroot $BUILD_DIR mount none -t proc /proc
chroot $BUILD_DIR /linux-live/initrfs
chroot $BUILD_DIR umount /proc
rm -rf $PARENT_DIR/image
mkdir -p $PARENT_DIR/image/$LIVEKITNAME/{boot,changes,modules}
# copy kernel files
cp $BUILD_DIR/boot/vmlinuz-**-**-generic $PARENT_DIR/image/$LIVEKITNAME/boot/vmlinuz
mv $BUILD_DIR/boot/initrfs.img $PARENT_DIR/image/$LIVEKITNAME/boot/initrfs.img
cp -r $SCRIPT_DIR/linux-live/bootfiles/* $PARENT_DIR/image/
cat <<'EOF' >$PARENT_DIR/image/boot/grub/grub.cfg
set default="0"
set timeout="10"
set hidden_timeout_quiet=false
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
set color_normal=black/black
set color_highlight=black/white
loadfont /boot/grub/unicode.pf2
background_image /boot/grub/bootlogo.png
set default_settings="load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 consoleblank=0 apparmor=0 net.ifnames=0 biosdevname=0"
set perch_settings="slax.flags=perch,automount"
set live_settings="slax.flags=automount"
set ram_settings="slax.flags=toram"
set debug_settings="load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 debug net.ifnames=0 biosdevname=0"
set linux_64="/minios/boot/vmlinuz"
set initrd_img="/minios/boot/initrfs.img"
set default=0
set message="Загружаем ядро и рамдиск... Подождите..."
menuentry "Запуск MiniOS с сохранением изменений"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $perch_settings
initrd $initrd_img
}
menuentry "Запуск MiniOS в чистом режиме"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $live_settings
initrd $initrd_img
}
menuentry "Запуск MiniOS с загрузкой в RAM"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $ram_settings
initrd $initrd_img
}
menuentry "Запуск MiniOS в режиме отладки"{
echo $message
search --set -f $linux_64
linux $linux_64 $debug_settings
initrd $initrd_img
}
EOF
cat <<'EOF' | iconv -f 'UTF-8' -t "CP866//TRANSLIT" >$PARENT_DIR/image/boot/syslinux/syslinux.cfg
FONT 866_8x16.psf
DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 90
ALLOWOPTIONS 0
ONTIMEOUT default
MENU BACKGROUND bootlogo.png
MENU COLOR border 30;44 #00000000 #00000000 none
MENU COLOR unsel 37;44 #901E1E1E #00000000 std
MENU COLOR sel 7;37;40 #ff1E1E1E #99006693 all
MENU COLOR hotsel 1;7;37;40 #55555555 #99006693 all
LABEL default
MENU LABEL Запуск MiniOS с сохранением изменений
KERNEL /minios/boot/vmlinuz
APPEND vga=normal initrd=/minios/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 consoleblank=0 slax.flags=perch,automount apparmor=0 net.ifnames=0 biosdevname=0
LABEL live
MENU LABEL Запуск MiniOS в чистом режиме
KERNEL /minios/boot/vmlinuz
APPEND vga=normal initrd=/minios/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 consoleblank=0 slax.flags=automount apparmor=0 net.ifnames=0 biosdevname=0
LABEL toram
MENU LABEL Запуск MiniOS с загрузкой в RAM
KERNEL /minios/boot/vmlinuz
APPEND vga=normal initrd=/minios/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 consoleblank=0 slax.flags=toram apparmor=0 net.ifnames=0 biosdevname=0
LABEL debug
MENU LABEL Запуск MiniOS в режиме отладки
KERNEL /minios/boot/vmlinuz
APPEND vga=normal initrd=/minios/boot/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 debug net.ifnames=0 biosdevname=0
EOF
# create compressed 01-core.sb
cd $BUILD_DIR
COREFS=""
for i in $MKMOD; do
if [ -d /$i ]; then
COREFS="$COREFS $i"
fi
done
mksquashfs $COREFS $PARENT_DIR/image/$LIVEKITNAME/01-core-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -keep-as-directory -noappend || exit
elif [ $LIVE_TYPE = "casper" ]; then
chroot $BUILD_DIR passwd -l root
if cat $BUILD_DIR/etc/passwd | grep /home/live; then
chroot $BUILD_DIR userdel live
fi
chroot $BUILD_DIR /bin/bash -x <<EOF
if [ -f /etc/systemd/system/multi-user.target.wants/grub-initrd-fallback.service ]; then
echo "Enable grub-initrd-fallback.service autostart."
systemctl enable grub-initrd-fallback.service
fi
EOF
rm -rf $BUILD_DIR/linux-live
rm -rf $PARENT_DIR/image
mkdir -p $PARENT_DIR/image/casper
# copy kernel files
cp $BUILD_DIR/boot/vmlinuz-**-**-generic $PARENT_DIR/image/casper/vmlinuz
cp $BUILD_DIR/boot/initrd.img-**-**-generic $PARENT_DIR/image/casper/initrd
cp -r $SCRIPT_DIR/linux-live/bootfiles/* $PARENT_DIR/image/
cat <<'EOF' >$PARENT_DIR/image/boot/grub/grub.cfg
set default="0"
set timeout="10"
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
set color_normal=black/black
set color_highlight=black/white
loadfont /boot/grub/unicode.pf2
background_image /boot/grub/bootlogo.png
set default_settings="boot=casper quiet splash net.ifnames=0 biosdevname=0"
set persistent_settings="persistent"
set toram_settings="toram"
set integrity_settings="integrity-check"
set ubiquity_settings="only-ubiquity"
set linux_64="/casper/vmlinuz"
set initrd_img="/casper/initrd"
set message="Загружаем ядро и рамдиск... Подождите..."
menuentry "Запуск MiniOS с сохранением изменений"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $persistent_settings
initrd $initrd_img
}
menuentry "Запуск MiniOS в чистом режиме"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings
initrd $initrd_img
}
menuentry "Запуск MiniOS с загрузкой в RAM"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $toram_settings
initrd $initrd_img
}
menuentry "Установка MiniOS"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $ubiquity_settings
initrd $initrd_img
}
menuentry "Установка MiniOS с загрузкой в RAM"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $toram_settings $ubiquity_settings
initrd $initrd_img
}
menuentry "Проверка диска"{
echo $message
search --set -f $linux_64
linux $linux_64 $default_settings $integrity_settings
initrd $initrd_img
}
EOF
cat <<'EOF' | iconv -f 'UTF-8' -t "CP866//TRANSLIT" >$PARENT_DIR/image/boot/syslinux/syslinux.cfg
FONT 866_8x16.psf
DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 90
ALLOWOPTIONS 0
ONTIMEOUT default
MENU BACKGROUND bootlogo.png
MENU COLOR border 30;44 #00000000 #00000000 none
MENU COLOR unsel 37;44 #901E1E1E #00000000 std
MENU COLOR sel 7;37;40 #ff1E1E1E #99006693 all
MENU COLOR hotsel 1;7;37;40 #55555555 #99006693 all
LABEL default
MENU LABEL Запуск MiniOS с сохранением изменений
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0 persistent
LABEL live
MENU LABEL Запуск MiniOS в чистом режиме
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0
LABEL toram
MENU LABEL Запуск MiniOS с загрузкой в RAM
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0 toram
LABEL install
MENU LABEL Установка MiniOS
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0 only-ubiquity
LABEL toram_install
MENU LABEL Установка MiniOS с загрузкой в RAM
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0 toram only-ubiquity
LABEL integrity
MENU LABEL Проверка диска
KERNEL /casper/vmlinuz
APPEND vga=normal initrd=/casper/initrd boot=casper quiet splash net.ifnames=0 biosdevname=0 integrity-check
EOF
# generate manifest
chroot $BUILD_DIR dpkg-query -W --showformat='${Package} ${Version}\n' | tee $PARENT_DIR/image/casper/filesystem.manifest >>$OUTPUT 2>&1
cp -v $PARENT_DIR/image/casper/filesystem.manifest $PARENT_DIR/image/casper/filesystem.manifest-desktop
sed -i '/ubiquity/d' $PARENT_DIR/image/casper/filesystem.manifest-desktop
sed -i '/casper/d' $PARENT_DIR/image/casper/filesystem.manifest-desktop
sed -i '/discover/d' $PARENT_DIR/image/casper/filesystem.manifest-desktop
sed -i '/laptop-detect/d' $PARENT_DIR/image/casper/filesystem.manifest-desktop
sed -i '/os-prober/d' $PARENT_DIR/image/casper/filesystem.manifest-desktop
# compress rootfs
mksquashfs $BUILD_DIR $PARENT_DIR/image/casper/filesystem.squashfs -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit
printf $(sudo du -sx --block-size=1 $BUILD_DIR | cut -f1) >$PARENT_DIR/image/casper/filesystem.size
# create diskdefines
cat <<EOF >$PARENT_DIR/image/README.diskdefines
#define DISKNAME $SYSTEMNAME
#define TYPE binary
#define TYPEbinary 1
#define ARCH $DISTRIBUTION_ARCH
#define ARCH$DISTRIBUTION_ARCH 1
#define DISKNUM 1
#define DISKNUM1 1
#define TOTALNUM 0
#define TOTALNUM0 1
EOF
# create iso image
pushd $PARENT_DIR/image
/bin/bash -c "(find . -type f -print0 | xargs -0 md5sum | grep -v -e 'md5sum.txt' -e 'bios.img' -e 'efiboot.img' -e 'isolinux.bin' -e 'boot.cat' > md5sum.txt)"
popd
fi
}
function build_iso() {
current_process
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
check_build_dir
if [ "$UNATTENDED" = "1" ]; then
BUILD_DIR="/build/$DISTRIBUTION"
fi
if [ "$BUILD_DIR" = "" ]; then
LAST_BUILD_DIR=$(cat "$SCRIPT_DIR/.build_dir") >>$OUTPUT 2>&1
BUILD_DIR=$LAST_BUILD_DIR
fi
cd $PARENT_DIR/image
if [ ! -d $ISO_DIR ]; then
mkdir -p $ISO_DIR
fi
mkdir -p $ISO_DIR >>$OUTPUT 2>&1
VER=$SYSTEMVER
DATE=$(date +%Y%m%d_%H%M)
DIR=$PARENT_DIR/image
ISO=$ISO_DIR/$LIVEKITNAME-$DISTRIBUTION-$DISTRIBUTION_ARCH-$COMP_TYPE-$LIVE_TYPE-$DATE.iso
B="-b boot/syslinux/isolinux.bin -c boot/syslinux/boot.cat"
C="-no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot"
# ▼ должно быть только перенаправление ошибки!
if [ -x "$(which xorriso 2>>$OUTPUT)" ]; then
M="xorriso -as mkisofs -isohybrid-mbr $DIR/boot/syslinux/isohdpfx.bin"
D=" -isohybrid-gpt-basdat -e"
# ▼ должно быть только перенаправление ошибки!
elif [ -x "$(which genisoimage 2>>$OUTPUT)" ]; then
M=genisoimage
D="-efi-boot"
else
M=mkisofs
D="-eltorito-platform 0xEF -eltorito-boot"
fi
E="EFI/boot/efiboot.img -no-emul-boot"
VER="$SYSTEMNAME $VER"
if [ REMOVE_OLD_ISO = "1" ]; then
rm $ISO_DIR/$LIVEKITNAME-$DISTRIBUTION-$DISTRIBUTION_ARCH-$COMP_TYPE-$LIVE_TYPE-*.iso >>$OUTPUT 2>&1
fi
if
! $M -hide-rr-moved -f -r -J -l -V "$VER" -A "$VER" \
$B $C $D $E -o $ISO $DIR
then
exit 1
fi
echo ">>> $ISO created"
# xorriso has hybridization built-in
if [ "$(echo $M | cut -d" " -f1)" != "xorriso" ]; then
# ▼ должно быть только перенаправление ошибки!
if [ -x "$(which isohybrid 2>>$OUTPUT)" ]; then
isohybrid -uefi $ISO
else
echo ">>> No isohybrid to hybridize this ISO"
fi
fi
if [ $BUILD_TEST_ISO = "1" ]; then
if [ -L $ISO_DIR/$LIVEKITNAME.iso ]; then
rm $ISO_DIR/$LIVEKITNAME.iso
fi
if ln -s $LIVEKITNAME-$DISTRIBUTION-$DISTRIBUTION_ARCH-$COMP_TYPE-$LIVE_TYPE-$DATE.iso $ISO_DIR/$LIVEKITNAME.iso; then
echo ">>> $ISO_DIR/$LIVEKITNAME.iso created"
fi
fi
exit 0
}
# =================================================================
# =================================================================
# ====================== INSTALL FUNCTIONS ========================
# =================================================================
# =================================================================
function setup_host() {
current_process
if [ $CONTAINER_TYPE != "2" ]; then
hostreq_pkg_list
fi
}
function chroot_setup_host() {
current_process
echo $LIVEKITNAME >/etc/hostname
prereq_pkg_list
#configure machine id
dbus-uuidgen >/etc/machine-id >>$OUTPUT 2>&1
ln -fs /etc/machine-id /var/lib/dbus/machine-id >>$OUTPUT 2>&1
# don't understand why, but multiple sources indicate this
dpkg-divert --local --rename --add /sbin/initctl >>$OUTPUT 2>&1
ln -s /bin/true /sbin/initctl >>$OUTPUT 2>&1
}
function hostreq_pkg_list() {
echo -e "${YELLOW}=====> installing required software for host system ...${ENDCOLOUR}"
$APT_CMD update >>$OUTPUT 2>&1
# we need this only for trusty container
: 'if [ $CONTAINER_TYPE = "1" ]; then
touch /.minios-live
$APT_CMD install -y wget patch >>$OUTPUT 2>&1
cd ~
wget -c http://ru.archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_1.0.123ubuntu2_all.deb >>$OUTPUT 2>&1
dpkg -i ~/debootstrap_1.0.123ubuntu2_all.deb >>$OUTPUT 2>&1
cat <<'EOF' >/usr/share/debootstrap/functions.diff
--- functions 2020-10-23 20:42:16.000000000 +0300
+++ functions.new 2021-01-16 23:22:25.612064306 +0300
@@ -1176,7 +1176,9 @@
umount_on_exit /dev/shm
umount_on_exit /proc
umount_on_exit /proc/bus/usb
- umount "$TARGET/proc" 2>/dev/null || true
+ if [ ! -h "$TARGET/proc" ]; then
+ umount "$TARGET/proc" 2>/dev/null || true
+ fi
# some container environment are used at second-stage, it already treats /proc and so on
if [ -z "$(ls -A "$TARGET/proc")" ]; then
EOF
cd /usr/share/debootstrap/
patch </usr/share/debootstrap/functions.diff
fi'
if [ -f $SCRIPT_DIR/linux-live/pkglists/hostreq.list ]; then
#sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install -y \
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/pkglists/hostreq.list | tr "\n" " ") >>$OUTPUT 2>&1
else
#sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install -y sudo debootstrap xorriso >>$OUTPUT 2>&1
fi
}
function prereq_pkg_list() {
echo -e "${YELLOW}=====> installing prerequested software for chroot system ...${ENDCOLOUR}"
if [ -f $SCRIPT_DIR/pkglists/prereq.list ]; then
$APT_CMD update >>$OUTPUT 2>&1 &&
echo -e "${YELLOW}=====> upgrading chroot system ...${ENDCOLOUR}" &&
$APT_CMD upgrade $APT_OPTIONS >>$OUTPUT 2>&1 &&
echo -e "${YELLOW}=====> installing packages ...${ENDCOLOUR}" &&
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/prereq.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
}
function main_pkg_list() {
echo -e "${YELLOW}=====> installing main packages for chroot system ...${ENDCOLOUR}"
if [ -f $SCRIPT_DIR/pkglists/main.list ]; then
#sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
# $APT_CMD update >>$OUTPUT 2>&1 &&
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/main.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
if [ $LIVE_TYPE = "casper" ]; then
if [ -f $SCRIPT_DIR/pkglists/ubuntu-main.list ]; then
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/ubuntu-main.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
if [ -f $SCRIPT_DIR/pkglists/ubuntu-gui.list ]; then
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/ubuntu-gui.list | tr "\n" " ") >>$OUTPUT 2>&1
#$APT_CMD install $APT_OPTIONS /linux-live/packages/chromium_88.0.4324.96~linuxmint1+ulyssa_amd64.deb >>$OUTPUT 2>&1
fi
if [ -f $SCRIPT_DIR/pkglists/ubuntu-ubiquity.list ]; then
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/ubuntu-ubiquity.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
fi
}
function other_pkg_list() {
echo -e "${YELLOW}=====> installing other packages for chroot system ...${ENDCOLOUR}"
if [ $LIVE_TYPE = "casper" ]; then
if [ -f $SCRIPT_DIR/pkglists/ubuntu-other.list ]; then
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/ubuntu-other.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
fi
if [ -f $SCRIPT_DIR/pkglists/other.list ]; then
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/pkglists/other.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
}
function chroot_pkg_install() {
current_process
main_pkg_list
other_pkg_list
# remove unused
$APT_CMD autoremove $APT_OPTIONS >>$OUTPUT 2>&1
# clean up apt cache
$APT_CMD clean $APT_OPTIONS >>$OUTPUT 2>&1
}
function chroot_configure() {
current_process
if [ $LIVE_TYPE = "livekit" ]; then
(cd /linux-live/rootcopy-livekit && cp --parents -afr * /)
echo "Set up password for user 'root'" >>$OUTPUT 2>&1
echo root:toor | chpasswd >>$OUTPUT 2>&1
echo "Set up user 'live'" >>$OUTPUT 2>&1
adduser --gecos '' live --disabled-password >>$OUTPUT 2>&1
echo "Set up password for user 'live'" >>$OUTPUT 2>&1
echo live:evil | chpasswd >>$OUTPUT 2>&1
addgroup live adm >>$OUTPUT 2>&1
addgroup live sudo >>$OUTPUT 2>&1
cat <<EOF >/etc/sudoers.d/90-minios
# live user is default user in minios.
# It needs passwordless sudo functionality.
live ALL=(ALL) NOPASSWD:ALL
EOF
if [ -d /etc/lightdm ]; then
cat <<EOF >/etc/lightdm/lightdm.conf
[Seat:*]
autologin-session=xubuntu
autologin-user=live
autologin-user-timeout=0
EOF
fi
if [ ! -d /etc/NetworkManager ]; then
echo "Enable dhclient.service autostart." >>$OUTPUT 2>&1
cat <<EOF >/lib/systemd/system/dhclient.service
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
After=network-pre.target systemd-sysctl.service systemd-modules-load.service
Before=network.target shutdown.target network-online.target
ConditionPathExists=!/run/initramfs/net.up.flag
[Service]
Type=forking
ExecStart=-/bin/sh -c 'udevadm settle && dhclient -nw'
PIDFile=/run/dhclient.pid
[Install]
WantedBy=multi-user.target
WantedBy=network-online.target
EOF
systemctl enable dhclient >>$OUTPUT 2>&1
fi
if [ -f /etc/systemd/system/multi-user.target.wants/grub-initrd-fallback.service ]; then
echo "Disable grub-initrd-fallback.service autostart."
systemctl disable grub-initrd-fallback.service
fi
if grep openssh-server $SCRIPT_DIR/pkglists/main.list >>$OUTPUT 2>&1 || grep openssh-server $SCRIPT_DIR/pkglists/other.list >>$OUTPUT 2>&1; then
echo "Enable ssh.service autostart." >>$OUTPUT 2>&1
cat <<EOF >/lib/systemd/system/ssh-keygen.service
[Unit]
Description=Generate sshd keys
Before=ssh.service
[Service]
Type=oneshot
ExecStart=/usr/bin/ssh-keygen -A
RemainAfterExit=true
StandardOutput=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl enable ssh-keygen >>$OUTPUT 2>&1
systemctl enable ssh >>$OUTPUT 2>&1
fi
elif [ $LIVE_TYPE = "casper" ]; then
(cd /linux-live/rootcopy-casper && cp --parents -afr * /)
fi
if [ $DEBIAN_FRONTEND_TYPE = "noninteractive" ]; then
# configure console and keyboard
cat <<EOF >/etc/default/console-setup
# CONFIGURATION FILE FOR SETUPCON
# Consult the console-setup(5) manual page.
ACTIVE_CONSOLES="/dev/tty[1-6]"
CHARMAP="UTF-8"
CODESET="guess"
FONTFACE="Fixed"
FONTSIZE="8x16"
VIDEOMODE=
# The following is an example how to use a braille font
# FONT='lat9w-08.psf.gz brl-8x8.psf'
EOF
cat <<EOF >/etc/default/keyboard
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us,ru"
XKBVARIANT=","
XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll"
BACKSPACE="guess"
EOF
dpkg-reconfigure -f noninteractive console-setup >>$OUTPUT 2>&1
# configure timezone
echo "tzdata tzdata/Areas select Europe" | debconf-set-selections -v >>$OUTPUT 2>&1
echo "tzdata tzdata/Zones/Europe select Moscow" | debconf-set-selections -v >>$OUTPUT 2>&1
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=704089
rm -f /etc/localtime /etc/timezone >>$OUTPUT 2>&1
dpkg-reconfigure -f noninteractive tzdata >>$OUTPUT 2>&1
# configure locales
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen >>$OUTPUT 2>&1 &&
sed -i -e 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen >>$OUTPUT 2>&1
# Set system locale
echo "locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8, ru_RU.UTF-8 UTF-8" | debconf-set-selections -v >>$OUTPUT 2>&1
echo "locales locales/default_environment_locale select ru_RU.UTF-8" | debconf-set-selections -v >>$OUTPUT 2>&1
dpkg-reconfigure -f noninteractive locales >>$OUTPUT 2>&1
update-locale LANGUAGE=ru_RU.UTF-8 >>$OUTPUT 2>&1
update-locale LANG=ru_RU.UTF-8 >>$OUTPUT 2>&1
update-locale LC_ALL=ru_RU.UTF-8 >>$OUTPUT 2>&1
if grep localepurge $SCRIPT_DIR/pkglists/main.list >>$OUTPUT 2>&1; then
echo "localepurge localepurge/nopurge debconf-set-selections multiselect en_US.UTF-8, ru_RU.UTF-8" | debconf-set-selections -v >>$OUTPUT 2>&1
echo "localepurge localepurge/use-dpkg-feature boolean true" | debconf-set-selections -v >>$OUTPUT 2>&1
dpkg-reconfigure -f noninteractive localepurge >>$OUTPUT 2>&1
fi
# configure resolvconf
if grep resolvconf $SCRIPT_DIR/pkglists/main.list >>$OUTPUT 2>&1 || grep resolvconf $SCRIPT_DIR/pkglists/other.list || [ $DISTRIBUTION != "xenial" ] >>$OUTPUT 2>&1; then
echo "resolvconf resolvconf/linkify-resolvconf boolean true" | debconf-set-selections
dpkg-reconfigure -f noninteractive resolvconf >>$OUTPUT 2>&1
fi
if [ $LIVE_TYPE = "casper" ]; then
# network manager
cat <<EOF >/etc/NetworkManager/NetworkManager.conf
[main]
rc-manager=resolvconf
plugins=ifupdown,keyfile
dns=dnsmasq
[ifupdown]
managed=false
EOF
dpkg-reconfigure -f noninteractive network-manager >>$OUTPUT 2>&1
fi
elif [ $DEBIAN_FRONTEND_TYPE = "dialog" ]; then
#dpkg-reconfigure console-setup
# configure timezone and locale
#dpkg-reconfigure tzdata
dpkg-reconfigure locales
#dpkg-reconfigure localepurge
#localepurge -v
# configure resolvconf
if grep resolvconf $SCRIPT_DIR/pkglists/main.list >>$OUTPUT 2>&1 || grep resolvconf $SCRIPT_DIR/pkglists/other.list || [ $DISTRIBUTION != "xenial" ] >>$OUTPUT 2>&1; then
dpkg-reconfigure resolvconf
fi
if [ $LIVE_TYPE = "casper" ]; then
# network manager
cat <<EOF >/etc/NetworkManager/NetworkManager.conf
[main]
rc-manager=resolvconf
plugins=ifupdown,keyfile
dns=dnsmasq
[ifupdown]
managed=false
EOF
dpkg-reconfigure network-manager >>$OUTPUT 2>&1
fi
fi
if [ $LIVE_TYPE = "casper" ]; then
update-alternatives --install /usr/share/plymouth/themes/default.plymouth default.plymouth /usr/share/plymouth/themes/minios-logo/minios-logo.plymouth 200
update-alternatives --install /usr/share/plymouth/themes/text.plymouth text.plymouth /usr/share/plymouth/themes/minios-text/minios-text.plymouth 200
update-alternatives --config default.plymouth --skip-auto
if [ $COMP_TYPE = "xz" ]; then
sed -i "s,COMPRESS=lz4,COMPRESS=xz,g" /etc/initramfs-tools/initramfs.conf
fi
update-initramfs -u
if [ $INSTALL_OPTIONAL = "1" ]; then
if [ -f /linux-live/modules/03-apps/package.list ]; then
$APT_CMD update >>$OUTPUT 2>&1 &&
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" /linux-live/modules/03-apps/package.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
if [ "$(ls -A /linux-live/modules/03-apps/rootcopy)" != "" ]; then
(cd /linux-live/modules/03-apps/rootcopy && cp --parents -afr * /)
fi
if [ -f /linux-live/modules/03-apps/postinstall ]; then
chmod +x /linux-live/modules/03-apps/postinstall
/linux-live/modules/03-apps/postinstall
fi
if [ -f /linux-live/modules/04-drivers/package.list ]; then
$APT_CMD update >>$OUTPUT 2>&1 &&
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" /linux-live/modules/04-drivers/package.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
fi
fi
if [ -f /usr/share/xfce4/backdrops/xubuntu-wallpaper.png ]; then
rm /usr/share/xfce4/backdrops/xubuntu-wallpaper.png
fi
if [ ! -d /usr/share/xfce4/backdrops ]; then
mkdir -p /usr/share/xfce4/backdrops
fi
ln -s /usr/share/backgrounds/MiniOS.png /usr/share/xfce4/backdrops/xubuntu-wallpaper.png
}
function chroot_finish_up() {
current_process
# truncate machine id (why??)
truncate -s 0 /etc/machine-id >>$OUTPUT 2>&1
# remove diversion (why??)
rm /sbin/initctl >>$OUTPUT 2>&1
dpkg-divert --rename --remove /sbin/initctl >>$OUTPUT 2>&1
# remove ssh config
#rm -f /etc/ssh/ssh_host*
# clean up useless stuff
rm -rf /tmp/* ~/.bash_history >>$OUTPUT 2>&1
rm -rf ~/.cache
find /var/log/ -type f | xargs rm -f >>$OUTPUT 2>&1
rm -f /etc/ssh/ssh_host*
rm -f /var/backups/* >>$OUTPUT 2>&1
rm -f /var/cache/ldconfig/* >>$OUTPUT 2>&1
#rm -f /var/cache/debconf/* >>$OUTPUT 2>&1
rm -f /var/cache/fontconfig/* >>$OUTPUT 2>&1
rm -f /var/cache/apt/archives/*.deb >>$OUTPUT 2>&1
rm -f /var/cache/apt/*.bin >>$OUTPUT 2>&1
rm -f /var/cache/debconf/*-old >>$OUTPUT 2>&1
rm -f /var/lib/apt/extended_states >>$OUTPUT 2>&1
rm -f /var/lib/apt/lists/*Packages >>$OUTPUT 2>&1
rm -f /var/lib/apt/lists/*Translation* >>$OUTPUT 2>&1
rm -f /var/lib/apt/lists/*InRelease >>$OUTPUT 2>&1
rm -f /var/lib/apt/lists/deb.* >>$OUTPUT 2>&1
rm -f /var/lib/dpkg/*-old >>$OUTPUT 2>&1
}
# =================================================================
# =================================================================
# ======================= MODULE 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}Сhroot 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
#if [ ! -d $MODULE_MERGED_DIR/dev ]; then
# mkdir $MODULE_MERGED_DIR/dev
#fi
module_check_mounted
MODULES_LIST=""
MODULES=($PARENT_DIR/image/$LIVEKITNAME/*.$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 ${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
: 'if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
ln -s /dev $MODULE_MERGED_DIR/dev
ln -s /run $MODULE_MERGED_DIR/run
ln -s /proc $MODULE_MERGED_DIR/proc
ln -s /sys $MODULE_MERGED_DIR/sys
ln -s /tmp $MODULE_MERGED_DIR/tmp
else'
mount --bind /dev $MODULE_MERGED_DIR/dev
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
mkdir -p $MODULE_MERGED_DIR/run/resolvconf
touch $MODULE_MERGED_DIR/run/resolvconf/resolv.conf
mount --bind /etc/resolv.conf $MODULE_MERGED_DIR/run/resolvconf/resolv.conf
else
mount --bind /run $MODULE_MERGED_DIR/run
fi
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
#fi
}
function module_chroot_umount_fs() {
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
local MODULES MODULE_LOWER_DIR
: 'if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
set +e
rm -f $MODULE_MERGED_DIR/dev >>$OUTPUT 2>&1
rm -f $MODULE_MERGED_DIR/run >>$OUTPUT 2>&1
rm -f $MODULE_MERGED_DIR/proc >>$OUTPUT 2>&1
rm -f $MODULE_MERGED_DIR/sys >>$OUTPUT 2>&1
rm -f $MODULE_MERGED_DIR/tmp >>$OUTPUT 2>&1
set -e
else'
set +e
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
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
umount $MODULE_MERGED_DIR/run/resolvconf/resolv.conf >>$OUTPUT 2>&1
rm -f $MODULE_MERGED_DIR/run/resolvconf/resolv.conf
rmdir -f $MODULE_MERGED_DIR/run/resolvconf
else
umount $MODULE_MERGED_DIR/run >>$OUTPUT 2>&1
fi
umount $MODULE_MERGED_DIR >>$OUTPUT 2>&1
set -e
#fi
MODULES=($PARENT_DIR/image/$LIVEKITNAME/*.$BEXT)
for ((i = ${#MODULES[@]} - 1; i >= 0; i--)); do
MODULE_LOWER_DIR=$(basename ${MODULES[$i]} .$BEXT)
umount $MODULES_DIR/lower/$MODULE_LOWER_DIR-lower
done
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() {
current_process
# truncate machine id (why??)
chroot $MODULE_MERGED_DIR /bin/bash -x <<EOF
truncate -s 0 /etc/machine-id
EOF
# remove diversion (why??)
chroot $MODULE_MERGED_DIR /bin/bash -x <<EOF
rm /sbin/initctl >>$OUTPUT 2>&1
dpkg-divert --rename --remove /sbin/initctl >>$OUTPUT 2>&1
EOF
# clean up useless stuff
rm -rf $MODULE_UPPER_DIR/boot $MODULE_UPPER_DIR/dev $MODULE_UPPER_DIR/proc $MODULE_UPPER_DIR/sys $MODULE_UPPER_DIR/rmp $MODULE_UPPER_DIR/run
rm -f $MODULE_UPPER_DIR/root/.bash_history >>$OUTPUT 2>&1
rm -rf $MODULE_UPPER_DIR/.cache
find $MODULE_UPPER_DIR/var/log/ -type f | xargs rm -f >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/etc/ssh/ssh_host*
rm -f $MODULE_UPPER_DIR/var/backups/* >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/cache/ldconfig/* >>$OUTPUT 2>&1
#rm -f $MODULE_UPPER_DIR/var/cache/debconf/* >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/cache/fontconfig/* >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/cache/apt/archives/*.deb >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/cache/apt/*.bin >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/cache/debconf/*-old >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/apt/extended_states >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*Packages >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*Translation* >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*InRelease >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/deb.* >>$OUTPUT 2>&1
rm -f $MODULE_UPPER_DIR/var/lib/dpkg/*-old >>$OUTPUT 2>&1
rm -f /preinstall
rm -f /postinstall
}
function build_modules_chroot() {
current_process
if [ $LIVE_TYPE = "casper" ]; then
return 0
fi
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
MODULES_DIR=$PARENT_DIR/modules
cd $SCRIPT_DIR/linux-live/modules
for MODULE in *; do
if (ls $PARENT_DIR/image/$LIVEKITNAME/*.$BEXT | grep -q $MODULE 2>/dev/null); then
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
echo -e "Please remove ${MAGENTA}$PARENT_DIR/image/$LIVEKITNAME/$MODULE.$BEXT${ENDCOLOUR} if you want to build ${MAGENTA}$MODULE${ENDCOLOUR}."
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
else
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
# run pre-install script
if [ -f $SCRIPT_DIR/linux-live/modules/$MODULE/preinstall ]; then
cp $SCRIPT_DIR/linux-live/modules/$MODULE/preinstall $MODULE_MERGED_DIR/preinstall
chmod +x $MODULE_MERGED_DIR/preinstall
chroot $MODULE_MERGED_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
/preinstall >>$OUTPUT 2>&1
fi
# install packages
if [ -f $SCRIPT_DIR/linux-live/modules/$MODULE/package.list ]; then
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
chroot $MODULE_MERGED_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
chroot $MODULE_MERGED_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/modules/$MODULE/package.list | tr "\n" " ") >>$OUTPUT 2>&1
else
chroot $MODULE_MERGED_DIR sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD update >>$OUTPUT 2>&1 &&
chroot $MODULE_MERGED_DIR sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
$APT_CMD install $APT_OPTIONS \
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/modules/$MODULE/package.list | tr "\n" " ") >>$OUTPUT 2>&1
fi
fi
# copy files
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$MODULE/rootcopy)" != "" ]; then
(cd $SCRIPT_DIR/linux-live/modules/$MODULE/rootcopy && cp --parents -afr * $MODULE_MERGED_DIR/)
fi
# run post-install script
if [ -f $SCRIPT_DIR/linux-live/modules/$MODULE/postinstall ]; then
cp $SCRIPT_DIR/linux-live/modules/$MODULE/postinstall $MODULE_MERGED_DIR/postinstall
chmod +x $MODULE_MERGED_DIR/postinstall
chroot $MODULE_MERGED_DIR /usr/bin/env \
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 \
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
/postinstall >>$OUTPUT 2>&1
fi
module_chroot_finish_up
module_chroot_umount_fs
fi
done
}
function build_modules_live() {
current_process
if [ $LIVE_TYPE = "casper" ]; then
return 0
fi
if [ $CONTAINER_TYPE = "1" ]; then
if [ ! -f /.minios-live ]; then
setup_host
fi
fi
MODULES_DIR=$PARENT_DIR/modules
cd $SCRIPT_DIR/linux-live/modules
for MODULE in *; do
if (ls $PARENT_DIR/image/$LIVEKITNAME/*.$BEXT | grep -q $MODULE 2>/dev/null); then
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
echo -e "Please remove ${MAGENTA}$PARENT_DIR/image/$LIVEKITNAME/$MODULE.$BEXT${ENDCOLOUR} if you want to build ${MAGENTA}$MODULE${ENDCOLOUR}."
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
else
MODULE_UPPER_DIR="$MODULES_DIR/$MODULE-upper"
MODULE_WORK_DIR="$MODULES_DIR/$MODULE-work"
MODULE_MERGED_DIR="$MODULES_DIR/$MODULE-merged"
if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then
# create compressed 01-core.sb
: 'cd $MODULE_UPPER_DIR
COREFS=""
for i in $MKMOD; do
if [ -d /$i ]; then
COREFS="$COREFS $i"
fi
done
mksquashfs $COREFS $PARENT_DIR/image/$LIVEKITNAME/$MODULE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -keep-as-directory -noappend || exit'
mksquashfs $MODULE_UPPER_DIR $PARENT_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit
else
echo -e "${MAGENTA}$BUILD_DIR${ENDCOLOUR} is empty. Nothing to do."
fi
fi
done
}