diff --git a/.gitignore b/.gitignore index 19ac04c..29af907 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ build/ user-data meta-data *.qcow2 +archiso/packages.x86_64 diff --git a/30-build-the-iso-the-first-time.sh b/30-build-the-iso-the-first-time.sh deleted file mode 100755 index 72401ab..0000000 --- a/30-build-the-iso-the-first-time.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/bash -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 1 : " -echo "- Setting General parameters" -tput sgr0 -echo "################################################################## " -echo - - # setting of the general parameters - archisoRequiredVersion="archiso 64-1" - currentFolder=$(pwd) - buildFolder="${currentFolder}/build" - outFolder="${currentFolder}/out" - archisoVersion=$(sudo pacman -Q archiso) - - echo "################################################################## " - echo "Build folder : "$buildFolder - echo "Out folder : "$outFolder - echo "################################################################## " - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 2 :" -echo "- Checking if archiso is installed" -echo "- Making mkarchiso verbose" -tput sgr0 -echo "################################################################## " -echo - - package="archiso" - - #---------------------------------------------------------------------------------- - - #checking if application is already installed or else install with aur helpers - if pacman -Qi $package &> /dev/null; then - - echo "Archiso is already installed" - - else - - #checking which helper is installed - if pacman -Qi yay &> /dev/null; then - - echo "################################################################" - echo "######### Installing with yay" - echo "################################################################" - yay -S --noconfirm $package - - elif pacman -Qi trizen &> /dev/null; then - - echo "################################################################" - echo "######### Installing with trizen" - echo "################################################################" - trizen -S --noconfirm --needed --noedit $package - - fi - - # Just checking if installation was successful - if pacman -Qi $package &> /dev/null; then - - echo "################################################################" - echo "######### "$package" has been installed" - echo "################################################################" - - else - - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!!!!!!! "$package" has NOT been installed" - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - exit 1 - fi - - fi - - echo - echo "Making mkarchiso verbose" - sudo sed -i 's/quiet="y"/quiet="n"/g' /usr/bin/mkarchiso - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 3 :" -echo "- Deleting the build folder if one exists" -echo "- Copying the Archiso folder to build folder" -tput sgr0 -echo "################################################################## " -echo - - echo "Deleting the build folder if one exists - takes some time" - [ -d $buildFolder ] && sudo rm -rf $buildFolder - echo - echo "Copying the Archiso folder to build work" - echo - mkdir $buildFolder - cp -r archiso $buildFolder/archiso - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 6 :" -echo "- Cleaning the cache from /var/cache/pacman/pkg/" -tput sgr0 -echo "################################################################## " -echo - - echo "Cleaning the cache from /var/cache/pacman/pkg/" - yes | sudo pacman -Scc - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 7 :" -echo "- Building the iso - this can take a while - be patient" -tput sgr0 -echo "################################################################## " -echo - - [ -d $outFolder ] || mkdir $outFolder - cd $buildFolder/archiso/ - sudo mkarchiso -v -w $buildFolder -o $outFolder $buildFolder/archiso/ - - - echo "Moving pkglist.x86_64.txt" - echo "########################" - rename=$(date +%Y-%m-%d) - cp $buildFolder/iso/arch/pkglist.x86_64.txt $outFolder/cachyos-$rename-pkglist.txt - -echo -echo "##################################################################" -tput setaf 2 -echo "DONE" -echo "- Check your out folder :"$outFolder -tput sgr0 -echo "################################################################## " -echo diff --git a/40-build-the-iso-local-again.sh b/40-build-the-iso-local-again.sh deleted file mode 100755 index 1114231..0000000 --- a/40-build-the-iso-local-again.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 1 : " -echo "- Setting General parameters" -tput sgr0 -echo "################################################################## " -echo - - # setting of the general parameters - archisoRequiredVersion="archiso 58-1" - currentFolder=$(pwd) - buildFolder="${currentFolder}/build" - outFolder="${currentFolder}/out" - archisoVersion=$(sudo pacman -Q archiso) - - echo "################################################################## " - echo "Build folder : "$buildFolder - echo "Out folder : "$outFolder - echo "################################################################## " - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 2 :" -echo "- Checking if archiso is installed" -echo "- Making mkarchiso verbose" -tput sgr0 -echo "################################################################## " -echo - - package="archiso" - - #---------------------------------------------------------------------------------- - - #checking if application is already installed or else install with aur helpers - if pacman -Qi $package &> /dev/null; then - - echo "Archiso is already installed" - - else - - #checking which helper is installed - if pacman -Qi yay &> /dev/null; then - - echo "################################################################" - echo "######### Installing with yay" - echo "################################################################" - yay -S --noconfirm $package - - elif pacman -Qi trizen &> /dev/null; then - - echo "################################################################" - echo "######### Installing with trizen" - echo "################################################################" - trizen -S --noconfirm --needed --noedit $package - - fi - - # Just checking if installation was successful - if pacman -Qi $package &> /dev/null; then - - echo "################################################################" - echo "######### "$package" has been installed" - echo "################################################################" - - else - - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!!!!!!! "$package" has NOT been installed" - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - exit 1 - fi - - fi - - echo - echo "Making mkarchiso verbose" - sudo sed -i 's/quiet="y"/quiet="n"/g' /usr/bin/mkarchiso - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 3 :" -echo "- Deleting the build folder if one exists" -echo "- Copying the Archiso folder to build folder" -tput sgr0 -echo "################################################################## " -echo - - echo "Deleting the build folder if one exists - takes some time" - [ -d $buildFolder ] && sudo rm -rf $buildFolder - echo - echo "Copying the Archiso folder to build work" - echo - mkdir $buildFolder - cp -r archiso $buildFolder/archiso - -echo -echo "################################################################## " -tput setaf 2 -echo "Phase 7 :" -echo "- Building the iso - this can take a while - be patient" -tput sgr0 -echo "################################################################## " -echo - - [ -d $outFolder ] || mkdir $outFolder - cd $buildFolder/archiso/ - sudo mkarchiso -v -w $buildFolder -o $outFolder $buildFolder/archiso/ - - - echo "Moving pkglist.x86_64.txt" - echo "########################" - rename=$(date +%Y-%m-%d) - cp $buildFolder/iso/arch/pkglist.x86_64.txt $outFolder/cachyos-$rename-pkglist.txt - -echo -echo "##################################################################" -tput setaf 2 -echo "DONE" -echo "- Check your out folder :"$outFolder -tput sgr0 -echo "################################################################## " -echo diff --git a/archiso/packages.x86_64 b/archiso/packages_kde.x86_64 similarity index 100% rename from archiso/packages.x86_64 rename to archiso/packages_kde.x86_64 diff --git a/buildiso.sh b/buildiso.sh new file mode 100755 index 0000000..3b5dbb7 --- /dev/null +++ b/buildiso.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# 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; version 2 of the License. +# +# 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. + +src_dir=$(pwd) +[[ -r ${src_dir}/util-msg.sh ]] && source ${src_dir}/util-msg.sh +import ${src_dir}/util.sh + +# setting of the general parameters +work_dir="${src_dir}/build" +outFolder="${src_dir}/out" + +build_list_iso="kde" +clean_first=true +verbose=false + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -c Disable clean work dir' + echo " -p Buildset or profile [default: ${build_list_iso}]" + echo ' -v Verbose output to log file, show profile detail (-q)' + echo ' -h This help' + echo '' + echo '' + exit $1 +} + +orig_argv=("$@") + +opts='p:cvh' + +while getopts "${opts}" arg; do + case "${arg}" in + c) clean_first=false ;; + p) build_list_iso="$OPTARG" ;; + v) verbose=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(($OPTIND - 1)) + +timer_start=$(get_timer) + +check_root "$0" "${orig_argv[@]}" + +prepare_dir "${work_dir}" + +import ${src_dir}/util-iso.sh +import ${src_dir}/util-iso-mount.sh + +check_requirements + +for sig in TERM HUP QUIT; do + trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig" +done +trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT +trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR + +run_build "${build_list_iso}" diff --git a/util-iso-mount.sh b/util-iso-mount.sh new file mode 100755 index 0000000..eeea362 --- /dev/null +++ b/util-iso-mount.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# 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; version 2 of the License. +# +# 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. + +umount_img() { + if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]]; then + info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}" + umount "${IMG_ACTIVE_MOUNTS[@]}" + unset IMG_ACTIVE_MOUNTS + rm -r "$1" + fi +} + +check_umount() { + if mountpoint -q "$1" + then + umount -l "$1" + fi +} + +umount_fs(){ + if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]]; then + info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}" + #umount "${FS_ACTIVE_MOUNTS[@]}" + for i in "${FS_ACTIVE_MOUNTS[@]}" + do + info "umount overlayfs: [%s]" "$i" + check_umount $i + done + unset FS_ACTIVE_MOUNTS + rm -rf "${mnt_dir}/work" + fi + mount_folders=$(grep "${work_dir}" /proc/mounts | awk '{print$2}' | sort -r) + for i in $mount_folders + do + info "umount folder: [%s]" "$i" + check_umount $i + done +} diff --git a/util-iso.sh b/util-iso.sh new file mode 100755 index 0000000..dd440cc --- /dev/null +++ b/util-iso.sh @@ -0,0 +1,138 @@ +#!/bin/bash +# +# 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; version 2 of the License. +# +# 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. + +error_function() { + if [[ -p $logpipe ]]; then + rm "$logpipe" + fi + # first exit all subshells, then print the error + if (( ! BASH_SUBSHELL )); then + error "A failure occurred in %s()." "$1" + plain "Aborting..." + fi + umount_fs + umount_img + exit 2 +} + +run_safe() { + local restoretrap func="$1" + set -e + set -E + restoretrap=$(trap -p ERR) + trap 'error_function $func' ERR + + if ${verbose}; then + run_log "$func" + else + "$func" + fi + + eval $restoretrap + set +E + set +e +} + +check_umount() { + if mountpoint -q "$1" + then + umount -l "$1" + fi +} + +trap_exit() { + local sig=$1; shift + error "$@" + umount_fs + trap -- "$sig" + kill "-$sig" "$$" +} + +prepare_profile(){ + profile=$1 + + info "Profile: [%s]" "${profile}" + + rm ${src_dir}/archiso/airootfs/etc/systemd/system/display-manager.service + if [[$profile == "kde"]]; then + cp ${src_dir}/archiso/packages_kde.x86_64 ${src_dir}/archiso/packages.x86_64 + ln -sf /usr/lib/systemd/system/sddm.service ${src_dir}/archiso/airootfs/etc/systemd/system/display-manager.service + elif [[$profile == "gnome"]]; then + rm ${src_dir}/archiso/airootfs/etc/motd + cp ${src_dir}/archiso/packages_gnome.x86_64 ${src_dir}/archiso/packages.x86_64 + ln -sf /usr/lib/systemd/system/gdm.service ${src_dir}/archiso/airootfs/etc/systemd/system/display-manager.service + elif [[$profile == "xfce"]]; then + cp ${src_dir}/archiso/packages_xfce.x86_64 ${src_dir}/archiso/packages.x86_64 + ln -sf /usr/lib/systemd/system/lightdm.service ${src_dir}/archiso/airootfs/etc/systemd/system/display-manager.service + else + die "Unknown profile: [%s]" "${profile}" + fi + + iso_file=$(gen_iso_fn).iso +} + +run_build() { + prepare_profile "$1" + local _profile="$1" + + msg "Prepare [work: ${work_dir}, out: ${outFolder}]" + + if $verbose; then + msg2 "Making mkarchiso verbose" + sudo sed -i 's/quiet="y"/quiet="n"/g' /usr/bin/mkarchiso + fi + + if $clean_first; then + msg2 "Deleting the build folder if one exists - takes some time" + [ -d ${work_dir} ] && sudo rm -rf ${work_dir} + fi + + msg2 "Copying the Archiso folder to build work" + mkdir ${work_dir} + cp -r archiso ${work_dir}/archiso + + msg "Start [Build ISO]" + + [ -d $outFolder ] || mkdir $outFolder + cd ${work_dir}/archiso/ + sudo mkarchiso -v -w ${work_dir} -o $outFolder ${work_dir}/archiso/ + + cp ${work_dir}/iso/arch/pkglist.x86_64.txt $outFolder/$(gen_iso_fn).pkgs.txt + + msg "Done [Build ISO] ${iso_file}" + msg "Finished building [%s]" "${_profile}" + + for f in $(find . -maxdepth 1 -name '*.iso' | cut -d'/' -f2); do + if [[ ! -e $f.sha256 ]]; then + create_chksums $f + elif [[ $f -nt $f.sha256 ]]; then + create_chksums $f + else + info "checksums for [$f] already created" + fi + done + show_elapsed_time "${FUNCNAME}" "${timer_start}" +} + +gen_iso_fn(){ + local vars=() name + vars+=("cachyos") + [[ -n ${profile} ]] && vars+=("${profile}") + + vars+=("linux") + vars+=("$(date +%y%m%d)") + + for n in ${vars[@]}; do + name=${name:-}${name:+-}${n} + done + + echo $name +} diff --git a/util-msg.sh b/util-msg.sh new file mode 100755 index 0000000..fcdb44e --- /dev/null +++ b/util-msg.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# 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; version 2 of the License. +# +# 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. + +export LC_MESSAGES=C +export LANG=C + +disable_colors(){ + unset ALL_OFF BOLD BLUE GREEN RED YELLOW +} + +enable_colors(){ + # prefer terminal safe colored and bold text when tput is supported + if tput setaf 0 &>/dev/null; then + ALL_OFF="$(tput sgr0)" + BOLD="$(tput bold)" + RED="${BOLD}$(tput setaf 1)" + GREEN="${BOLD}$(tput setaf 2)" + YELLOW="${BOLD}$(tput setaf 3)" + BLUE="${BOLD}$(tput setaf 4)" + else + ALL_OFF="\e[0m" + BOLD="\e[1m" + RED="${BOLD}\e[31m" + GREEN="${BOLD}\e[32m" + YELLOW="${BOLD}\e[33m" + BLUE="${BOLD}\e[34m" + fi + readonly ALL_OFF BOLD BLUE GREEN RED YELLOW +} + +if [[ -t 2 ]]; then + enable_colors +else + disable_colors +fi + +plain() { + local mesg=$1; shift + printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg() { + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg2() { + local mesg=$1; shift + printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +info() { + local mesg=$1; shift + printf "${YELLOW} -->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +warning() { + local mesg=$1; shift + printf "${YELLOW}==> WARNING:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +error() { + local mesg=$1; shift + printf "${RED}==> ERROR:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +stat_busy() { + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" >&2 +} + +stat_done() { + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +cleanup() { + exit ${1:-0} +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +import(){ + if [[ -r $1 ]]; then + source $1 + else + die "Could not import $1" + fi +} diff --git a/util.sh b/util.sh new file mode 100755 index 0000000..f8dff45 --- /dev/null +++ b/util.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# 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; version 2 of the License. +# +# 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. + +get_timer(){ + echo $(date +%s) +} + +# $1: start timer +elapsed_time(){ + echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }') +} + +show_elapsed_time(){ + info "Time %s: %s minutes" "$1" "$(elapsed_time $2)" +} + +check_root(){ + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + exec sudo -- "$@" + else + exec su root -c "$(printf ' %q' "$@")" + fi +} + +check_requirements(){ + local package="archiso" + #checking if application is already installed or else install with aur helpers + if ! pacman -Qi $package &> /dev/null; then + # checking which helper is installed + if pacman -Qi yay &> /dev/null; then + echo "################################################################" + echo "######### Installing with yay" + echo "################################################################" + yay -S --noconfirm $package + elif pacman -Qi trizen &> /dev/null; then + echo "################################################################" + echo "######### Installing with trizen" + echo "################################################################" + trizen -S --noconfirm --needed --noedit $package + fi + + # Just checking if installation was successful + if pacman -Qi $package &> /dev/null; then + echo "################################################################" + echo "######### "$package" has been installed" + echo "################################################################" + else + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "!!!!!!!!! "$package" has NOT been installed" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + exit 1 + fi + fi +} + +prepare_dir(){ + if [[ ! -d $1 ]]; then + mkdir -p $1 + fi +} + +create_chksums() { + msg2 "creating checksums for [$1]" + sha1sum $1 > $1.sha1 + sha256sum $1 > $1.sha256 +}