#!/usr/bin/env bash # New version of cleaner_script # Made by @fernandomaroto and @manuel # Any failed command will just be skipped, error message may pop up but won't crash the install process # Net-install creates the file /tmp/run_once in live environment (need to be transfered to installed system) so it can be used to detect install option # ISO-NEXT specific cleanup removals and additions (08-2021) @killajoe and @manuel # 01-2022 passing in online and username as params - @dalto # 04-2022 small code re-organization - @manuel # 10-2022 remove unused code and support for dracut/mkinitcpio switch _c_c_s_msg() { # use this to provide all user messages (info, warning, error, ...) local type="$1" local msg="$2" echo "==> $type: $msg" } _pkg_msg() { # use this to provide all package management messages (install, uninstall) local op="$1" local pkgs="$2" case "$op" in remove | uninstall) op="uninstalling" ;; install) op="installing" ;; esac echo "==> $op $pkgs" } _check_internet_connection(){ eos-connection-checker } _is_pkg_installed() { # this is not meant for offline mode !? # returns 0 if given package name is installed, otherwise 1 local pkgname="$1" pacman -Q "$pkgname" >& /dev/null } _remove_a_pkg() { local pkgname="$1" _pkg_msg remove "$pkgname" pacman -Rsn --noconfirm "$pkgname" } _remove_pkgs_if_installed() { # this is not meant for offline mode !? # removes given package(s) and possible dependencies if the package(s) are currently installed local pkgname local removables=() for pkgname in "$@" ; do if _is_pkg_installed "$pkgname" ; then _pkg_msg remove "$pkgname" removables+=("$pkgname") fi done if [ -n "$removables" ] ; then pacman -Rs --noconfirm "${removables[@]}" fi } _install_needed_packages() { if eos-connection-checker ; then _pkg_msg install "if missing: $*" pacman -S --needed --noconfirm "$@" else _c_c_s_msg warning "no internet connection, cannot install packages $*" fi } ################################################################## # Virtual machine stuff. # For virtual machines we assume internet connection exists. ################################################################## _virt_remove() { local pkg for pkg in "$@" ; do _pkg_msg remove "$pkg" pacman -Rns --noconfirm "$pkg" done } _vm_environment_set1() { local varname="$1" if [ -z "$(grep "^$varname=" /etc/environment)" ] ; then _c_c_s_msg info "adding $varname=1 to /etc/environment" echo "$varname=1" >> /etc/environment fi } _sway_in_vm_settings() { # Settings for sway in a virtual machine if [ -x /usr/bin/swaybg ] ; then # We are using sway here (see also: eos-script-lib-yad, eos_IsSway()). _vm_environment_set1 WLR_NO_HARDWARE_CURSORS case "$detected_vm" in qemu) _vm_environment_set1 WLR_RENDERER_ALLOW_SOFTWARE ;; esac fi } _virtual_machines() { local detected_vm="$1" local pkgs_common="xf86-video-vmware" local pkgs_remove_from_vm="power-profiles-daemon" local pkgs_vbox="virtualbox-guest-utils" local pkgs_qemu="qemu-guest-agent spice-vdagent" local pkgs_vmware="open-vm-tools xf86-input-vmmouse" [ -n "$detected_vm" ] || detected_vm="$(device-info --vm)" case "$detected_vm" in # 2021-Sep-30: device-info may output one of: "virtualbox", "qemu", "kvm", "vmware" or "" virtualbox) _c_c_s_msg info "VirtualBox VM detected." _virt_remove $pkgs_qemu $pkgs_vmware $pkgs_remove_from_vm _install_needed_packages $pkgs_vbox $pkgs_common _sway_in_vm_settings # Note: sway requires enabling 3D support for the vbox virtual machine! ;; vmware) _c_c_s_msg info "VmWare VM detected." _virt_remove $pkgs_qemu $pkgs_vbox $pkgs_remove_from_vm _install_needed_packages $pkgs_vmware $pkgs_common _sway_in_vm_settings ;; qemu) # common pkgs ?? _c_c_s_msg info "Qemu VM detected." _virt_remove $pkgs_vmware $pkgs_vbox $pkgs_common $pkgs_remove_from_vm _install_needed_packages $pkgs_qemu _sway_in_vm_settings ;; kvm) _c_c_s_msg info "Kvm VM detected." if [ -n "$(lspci -vnn | grep -iw "qemu virtual machine")" ] ; then $FUNCNAME qemu else _virt_remove $pkgs_remove_from_vm _install_needed_packages $pkgs_qemu $pkgs_vbox $pkgs_common # ??? _sway_in_vm_settings fi ;; *) _c_c_s_msg info "VM not detected." _virt_remove $pkgs_vbox $pkgs_qemu $pkgs_vmware $pkgs_common ;; esac } _sed_stuff(){ # Journal for offline. Turn volatile (for iso) into a real system. sed -i 's/volatile/auto/g' /etc/systemd/journald.conf 2>>/tmp/.errlog sed -i 's/.*pam_wheel\.so/#&/' /etc/pam.d/su } _clean_archiso(){ local _files_to_remove=( /etc/sudoers.d/g_wheel /var/lib/NetworkManager/NetworkManager.state /etc/systemd/system/getty@tty1.service.d/autologin.conf /etc/systemd/system/getty@tty1.service.d /etc/systemd/system/multi-user.target.wants/* /etc/systemd/journald.conf.d /etc/systemd/logind.conf.d /etc/mkinitcpio-archiso.conf /etc/initcpio /root/{,.[!.],..?}* /etc/motd /{gpg.conf,gpg-agent.conf,pubring.gpg,secring.gpg} /version ) local xx for xx in ${_files_to_remove[*]}; do rm -rf $xx; done find /usr/lib/initcpio -name archiso* -type f -exec rm '{}' \; } _clean_offline_packages(){ local packages_to_remove=( # BASE ## Base system edk2-shell # SOFTWARE # ISO ## Live iso specific arch-install-scripts memtest86+ mkinitcpio mkinitcpio-archiso mkinitcpio-busybox #pv syslinux ## Live iso tools clonezilla gpart grsync hdparm #partitionmanager # ENDEAVOUROS REPO ## General rate-mirrors ## Calamares EndeavourOS $(pacman -Qq | grep calamares) # finds calamares related packages ckbcomp # arm qemu dependency qemu-arm-aarch64-static-bin ) pacman -Rsn --noconfirm "${packages_to_remove[@]}" } _is_offline_mode() { if [ "$INSTALL_TYPE" = "online" ] ; then return 1 # online install mode else return 0 # offline install mode fi } _is_online_mode() { ! _is_offline_mode ; } _check_install_mode(){ if _is_online_mode ; then local INSTALL_OPTION="ONLINE_MODE" else local INSTALL_OPTION="OFFLINE_MODE" fi case "$INSTALL_OPTION" in OFFLINE_MODE) _clean_archiso chown $NEW_USER:$NEW_USER /home/$NEW_USER/.bashrc _sed_stuff _clean_offline_packages ;; ONLINE_MODE) # not implemented yet. For now run functions at "SCRIPT STARTS HERE" : # all systemd are enabled - can be specific offline/online in the future ;; *) ;; esac } _remove_ucode(){ local ucode="$1" _remove_a_pkg "$ucode" } _remove_other_graphics_drivers() { local graphics="$(device-info --vga ; device-info --display)" local amd=no # remove AMD graphics driver if it is not needed if [ -n "$(echo "$graphics" | grep "Advanced Micro Devices")" ] ; then amd=yes elif [ -n "$(echo "$graphics" | grep "AMD/ATI")" ] ; then amd=yes elif [ -n "$(echo "$graphics" | grep "Radeon")" ] ; then amd=yes fi if [ "$amd" = "no" ] ; then _remove_a_pkg xf86-video-amdgpu _remove_a_pkg xf86-video-ati fi } _remove_broadcom_wifi_driver_old() { local pkgname=broadcom-wl-dkms local wifi_pci local wifi_driver # _is_pkg_installed $pkgname && { wifi_pci="$(lspci -k | grep -A4 " Network controller: ")" if [ -n "$(lsusb | grep " Broadcom ")" ] || [ -n "$(echo "$wifi_pci" | grep " Broadcom ")" ] ; then return fi wifi_driver="$(echo "$wifi_pci" | grep "Kernel driver in use")" if [ -n "$(echo "$wifi_driver" | grep "in use: wl$")" ] ; then return fi _remove_a_pkg $pkgname # } } _remove_broadcom_wifi_driver() { local pkgname=broadcom-wl-dkms local file=/tmp/$pkgname.txt if [ "$(cat $file 2>/dev/null)" = "no" ] ; then _remove_a_pkg $pkgname fi } _install_extra_drivers_to_target() { # Install special drivers to target if needed. # The drivers exist on the ISO and were copied to the target. local dir=/opt/extra-drivers local pkg # Handle the r8168 package. if [ -r /tmp/r8168_in_use ] ; then # We must install r8168 now. if _is_offline_mode ; then # Install using the copied r8168 package. pkg="$(/usr/bin/ls -1 $dir/r8168-*-x86_64.pkg.tar.zst)" if [ -n "$pkg" ] ; then _pkg_msg install "r8168 (offline)" pacman -U --noconfirm $pkg else _c_c_s_msg error "no r8168 package in folder $dir!" fi else # Install r8168 package from the mirrors. _install_needed_packages r8168 fi fi } _install_more_firmware() { # Install possibly missing firmware packages based on detected hardware if [ -n "$(lspci -k | grep "Kernel driver in use: mwifiex_pcie")" ] ; then # e.g. Microsoft Surface Pro _install_needed_packages linux-firmware-marvell fi } _nvidia_remove() { _pkg_msg remove "$*" pacman -Rsc --noconfirm "$@" } _remove_nvidia_drivers() { local remove="pacman -Rsc --noconfirm" if _is_offline_mode ; then # delete packages separately to avoid all failing if one fails [ -r /usr/share/licenses/nvidia-dkms/LICENSE ] && _nvidia_remove nvidia-dkms [ -x /usr/bin/nvidia-modprobe ] && _nvidia_remove nvidia-utils [ -x /usr/bin/nvidia-settings ] && _nvidia_remove nvidia-settings [ -x /usr/bin/nvidia-inst ] && _nvidia_remove nvidia-inst [ -r /usr/share/libalpm/hooks/eos-nvidia-fix.hook ] && _nvidia_remove nvidia-hook true fi } _manage_nvidia_packages() { local file=/tmp/nvidia-info.bash # nvidia info from livesession local nvidia_card="" # these two variables are defined in $file local nvidia_driver="" if [ ! -r $file ] ; then _c_c_s_msg warning "file $file does not exist!" _remove_nvidia_drivers else source $file if [ "$nvidia_driver" = "no" ] ; then _remove_nvidia_drivers elif [ "$nvidia_card" = "yes" ] ; then _install_needed_packages nvidia-inst nvidia-hook nvidia-dkms fi fi } _run_if_exists_or_complain() { local app="$1" if (which "$app" >& /dev/null) ; then _c_c_s_msg info "running $*" "$@" else _c_c_s_msg warning "program $app not found." fi } _RunUserCommands() { local usercmdfile=/tmp/user_commands.bash if [ -r $usercmdfile ] ; then _c_c_s_msg info "running script $(basename $usercmdfile)" bash $usercmdfile $NEW_USER fi } _misc_cleanups() { # /etc/resolv.conf.pacnew may be unnecessary, so delete it local file=/etc/resolv.conf.pacnew if [ -z "$(grep -Pv "^[ ]*#" $file 2>/dev/null)" ] ; then _c_c_s_msg info "removing file $file" rm -f $file # pacnew contains only comments fi } _clean_up(){ local xx # install or remove nvidia graphics stuff _manage_nvidia_packages # remove AMD and Intel graphics drivers if they are not needed _remove_other_graphics_drivers # remove broadcom-wl-dkms if it is not needed _remove_broadcom_wifi_driver _install_extra_drivers_to_target _install_more_firmware _misc_cleanups # on the target, select file server based on country xx=/usr/bin/eos-select-file-server if [ -x $xx ] ; then _c_c_s_msg info "running $xx" local fileserver="$($xx)" if [ "$fileserver" != "gitlab" ] ; then _c_c_s_msg info "file server configured to '$fileserver'" fi else _c_c_s_msg warning "program $xx was not found" fi # change log file permissions [ -r /var/log/Calamares.log ] && chown root:root /var/log/Calamares.log # run possible user-given commands _RunUserCommands } _show_info_about_installed_system() { local cmd local cmds=( "lsblk -f -o+SIZE" "fdisk -l" ) for cmd in "${cmds[@]}" ; do _c_c_s_msg info "$cmd" $cmd done } _run_hotfix_end() { local file=hotfix-end.bash local type="" if ! _check_internet_connection ; then _is_offline_mode && type=info || type=warning _c_c_s_msg $type "cannot fetch $file, no connection." return fi local url=$(eos-github2gitlab https://raw.githubusercontent.com/endeavouros-team/ISO-hotfixes/main/$file) wget --timeout=60 -q -O /tmp/$file $url && { _c_c_s_msg info "running script $file" bash /tmp/$file } } Main() { local filename=chrooted_cleaner_script _c_c_s_msg info "$filename started." local i local NEW_USER="" INSTALL_TYPE="" BOOTLOADER="" # parse the options for i in "$@"; do case $i in --user=*) NEW_USER="${i#*=}" shift ;; --online) INSTALL_TYPE="online" shift ;; --bootloader=*) BOOTLOADER="${i#*=}" ;; esac done if [ -z "$NEW_USER" ] ; then _c_c_s_msg error "new username is unknown!" fi _check_install_mode _virtual_machines _clean_up _run_hotfix_end _show_info_about_installed_system # Remove pacnew files find /etc -type f -name "*.pacnew" -exec rm {} \; rm -rf /etc/calamares /opt/extra-drivers # Remove device-info & eos-connection-checker if they aren't installed [[ $(pacman -Q eos-bash-shared 2