#!/bin/sh ############################################## # VERSION No. 9.1 # UPDATED on 2025-06-21 # Several functions have been added to programs_selection_menu and usual_tools_installation. # added a combined function for check_internet and installpkg called "initial_checks" # improved the process of verifying package availability for all desktop environments. It now checks both repositories and generates a combined report. # updated welcoming. # added a cpu_vendor temperature monitoring function and coredumps to /tmp, thanks to "bgroper" # added a new function : "detect_and_clean_or_keep_existing_de" detecting a previous DE installation and offering you the choice to completely clean it before installing a new one. # added files to remove for complete deskop environnement removal. # added checking for kde parameters before setting (net.local.stream.recvspace=65536 and net.local.stream.sendspace=65536) # added detection of the current repository for "change_repo" ############################################## # Welcome to this script. # All functions are described here. # To see the final execution flow, go directly to the end. # You can comment out functions if you don't wish them to execute. ############################################## # DE packages that are used in this script : export pkg_list_kdemin="xorg sudo sddm kde" export pkg_list_kdefull="xorg sudo sddm kde freebsd-8k-wallpapers-kde kde-dev-scripts \ kde-dev-utils kde-thumbnailer-chm kde-thumbnailer-epub kde-thumbnailer-fb2 \ kde_poster kdeaccessibility kdeadmin kdeconnect-kde kdegames kdegraphics kdemultimedia \ kdevelop calligra kmymoney kdenetwork kdeutils libkdepim wallpapers-freebsd-kde" export pkg_list_xfcemin="xorg sudo lightdm lightdm-gtk-greeter xfce xdg-user-dirs gvfs" export pkg_list_xfcefull="xorg sudo lightdm lightdm-gtk-greeter xfce gtk-xfce-engine \ workrave-xfce xfce4-appmenu-plugin xfce4-battery-plugin xfce4-bsdcpufreq-plugin \ xfce4-calculator-plugin xfce4-clipman-plugin xfce4-cpugraph-plugin xfce4-dashboard \ xfce4-datetime-plugin xfce4-dev-tools xfce4-dict-plugin xfce4-diskperf-plugin \ xfce4-docklike-plugin xfce4-fsguard-plugin xfce4-generic-slider xfce4-genmon-plugin \ xfce4-goodies xfce4-mixer xfce4-mpc-plugin xfce4-panel-profiles xfce4-places-plugin \ xfce4-pulseaudio-plugin xfce4-volumed-pulse xfce4-whiskermenu-plugin xfce4-windowck-plugin \ xarchiver xdg-user-dirs xfce4-screensaver xfce-icons-elementary \ xfce4-weather-plugin xfce4-netload-plugin xfce4-systemload-plugin \ xfce4-mount-plugin xfce4-notes-plugin xfce4-xkb-plugin gvfs" export pkg_list_mate="xorg sudo lightdm lightdm-gtk-greeter libmatekbd libmatemixer libmateweather \ libshumate mate mate-applet-appmenu mate-applets mate-backgrounds mate-base mate-calc \ mate-common mate-control-center mate-desktop mate-dock-applet mate-icon-theme \ mate-icon-theme-faenza mate-indicator-applet mate-media mate-menus mate-notification-daemon \ mate-pam-helper mate-panel mate-polkit mate-power-manager mate-screensaver \ mate-session-manager mate-settings-daemon mate-system-monitor mate-terminal \ mate-themes mate-user-guide mate-utils materia-gtk-theme" export pkg_list_cinnamon="xorg sudo lightdm lightdm-gtk-greeter cinnamon cinnamon-translations" export pkg_list_gnomemin="xorg sudo gdm gnome-shell gnome-terminal nautilus gnome-tweaks \ gnome-keyring gnome-backgrounds gnome-system-monitor gnome-screenshot \ gnome-power-manager xdg-user-dirs xdg-desktop-portal-gnome" export pkg_list_gnomefull="xorg sudo gdm chrome-gnome-shell gnome gnome-2048 gnome-autoar gnome-backgrounds \ gnome-calculator gnome-calendar gnome-characters gnome-chess \ gnome-clipboard-daemon gnome-clocks gnome-color-manager gnome-common gnome-connections \ gnome-console gnome-contacts gnome-control-center gnome-desktop gnome-devel-docs \ gnome-dictionary gnome-font-viewer gnome-games gnome-getting-started-docs gnome-icon-theme \ gnome-icon-theme-extras gnome-icon-theme-symbolic gnome-icons gnome-icons-elementary \ gnome-icons-faenza gnome-icons-luv gnome-initial-setup gnome-keyring gnome-keyring-sharp \ gnome-klotski gnome-latex gnome-lite gnome-mahjongg gnome-maps gnome-menus gnome-metronome \ gnome-mime-data gnome-mines gnome-mplayer gnome-music gnome-nettool gnome-nibbles \ gnome-online-accounts gnome-online-miners gnome-photos gnome-pie gnome-planner \ gnome-podcasts gnome-pomodoro gnome-power-manager gnome-pty-helper gnome-robots \ gnome-screenshot gnome-session gnome-settings-daemon gnome-shell \ gnome-shell-extension-audio-output-switcher gnome-shell-extension-coverflow \ gnome-shell-extension-dashtodock gnome-shell-extension-dashtopanel \ gnome-shell-extension-filesmenu gnome-shell-extension-hidetopbar \ gnome-shell-extension-lockkeys gnome-shell-extension-mediaplayer \ gnome-shell-extension-openweather gnome-shell-extension-panel-osd \ gnome-shell-extension-recent-items gnome-shell-extension-trash \ gnome-shell-extension-weather gnome-shell-extension-windowoverlay-icons \ gnome-shell-extensions gnome-shell-extra-extensions gnome-sound-recorder \ gnome-sudoku gnome-system-monitor gnome-terminal gnome-tetravex \ gnome-text-editor gnome-themes gnome-themes-extra gnome-todo gnome-tweaks \ gnome-user-docs gnome-user-share gnome-utils gnome-video-effects gnome-weather \ gnome_subr guile-gnome-platform-full guile-gnome-platform-lite libgnome-games-support \ libgnome-keyring libgnomecanvas libgnomecanvasmm libgnomekbd libproxy-gnome3 \ pinentry-gnome polkit-gnome qgnomeplatform rubygem-gnome subversion-gnome-keyring \ xdg-desktop-portal-gnome" export pkg_list_lxqt="xorg sudo sddm lxqt lxqt-about lxqt-admin lxqt-archiver \ lxqt-build-tools lxqt-config lxqt-notificationd lxqt-openssh-askpass lxqt-policykit \ lxqt-powermanagement lxqt-runner lxqt-sudo lxqt-themes xdg-desktop-portal-lxqt" export pkg_list_fvwm="xorg sudo fvwm fvwm-themes" export pkg_list_wmaker="xorg sudo windowmaker" export pkg_list_twm="xorg sudo" export pkg_list_vbox="virtualbox-ose virtualbox-ose-additions" export gpu_configured=0 ############################################################################################ # FUNCTIONS # If you can not connect to internet.. then I can do nothing ! initial_checks() { ( echo "XXX" echo "0" echo "Checking internet connection..." echo "XXX" sleep 1 if ! fetch -q -o /dev/null "https://www.freebsd.org/"; then bsddialog --msgbox " No internet connection detected.\n Exiting." 6 40 exit 1 fi echo "XXX" echo "50" echo "Verifying 'pkg' installation..." echo "XXX" sleep 1 if [ ! -x /usr/local/sbin/pkg ]; then if pkg ins -y 2>&1 | grep -q "error"; then bsddialog --msgbox " Unable to install pkg.\n Check your connection." 6 40 exit 1 fi fi echo "XXX" echo "100" echo "Everything seems fine ! Let's go !" echo "XXX" sleep 1 echo EOF ) | bsddialog --gauge "Initializing environment, please wait..." 6 40 } # Welcome ! welcome() { if ! bsddialog --yesno " Welcome to this installation script for setting up\n a Desktop Environment on FreeBSD.\n\nCurrently, it allows you to install KDE, XFCE, GNOME, Mate, Cinnamon, LXQT, FVWM, WindowMaker or Twm.\nSince some desktop environments are feature-rich (such as KDE, XFCE, GNOME), you have the option to choose between a minimal and a more complete version.\n\nSeveral options will be offered to you (autologin, selection of standard applications for your desktop environment, hypervisor installation, etc.).\n\nA basic graphics card detection feature is included. It relies on detection using "pciconf" and is therefore not exhaustive.\nHowever, if you use an NVIDIA GPU, you need to know which driver version is required for your graphics card. You will be asked to choose between versions 304, 340, 390, 470 and 570\n\nTo enable the installation of a desktop environment, a user (other than root) must be created. If you haven't created one during the FreeBSD installation process, you'll be able to do so here.\n\nFurthermore, correct UEFI configuration is obviously not supported by this script. Generally, a few things must be done before (disable GPU switchable graphics etc.)\n\n --------------------------- \n\nBefore starting the installation, the script will generate a package availability report for all desktop environments mentioned above, in order to check if any of them are currently experiencing build issues in the two repositories (quarterly and latest).\nOf course, you have the option to bypass the creation of this report (it takes a few minutes) by commenting out the relevant functions in the execution flow at the bottom of this script.\n\n Shall we continue?\n" 26 70; then echo 'I quit, bye !' exit 0 fi } # Change repository switch_to_quarterly() { ( echo XXX echo "0" echo "Switching repository to Quarterly..." echo XXX sed -i "" "s/latest/quarterly/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Quarterly repository and updating packages..." 6 50 export whichrepo="QUARTERLY" } # Remove previous report rm_previous_report() { if [ -e /tmp/de_report.tmp ]; then rm -f /tmp/de_report.tmp fi } # Change repository switch_to_latest() { ( echo XXX echo "0" echo "Switching repository to Latest..." echo XXX sed -i "" "s/quarterly/latest/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Latest repository and updating packages..." 6 50 export whichrepo="LATEST" } # Check for Desktop Environnement packages availability before going on check_packages_availability() { bsddialog --infobox "Analyzing repository, please wait..." 3 40 pkg_vars="pkg_list_kdemin pkg_list_kdefull pkg_list_xfcemin pkg_list_xfcefull pkg_list_mate pkg_list_cinnamon pkg_list_gnomemin pkg_list_gnomefull pkg_list_lxqt pkg_list_fvwm pkg_list_wmaker pkg_list_twm pkg_list_vbox" TEMP=$(mktemp) : > "$TEMP" TEMP2=$(mktemp) : > "$TEMP2" for pkg_var in $pkg_vars; do eval pkg_list="\${$pkg_var}" pkg_missing="no" missing_pkgs="" for pkgname in $pkg_list; do latest_version=$(pkg rquery '%v' "$pkgname" 2>/dev/null) if [ -z "$latest_version" ]; then pkg_missing="yes" missing_pkgs="$missing_pkgs $pkgname" fi done if [ "$pkg_missing" = "yes" ]; then case "$pkg_var" in pkg_list_kdemin) env_name="|--KDE-(min)";; pkg_list_kdefull) env_name="|--KDE-(full)";; pkg_list_xfcemin) env_name="|--XFCE-(min)";; pkg_list_xfcefull) env_name="|--XFCE-(full)";; pkg_list_mate) env_name="|--MATE";; pkg_list_cinnamon) env_name="|--CINNAMON-(full)";; pkg_list_gnomemin) env_name="|--GNOME-(min)";; pkg_list_gnomefull) env_name="|--GNOME-(full)";; pkg_list_lxqt) env_name="|--LXQt";; pkg_list_fvwm) env_name="|--FVWM";; pkg_list_vbox) env_name="|--VirtualBox";; pkg_list_wmaker) env_name="|--WindowMaker";; pkg_list_twm) env_name="|--TWM (Xorg)";; esac echo "$env_name:$missing_pkgs" >> "$TEMP" echo "" >> "$TEMP" tr ' ' '\n' < $TEMP > $TEMP2 fi done echo "| ------------------------------------------" >> /tmp/de_report.tmp echo "| Missing packages in $whichrepo repository" >> /tmp/de_report.tmp echo >> /tmp/de_report.tmp cat $TEMP2 >> /tmp/de_report.tmp echo >> /tmp/de_report.tmp } # Display the report show_report() { echo >> /tmp/de_report.tmp echo "| > Press 'q' to go on ..." >> /tmp/de_report.tmp less /tmp/de_report.tmp } # Change repository change_repo() { REPO=$(pkg -vv | awk '/Repositories:/ {flag=1} flag && /url/ {split($3,a,"/"); gsub(/"|,/,"",a[length(a)]); print a[length(a)]; exit}') CHOICE=$(bsddialog --title "Change your Repository? (current : $REPO)" \ --radiolist "Please select an option:" 10 65 3 \ 1 "Quarterly (rebuilt every quarter)" off \ 2 "Latest (continuously updated)" off \ 3 "Do not change the actual configuration" on \ 3>&1 1>&2 2>&3) if [ $? -eq 0 ]; then case $CHOICE in 1) ( echo XXX echo "0" echo "Switching repository to Quarterly..." echo XXX sed -i "" "s/latest/quarterly/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Quarterly repository and updating packages..." 6 50 ;; 2) ( echo XXX echo "0" echo "Switching repository to Latest..." echo XXX sed -i "" "s/quarterly/latest/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Latest repository and updating packages..." 6 50 ;; esac fi } # System Update update() { if bsddialog --yesno "Do you want to update your system before starting?\n (freebsd-update fetch/install)" 6 54; then bsddialog --msgbox "Please review the available changes, then press 'q' to continue" 5 67 freebsd-update fetch freebsd-update install fi } # Create a BE before going on ? create_boot_environment() { # Check if filesystem is ZFS or not fstype=$(df -T / | awk 'NR==2 {print $2}') if [ ! "$fstype" = "zfs" ]; then bsddialog --msgbox "This function is reserved for the ZFS filesystem." 5 53 return fi date=$(date +"%Y%m%d-%H%M%S") if bsddialog --yesno "Do you want to create a boot environment before installation?" 5 65; then pkg info -e beadm || pkg install -y beadm if ! beadm create DE-install_$date; then bsddialog --msgbox "Error creating the boot environment." 5 40 else bsddialog --msgbox "I created a new boot environment named 'DE-install_$date'" 5 71 fi fi } # Change repository change_repo() { REPO=$(pkg -vv | awk '/Repositories:/ {flag=1} flag && /url/ {split($3,a,"/"); gsub(/"|,/,"",a[length(a)]); print a[length(a)]; exit}') CHOICE=$(bsddialog --title "Change your Repository? (current : $REPO)" \ --radiolist "Please select an option:" 10 65 3 \ 1 "Quarterly (rebuilt every quarter)" off \ 2 "Latest (continuously updated)" off \ 3 "Do not change the actual configuration" on \ 3>&1 1>&2 2>&3) if [ $? -eq 0 ]; then case $CHOICE in 1) ( echo XXX echo "0" echo "Switching repository to Quarterly..." echo XXX sed -i "" "s/latest/quarterly/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Quarterly repository and updating packages..." 6 50 ;; 2) ( echo XXX echo "0" echo "Switching repository to Latest..." echo XXX sed -i "" "s/quarterly/latest/" /etc/pkg/FreeBSD.conf >/dev/null 2>&1 sleep 1 echo XXX echo "25" echo "Reinstalling pkg..." echo XXX pkg remove -yf pkg >/dev/null 2>&1 pkg ins -y pkg >/dev/null 2>&1 sleep 1 echo XXX echo "50" echo "Updating packages (first run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "75" echo "Updating packages (second run)..." echo XXX pkg update -f >/dev/null 2>&1 sleep 1 echo XXX echo "100" echo "Packages updated..." echo XXX sleep 1 echo EOF ) | bsddialog --gauge "Switching to Latest repository and updating packages..." 6 50 ;; esac fi } # User user_for_desktop() { if bsddialog --yesno "Have you already created the user who will use the desktop?" 5 63; then for j in $(seq 4); do # Username of the desktop environment user user=$(bsddialog --inputbox "Please enter his username" 8 29 2>&1 1>/dev/tty) #check if the user already exists or not if ! getent passwd "$user" >/dev/null; then bsddialog --msg " !WARNING!\n This user does not exist\n Please try again" 7 58 else break fi done # Exit script if not able to choose a user if [ $j -eq 4 ]; then exit 0 fi else for i in $(seq 4); do user=$(bsddialog --inputbox "What username would you like to give to your user?\n (No spaces or special characters)" 9 54 2>&1 1>/dev/tty) fullname=$(bsddialog --inputbox "Please enter his full name (don't leave empty)" 8 50 2>&1 1>/dev/tty) #check if the user already exists or not if getent passwd "$user" >/dev/null; then if bsddialog --yesno " !WARNING!\n This user already exists\nDo you want to use it [Yes] or create another one [No]" 7 58; then break fi else pw useradd "$user" -d "/home/$user" -m -c "$fullname" clear echo "--------------------------------------" echo "Please assign a password to $user" printf "\n" passwd $user break fi done # Exit script if not able to create a user if [ $i -eq 4 ]; then exit 0 fi fi } ############## # Detect a previous DE installation detect_and_clean_or_keep_existing_de() { # -------------------- # Check for KDE : check_previous_kde_install() { grep -q '^\s*sddm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ [ "$(sysctl -n net.local.stream.recvspace)" -eq 65536 ] && \ [ "$(sysctl -n net.local.stream.sendspace)" -eq 65536 ] && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q kde || return 1 return 0 } if check_previous_kde_install; then # Decide to clear KDE installation or not. if bsddialog --default-no --yesno "A previous KDE installation has been detected.\n Do you want to clear it ?" 6 50; then echo 'I clean KDE installation now' sysrc -x sddm_enable dbus_enable sed -i '' 's/net\.local\.stream\.recvspace=65536//' /etc/sysctl.conf sed -i '' 's/net\.local\.stream\.sendspace=65536//' /etc/sysctl.conf sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_kdefull; do pkg remove -yf $pkg* done cd /home/"$user" rm .Xauthority rm -rf .dbus rm -rf .config rm -rf .local rm .xsession* rm -f drkonqi.core rm -f kcminit.core rm -f ksplashqml.core rm -f plasmashell.core rm -f .dmrc rm -f .gtkrc-2.0 pkg delete -y $(pkg info | grep -i kde | awk '{print $1}') pkg delete -y $(pkg info | grep -i plasma | awk '{print $1}') if bsddialog --yesno " KDE has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for XFCE : check_previous_xfce_install() { grep -q '^\s*lightdm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q xfce || return 1 return 0 } if check_previous_xfce_install; then # Decide to clear Xfce installation or not. if bsddialog --default-no --yesno "A previous Xfce installation has been detected.\n Do you want to clear it ?" 6 51; then echo 'I clean Xfce installation now' sysrc -x lightdm_enable dbus_enable sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_xfcefull; do pkg remove -yf $pkg* done cd /home/"$user" rm -rf .dbus rm -rf .config rm -f .dmrc rm -rf .gnupg rm -rf .local rm -rf .cache rm .xsession* rm .ICEauthority rm .Xauthority rm -f .dmrc rm -f .gtkrc-2.0 pkg delete -y $(pkg info | grep -i xfce | awk '{print $1}') if bsddialog --yesno " Xfce has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for MATE : check_previous_mate_install() { grep -q '^\s*lightdm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q mate || return 1 return 0 } if check_previous_mate_install; then # Decide to clear Mate installation or not. if bsddialog --default-no --yesno "A previous Mate installation has been detected.\n Do you want to clear it ?" 6 51; then echo 'I clean Mate installation now' sysrc -x lightdm_enable dbus_enable sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_mate; do pkg remove -yf $pkg* done cd /home/"$user" rm -rf .dbus rm -rf .config rm -f .dmrc rm -rf .gnupg rm -rf .local rm -rf .cache rm .xsession* rm .ICEauthority rm .Xauthority rm -f .dmrc rm -f .gtkrc-2.0 pkg delete -y $(pkg info | grep -i mate | awk '{print $1}') if bsddialog --yesno " Mate has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for CINNAMON : check_previous_cinnamon_install() { grep -q '^\s*lightdm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q cinnamon || return 1 return 0 } if check_previous_cinnamon_install; then # Decide to clear Mate installation or not. if bsddialog --default-no --yesno "A previous Cinnamon installation has been detected.\n Do you want to clear it ?" 6 55; then echo 'I clean Cinnamon installation now' sysrc -x lightdm_enable dbus_enable sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_cinnamon; do pkg remove -yf $pkg* done cd /home/"$user" rm -rf .dbus rm -rf .config rm -f mate-panel.core rm -rf .cinnamon rm -f .dmrc rm -rf .local rm -rf .cache rm .xsession* rm .Xauthority rm -f .dmrc pkg delete -y $(pkg info | grep -i cinnamon | awk '{print $1}') if bsddialog --yesno " Cinnamon has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for GNOME: check_previous_gnome_install() { grep -q '^\s*gdm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q gnome-shell || return 1 pkg info -q gnome-terminal || return 1 pkg info -q nautilus || return 1 return 0 } if check_previous_gnome_install; then # Decide to clear Gnome installation or not. if bsddialog --default-no --yesno "A previous Gnome installation has been detected.\n Do you want to clear it ?" 6 52; then echo 'I clean Gnome installation now' sysrc -x gdm_enable dbus_enable sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_gnomefull; do pkg remove -yf $pkg* done cd /home/"$user" rm -rf .dbus rm -rf .config rm -rf .local rm -rf .cache rm .xsession* rm .Xauthority rm -f .dmrc pkg delete -y $(pkg info | grep -i gnome | awk '{print $1}') if bsddialog --yesno " Gnome has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for LXQT: check_previous_lxqt_install() { grep -q '^\s*sddm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf && \ grep -q '^proc /proc procfs rw 0 0' /etc/fstab || return 1 pkg info -q lxqt || return 1 return 0 } if check_previous_lxqt_install; then # Decide to clear Lxqt installation or not. if bsddialog --default-no --yesno "A previous lxqt installation has been detected.\n Do you want to clear it ?" 6 51; then echo 'I clean lxqt installation now' sysrc -x sddm_enable dbus_enable sed -i '' 's/proc \/proc procfs rw 0 0//' /etc/fstab pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_lxqt; do pkg remove -yf $pkg* done cd /home/"$user" rm -rf .dbus rm -rf .config rm -rf .local rm -rf .cache pkg delete -y $(pkg info | grep -i lxqt | awk '{print $1}') if bsddialog --yesno " Lxqt has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for FVWM: check_previous_fvwm_install() { grep -q '^\s*sddm_enable="YES"' /etc/rc.conf && \ grep -q '^\s*dbus_enable="YES"' /etc/rc.conf pkg info -q fvwm || return 1 return 0 } if check_previous_fvwm_install; then # Decide to clear fvwm installation or not. if bsddialog --default-no --yesno "A previous fvwm installation has been detected.\n Do you want to clear it ?" 6 51; then echo 'I clean fvwm installation now' sysrc -x sddm_enable dbus_enable pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_fvwm; do pkg remove -yf $pkg done if bsddialog --yesno " fvwm has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi # -------------------- # Check for WINDOWMAKER: check_previous_wmaker_install() { pkg info -q windowmaker || return 1 return 0 } if check_previous_wmaker_install; then # Decide to clear windowmaker installation or not. if bsddialog --default-no --yesno "A previous windowmaker installation has been detected.\n Do you want to clear it ?" 6 58; then echo 'I clean windowmaker installation now' sysrc -x sddm_enable dbus_enable pw groupmod video -d "$user" rm -f /home/"$user"/.xinitrc for pkg in $pkg_list_wmaker; do pkg remove -yf $pkg done if bsddialog --yesno " windowmaker has been entirely removed.\nYou should restart before installing another desktop.\n Do you want to restart now ?" 7 57; then reboot fi fi fi } ############## # DE choices: kde-sddm_min() { for pkg in $pkg_list_kdemin; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc sddm_enable=YES dbus_enable=YES if ! grep -q "net.local.stream.recvspace=65536" /etc/sysctl.conf; then echo "net.local.stream.recvspace=65536" >> /etc/sysctl.conf fi if ! grep -q "net.local.stream.sendspace=65536" /etc/sysctl.conf; then echo "net.local.stream.sendspace=65536" >> /etc/sysctl.conf fi pw groupmod video -m "$user" if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec ck-launch-session startplasma-x11" > /home/"$user"/.xinitrc session_autologin="plasma" } kde-sddm_full() { for pkg in $pkg_list_kdefull; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc sddm_enable=YES dbus_enable=YES if ! grep -q "net.local.stream.recvspace=65536" /etc/sysctl.conf; then echo "net.local.stream.recvspace=65536" >> /etc/sysctl.conf fi if ! grep -q "net.local.stream.sendspace=65536" /etc/sysctl.conf; then echo "net.local.stream.sendspace=65536" >> /etc/sysctl.conf fi pw groupmod video -m "$user" if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec ck-launch-session startplasma-x11" > /home/"$user"/.xinitrc session_autologin="plasma" } xfce-lightdm_min() { for pkg in $pkg_list_xfcemin; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc lightdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi cp /usr/local/etc/xdg/xfce4/xinitrc /home/"$user"/.xinitrc } xfce-lightdm_full() { for pkg in $pkg_list_xfcefull; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc lightdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi cp /usr/local/etc/xdg/xfce4/xinitrc /home/"$user"/.xinitrc } mate-lightdm() { for pkg in $pkg_list_mate; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc lightdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec ck-launch-session mate-session" > /home/"$user"/.xinitrc } cinnamon-lightdm() { for pkg in $pkg_list_cinnamon; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc lightdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec ck-launch-session cinnamon-session" > /home/"$user"/.xinitrc } gnome-gdm_min() { for pkg in $pkg_list_gnomemin; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc gdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec gnome-session" > /home/"$user"/.xinitrc } gnome-gdm_full() { for pkg in $pkg_list_gnomefull; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc gdm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec gnome-session" > /home/"$user"/.xinitrc } lxqt-sddm() { for pkg in $pkg_list_lxqt; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done sysrc sddm_enable=YES dbus_enable=YES if ! grep -q "proc /proc procfs rw 0 0" /etc/fstab; then echo "proc /proc procfs rw 0 0" >> /etc/fstab fi echo "exec ck-launch-session startlxqt" > /home/"$user"/.xinitrc session_autologin="lxqt" } fvwm() { for pkg in $pkg_list_fvwm; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done pw groupmod video -m "$user" sysrc sddm_enable=YES dbus_enable=YES echo "exec fvwm" > /home/"$user"/.xinitrc session_autologin="fvwm" } wmaker() { for pkg in $pkg_list_wmaker; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done pw groupmod video -m "$user" echo "exec wmaker" > /home/"$user"/.xinitrc } twm() { for pkg in $pkg_list_twm; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" echo "| - \"$pkg\" installed" done } #################### # Autologin options autologin() { if bsddialog --yesno "Do you want to enable automatic login at desktop startup?" 5 61; then if [ -f /usr/local/bin/sddm ]; then # SDDM detected cat <> /usr/local/etc/sddm.conf [Autologin] User=$user Session=$session_autologin EOF bsddialog --msgbox "Autologin configured for SDDM." 5 34 elif [ -f /usr/local/sbin/lightdm ]; then # LightDM detected sed -i "" "s/#autologin-user=/autologin-user=$user/" /usr/local/etc/lightdm/lightdm.conf sed -i "" "s/#autologin-user-timeout=0/autologin-user-timeout=0/" /usr/local/etc/lightdm/lightdm.conf bsddialog --msgbox "Autologin configured for LightDM." 5 37 else bsddialog --msgbox "Neither SDDM nor LightDM detected. No changes made." 5 55 fi fi } ########### # DE menus kde-sddm_choice() { DE=$(bsddialog --clear \ --backtitle "KDE-SDDM" \ --title "Desktop Environment" \ --menu "Select your Desktop Environment:" \ 9 40 10 \ 1 "Minimal KDE environment" \ 2 "Full KDE environment" \ 3>&1 1>&2 2>&3) case $? in 0) case $DE in 1) kde-sddm_min ;; 2) kde-sddm_full ;; esac ;; 1|255) desktop_selection_menu ;; esac } xfce-lightdm_choice() { DE=$(bsddialog --clear \ --backtitle "XFCE-LIGHTDM" \ --title "Desktop Environment" \ --menu "Select your Desktop Environnment:" \ 9 40 10 \ 1 "Minimal Xfce environment" \ 2 "Full Xfce environment" \ 3>&1 1>&2 2>&3) case $? in 0) case $DE in 1) xfce-lightdm_min ;; 2) xfce-lightdm_full ;; esac ;; 1|255) desktop_selection_menu ;; esac } gnome-gdm_choice() { DE=$(bsddialog --clear \ --backtitle "GNOME-GDM" \ --title "Desktop Environment" \ --menu "Select your Desktop Environnment:" \ 9 40 10 \ 1 "Minimal GNOME environment" \ 2 "Full GNOME environment" \ 3>&1 1>&2 2>&3) case $? in 0) case $DE in 1) gnome-gdm_min ;; 2) gnome-gdm_full ;; esac ;; 1|255) desktop_selection_menu ;; esac } # DE selection desktop_selection_menu() { DE=$(bsddialog --clear \ --backtitle "Desktop Environnments" \ --title "Desktop Environnment" \ --menu "Select your Desktop Environnment:" \ 17 70 10 \ 1 "KDE (with sddm)" \ 2 "XFCE4 (with lightdm)" \ 3 "MATE (with lightdm)" \ 4 "CINNAMON (with lightdm)" \ 5 "GNOME (with gdm)" \ 6 "LXQT (with sddm)" \ 7 "FVWM" \ 8 "WINDOWMAKER" \ 9 "TWM" \ 10 "(none)" \ 3>&1 1>&2 2>&3) case $DE in 1) kde-sddm_choice ;; 2) xfce-lightdm_choice ;; 3) mate-lightdm ;; 4) cinnamon-lightdm ;; 5) gnome-gdm_choice ;; 6) lxqt-sddm ;; 7) fvwm ;; 8) wmaker ;; 9) twm ;; 10) automatic_graphics_detection ;; esac } ############################################################################################ # Which GPU ? intel-irisxe() { cat < /usr/local/etc/X11/xorg.conf.d/00-scfb.conf Section "Device" Identifier "Card0" Driver "scfb" BusID "$intelirisxe_pci_location" EndSection EOF gpu_configured=1 } vbox() { cat < /usr/local/etc/X11/xorg.conf.d/00-vbox.conf # This configuration file is useless. # It only permits autodetection. EOF gpu_configured=1 } intel-older() { clear pkg_list_intelgpu="xf86-video-intel drm-kmod" for pkg in $pkg_list_intelgpu; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" i915kms" > /dev/null 2>&1 cat < /usr/local/etc/X11/xorg.conf.d/00-intel.conf Section "Device" Identifier "Intel Graphics" Driver "intel" #Option "AccelMethod" "sna" #Option "TearFree" "true" #Option "DRI" "3" #Option "Backlight" "intel_backlight" BusID "$intel_pci_location" EndSection EOF gpu_configured=1 } nvidia-gpu() { TMPFILE=$(mktemp) bsddialog --backtitle "Select your GPU driver" \ --title "Installing graphics" \ --radiolist "Select driver:" 12 60 9 \ "nvidia-driver-304" "Legacy NVIDIA driver 304" off \ "nvidia-driver-340" "Legacy NVIDIA driver 340" off \ "nvidia-driver-390" "Legacy NVIDIA driver 390" off \ "nvidia-driver-470" "Legacy NVIDIA driver 470" off \ "nvidia-driver-570" "Latest NVIDIA driver 570" off 2> "$TMPFILE" choice=$(< "$TMPFILE" sed 's/"//g') rm -f "$TMPFILE" case "$choice" in "nvidia-driver-304") pkg_list_nvidia304="nvidia-driver-304" for pkg in $pkg_list_nvidia304; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" nvidia" > /dev/null 2>&1 # BusID detection pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$pciconf_output" | \ sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | \ sed 's/0://') cat < /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "$nvidia_pci_location" EndSection Section "ServerFlags" Option "IgnoreABI" "1" EndSection EOF gpu_configured=1 ;; "nvidia-driver-340") pkg_list_nvidia340="nvidia-driver-340" for pkg in $pkg_list_nvidia340; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" nvidia" > /dev/null 2>&1 # BusID detection pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$pciconf_output" | \ sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | \ sed 's/0://') cat < /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "$nvidia_pci_location" EndSection EOF gpu_configured=1 ;; "nvidia-driver-390") pkg_list_nvidia390="nvidia-driver-390" for pkg in $pkg_list_nvidia390; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" nvidia-modeset" > /dev/null 2>&1 # BusID detection pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$pciconf_output" | \ sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | \ sed 's/0://') cat < /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "$nvidia_pci_location" EndSection EOF gpu_configured=1 ;; "nvidia-driver-470") pkg_list_nvidia470="nvidia-driver-470" for pkg in $pkg_list_nvidia470; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" nvidia-modeset" > /dev/null 2>&1 # BusID detection pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$pciconf_output" | \ sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | \ sed 's/0://') cat < /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "$nvidia_pci_location" EndSection EOF gpu_configured=1 ;; "nvidia-driver-570") pkg_list_nvidia570="nvidia-driver" for pkg in $pkg_list_nvidia570; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" nvidia-modeset" > /dev/null 2>&1 # BusID detection pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$pciconf_output" | \ sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | \ sed 's/0://') cat < /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "$nvidia_pci_location" EndSection EOF gpu_configured=1 ;; esac } amd-cpu_amd-gpu() { clear pkg_list_amdgpu="xf86-video-amdgpu drm-kmod gpu-firmware-kmod" for pkg in $pkg_list_amdgpu; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc kld_list+=" amdgpu" > /dev/null 2>&1 gpu_configured=1 } graphics_selection_menu() { GPU=$(bsddialog --clear \ --backtitle "GPU" \ --title "GPU Menu" \ --menu "Select your graphics:" \ 13 70 10 \ 1 "Intel Iris Xe" \ 2 "Intel (before Iris Xe)" \ 3 "Nvidia" \ 4 "AMD" \ 5 "Restart automatic GPU detection" \ 6 "Virtual Machine" \ 3>&1 1>&2 2>&3) case $GPU in 1) intel-irisxe ;; 2) intel-older ;; 3) nvidia-gpu ;; 4) amd-gpu ;; 5) automatic_graphics_detection ;; 6) programs_selection_menu ;; esac } automatic_graphics_detection() { # Check if there is an already existing configuration file : if [ -e /usr/local/etc/X11/xorg.conf.d/00-scfb.conf ] || \ [ -e /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf ] || \ [ -e /usr/local/etc/X11/xorg.conf.d/00-intel.conf ] || \ [ -e /usr/local/etc/X11/xorg.conf.d/00-vbox.conf ]; then bsddialog --yesno "I have detected a previous graphics configuration file\n Do you want to use it [Yes] or erase it [No]?" 6 58 existingconf_ornot=$? if [ $existingconf_ornot -eq 0 ]; then useconf="1" return else rm /usr/local/etc/X11/xorg.conf.d/00-scfb.conf 2>&1 rm /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf 2>&1 rm /usr/local/etc/X11/xorg.conf.d/00-intel.conf 2>&1 rm /usr/local/etc/X11/xorg.conf.d/00-vbox.conf 2>&1 graphics_selection_menu return fi fi if [ "$useconf" != "1" ]; then # VIRTUALBOX vbox_pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 "'SVGA II Adapter") vbox_pci_location=$(echo "$vbox_pciconf_output" | sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | sed 's/0://') # INTEL IRIS Xe intelirisxe_pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'Iris Xe') intelirisxe_pci_location=$(echo "$intelirisxe_pciconf_output" | sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | sed 's/0://') # INTEL (before Iris Xe) intel_pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 "HD Graphics") intel_pci_location=$(echo "$intel_pciconf_output" | sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | sed 's/0://') # NVIDIA nvidia_pciconf_output=$(pciconf -lv | grep -B3 'display' | grep -B2 'NVIDIA') nvidia_pci_location=$(echo "$nvidia_pciconf_output" | sed -nE 's/^vgapci[0-9]+@pci([0-9]+:[0-9]+:[0-9]+:[0-9]+).*/PCI:\1/p' | sed 's/0://') # If 2 graphics are detected (Intel Iris Xe and NVIDIA), please choose between if [ ! -z "$intelirisxe_pciconf_output" ] && \ [ ! -z "$nvidia_pciconf_output" ]; then bsddialog --yesno "We have detected both Intel Iris Xe and NVIDIA graphics\n Use Intel Iris Xe [Yes] or NVIDIA [No]?" 6 59 intel_ornvidia=$? if [ $intel_ornvidia -eq 0 ]; then intel-irisxe return else nvidia-gpu return fi fi # If 2 graphics are detected (Intel and NVIDIA), please choose between if [ ! -z "$intel_pciconf_output" ] && \ [ ! -z "$nvidia_pciconf_output" ]; then bsddialog --yesno "We have detected both Intel and NVIDIA graphics\n Use Intel [Yes] or NVIDIA [No]?" 6 51 intel_ornvidia=$? if [ $intel_ornvidia -eq 0 ]; then intel-older return else nvidia-gpu return fi fi # If VirtualBox is detected, ask to accept or not : if [ ! -z "$vbox_pciconf_output" ]; then vbox return fi # If an Intel Iris Xe is detected, ask to accept or not : if [ ! -z "$intelirisxe_pciconf_output" ]; then intel-irisxe return fi # If an Intel is detected, ask to accept or not : if [ ! -z "$intel_pciconf_output" ]; then intel-older return fi # If an NVIDIA is detected, ask to accept or not : if [ ! -z "$nvidia_pciconf_output" ]; then nvidia-gpu return fi # If no choice has been done, go to graphics_selection_menu : if [ ! -e /usr/local/etc/X11/xorg.conf.d/00-scfb.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-intel.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-vbox.conf ]; then graphics_selection_menu return fi fi # If a GPU has been configured, then leave the function if [ "$gpu_configured" -eq 1 ]; then return 0 fi # Check if there is an already existing configuration file : if [ ! -e /usr/local/etc/X11/xorg.conf.d/00-scfb.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-nvidia.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-intel.conf ] && \ [ ! -e /usr/local/etc/X11/xorg.conf.d/00-vbox.conf ]; then graphics_selection_menu return fi } programs_selection_menu() { # Install usual programs TMPFILE=$(mktemp) bsddialog --backtitle "Select usual programs" \ --title "Installing applications" \ --checklist "Select usual programs:" 30 70 20 \ "firefox " "Firefox web browser" off \ "ungoogled-chromium " "Chromium web browser without Google" off \ "chrome-linux " "Linux compat chrome for Netflix" off \ "brave-linux " "Linux compat brave" off \ "edge-linux " "Linux compat edge" off \ "opera-linux " "Linux compat opera" off \ "vivaldi-linux " "Linux compat vivaldi" off \ "qutebrowser " "Qutebrowser vim-like web browser" off \ "tor-browser " "Tor Browser for FreeBSD" off \ "midori " "Midori web browser" off \ "thunderbird " "Thunderbird Mail Client" off \ "claws-mail " "Claws-Mail Client" off \ "remmina " "Remote Desktop Viewer" off \ "tigervnc-server " "TigerVNC Server" off \ "tigervnc-viewer " "TigerVNC Viewer" off \ "anydesk " "Remote Desktop access" off \ "rxvt-unicode " "rxvt modified to support Unicode" off \ "alacritty " "GPU-accelerated terminal emulator" off \ "neofetch " "highly customizable system info script" off \ "putty " "Putty term" off \ "hexchat " "HexChat IRC client" off \ "pidgin " "Pidgin messaging client" off \ "psi " "PSI messaging client" off \ "codeblocks " "Code Editor" off \ "vscode " "Code Editor" off \ "vlc " "VLC multimedia player" off \ "handbrake " "HandBrake video encoder" off \ "ffmpeg " "Video library" off \ "audacity " "Audacity audio editor" off \ "gtk-mixer " "Sound controller" off \ "gimp " "GIMP image editor" off \ "nomacs " "easy image viewer/editor" off \ "ristretto " "Ristretto image viewer" off \ "libreoffice " "LibreOffice office suite" off \ "abiword " "Text editor" off \ "qpdfview " "PDF document viewer" off \ "evince " "PFD reader" off \ "okular " "PDF reader" off \ "filezilla " "FileZilla FTP client" off \ "rsync " "Network file sync utility" off \ "restic " "Restic Simplified Backup tool" off \ "rclone " "Rclone file transfer tool" off \ "rclone-browser " "GUI rclone" off \ "7-zip " "7z file archiver" off \ "keepassxc " "KeePassXC password manager" off \ "keepass " "KeePass password manager" off \ "1password-client " "1Password manager" off \ "1password-client2 " "1Password manager" off \ "openvpn " "OpenVPN Virtual Private Network setup" off \ "tor " "Tor decentralized anonymous network" off \ "wireshark " "Wireshark network protocol analyzer" off \ "nmap " "Nmap network discovery tool" off \ "liferea " "RSS agregator" off \ "musescore " "Sheet music editor" off \ "virtualbox " "VirtualBox Hypervisor" off \ "BVCP " "BVCP (bhyve) Hypervisor" off \ "httrack " "web-site sucker" off 2>$TMPFILE choices=$(sed 's/"//g' < $TMPFILE | tr ' ' '\n') # Install the selected programs. for choice in $choices; do case $choice in "firefox") pkg_list="firefox" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "firefox-esr" done ;; "chrome-linux") pkg_list="wget git" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done if [ ! -e /tmp/linux-browser-installer* ]; then cd /tmp git clone https://github.com/mrclksr/linux-browser-installer.git fi chmod 755 /usr/local/sbin/debootstrap /tmp/linux-browser-installer/linux-browser-installer install chrome ;; "brave-linux") pkg_list="wget git" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done if [ ! -e /tmp/linux-browser-installer ]; then cd /tmp git clone https://github.com/mrclksr/linux-browser-installer.git fi chmod 755 /usr/local/sbin/debootstrap /tmp/linux-browser-installer/linux-browser-installer install brave ;; "edge-linux") pkg_list="wget git" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done if [ ! -e /tmp/linux-browser-installer* ]; then cd /tmp git clone https://github.com/mrclksr/linux-browser-installer.git fi chmod 755 /usr/local/sbin/debootstrap /tmp/linux-browser-installer/linux-browser-installer install edge ;; "opera-linux") pkg_list="wget git" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done if [ ! -e /tmp/linux-browser-installer* ]; then cd /tmp git clone https://github.com/mrclksr/linux-browser-installer.git fi chmod 755 /usr/local/sbin/debootstrap /tmp/linux-browser-installer/linux-browser-installer install opera ;; "vivaldi-linux") pkg_list="wget git" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done if [ ! -e /tmp/linux-browser-installer* ]; then cd /tmp git clone https://github.com/mrclksr/linux-browser-installer.git fi chmod 755 /usr/local/sbin/debootstrap /tmp/linux-browser-installer/linux-browser-installer install vivaldi ;; "pidgin") pkg_list="pidgin pidgin-bot-sentry pidgin-encryption pidgin-fetion pidgin-hotkeys pidgin-latex pidgin-libnotify pidgin-manualsize pidgin-otr pidgin-sipe pidgin-skypeweb pidgin-twitter pidgin-window_merge" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done ;; "anydesk") fetch https://download.anydesk.com/freebsd/anydesk-freebsd-6.1.1-x86_64.tar.gz -P /tmp cd /tmp tar -xvzf anydesk-freebsd* cd anydesk-6* cp anydesk /usr/local/bin/ ;; "virtualbox") pkg_list_vbox="virtualbox-ose virtualbox-ose-additions" for pkg in $pkg_list_vbox; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc vboxguest_enable=YES > /dev/null 2>&1 sysrc vboxservice_enable=YES > /dev/null 2>&1 sysrc vboxnet_enable=YES > /dev/null 2>&1 sysrc -f /boot/loader.conf vboxdrv_load=YES > /dev/null 2>&1 if ! grep -q "^\[system=10\]$" /etc/devfs.rules; then echo "[system=10]" >> /etc/devfs.rules fi if ! grep -q "^add path 'usb/\*' mode 0660 group operator$" /etc/devfs.rules; then echo "add path 'usb/*' mode 0660 group operator" >> /etc/devfs.rules fi sysrc devfs_system_ruleset="system" > /dev/null 2>&1 pw groupmod vboxusers -m "$user" pw groupmod operator -m "$user" sysrc hald_enable=YES > /dev/null 2>&1 if ! grep -q "^perm cd\* 0660$" /etc/devfs.conf; then echo "perm cd* 0660" >> /etc/devfs.conf fi if ! grep -q "^perm xpt0 0660$" /etc/devfs.conf; then echo "perm xpt0 0660" >> /etc/devfs.conf fi if ! grep -q "^perm pass\* 0660$" /etc/devfs.conf; then echo "perm pass* 0660" >> /etc/devfs.conf fi if ! grep -q "^own vboxnetctl root:vboxusers$" /etc/devfs.conf; then echo "own vboxnetctl root:vboxusers" >> /etc/devfs.conf fi if ! grep -q "^perm vboxnetctl 0660$" /etc/devfs.conf; then echo "perm vboxnetctl 0660" >> /etc/devfs.conf fi chown root:vboxusers /dev/vboxnetctl chmod 0660 /dev/vboxnetctl ;; "BVCP") fetch https://bhyve.npulse.net/release.tgz -o /tmp cd /tmp ; tar xvzf release.tgz ; cd bhyve-webadmin* ./install.sh printf "\n" echo "------------------------------------------------------" echo "Please note the admin password and then press [ENTER] to continue" echo "------------------------------------------------------" read ENTER ;; *) pkg info -e "$choice" || pkg ins -y "$choice" ;; esac done rm -f "$TMPFILE" } # usual tools bundle (webcams, printers, RDP, usb devices NTFS/EXFAT automount, CD/DVD burning, hypervisors etc.) usual_tools_installation() { # Install usual tools TMPFILE=$(mktemp) bsddialog --backtitle "Select usual tools" \ --title "Installing applications" \ --checklist "Select usual tools:" 30 70 20 \ "git " "Distributed source code management tool" off \ "webcam " "Automatically configure webcam usage" off \ "NTFS-ExFAT " "Automount USB devices with NTFS/ExFAT" off \ "CD-DVD " "dvd+rw-tools cdrtools" off \ "compress " "Compression/Decompression bundle" off \ "printer " "Use printers" off \ "wifimgr " "Manage Wifi connections" off \ "networkmgr " "Manage Ethernet connections" off \ "bind-tools " "Command line tools from BIND" off \ "htop " "htop monitoring tool" off \ "btop " "btop monitoring tool" off \ "nano " "nano CLI editor" off \ "hw-probe " "Send hardware probes" off \ "inxi " "CLI system information tool" off \ "xrdp " "Remote Desktop Protocol (RDP) server" off \ "rdesktop " "RDP client for Windows" off \ "ipfwGUI " "IPFW firewall GUI manager" off \ "dma " "DragonFly Mail Agent" off \ "coredumps " "Send core dumps to /tmp/core" off \ "cpu_temp " "Enable CPU temp monitoring (Intel/AMD)" off \ "locatedb " "Build locatedb" off \ "password_less" "Enable password-less root login with 'sudo su -'" off \ "wget " "Retrieve files by HTTP(S) or FTP" off 2>$TMPFILE choices=$(sed 's/"//g' < $TMPFILE | tr ' ' '\n') # Install the selected programs. for choice in $choices; do case $choice in "webcam") pkg_list="webcamd pwcview" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc webcamd_enable="YES" service devd restart pw groupmod webcamd -m "$user" sysrc -f /boot/loader.conf cuse_load=YES ;; "NTFS-ExFAT") pkg_list="fuse fusefs-ntfs fusefs-exfat automount" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc -f /boot/loader.conf fusefs_load=YES ;; "CD-DVD") pkg_list="dvd+rw-tools cdrtools" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done ;; "compress") pkg_list="zip unzip bzip2 bzip3 zpaqfranz" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done ;; "printer") pkg_list="cups cups-filters system-config-printer" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc cupsd_enable="YES" ;; "xrdp") pkg_list="xrdp" for pkg in $pkg_list; do pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg" done sysrc xrdp_enable="NO" sysrc xrdp_sesman_enable="NO" ;; "ipfwGUI") if [ ! -x /usr/local/bin/ipfwGUI ]; then cd /tmp git clone https://github.com/bsdlme/ipfwGUI.git cd ipfwGUI make install clean fi ;; "dma") HOSTNAME=$(hostname) MAILSERVER=$(bsddialog --inputbox " DMA : Address of mailserver" 8 33 2>&1 1>/dev/tty) if [ -e /etc/dma/dma.conf ]; then mv /etc/dma/dma.conf /etc/dma/dma.conf.original fi cat < /etc/dma/dma.conf SMARTHOST $MAILSERVER MAILNAME $HOSTNAME NULLCLIENT EOF cat <> /etc/rc.conf # Disable sendmail sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" EOF ;; "coredumps") # Make the cores directory, with sticky bit if [ ! -d /tmp/core ]; then mkdir -p /tmp/cores chmod 1777 /tmp/cores fi CONF="/etc/sysctl.conf" set_sysctl() { KEY="$1" VALUE="$2" # Update sysctl.conf only if the exact line is missing if ! grep -q "^$KEY=$VALUE\$" "$CONF"; then if grep -q "^$KEY=" "$CONF"; then sed -i '' "s|^$KEY=.*|$KEY=$VALUE|" "$CONF" else echo "$KEY=$VALUE" >> "$CONF" fi fi # Apply the setting immediately CURRENT_VAL=$(sysctl -n "$KEY") if [ "$CURRENT_VAL" != "$VALUE" ]; then sysctl "${KEY}=${VALUE}" fi } # Set both values set_sysctl kern.corefile "/tmp/cores/%N.%P.core" set_sysctl kern.coredump "1" ;; "cpu_temp") vendor=$(sysctl -n hw.model 2>/dev/null) if echo "$vendor" | grep -qi "intel"; then sysrc kld_list+=coretemp elif echo "$vendor" | grep -qi "amd"; then sysrc kld_list+=amdtemp fi ;; "locatedb") # updatedb : if [ "$(sysrc -n weekly_locate_enable='/etc/periodic/weekly/310.locate')" = "YES" ]; then echo "The weekly locate update is already enabled in rc.conf. The script 310.locate will not run." else /etc/periodic/weekly/310.locate fi ;; "password_less") pw groupmod wheel -m "$user" pw groupmod operator -m "$user" sed -i '' "s/# %wheel/ %wheel/" /usr/local/etc/sudoers ;; *) pkg info -e "$choice" || pkg ins -y "$choice" ;; esac done rm -f "$TMPFILE" } # Change locale locale_selection_menu() { # Utiliser bsddialog pour afficher une liste avec des boutons radio selected_choice=$(bsddialog --title "Select Locale" --radiolist "Please choose:" 19 50 15 \ "af_ZA.UTF-8" "South Africa" off \ "am_ET.UTF-8" "Ethiopia" off \ "ar_AE.UTF-8" "United Arab Emirates" off \ "ar_EG.UTF-8" "Egypt" off \ "ar_JO.UTF-8" "Jordan" off \ "ar_MA.UTF-8" "Morocco" off \ "ar_QA.UTF-8" "Qatar" off \ "ar_SA.UTF-8" "Saudi Arabia" off \ "be_BY.UTF-8" "Belarus" off \ "bg_BG.UTF-8" "Bulgaria" off \ "ca_AD.UTF-8" "Andorra" off \ "ca_ES.UTF-8" "Spain" off \ "ca_FR.UTF-8" "France" off \ "ca_IT.UTF-8" "Italy" off \ "cs_CZ.UTF-8" "Czech Republic" off \ "da_DK.UTF-8" "Denmark" off \ "de_AT.UTF-8" "Austria" off \ "de_CH.UTF-8" "Switzerland" off \ "de_DE.UTF-8" "Germany" off \ "el_GR.UTF-8" "Greece" off \ "en_AU.UTF-8" "Australia" off \ "en_CA.UTF-8" "Canada" off \ "en_GB.UTF-8" "United Kingdom" off \ "en_HK.UTF-8" "Hong Kong" off \ "en_IE.UTF-8" "Ireland" off \ "en_NZ.UTF-8" "New Zealand" off \ "en_PH.UTF-8" "Philippines" off \ "en_SG.UTF-8" "Singapore" off \ "en_US.UTF-8" "United States" off \ "en_ZA.UTF-8" "South Africa" off \ "es_AR.UTF-8" "Argentina" off \ "es_CR.UTF-8" "Costa Rica" off \ "es_ES.UTF-8" "Spain" off \ "es_MX.UTF-8" "Mexico" off \ "et_EE.UTF-8" "Estonia" off \ "eu_ES.UTF-8" "Spain" off \ "fa_AF.UTF-8" "Afghanistan" off \ "fa_IR.UTF-8" "Iran" off \ "fi_FI.UTF-8" "Finland" off \ "fr_BE.UTF-8" "Belgium" off \ "fr_CA.UTF-8" "Canada" off \ "fr_CH.UTF-8" "Switzerland" off \ "fr_FR.UTF-8" "France" off \ "ga_IE.UTF-8" "Ireland" off \ "he_IL.UTF-8" "Israel" off \ "hi_IN.UTF-8" "India" off \ "hr_HR.UTF-8" "Croatia" off \ "hu_HU.UTF-8" "Hungary" off \ "hy_AM.UTF-8" "Armenia" off \ "is_IS.UTF-8" "Iceland" off \ "it_CH.UTF-8" "Switzerland" off \ "it_IT.UTF-8" "Italy" off \ "ja_JP.UTF-8" "Japan" off \ "kk_KZ.UTF-8" "Kazakhstan" off \ "ko_KR.UTF-8" "South Korea" off \ "lt_LT.UTF-8" "Lithuania" off \ "lv_LV.UTF-8" "Latvia" off \ "mn_MN.UTF-8" "Mongolia" off \ "nb_NO.UTF-8" "Norway" off \ "nl_BE.UTF-8" "Belgium" off \ "nl_NL.UTF-8" "Netherlands" off \ "nn_NO.UTF-8" "Norway" off \ "pl_PL.UTF-8" "Poland" off \ "pt_BR.UTF-8" "Brazil" off \ "pt_PT.UTF-8" "Portugal" off \ "ro_RO.UTF-8" "Romania" off \ "ru_RU.UTF-8" "Russia" off \ "se_FI.UTF-8" "Finland" off \ "se_NO.UTF-8" "Norway" off \ "sk_SK.UTF-8" "Slovakia" off \ "sl_SI.UTF-8" "Slovenia" off \ "sr_RS.UTF-8" "Serbia" off \ "sr_RS.UTF-8@latin" "Serbia" off \ "sv_FI.UTF-8" "Finland" off \ "sv_SE.UTF-8" "Sweden" off \ "tr_TR.UTF-8" "Turkey" off \ "uk_UA.UTF-8" "Ukraine" off \ "zh_CN.UTF-8" "China" off \ "zh_HK.UTF-8" "Hong Kong" off \ "zh_TW.UTF-8" "Taiwan" off 3>&1 1>&2 2>&3) # Check and Add locale choice to /home/"$user"/.profile if [ ! -z $selected_choice ]; then if ! grep -q "export LANG=\"$selected_choice\"" /home/"$user"/.profile; then { echo -e "\n# CUSTOM LOCALE" echo "export LANG=\"$selected_choice\"" } >> /home/"$user"/.profile fi if ! grep -q "export LC_CTYPE=\"$selected_choice\"" /home/"$user"/.profile; then echo "export LC_CTYPE=\"$selected_choice\"" >> /home/"$user"/.profile fi fi # Change the locale for gdm (if installed) if [ -e /usr/local/etc/gdm/locale.conf ]; then sed -i '' "s/en_US.UTF-8/$selected_choice/" /usr/local/etc/gdm/locale.conf fi # Change Keyboard map kbd=$(echo "$selected_choice" | sed 's/^\(..\).*$/\1/') if [ ! -e /usr/local/etc/X11/xorg.conf.d/keyboard.conf ]; then cat < /usr/local/etc/X11/xorg.conf.d/keyboard.conf Section "InputClass" Identifier "KeyboardDefaults" MatchIsKeyboard "on" Option "XkbLayout" "$kbd" EndSection EOF fi build_locatedb } # reboot now reboot_now() { bsddialog --yesno "Thank you for using this script!\n The installation is finished\n Do you want to reboot now?" 7 36 close_inac=$? if [ $close_inac -eq 0 ]; then reboot fi exit 0 } ############################################################################################ # EXECUTION FLOW initial_checks welcome # ---- Package availability report for every DE in the 2 repositories section ---- # rm_previous_report switch_to_quarterly check_packages_availability switch_to_latest check_packages_availability show_report # -------------------------------------------------------------------------------- # change_repo update create_boot_environment user_for_desktop detect_and_clean_or_keep_existing_de desktop_selection_menu autologin automatic_graphics_detection programs_selection_menu usual_tools_installation locale_selection_menu reboot_now