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.
2381 lines
95 KiB
2381 lines
95 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
|
|
if [ -z $SYSTEM_TYPE ]; then
|
|
SYSTEM_TYPE=""
|
|
fi
|
|
if [ -z $CLOUD ]; then
|
|
CLOUD=false
|
|
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
|
|
|
|
if [ $DISTRIBUTION_ARCH = "amd64" ]; then
|
|
KERNEL_ARCH="amd64"
|
|
#PACKAGE_VARIANT="standard"
|
|
elif [ $DISTRIBUTION_ARCH = "i386" ]; then
|
|
KERNEL_ARCH="686-pae"
|
|
#KERNEL_ARCH="686"
|
|
#PACKAGE_VARIANT="minimal"
|
|
elif [ $DISTRIBUTION_ARCH = "arm64" ]; then
|
|
KERNEL_ARCH="arm64"
|
|
fi
|
|
|
|
if [ $DESKTOP_ENVIRONMENT = "slax" ]; then
|
|
PACKAGE_VARIANT="minimal"
|
|
fi
|
|
|
|
if [ $CLOUD = "true" ]; then
|
|
PACKAGE_VARIANT="cloud"
|
|
fi
|
|
|
|
if [ $DISTRIBUTION_TYPE = "debian" ]; then
|
|
DISTRIBUTION_URL="http://ftp.debian.org/debian"
|
|
elif [ $DISTRIBUTION_TYPE = "ubuntu" ]; then
|
|
DISTRIBUTION_URL="http://archive.ubuntu.com/ubuntu"
|
|
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 >/dev/null 2>&1; 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
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
# 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
|
|
}
|
|
|
|
# =================================================================
|
|
# 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 >/dev/null 2>&1; 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 >/dev/null 2>&1; 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 >/dev/null 2>&1; 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 >/dev/null 2>&1; 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 >/dev/null 2>&1; 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 "$INSTALL_DIR/dev" /proc/mounts || grep -qs "$INSTALL_DIR/run" /proc/mounts || grep -qs "$INSTALL_DIR/proc" /proc/mounts || grep -qs "$INSTALL_DIR/sys" /proc/mounts || grep -qs "$INSTALL_DIR/dev/pts" /proc/mounts || grep -qs "$INSTALL_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_install_dir() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
if [ "$UNATTENDED" = "1" ]; then
|
|
#echo -e "${RED}!!!Unattended installation!!!${ENDCOLOUR}"
|
|
INSTALL_DIR="$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH"
|
|
echo -e "The working directory is ${MAGENTA}$INSTALL_DIR${ENDCOLOUR}."
|
|
if [ "$(ls -A $INSTALL_DIR)" != "" ]; then
|
|
cleanup
|
|
check_mounted
|
|
fi
|
|
else
|
|
# ▼ должно быть только перенаправление ошибки!
|
|
if [ "$(ls -A $INSTALL_DIR)" != "" ]; then
|
|
echo -e "${MAGENTA}$INSTALL_DIR${ENDCOLOUR} is not empty."
|
|
cleanup
|
|
check_mounted
|
|
if [ ! -d "$INSTALL_DIR" ]; then
|
|
mkdir -p $INSTALL_DIR
|
|
fi
|
|
INSTALL_DIR="$(
|
|
cd $INSTALL_DIR
|
|
pwd
|
|
)"
|
|
echo $INSTALL_DIR >$SCRIPT_DIR/.install_dir && chmod 644 $SCRIPT_DIR/.install_dir
|
|
echo -e "The working directory is ${MAGENTA}$INSTALL_DIR${ENDCOLOUR}."
|
|
else
|
|
mkdir -p $INSTALL_DIR
|
|
check_mounted
|
|
INSTALL_DIR="$(
|
|
cd $INSTALL_DIR
|
|
pwd
|
|
)"
|
|
echo $INSTALL_DIR >$SCRIPT_DIR/.install_dir && chmod 644 $SCRIPT_DIR/.install_dir
|
|
echo -e "The working directory is ${MAGENTA}$INSTALL_DIR${ENDCOLOUR}."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
# configure the build folder
|
|
# настраиваем папку для сборки
|
|
# =================================================================
|
|
|
|
function setup_install_dir() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
if [ "$UNATTENDED" = "1" ] && [ "$INSTALL_DIR" = "" ]; then
|
|
INSTALL_DIR="$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH"
|
|
check_install_dir
|
|
else
|
|
if [ "$INSTALL_DIR" = "" ]; then
|
|
if [ ! -f "$SCRIPT_DIR/.install_dir" ]; then
|
|
echo "Enter the address of the working directory where we will build the system"
|
|
read -r -p "$(echo -e "(Default is ${MAGENTA}$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH${ENDCOLOUR}): ")" response
|
|
INSTALL_DIR=${response,,}
|
|
if [ "$INSTALL_DIR" = "" ]; then
|
|
INSTALL_DIR="$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH"
|
|
fi
|
|
check_install_dir
|
|
else
|
|
LAST_INSTALL_DIR=$(cat "$SCRIPT_DIR/.install_dir")
|
|
echo -e "Last time you used the build directory ${MAGENTA}$LAST_INSTALL_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}$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH${ENDCOLOUR}): ")" response
|
|
INSTALL_DIR=${response,,}
|
|
if [ "$INSTALL_DIR" = "" ]; then
|
|
INSTALL_DIR="$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH"
|
|
fi
|
|
check_install_dir
|
|
else
|
|
INSTALL_DIR="$LAST_INSTALL_DIR"
|
|
check_install_dir
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
# cleaning the build folder
|
|
# очистка папки для сборки
|
|
# =================================================================
|
|
|
|
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 $INSTALL_DIR
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
cleanup
|
|
fi
|
|
else
|
|
read -r -p "$(echo -e ""Do you want to ${BOLD}${RED}completely remove content${ENDCOLOUR} of ${MAGENTA}$INSTALL_DIR${ENDCOLOUR}? [y/${BOLD}${GREEN}N${ENDCOLOUR}])" response
|
|
response=${response,,}
|
|
if [[ "$response" =~ ^(yes|y)$ ]]; then
|
|
check_mounted
|
|
rm -rf $INSTALL_DIR
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
cleanup
|
|
fi
|
|
else
|
|
echo -e "${MAGENTA}$INSTALL_DIR${ENDCOLOUR} should be empty to continue."
|
|
exit 1
|
|
fi
|
|
fi
|
|
elif [ "${CMD[ii]}" = "remove_sources" ]; then
|
|
if [ $REMOVE_SOURCES = "true" ]; then
|
|
if [ "$UNATTENDED" = "1" ]; then
|
|
check_mounted
|
|
rm -rf $INSTALL_DIR
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
cleanup
|
|
fi
|
|
else
|
|
read -r -p "$(echo -e ""Do you want to ${BOLD}${RED}completely remove content${ENDCOLOUR} of ${MAGENTA}$INSTALL_DIR${ENDCOLOUR}? [y/${BOLD}${GREEN}N${ENDCOLOUR}])" response
|
|
response=${response,,}
|
|
if [[ "$response" =~ ^(yes|y)$ ]]; then
|
|
check_mounted
|
|
rm -rf $INSTALL_DIR
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
cleanup
|
|
fi
|
|
else
|
|
echo -e "${MAGENTA}$INSTALL_DIR${ENDCOLOUR} should be empty to continue."
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
# =================================================================
|
|
# mount filesystems inside chroot
|
|
# монтируем файловые системы внутри chroot
|
|
# =================================================================
|
|
|
|
function chroot_mount_fs() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
|
|
check_mounted
|
|
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
if [ -L $INSTALL_DIR/etc/resolv.conf ] || [ $DISTRIBUTION = "stretch" ]; then
|
|
mv $INSTALL_DIR/etc/resolv.conf $INSTALL_DIR/etc/resolv.conf.bak
|
|
echo "nameserver 8.8.8.8" >>$INSTALL_DIR/etc/resolv.conf
|
|
fi
|
|
fi
|
|
|
|
mount --bind /dev $INSTALL_DIR/dev
|
|
mount --bind /run $INSTALL_DIR/run
|
|
if [ $DISTRIBUTION = "stretch" ]; then
|
|
mount --bind /proc $INSTALL_DIR/proc
|
|
else
|
|
mount none -t proc $INSTALL_DIR/proc
|
|
fi
|
|
mount none -t sysfs $INSTALL_DIR/sys
|
|
mount none -t devpts $INSTALL_DIR/dev/pts
|
|
mount none -t tmpfs $INSTALL_DIR/tmp
|
|
}
|
|
|
|
# =================================================================
|
|
# unmount filesystems inside chroot
|
|
# размонтируем файловые системы внутри chroot
|
|
# =================================================================
|
|
|
|
function chroot_umount_fs() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
|
|
set +e
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
umount $INSTALL_DIR/proc
|
|
umount $INSTALL_DIR/sys
|
|
umount $INSTALL_DIR/dev/pts
|
|
umount $INSTALL_DIR/tmp
|
|
umount $INSTALL_DIR/dev
|
|
umount $INSTALL_DIR/run
|
|
else
|
|
umount $INSTALL_DIR/proc >>$OUTPUT 2>&1
|
|
umount $INSTALL_DIR/sys >>$OUTPUT 2>&1
|
|
umount $INSTALL_DIR/dev/pts >>$OUTPUT 2>&1
|
|
umount $INSTALL_DIR/tmp >>$OUTPUT 2>&1
|
|
umount $INSTALL_DIR/dev >>$OUTPUT 2>&1
|
|
umount $INSTALL_DIR/run >>$OUTPUT 2>&1
|
|
fi
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
if [ -L $INSTALL_DIR/etc/resolv.conf.bak ] || [ $DISTRIBUTION = "stretch" ]; then
|
|
rm -f $INSTALL_DIR/etc/resolv.conf
|
|
mv $INSTALL_DIR/etc/resolv.conf.bak $INSTALL_DIR/etc/resolv.conf
|
|
elif [ -L $INSTALL_DIR/etc/resolv.conf.bak ] && [ -L $INSTALL_DIR/etc/resolv.conf ]; then
|
|
rm -f $INSTALL_DIR/etc/resolv.conf.bak
|
|
fi
|
|
fi
|
|
set -e
|
|
|
|
check_mounted
|
|
}
|
|
|
|
# =================================================================
|
|
# delete the log
|
|
# удаляем лог
|
|
# =================================================================
|
|
|
|
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 $INSTALL_DIR/$LIVEKITNAME.log ]; then
|
|
rm -f $INSTALL_DIR/$LIVEKITNAME.log
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
# creating a backup of scripts (to run you need to set the variable
|
|
# CREATE_BACKUP = "1" in linux-live/buildconfig)
|
|
# создание бэкапа скриптов (для запуска необходимо установить
|
|
# переменную CREATE_BACKUP="1" в linux-live/buildconfig)
|
|
# =================================================================
|
|
|
|
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/.install_dir >>$OUTPUT 2>&1
|
|
rm -f $SCRIPT_DIR/*.log >>$OUTPUT 2>&1
|
|
if [ ! -d $BUILD_DIR/minios-live-current ]; then
|
|
CHANGED="1"
|
|
mkdir -p $BUILD_DIR/minios-live-current
|
|
(cd $SCRIPT_DIR && cp --parents -afr * $BUILD_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 $BUILD_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 $BUILD_DIR/minios-live-current/$file..." >>$OUTPUT 2>&1
|
|
cp -f "$SCRIPT_DIR/$file" "$BUILD_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)) >$BUILD_DIR/minios-live-current/.script_version
|
|
cd $SCRIPT_DIR >>$OUTPUT 2>&1
|
|
rm -f $BUILD_DIR/minios-live-current.tar.gz
|
|
tar -czf $BUILD_DIR/minios-live-current.tar.gz ./ >>$OUTPUT 2>&1
|
|
cp $BUILD_DIR/minios-live-current.tar.gz $BUILD_DIR/minios-live-v$SCRIPT_VERSION-$DATE.tar.gz >>$OUTPUT 2>&1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
# Displaying information about the start of the build for a more
|
|
# convenient search in the logs
|
|
# Отображение информации о старте сборки для более удобного поиска
|
|
# в логах
|
|
# =================================================================
|
|
|
|
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 "========== Distributution: $DISTRIBUTION" >>$OUTPUT 2>&1
|
|
echo "========== Desktop Environment: $DESKTOP_ENVIRONMENT" >>$OUTPUT 2>&1
|
|
echo "========== Package Variant: $PACKAGE_VARIANT" >>$OUTPUT 2>&1
|
|
echo "========== Arch: $DISTRIBUTION_ARCH" >>$OUTPUT 2>&1
|
|
echo "========== Compression: $COMP_TYPE" >>$OUTPUT 2>&1
|
|
echo "=================================================================" >>$OUTPUT 2>&1
|
|
echo "=================================================================" >>$OUTPUT 2>&1
|
|
echo ""
|
|
}
|
|
|
|
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
|
|
DESKTOP_ENVIRONMENT=$DESKTOP_ENVIRONMENT
|
|
DISTRIBUTION=$DISTRIBUTION
|
|
DISTRIBUTION_TYPE=$DISTRIBUTION_TYPE
|
|
PACKAGE_VARIANT=$PACKAGE_VARIANT
|
|
COMP_TYPE=$COMP_TYPE
|
|
KERNEL_ARCH=$KERNEL_ARCH
|
|
LIVEKITNAME=$LIVEKITNAME
|
|
SYSTEMNAME=$SYSTEMNAME
|
|
DISTRIBUTION_ARCH=$DISTRIBUTION_ARCH
|
|
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
|
|
}
|
|
|
|
# Unzip gzipped files (man pages), so LZMA can compress 2times better.
|
|
# First we fix symlinks, then uncompress files
|
|
# $1 = search directory
|
|
uncompress_files() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
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() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
find "$1" -type l -exec test ! -e {} \; -print | xargs rm -vf
|
|
}
|
|
EOF
|
|
}
|
|
|
|
function remove_chroot_configuration_files() {
|
|
rm -f $1/$LIVEKITNAME.conf
|
|
rm -f $1/functions
|
|
}
|
|
|
|
# =================================================================
|
|
# =================================================================
|
|
# ====================== HOST FUNCTIONS ===========================
|
|
# =================================================================
|
|
# =================================================================
|
|
|
|
# =================================================================
|
|
# Creating a $PACKAGE_VARIANT list from a template
|
|
# Создание списка пакетов из шаблона
|
|
# =================================================================
|
|
|
|
function create_apt_list() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
if [ ! -f $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list ] && [ $DISTRIBUTION_TYPE != "debian" ]; 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 get_vars() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
set +u
|
|
add_chroot_configuration_files $1
|
|
. /functions
|
|
read_config /$LIVEKITNAME.conf OUTPUT LOGPATH BUILD_TEST_ISO CREATE_BACKUP DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS DESKTOP_ENVIRONMENT DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE KERNEL_ARCH LIVEKITNAME SYSTEMNAME DISTRIBUTION_ARCH
|
|
export OUTPUT LOGPATH BUILD_TEST_ISO CREATE_BACKUP DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS DESKTOP_ENVIRONMENT DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE KERNEL_ARCH LIVEKITNAME SYSTEMNAME DISTRIBUTION_ARCH
|
|
set -u
|
|
}
|
|
|
|
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 OUTPUT LOGPATH BUILD_TEST_ISO CREATE_BACKUP DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS DESKTOP_ENVIRONMENT DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE KERNEL_ARCH LIVEKITNAME SYSTEMNAME DISTRIBUTION_ARCH
|
|
export OUTPUT LOGPATH BUILD_TEST_ISO CREATE_BACKUP DEBIAN_FRONTEND_TYPE APT_CMD APT_OPTIONS DESKTOP_ENVIRONMENT DISTRIBUTION DISTRIBUTION_TYPE PACKAGE_VARIANT COMP_TYPE KERNEL_ARCH LIVEKITNAME SYSTEMNAME DISTRIBUTION_ARCH
|
|
${@:2}
|
|
EOF
|
|
remove_chroot_configuration_files $1
|
|
}
|
|
|
|
# Unzip gzipped files (man pages), so LZMA can compress 2times better.
|
|
# First we fix symlinks, then uncompress files
|
|
# $1 = search directory
|
|
uncompress_files() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
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() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
find "$1" -type l -exec test ! -e {} \; -print | xargs rm -vf
|
|
}
|
|
|
|
# =================================================================
|
|
# Installing the base system
|
|
# Установка базовой системы
|
|
# =================================================================
|
|
|
|
function build_bootstrap() {
|
|
current_process
|
|
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
if [ $USE_ROOTFS = "1" ] && [ ! -f $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH-rootfs.tar.gz ]; then
|
|
if [ -f $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz ]; then
|
|
if [ ! -d $INSTALL_DIR ]; then
|
|
mkdir -p $INSTALL_DIR
|
|
fi
|
|
tar -xzf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz -C $INSTALL_DIR
|
|
else
|
|
# Раскомментировать для Ubuntu, но придётся вручную подбирать пакеты до соответсвия bootstrap Debian по пакетам.
|
|
#if [ $DISTRIBUTION_TYPE != "debian" ]; then
|
|
# sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
|
|
# debootstrap --arch=$DISTRIBUTION_ARCH --variant=$DISTRIBUTION_VARIANT $DISTRIBUTION $INSTALL_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
|
|
#else
|
|
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
|
|
debootstrap --arch=$DISTRIBUTION_ARCH $DISTRIBUTION $INSTALL_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
|
|
#fi
|
|
if [ ! -d $SCRIPT_DIR/rootfs ]; then
|
|
mkdir -p $SCRIPT_DIR/rootfs
|
|
fi
|
|
tar -czf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz -C $INSTALL_DIR .
|
|
fi
|
|
elif [ $USE_ROOTFS = "1" ] && [ -f $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH-rootfs.tar.gz ]; then
|
|
if [ ! -d $INSTALL_DIR ]; then
|
|
mkdir -p $INSTALL_DIR
|
|
fi
|
|
tar -xzf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH-rootfs.tar.gz -C $INSTALL_DIR
|
|
elif [ $USE_ROOTFS != "1" ] && [ $USE_BOOTSTRAP = "1" ]; then
|
|
if [ -f $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz ]; then
|
|
if [ ! -d $INSTALL_DIR ]; then
|
|
mkdir -p $INSTALL_DIR
|
|
fi
|
|
tar -xzf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz -C $INSTALL_DIR
|
|
else
|
|
# Раскомментировать для Ubuntu, но придётся вручную подбирать пакеты до соответсвия bootstrap Debian по пакетам.
|
|
#if [ $DISTRIBUTION_TYPE != "debian" ]; then
|
|
# sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
|
|
# debootstrap --arch=$DISTRIBUTION_ARCH --variant=$DISTRIBUTION_VARIANT $DISTRIBUTION $INSTALL_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
|
|
#else
|
|
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
|
|
debootstrap --arch=$DISTRIBUTION_ARCH $DISTRIBUTION $INSTALL_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
|
|
#fi
|
|
if [ ! -d $SCRIPT_DIR/rootfs ]; then
|
|
mkdir -p $SCRIPT_DIR/rootfs
|
|
fi
|
|
tar -czf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH.tar.gz -C $INSTALL_DIR .
|
|
fi
|
|
else
|
|
sudo DEBIAN_FRONTEND=$DEBIAN_FRONTEND_TYPE \
|
|
debootstrap --arch=$DISTRIBUTION_ARCH $DISTRIBUTION $INSTALL_DIR $DISTRIBUTION_URL >>$OUTPUT 2>>$OUTPUT
|
|
fi
|
|
|
|
build_rootfs
|
|
|
|
}
|
|
|
|
function build_rootfs() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
#current_process
|
|
|
|
if [ $USE_ROOTFS = "1" ]; then
|
|
if [ ! -f $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH-rootfs.tar.gz ]; then
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
chroot_mount_fs
|
|
|
|
create_apt_list
|
|
|
|
cp -f $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list $INSTALL_DIR/etc/apt/sources.list
|
|
cat <<'EOF' >$INSTALL_DIR/etc/apt/apt.conf.d/000MiniOS
|
|
APT::Install-Recommends "0";
|
|
APT::Install-Suggests "0";
|
|
Acquire::Languages { "none"; }
|
|
EOF
|
|
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
chroot_run $INSTALL_DIR $APT_CMD update $APT_OPTIONS
|
|
else
|
|
chroot_run $INSTALL_DIR $APT_CMD update $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
else
|
|
chroot $INSTALL_DIR $APT_CMD update $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
chroot_run $INSTALL_DIR $APT_CMD upgrade $APT_OPTIONS
|
|
else
|
|
chroot_run $INSTALL_DIR $APT_CMD upgrade $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
else
|
|
chroot $INSTALL_DIR $APT_CMD upgrade $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
|
|
if [ -f $SCRIPT_DIR/linux-live/pkglists/prereq.list ]; then
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
chroot_run $INSTALL_DIR $APT_CMD install $APT_OPTIONS \
|
|
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/pkglists/prereq.list | tr "\n" " ")
|
|
else
|
|
chroot_run $INSTALL_DIR $APT_CMD install $APT_OPTIONS \
|
|
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/pkglists/prereq.list | tr "\n" " ") >>$OUTPUT 2>&1
|
|
fi
|
|
else
|
|
chroot $INSTALL_DIR $APT_CMD install $APT_OPTIONS \
|
|
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/pkglists/prereq.list | tr "\n" " ") >>$OUTPUT 2>&1
|
|
fi
|
|
fi
|
|
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
chroot_run $INSTALL_DIR $APT_CMD clean $APT_OPTIONS
|
|
else
|
|
chroot_run $INSTALL_DIR $APT_CMD clean $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
else
|
|
chroot $INSTALL_DIR $APT_CMD clean $APT_OPTIONS >>$OUTPUT 2>&1
|
|
fi
|
|
chroot_umount_fs
|
|
|
|
tar -czf $SCRIPT_DIR/rootfs/$DISTRIBUTION-$DISTRIBUTION_ARCH-rootfs.tar.gz -C $INSTALL_DIR .
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function copy_build_scripts() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
if [ ! -d $INSTALL_DIR/linux-live ]; then
|
|
mkdir -p $INSTALL_DIR/linux-live
|
|
(cd $SCRIPT_DIR/linux-live && cp --parents -afr * $INSTALL_DIR/linux-live)
|
|
else
|
|
find $SCRIPT_DIR/linux-live -type f -print0 | sed "s,$SCRIPT_DIR/linux-live/,,g" | while IFS= read -r -d '' file; do
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if ! cmp $SCRIPT_DIR/linux-live/"$file" $INSTALL_DIR/linux-live/"$file"; then
|
|
echo -e "$file has been modified since last build run."
|
|
echo -e "Copying $SCRIPT_DIR/linux-live/$file to $INSTALL_DIR/linux-live/$file..."
|
|
cp -f $SCRIPT_DIR/linux-live/"$file" $INSTALL_DIR/linux-live/"$file"
|
|
fi
|
|
else
|
|
if ! cmp $SCRIPT_DIR/linux-live/"$file" $INSTALL_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 $INSTALL_DIR/linux-live/$file..." >>$OUTPUT 2>&1
|
|
cp -f $SCRIPT_DIR/linux-live/"$file" $INSTALL_DIR/linux-live/"$file" >>$OUTPUT 2>&1
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
#chmod +x $INSTALL_DIR/linux-live/build
|
|
chmod +x $INSTALL_DIR/linux-live/install_chroot
|
|
|
|
if [ "$DEV_SYSTEM" = "1" ]; then
|
|
if [ ! -d $INSTALL_DIR/opt/minios-live ]; then
|
|
mkdir -p $INSTALL_DIR/opt/minios-live
|
|
(cd $SCRIPT_DIR && cp --parents -afr * $INSTALL_DIR/opt/minios-live)
|
|
else
|
|
find $SCRIPT_DIR/linux-live -type f -print0 | sed "s,$SCRIPT_DIR/linux-live/,,g" | while IFS= read -r -d '' file; do
|
|
if ! cmp $SCRIPT_DIR/"$file" $INSTALL_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 $INSTALL_DIR/opt/minios-live/$file..." >>$OUTPUT 2>&1
|
|
cp -f $SCRIPT_DIR/"$file" $INSTALL_DIR/opt/minios-live/"$file" >>$OUTPUT 2>&1
|
|
fi
|
|
done
|
|
fi
|
|
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 $INSTALL_DIR/$LIVEKITNAME.log
|
|
fi
|
|
if [ "$OUTPUT"="$LOGPATH/$LIVEKITNAME.log" ] && [ -f $INSTALL_DIR/$LIVEKITNAME.log ]; then
|
|
echo "===========================================" >>$INSTALL_DIR/$LIVEKITNAME.log 2>&1
|
|
echo "===========================================" >>$INSTALL_DIR/$LIVEKITNAME.log 2>&1
|
|
echo "=============== CHROOT LOG ================" >>$INSTALL_DIR/$LIVEKITNAME.log 2>&1
|
|
echo "===========================================" >>$INSTALL_DIR/$LIVEKITNAME.log 2>&1
|
|
echo "===========================================" >>$INSTALL_DIR/$LIVEKITNAME.log 2>&1
|
|
fi
|
|
|
|
cp -f $SCRIPT_DIR/linux-live/aptsources/$DISTRIBUTION.list $INSTALL_DIR/etc/apt/sources.list
|
|
|
|
if [ -d /opt/minios-live ] || [ -f /.minios-live-container ]; then
|
|
chroot_run $INSTALL_DIR /linux-live/install_chroot -
|
|
else
|
|
chroot $INSTALL_DIR /linux-live/install_chroot -
|
|
fi
|
|
|
|
chroot_umount_fs
|
|
|
|
if [ "$OUTPUT"="$LOGPATH/$LIVEKITNAME.log" ] && [ -f $INSTALL_DIR/$LIVEKITNAME.log ]; then
|
|
mv -f $INSTALL_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_live() {
|
|
current_process
|
|
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
remove_log_file
|
|
|
|
copy_build_scripts
|
|
|
|
check_install_dir
|
|
|
|
rm -rf $BUILD_DIR/image
|
|
mkdir -p $BUILD_DIR/image/$LIVEKITNAME/{boot,changes,modules}
|
|
|
|
build_boot
|
|
|
|
if [ $DISTRIBUTION_ARCH = "i386" ]; then
|
|
MKMOD="bin etc home lib opt root sbin srv usr var"
|
|
fi
|
|
|
|
# create compressed 01-core.sb
|
|
cd $INSTALL_DIR
|
|
COREFS=""
|
|
for i in $MKMOD; do
|
|
if [ -d /$i ]; then
|
|
COREFS="$COREFS $i"
|
|
fi
|
|
done
|
|
|
|
: 'if [ $COMP_TYPE = "zstd" ]; then
|
|
mksquashfs $COREFS $BUILD_DIR/image/$LIVEKITNAME/01-core-$COMP_TYPE.$BEXT -comp $COMP_TYPE -Xcompression-level 22 -b 1024K -always-use-fragments -keep-as-directory -noappend || exit
|
|
else
|
|
mksquashfs $COREFS $BUILD_DIR/image/$LIVEKITNAME/01-core-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -keep-as-directory -noappend || exit
|
|
fi'
|
|
|
|
mksquashfs $COREFS $BUILD_DIR/image/$LIVEKITNAME/01-core-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -keep-as-directory -noappend || exit
|
|
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function build_boot() {
|
|
#current_process
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
copy_build_scripts
|
|
|
|
check_install_dir
|
|
|
|
# initramfs generation
|
|
chroot $INSTALL_DIR mount none -t proc /proc
|
|
chmod +x $INSTALL_DIR/linux-live/initrfs
|
|
chroot $INSTALL_DIR /linux-live/initrfs
|
|
chroot $INSTALL_DIR umount /proc
|
|
|
|
# copy kernel files
|
|
cp $INSTALL_DIR/boot/vmlinuz-**-**-* $BUILD_DIR/image/$LIVEKITNAME/boot/vmlinuz
|
|
cp $INSTALL_DIR/boot/initrfs.img $BUILD_DIR/image/$LIVEKITNAME/boot/initrfs.img
|
|
|
|
#if [ $CLOUD != "true" ]; then
|
|
cp -r $SCRIPT_DIR/linux-live/bootfiles/* $BUILD_DIR/image/$LIVEKITNAME
|
|
#fi
|
|
|
|
if [ $CLOUD = "true" ]; then
|
|
BOOT_TYPE="hybrid"
|
|
fi
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
cp -r $SCRIPT_DIR/linux-live/bootfiles-grub/* $BUILD_DIR/image
|
|
#cp -r $SCRIPT_DIR/linux-live/bootfiles-hybrid/ $DIR
|
|
if [ ! -d $BUILD_DIR/image/.disk ]; then
|
|
mkdir -p $BUILD_DIR/image/.disk
|
|
fi
|
|
echo $SYSTEMNAME >$BUILD_DIR/image/.disk/info
|
|
fi
|
|
|
|
if [ $CLOUD = "true" ]; then
|
|
cat <<'EOF' | iconv -f 'UTF-8' -t "CP866//TRANSLIT" >$BUILD_DIR/image/minios/boot/syslinux.cfg
|
|
UI /minios/boot/vesamenu.c32
|
|
|
|
PROMPT 0
|
|
TIMEOUT 40
|
|
|
|
MENU CLEAR
|
|
MENU HIDDEN
|
|
MENU HIDDENKEY Enter default
|
|
MENU BACKGROUND /minios/boot/bootlogo.png
|
|
|
|
MENU WIDTH 80
|
|
MENU MARGIN 20
|
|
MENU ROWS 5
|
|
MENU TABMSGROW 9
|
|
MENU CMDLINEROW 9
|
|
MENU HSHIFT 0
|
|
MENU VSHIFT 19
|
|
|
|
MENU COLOR BORDER 30;40 #00000000 #00000000 none
|
|
MENU COLOR SEL 47;30 #FF000000 #FFFFFFFF none
|
|
MENU COLOR UNSEL 37;40 #FFFFFFFF #FF000000 none
|
|
MENU COLOR TABMSG 32;40 #FF60CA00 #FF000000 none
|
|
|
|
F1 help.txt /minios/boot/zblack.png
|
|
|
|
MENU AUTOBOOT Press Esc for options, automatic boot in # second{,s} ...
|
|
MENU TABMSG [F1] help [Tab] cmdline >
|
|
|
|
LABEL default
|
|
MENU LABEL Run MiniOS (Copy to 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 apparmor=0 selinux=0 minios.flags=toram net.ifnames=0 biosdevname=0 ssh
|
|
|
|
EOF
|
|
cat <<'EOF' >$BUILD_DIR/image/boot/grub/grub.cfg
|
|
set default="0"
|
|
set timeout="4"
|
|
set hidden_timeout_quiet=false
|
|
set gfxmode=auto
|
|
insmod efi_gop
|
|
insmod efi_uga
|
|
insmod gfxterm
|
|
terminal_output gfxterm
|
|
set color_normal=white/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 ssh"
|
|
set perch_settings="minios.flags=perch"
|
|
set live_settings="minios.flags= "
|
|
set ram_settings="minios.flags=toram"
|
|
set console_settings="console=tty0 console=ttyS0,115200"
|
|
set debug_settings="load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 apparmor=0 debug net.ifnames=0 biosdevname=0 ssh"
|
|
set linux_64="/minios/boot/vmlinuz"
|
|
set initrd_img="/minios/boot/initrfs.img"
|
|
set default=0
|
|
set message="Loading kernel and ramdisk..."
|
|
|
|
menuentry "Run MiniOS (Copy to RAM)"{
|
|
echo $message
|
|
search --set -f $linux_64
|
|
linux $linux_64 $default_settings $ram_settings $console_settings
|
|
initrd $initrd_img
|
|
}
|
|
EOF
|
|
fi
|
|
|
|
if [ $PACKAGE_VARIANT = "minimal" ]; then
|
|
sed -i 's/minios.flags=perch/minios.flags=perch,automount/g' $BUILD_DIR/image/$LIVEKITNAME/boot/syslinux.cfg
|
|
sed -i 's/minios.flags= /minios.flags=automount /g' $BUILD_DIR/image/$LIVEKITNAME/boot/syslinux.cfg
|
|
if [ $DESKTOP_ENVIRONMENT = "slax" ]; then
|
|
sed -i 's/quiet/quiet user_name=root/g' $BUILD_DIR/image/$LIVEKITNAME/boot/syslinux.cfg
|
|
fi
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
sed -i 's/minios.flags=perch/minios.flags=perch,automount/g' $BUILD_DIR/image/boot/grub/grub.cfg
|
|
sed -i 's/minios.flags= /minios.flags=automount /g' $BUILD_DIR/image/boot/grub/grub.cfg
|
|
if [ $DESKTOP_ENVIRONMENT = "slax" ]; then
|
|
sed -i 's/quiet/quiet user_name=root/g' $BUILD_DIR/image/boot/grub/grub.cfg
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
}
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function build_iso() {
|
|
current_process
|
|
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
check_install_dir
|
|
|
|
if [ "$UNATTENDED" = "1" ]; then
|
|
INSTALL_DIR="$BUILD_DIR/$DISTRIBUTION-$DISTRIBUTION_ARCH"
|
|
fi
|
|
if [ "$INSTALL_DIR" = "" ]; then
|
|
LAST_INSTALL_DIR=$(cat "$SCRIPT_DIR/.install_dir") >>$OUTPUT 2>&1
|
|
INSTALL_DIR=$LAST_INSTALL_DIR
|
|
fi
|
|
|
|
cd $BUILD_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=$BUILD_DIR/image
|
|
ISO=$ISO_DIR/$LIVEKITNAME-$DISTRIBUTION-$DESKTOP_ENVIRONMENT-$PACKAGE_VARIANT-$DISTRIBUTION_ARCH-$COMP_TYPE-$DATE.iso
|
|
|
|
B="-b $LIVEKITNAME/boot/isolinux.bin -c $LIVEKITNAME/boot/isolinux.boot"
|
|
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
C="-no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot"
|
|
else
|
|
C="-no-emul-boot -boot-load-size 4 -boot-info-table"
|
|
fi
|
|
|
|
# ▼ должно быть только перенаправление ошибки!
|
|
|
|
if [ -x "$(which xorriso 2>>$OUTPUT)" ] && [ $BOOT_TYPE = "hybrid" ]; then
|
|
M="xorriso -as mkisofs -isohybrid-mbr $DIR/$LIVEKITNAME/boot/isohdpfx.bin"
|
|
D=" -isohybrid-gpt-basdat -e"
|
|
elif [ -x "$(which genisoimage 2>>$OUTPUT)" ]; then
|
|
M=genisoimage
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
D="-efi-boot"
|
|
else
|
|
D=""
|
|
fi
|
|
fi
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
E="EFI/boot/efiboot.img -no-emul-boot"
|
|
else
|
|
E=""
|
|
fi
|
|
|
|
#VER="$SYSTEMNAME $VER"
|
|
VER="$SYSTEMNAME"
|
|
|
|
if [ $REMOVE_OLD_ISO = "1" ]; then
|
|
set +e
|
|
rm $ISO_DIR/$LIVEKITNAME-$DISTRIBUTION-$DESKTOP_ENVIRONMENT-$PACKAGE_VARIANT-$DISTRIBUTION_ARCH-$COMP_TYPE-*.iso >>$OUTPUT 2>&1
|
|
while [ -f $ISO_DIR/$LIVEKITNAME.iso ]; do
|
|
rm $ISO_DIR/$LIVEKITNAME.iso >>$OUTPUT 2>&1
|
|
sleep 1
|
|
done
|
|
set -e
|
|
#rm -f $ISO_DIR/*
|
|
fi
|
|
|
|
if [ $BOOT_TYPE = "hybrid" ]; then
|
|
if
|
|
! $M -hide-rr-moved -f -r -J -l -V "$VER" -A "$VER" \
|
|
$B $C $D $E -o $ISO $DIR
|
|
then
|
|
exit 1
|
|
fi
|
|
else
|
|
if
|
|
! $M -f -r -J -l -V "$VER" -A "$VER" \
|
|
$B $C $D $E -o $ISO $DIR
|
|
then
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo ">>> $ISO created"
|
|
|
|
if [ $BUILD_TEST_ISO = "1" ]; then
|
|
if [ -L $ISO_DIR/$LIVEKITNAME.iso ]; then
|
|
rm $ISO_DIR/$LIVEKITNAME.iso
|
|
fi
|
|
while [ -f $ISO_DIR/$LIVEKITNAME.iso ]; do
|
|
rm $ISO_DIR/$LIVEKITNAME.iso >>$OUTPUT 2>&1
|
|
sleep 1
|
|
done
|
|
if ln $ISO_DIR/$LIVEKITNAME-$DISTRIBUTION-$DESKTOP_ENVIRONMENT-$PACKAGE_VARIANT-$DISTRIBUTION_ARCH-$COMP_TYPE-$DATE.iso $ISO_DIR/$LIVEKITNAME.iso; then
|
|
echo ">>> $ISO_DIR/$LIVEKITNAME.iso created"
|
|
fi
|
|
fi
|
|
|
|
#exit 0
|
|
}
|
|
|
|
function remove_sources() {
|
|
if [ $REMOVE_SOURCES = "true" ]; then
|
|
cleanup
|
|
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
|
|
|
|
current_process
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function chroot_cleanup() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
|
|
set +eu
|
|
|
|
rm -f $1/$LIVEKITNAME.conf
|
|
rm -f $1/functions
|
|
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
|
|
|
|
if [ -z $1 ]; then
|
|
uncompress_files $1/etc/alternatives
|
|
uncompress_files $1/usr/share/man
|
|
|
|
remove_broken_links $1/etc/alternatives
|
|
remove_broken_links $1/usr/share/man
|
|
fi
|
|
|
|
set -eu
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function hostreq_pkg_list() {
|
|
echo -e "${YELLOW}=====> installing required software for host system ...${ENDCOLOUR}"
|
|
$APT_CMD update >>$OUTPUT 2>&1
|
|
|
|
if [ -f $SCRIPT_DIR/linux-live/pkglists/hostreq.list ]; then
|
|
$APT_CMD install -y \
|
|
$(grep -vE "^\s*#" $SCRIPT_DIR/linux-live/pkglists/hostreq.list | tr "\n" " ") >>$OUTPUT 2>&1
|
|
else
|
|
$APT_CMD install -y \
|
|
sudo debootstrap genisoimage >>$OUTPUT 2>&1
|
|
fi
|
|
if [ $DISTRIBUTION_ARCH = "arm64" ]; then
|
|
$APT_CMD install -y \
|
|
grub-efi-arm64-bin >>$OUTPUT 2>&1
|
|
else
|
|
$APT_CMD install -y \
|
|
grub-efi-amd64-bin grub-pc-bin >>$OUTPUT 2>&1
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function prereq_pkg_list() {
|
|
echo -e "${YELLOW}=====> installing prerequested software for chroot system ...${ENDCOLOUR}"
|
|
|
|
if [ ! -f /etc/apt/apt.conf.d/000MiniOS ]; then
|
|
cat <<'EOF' >/etc/apt/apt.conf.d/000MiniOS
|
|
APT::Install-Recommends "0";
|
|
APT::Install-Suggests "0";
|
|
Acquire::Languages { "none"; }
|
|
EOF
|
|
fi
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if [ -f $SCRIPT_DIR/pkglists/prereq.list ]; then
|
|
$APT_CMD update
|
|
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" " ")
|
|
fi
|
|
else
|
|
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
|
|
fi
|
|
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function main_pkg_list() {
|
|
echo -e "${YELLOW}=====> installing main packages for chroot system ...${ENDCOLOUR}"
|
|
|
|
get_vars
|
|
|
|
$APT_CMD update
|
|
|
|
if [ -f /linux-live/basesystem/01-core/preinstall ]; then
|
|
chmod +x /linux-live/basesystem/01-core/preinstall
|
|
/linux-live/basesystem/01-core/preinstall
|
|
fi
|
|
: 'if [ "$(ls -A /linux-live/basesystem/01-core/rootcopy-install)" != "" ]; then
|
|
(cd /linux-live/basesystem/01-core/rootcopy-install && cp --parents -afr * /)
|
|
fi'
|
|
if [ -f /linux-live/basesystem/01-core/install ]; then
|
|
chmod +x /linux-live/basesystem/01-core/install
|
|
/linux-live/basesystem/01-core/install
|
|
fi
|
|
if [ -f /linux-live/basesystem/01-core/postinstall ]; then
|
|
chmod +x /linux-live/basesystem/01-core/postinstall
|
|
/linux-live/basesystem/01-core/postinstall
|
|
fi
|
|
|
|
chroot_cleanup
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function chroot_pkg_install() {
|
|
current_process
|
|
|
|
main_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
|
|
|
|
(cd /linux-live/basesystem/01-core/rootcopy-install && cp --parents -afr * /)
|
|
|
|
# minios-install setup
|
|
if [ ! -d /etc/$LIVEKITNAME ]; then
|
|
mkdir -p /etc/$LIVEKITNAME
|
|
fi
|
|
cat <<EOF >/etc/$LIVEKITNAME/config
|
|
#!/bin/bash
|
|
# This is a config file for MiniOS-Live build script and Linux Live Kit boot script.
|
|
# !!! You shouldn't need to change anything expect PACKAGE_VARIANT OUTPUT COMP_TYPE !!!
|
|
LIVEKITNAME="$LIVEKITNAME"
|
|
SYSTEMNAME="$SYSTEMNAME"
|
|
DISTRIBUTION_TYPE="$DISTRIBUTION_TYPE"
|
|
DISTRIBUTION="$DISTRIBUTION"
|
|
DISTRIBUTION_ARCH="$DISTRIBUTION_ARCH"
|
|
PACKAGE_VARIANT="$PACKAGE_VARIANT"
|
|
DESKTOP_ENVIRONMENT="livekit"
|
|
OUTPUT="/dev/stdout" # Default is output to /dev/stdout. You can use OUTPUT="/dev/null" if you want to silent installation or OUTPUT="somefilename.log" to route events to log file.
|
|
DEBIAN_FRONTEND_TYPE="noninteractive"
|
|
APT_CMD="apt-get"
|
|
APT_OPTIONS="-y"
|
|
UNION_BUILD_TYPE="overlayfs"
|
|
BEXT="sb"
|
|
COMP_TYPE="xz" # Compression method used for the system and modules.
|
|
EOF
|
|
|
|
if [ ! -d /etc/NetworkManager ]; then
|
|
echo "Enable dhclient.service autostart." >>$OUTPUT 2>&1
|
|
cat <<EOF >/usr/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
|
|
elif [ -d /etc/NetworkManager ] && [[ $DISTRIBUTION = "bionic" || $DISTRIBUTION = "focal" ]]; then
|
|
cat <<EOF >/etc/netplan/01-netcfg.yaml
|
|
# This file describes the network interfaces available on your system
|
|
# For more information, see netplan(5).
|
|
# Set and change netplan renderer to NetworkManager GUI tool
|
|
network:
|
|
version: 2
|
|
renderer: NetworkManager
|
|
|
|
EOF
|
|
cat <<EOF >/etc/NetworkManager/NetworkManager.conf
|
|
[main]
|
|
rc-manager=resolvconf
|
|
plugins=ifupdown,keyfile
|
|
dns=dnsmasq
|
|
[ifupdown]
|
|
managed=false
|
|
|
|
EOF
|
|
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/basesystem/01-core/$PACKAGE_VARIANT.list >>$OUTPUT 2>&1; then
|
|
echo "Enable ssh.service autostart." >>$OUTPUT 2>&1
|
|
cat <<EOF >/usr/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
|
|
#if [ $CLOUD != "true" ]; then
|
|
# sed -i 's,#PermitRootLogin prohibit-password,PermitRootLogin yes,g' /etc/ssh/sshd_config
|
|
# sed -i 's,#PasswordAuthentication yes,PasswordAuthentication yes,g' /etc/ssh/sshd_config
|
|
#fi
|
|
#systemctl enable ssh-keygen >>$OUTPUT 2>&1
|
|
#systemctl enable ssh >>$OUTPUT 2>&1
|
|
fi
|
|
|
|
if [ ! -f /usr/share/sudo ]; then
|
|
cat <<EOF >/usr/share/sudo
|
|
#!/bin/bash
|
|
if [ "$#" -lt 1 ]; then
|
|
echo "Usage: sudo [command] [arguments]"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$UID" = 0 ]; then
|
|
exec "$@"
|
|
fi
|
|
|
|
echo "Sudo is not installed. Run the command as root or install sudo."
|
|
EOF
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
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_install_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
|
|
|
|
if [ $UNION_BUILD_TYPE = "overlayfs" ]; then
|
|
MODULES_LIST=""
|
|
MODULES=($BUILD_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
|
|
elif [ $UNION_BUILD_TYPE = "aufs" ]; then
|
|
MODULES_LIST=""
|
|
MODULES=($BUILD_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""=ro"
|
|
done
|
|
MODULES_LIST=${MODULES_LIST:1}
|
|
|
|
mkdir -p $MODULE_UPPER_DIR $MODULE_WORK_DIR $MODULE_MERGED_DIR
|
|
|
|
mount -t aufs -o br:$MODULE_UPPER_DIR=rw:$MODULES_LIST aufs $MODULE_MERGED_DIR
|
|
fi
|
|
|
|
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
|
|
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
if [ -L $MODULE_MERGED_DIR/etc/resolv.conf ] || [ $DISTRIBUTION = "stretch" ]; then
|
|
mv $MODULE_MERGED_DIR/etc/resolv.conf $MODULE_MERGED_DIR/etc/resolv.conf.bak
|
|
echo "nameserver 8.8.8.8" >>$MODULE_MERGED_DIR/etc/resolv.conf
|
|
fi
|
|
: 'if [ ! -d $MODULE_MERGED_DIR/run/resolvconf ]; 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
|
|
fi'
|
|
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
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function module_chroot_umount_fs() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
|
|
local MODULES MODULE_LOWER_DIR
|
|
|
|
set +e
|
|
ls -la /dev/stdout
|
|
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
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
if [[ -L $MODULE_MERGED_DIR/etc/resolv.conf.bak && ! -L $MODULE_MERGED_DIR/etc/resolv.conf ]] || [ $DISTRIBUTION = "stretch" ]; then
|
|
rm -f $MODULE_MERGED_DIR/etc/resolv.conf
|
|
mv $MODULE_MERGED_DIR/etc/resolv.conf.bak $MODULE_MERGED_DIR/etc/resolv.conf
|
|
elif [ -L $MODULE_MERGED_DIR/etc/resolv.conf.bak ] && [ -L $MODULE_MERGED_DIR/etc/resolv.conf ]; then
|
|
rm -f $MODULE_MERGED_DIR/etc/resolv.conf.bak
|
|
fi
|
|
: 'umount $MODULE_MERGED_DIR/run/resolvconf/resolv.conf
|
|
rm -f $MODULE_MERGED_DIR/run/resolvconf/resolv.conf
|
|
rmdir $MODULE_MERGED_DIR/run/resolvconf'
|
|
else
|
|
umount $MODULE_MERGED_DIR/run
|
|
fi
|
|
umount $MODULE_MERGED_DIR
|
|
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf.bak
|
|
fi
|
|
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
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
if [[ -L $MODULE_MERGED_DIR/etc/resolv.conf.bak && ! -L $MODULE_MERGED_DIR/etc/resolv.conf ]] || [ $DISTRIBUTION = "stretch"]; then
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf
|
|
mv $MODULE_MERGED_DIR/etc/resolv.conf.bak $MODULE_MERGED_DIR/etc/resolv.conf
|
|
elif [ -L $MODULE_MERGED_DIR/etc/resolv.conf.bak ] && [ -L $MODULE_MERGED_DIR/etc/resolv.conf ]; then
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf.bak
|
|
fi
|
|
: 'umount $MODULE_MERGED_DIR/run/resolvconf/resolv.conf >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/run/resolvconf/resolv.conf
|
|
rmdir $MODULE_UPPER_DIR/run/resolvconf'
|
|
else
|
|
umount $MODULE_MERGED_DIR/run >>$OUTPUT 2>&1
|
|
fi
|
|
umount $MODULE_MERGED_DIR >>$OUTPUT 2>&1
|
|
|
|
if [ -f /.dockerenv ] || [ "$container" = "podman" ]; then
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/etc/resolv.conf.bak >>$OUTPUT 2>&1
|
|
fi
|
|
fi
|
|
|
|
MODULES=($BUILD_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
|
|
|
|
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 ..."
|
|
|
|
# truncate machine id (why??)
|
|
chroot $MODULE_MERGED_DIR /bin/bash -x <<EOF
|
|
truncate -s 0 /etc/machine-id
|
|
EOF
|
|
|
|
# remove diversion (why??)
|
|
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
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function module_chroot_cleanup() {
|
|
echo -e "=====> the ${CYAN}${FUNCNAME[0]}${ENDCOLOUR} function is executing ..."
|
|
set +e
|
|
# clean up useless stuff
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
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
|
|
rm -rf $MODULE_UPPER_DIR/.cache
|
|
find $MODULE_UPPER_DIR/var/log/ -type f | xargs rm -f
|
|
rm -f $MODULE_UPPER_DIR/etc/ssh/ssh_host*
|
|
rm -f $MODULE_UPPER_DIR/var/backups/*
|
|
rm -f $MODULE_UPPER_DIR/var/cache/ldconfig/*
|
|
#rm -f $MODULE_UPPER_DIR/var/cache/debconf/*
|
|
rm -f $MODULE_UPPER_DIR/var/cache/fontconfig/*
|
|
rm -f $MODULE_UPPER_DIR/var/cache/apt/archives/*.deb
|
|
rm -f $MODULE_UPPER_DIR/var/cache/apt/*.bin
|
|
rm -f $MODULE_UPPER_DIR/var/cache/debconf/*-old
|
|
rm -f $MODULE_UPPER_DIR/var/lib/apt/extended_states
|
|
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*Packages
|
|
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*Translation*
|
|
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/*InRelease
|
|
rm -f $MODULE_UPPER_DIR/var/lib/apt/lists/deb.*
|
|
rm -f $MODULE_UPPER_DIR/var/lib/dpkg/*-old
|
|
rm -f $MODULE_UPPER_DIR/preinstall
|
|
rm -f $MODULE_UPPER_DIR/install
|
|
rm -f $MODULE_UPPER_DIR/install2
|
|
rm -f $MODULE_UPPER_DIR/cleanup
|
|
rm -f $MODULE_UPPER_DIR/$PACKAGE_VARIANT.list
|
|
rm -f $MODULE_UPPER_DIR/postinstall
|
|
rm -rf $MODULE_UPPER_DIR/rootcopy
|
|
rm -f $MODULE_UPPER_DIR/machine-id
|
|
else
|
|
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 $MODULE_UPPER_DIR/preinstall >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/install >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/install2 >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/cleanup >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/$PACKAGE_VARIANT.list >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/postinstall >>$OUTPUT 2>&1
|
|
rm -rf $MODULE_UPPER_DIR/rootcopy-install >>$OUTPUT 2>&1
|
|
rm -f $MODULE_UPPER_DIR/machine-id >>$OUTPUT 2>&1
|
|
set -e
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
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
|
|
|
|
if [[ $SYSTEM_TYPE != "core" ]]; then
|
|
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
MODULES_DIR=$BUILD_DIR/modules
|
|
|
|
cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT
|
|
|
|
for MODULE in *; do
|
|
if (ls $BUILD_DIR/image/$LIVEKITNAME/*.$BEXT | grep -q $MODULE 2>/dev/null); then
|
|
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
|
|
echo -e "Please remove ${MAGENTA}$BUILD_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_install_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/$DESKTOP_ENVIRONMENT/$MODULE/preinstall ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$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/$DESKTOP_ENVIRONMENT/$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 [ ! -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install)" != "" ]; then
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/)
|
|
fi
|
|
else
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install)" != "" ] >>$OUTPUT 2>&1; then
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/)
|
|
fi
|
|
fi
|
|
else
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install)" != "" ]; then
|
|
mkdir $MODULE_MERGED_DIR/rootcopy-install
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/rootcopy-install/)
|
|
fi
|
|
else
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install)" != "" ] >>$OUTPUT 2>&1; then
|
|
mkdir $MODULE_MERGED_DIR/rootcopy-install
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-install && cp --parents -afr * $MODULE_MERGED_DIR/rootcopy-install/)
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# run install script
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/install ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/install $MODULE_MERGED_DIR/install
|
|
chmod +x $MODULE_MERGED_DIR/install
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/cleanup ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/cleanup $MODULE_MERGED_DIR/cleanup
|
|
fi
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/$PACKAGE_VARIANT.list ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$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
|
|
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
module_chroot_umount_fs
|
|
|
|
module_build_cleanup
|
|
|
|
# run external actions
|
|
|
|
if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then
|
|
mkdir -p $BUILD_DIR/modules/tmp >>$OUTPUT 2>&1
|
|
mksquashfs $MODULE_UPPER_DIR $BUILD_DIR/modules/tmp/$MODULE-stock.$BEXT -comp lz4 -b 1024K -always-use-fragments -noappend >>$OUTPUT 2>&1 || exit
|
|
mv $BUILD_DIR/modules/tmp/$MODULE-stock.$BEXT $MODULE_UPPER_DIR/$MODULE-stock.$BEXT >>$OUTPUT 2>&1
|
|
cd $MODULE_UPPER_DIR >>$OUTPUT 2>&1
|
|
unsquashfs $MODULE-stock.$BEXT >>$OUTPUT 2>&1
|
|
else
|
|
echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} is empty. Nothing to do."
|
|
fi
|
|
|
|
#module_check_install_dir
|
|
|
|
module_chroot_mount_fs
|
|
fi
|
|
|
|
# run install2 script
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/install2 ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/install2 $MODULE_MERGED_DIR/install2
|
|
chmod +x $MODULE_MERGED_DIR/install2
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/patches)" != "" ] >>$OUTPUT 2>&1; then
|
|
mkdir $MODULE_MERGED_DIR/patches
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$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 [ ! -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall)" != "" ]; then
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/)
|
|
fi
|
|
else
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall)" != "" ] >>$OUTPUT 2>&1; then
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/)
|
|
fi
|
|
fi
|
|
else
|
|
if [ $OUTPUT = "/dev/stdout" ] && [ ! -f /dev/stdout ]; then
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall)" != "" ]; then
|
|
mkdir $MODULE_MERGED_DIR/rootcopy-postinstall
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/rootcopy-postinstall/)
|
|
fi
|
|
else
|
|
if [ "$(ls -A $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall)" != "" ] >>$OUTPUT 2>&1; then
|
|
mkdir $MODULE_MERGED_DIR/rootcopy-postinstall
|
|
(cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/rootcopy-postinstall && cp --parents -afr * $MODULE_MERGED_DIR/rootcopy-postinstall/)
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# run post-install script
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/postinstall ]; then
|
|
cp $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$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
|
|
|
|
if [ ! -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
set +e
|
|
chroot_run $MODULE_MERGED_DIR uncompress_files /etc/alternatives
|
|
chroot_run $MODULE_MERGED_DIR uncompress_files /usr/share/man
|
|
chroot_run $MODULE_MERGED_DIR remove_broken_links /etc/alternatives
|
|
chroot_run $MODULE_MERGED_DIR remove_broken_links /usr/share/man
|
|
set -e
|
|
fi
|
|
|
|
# run external actions
|
|
if [ -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
cp $MODULE_UPPER_DIR/$MODULE.$BEXT $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT >>$OUTPUT 2>&1
|
|
fi
|
|
|
|
module_chroot_finish_up
|
|
|
|
module_chroot_umount_fs
|
|
|
|
if [ ! -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
module_build_cleanup
|
|
fi
|
|
|
|
module_chroot_cleanup
|
|
|
|
if [ ! -f $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT/$MODULE/is_internal_build ]; then
|
|
if [ ! -f $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT ]; then
|
|
if [ "$(ls -A $MODULE_UPPER_DIR)" != "" ]; then
|
|
if [ $COMP_TYPE = "zstd" ]; then
|
|
mksquashfs $MODULE_UPPER_DIR $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -Xcompression-level 22 -b 1024K -always-use-fragments -noappend || exit
|
|
else
|
|
mksquashfs $MODULE_UPPER_DIR $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit
|
|
fi
|
|
else
|
|
echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} is empty. Nothing to do."
|
|
fi
|
|
else
|
|
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
|
|
echo -e "Please remove ${MAGENTA}$BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT${ENDCOLOUR} if you want to build ${MAGENTA}$MODULE${ENDCOLOUR}."
|
|
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
|
|
fi
|
|
fi
|
|
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
# =================================================================
|
|
#
|
|
#
|
|
# =================================================================
|
|
function build_modules_live() {
|
|
current_process
|
|
echo "here 2"
|
|
if [ $CONTAINER_TYPE = "1" ]; then
|
|
if [ ! -f /.minios-live ]; then
|
|
setup_host
|
|
fi
|
|
fi
|
|
|
|
MODULES_DIR=$BUILD_DIR/modules
|
|
|
|
cd $SCRIPT_DIR/linux-live/modules/$DESKTOP_ENVIRONMENT
|
|
|
|
for MODULE in *; do
|
|
|
|
if (ls $BUILD_DIR/image/$LIVEKITNAME/*.$BEXT | grep -q $MODULE 2>/dev/null); then
|
|
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${ENDCOLOUR}"
|
|
echo -e "Please remove ${MAGENTA}$BUILD_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
|
|
if [ $COMP_TYPE = "zstd" ]; then
|
|
mksquashfs $MODULE_UPPER_DIR $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -Xcompression-level 22 -b 1024K -always-use-fragments -noappend || exit
|
|
else
|
|
mksquashfs $MODULE_UPPER_DIR $BUILD_DIR/image/$LIVEKITNAME/$MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit
|
|
fi
|
|
else
|
|
echo -e "${MAGENTA}$MODULE_UPPER_DIR${ENDCOLOUR} is empty. Nothing to do."
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
function repack_module() {
|
|
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
|
|
unsquashfs $OLD_MODULE
|
|
|
|
mksquashfs squashfs-root $MODULE-$COMP_TYPE.$BEXT -comp $COMP_TYPE -b 1024K -always-use-fragments -noappend || exit
|
|
|
|
rm -rf squashfs-root
|
|
rm -f $OLD_MODULE
|
|
}
|
|
|
|
function repack_modules() {
|
|
current_process
|
|
|
|
cd $BUILD_DIR/image/$LIVEKITNAME/
|
|
for MODULE in *; do
|
|
if (ls ./*-xz.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then
|
|
OLD_COMP_TYPE="xz"
|
|
repack_module
|
|
elif (ls ./*-lz4.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then
|
|
OLD_COMP_TYPE="lz4"
|
|
repack_module
|
|
elif (ls ./*-zstd.$BEXT | grep -q $MODULE >>/dev/null 2>&1); then
|
|
OLD_COMP_TYPE="zstd"
|
|
repack_module
|
|
fi
|
|
done
|
|
}
|
|
|