linux-deployment-scripts/script.sh
2024-11-09 20:59:14 +01:00

214 lines
6 KiB
Bash
Executable file

#!/bin/bash
# linux-deployment-scripts
# Copyright (C) 2024 VM-Experiments
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# hardcoded paths
downloads="downloads/"
output="output/"
chroot="chroot/"
resources="resources/"
# hardcoded package lists
ubuntu_server_packages="nginx grub-pc linux-image-generic"
ubuntu_client_packages="grub-pc linux-image-generic"
ubuntu_client_gnome_packages="ubuntu-desktop"
ubuntu_client_kde_packages="kubuntu-desktop"
installer_packages="linux-image-generic grub-pc parted tar dosfstools util-linux e2fsprogs arch-install-scripts"
# hardcoded links
noble_amd64="https://cdimage.ubuntu.com/ubuntu-base/noble/daily/current/noble-base-amd64.tar.gz"
noble_amd64_name="noble-base-amd64.tar.gz"
jammy_amd64="https://cdimage.ubuntu.com/ubuntu-base/jammy/daily/current/jammy-base-amd64.tar.gz"
jammy_amd64_name="jammy-base-amd64.tar.gz"
# hardcoded names
ubuntu_noble_server_output="noble-server-amd64"
ubuntu_noble_ubuntu_output="noble-ubuntu-amd64"
ubuntu_noble_kubuntu_output="noble-kubuntu-amd64"
ubuntu_jammy_server_output="jammy-server-amd64"
ubuntu_jammy_ubuntu_output="jammy-ubuntu-amd64"
ubuntu_jammy_kubuntu_output="jammy-kubuntu-amd64"
# creates a menu
menu() {
iter=1
echo "$1"
echo ""
shift
for arg in "$@"; do
echo "$iter) $arg"
iter=$((iter + 1))
done
read option
}
# chroot associated functions
prepare_chroot() {
sudo mount --bind /dev "$chroot/dev"
sudo mount --bind /proc "$chroot/proc"
sudo mount --bind /sys "$chroot/sys"
sudo cp /etc/resolv.conf "$chroot/etc/"
}
do_chroot_command() {
sudo chroot "$chroot" /bin/bash -c "$*"
}
do_chroot() {
prepare_chroot "$chroot"
sudo chroot "$chroot"
close_chroot "$chroot"
}
close_chroot() {
sudo umount "$chroot/dev"
sudo umount "$chroot/proc"
sudo umount "$chroot/sys"
}
# handle rootfs image from internet
rootfs_downloader() {
cd "$downloads"
wget -nc "$1"
sudo tar -xzf "$2" -C "../$chroot"
cd ..
}
rootfs_creator() {
cd $output
sudo tar -czf "$1" -C "../$chroot" .
cd ..
}
# packaging rootfs
rootfs_package() {
infile="$1.tar.gz"
outfile="$1.iso"
close_chroot
sudo rm -rf "$chroot"
sudo mkdir "$chroot"
rootfs_downloader "$noble_amd64" "$noble_amd64_name"
sudo cp "$infile" "$chroot/rootfs.tar.gz"
prepare_chroot
do_chroot_command "apt update"
do_chroot_command "DEBIAN_FRONTEND=noninteractive apt install -y $installer_packages"
do_chroot_command "mkdir -p /etc/systemd/system/getty@tty1.service.d/"
do_chroot_command "touch /etc/systemd/system/getty@tty1.service.d/override.conf"
do_chroot_command "echo -e '[Service]\nExecStart=\nExecStart=/sbin/agetty --noclear --autologin root %I \$TERM' | tee /etc/systemd/system/getty@tty1.service.d/override.conf"
do_chroot_command "systemctl daemon-reload"
do_chroot_command "systemctl enable getty@tty1.service"
close_chroot
sudo cp "$resources/grub.cfg" "$chroot/boot/grub/grub.cfg"
sudo cp "$resources/install.sh" "$chroot/root"
echo "./install.sh" | sudo tee -a "$chroot/root/.profile"
echo "./install.sh" | sudo tee -a "$chroot/root/.bashrc"
sudo grub2-mkrescue -o "$outfile" "$chroot"
}
# distro specific
ubuntu_rootfs_prepare() {
rootfs_downloader "$1" "$2"
prepare_chroot
do_chroot_command "apt update -y"
do_chroot_command "apt full-upgrade -y"
do_chroot_command "DEBIAN_FRONTEND=noninteractive apt install -y $3"
close_chroot
rootfs_creator "$4.tar.gz"
rootfs_package "$output$4"
}
main() {
mkdir -p "$downloads" "$output"
close_chroot
sudo rm -rf "$chroot"
sudo mkdir "$chroot"
clear
menu "Welcome to the Ubuntu installer creation script. Choose an option." "Ubuntu 24.04" "Ubuntu 22.04"
case $option in
1)
menu "Choose an option." "Server" "Client"
case $option in
1)
ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_server_packages" "$ubuntu_noble_server_output"
;;
2)
menu "Choose an option." "Ubuntu" "Kubuntu"
case $option in
1)
ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_client_packages $ubuntu_client_gnome_packages" "$ubuntu_noble_ubuntu_output"
;;
2)
ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_client_packages $ubuntu_client_kde_packages" "$ubuntu_noble_kubuntu_output"
;;
*) ;;
esac
;;
*) ;;
esac
;;
2)
menu "Choose an option." "Server" "Client"
case $option in
1)
ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_server_packages" "$ubuntu_jammy_server_output"
;;
2)
menu "Choose an option." "Ubuntu" "Kubuntu"
case $option in
1)
ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_client_packages $ubuntu_client_gnome_packages" "$ubuntu_jammy_ubuntu_output"
;;
2)
ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_client_packages $ubuntu_client_kde_packages" "$ubuntu_jammy_kubuntu_output"
;;
*) ;;
esac
;;
*) ;;
esac
;;
*) ;;
esac
}
main $*