From da3e73d849547439ce5307bc0bf1a970481f33f6 Mon Sep 17 00:00:00 2001
From: majekla <theophile.dudreuilh@yahoo.com>
Date: Fri, 28 Mar 2025 19:40:19 +0000
Subject: [PATCH] Upload files to "/"

---
 freebsd-desktop.sh | 1130 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 1130 insertions(+)
 create mode 100644 freebsd-desktop.sh

diff --git a/freebsd-desktop.sh b/freebsd-desktop.sh
new file mode 100644
index 0000000..a94c9c9
--- /dev/null
+++ b/freebsd-desktop.sh
@@ -0,0 +1,1130 @@
+#!/bin/sh
+
+clear
+
+checkinternet() {
+    local url="https://www.freebsd.org/"
+
+    if fetch -q -o /dev/null "$url"; then
+        echo "Looking for Internet Connection, please wait..."
+    else
+        echo "Your computer is not connected to the internet, I can't go on."
+        exit 1
+    fi
+}
+
+knowyourhardwarefirst() {
+    clear
+    echo "--------------------------------------"
+    echo "Before you start, a note if you have an NVIDIA graphics card:"
+    echo "You need to know which driver version is required for your graphics card to function properly."
+    echo "You will be asked to choose between versions 390, 470 and 550"
+    echo
+    echo "Furthermore, correct UEFI configuration is obviously not supported by this script." 
+    echo "In principle, you must disable the 'GPU Switchable Graphics' feature."
+    echo
+    read -p "Do you still want to go on ? [Y/n] : " confirm
+
+    case $confirm in
+        n) exit 0 ;;
+    esac
+}
+
+installpkg() {
+    printf "\n"
+    echo "Looking for 'pkg', please wait..."
+
+    if [ ! -x /usr/local/sbin/pkg ]; then
+        # Check if pkg can be installed
+        if pkg ins -y 2>&1 | grep -q "error"; then
+            echo "I can't install pkg, please check your internet connection"
+            printf "\n"
+            exit 0
+        fi
+    fi
+}
+
+# Welcome !
+welcome() {
+    echo "Everything seems OK, let's go !"
+    bsddialog --msgbox "Welcome to this desktop installation script for FreeBSD!" 5 60
+}
+
+
+# System Update
+update() {
+    if bsddialog --yesno "Do you want to update your system before starting?" 5 54; then
+        bsddialog --msgbox "Please review the available changes, then press 'q' to continue" 5 67
+        freebsd-update fetch
+        freebsd-update install
+    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
+}
+
+
+# DE choice:
+kde-sddm_min() {
+    pkg_list="xorg sudo sddm plasma5-plasma plasma5-sddm-kcm kf5-kded kf5-kdesu \
+    plasma5-polkit-kde-agent-1 plasma5-kdecoration plasma5-kde-cli-tools"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    done
+
+    sysrc sddm_enable=YES dbus_enable=YES
+
+    sysctl net.local.stream.recvspace=65536 net.local.stream.sendspace=65536 > /dev/null 2>&1
+    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
+
+    sddm_autologin
+}
+
+kde-sddm_full() {
+    pkg_list="xorg sudo sddm kde5 freebsd-8k-wallpapers-kde kde-baseapps kde-dev-scripts \
+    kde-dev-utils kde-thumbnailer-chm kde-thumbnailer-epub kde-thumbnailer-fb2 \
+    kde_poster kdeaccessibility kdeadmin kdebugsettings kdeconnect-kde kdegames \
+    kdegraphics kdegraphics-thumbnailers kdemultimedia kdevelop calligra kmymoney \
+    kdemultimedia-ffmpegthumbs kdenetwork kdenetwork-filesharing kdenlive kdeutils \
+    libkdegames libkdepim libproxy-kde plasma5-kde-cli-tools plasma5-kde-gtk-config \
+    plasma5-kdecoration plasma5-kdeplasma-addons wallpapers-freebsd-kde dsbsu"
+
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    done
+
+    sysrc sddm_enable=YES dbus_enable=YES
+
+    sysctl net.local.stream.recvspace=65536 net.local.stream.sendspace=65536 > /dev/null 2>&1
+    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
+
+    sddm_autologin
+}
+
+xfce-lightdm_min() {
+    pkg_list="xorg sudo lightdm lightdm-gtk-greeter xfce xfce4-session xfce4-settings \
+    xfce4-desktop xfce4-panel xfce4-wm xfce4-terminal xfce4-tumbler \
+    xfce4-power-manager xfce4-notifyd xfce4-screenshooter-plugin xfce4-taskmanager \
+    xfce4-wm-themes xdg-user-dirs"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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
+
+    lightdm_autologin
+}
+
+xfce-lightdm_full() {
+    pkg_list="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-session xfce4-settings \
+        xfce4-desktop xfce4-panel xfce4-wm xfce4-terminal xfce4-tumbler \
+        xfce4-power-manager xfce4-notifyd xfce4-screensaver xfce4-taskmanager \
+        xfce4-screenshooter-plugin xfce-icons-elementary xfce4-wm-themes \
+        xfce4-weather-plugin xfce4-netload-plugin xfce4-systemload-plugin \
+        xfce4-mount-plugin xfce4-notes-plugin xfce4-xkb-plugin"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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
+
+    lightdm_autologin
+}
+
+mate-lightdm() {
+    pkg_list="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 mate-conf-editor"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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
+
+    lightdm_autologin
+}
+
+cinnamon-lightdm() {
+    pkg_list="xorg sudo lightdm lightdm-gtk-greeter cinnamon cinnamon-control-center
+    cinnamon-desktop cinnamon-menus cinnamon-screensaver cinnamon-session
+    cinnamon-settings-daemon cinnamon-translations"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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
+
+    lightdm_autologin
+}
+
+gnome-gdm_min() {
+    pkg_list="xorg sudo gdm gnome-shell gnome-session gnome-desktop gnome-control-center \
+    gnome-settings-daemon gnome-terminal nautilus gnome-tweaks gnome-keyring gnome-backgrounds \
+    gnome-system-monitor gnome-screenshot gnome-power-manager xdg-user-dirs xdg-desktop-portal-gnome"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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() {
+    pkg_list="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"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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() {
+    pkg_list="xorg sudo sddm liblxqt lxqt lxqt-about lxqt-admin lxqt-archiver \
+        lxqt-build-tools lxqt-config lxqt-globalkeys lxqt-menu-data lxqt-notificationd lxqt-openssh-askpass \
+        lxqt-panel lxqt-policykit lxqt-powermanagement lxqt-qtplugin lxqt-runner \
+        lxqt-session lxqt-sudo lxqt-themes xdg-desktop-portal-lxqt"
+
+    for pkg in $pkg_list; do
+        pkg info -e "$pkg" >/dev/null || pkg ins -y "$pkg"
+    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
+
+    sddm_autologin
+}
+
+# Autologin option
+sddm_autologin() {
+    if bsddialog --yesno "Do you want to enable automatic login at desktop startup?" 5 61; then
+        cat <<EOF  >> /usr/local/etc/sddm.conf
+[Autologin]
+User=$user
+Session=plasma
+EOF
+    fi
+}
+
+lightdm_autologin() {
+    if bsddialog --yesno "Do you want to enable automatic login at desktop startup?" 5 61; then
+        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
+    fi
+}
+
+
+# DE min/full installation
+kde-sddm_choice() {
+    DE=$(bsddialog --clear \
+                    --backtitle "KDE-SDDM" \
+                    --title "Desktop Environment" \
+                    --menu "Select your Desktop Environnment:" \
+                    9 40 10 \
+                    1 "Minimal KDE environment" \
+                    2 "Full    KDE environment" \
+                    3>&1 1>&2 2>&3)
+
+    case $DE in
+        1) kde-sddm_min ;;
+        2) kde-sddm_full ;;
+    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 $DE in
+        1) xfce-lightdm_min ;;
+        2) xfce-lightdm_full ;;
+    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 $DE in
+        1) gnome-gdm_min ;;
+        2) gnome-gdm_full ;;
+    esac
+}
+
+# DE selection
+desktop_selection_menu() {
+    DE=$(bsddialog --clear \
+                    --backtitle "Desktop Environnment" \
+                    --title "Desktop Environnment" \
+                    --menu "Select your Desktop Environnment:" \
+                    14 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 "(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) automatic_graphics_detection ;;
+    esac
+}
+
+
+# Which GPU ?
+intel-irisxe() {
+cat <<EOF > /usr/local/etc/X11/xorg.conf.d/00-scfb.conf
+Section "Device"
+    Identifier "Card0"
+    Driver "scfb"
+    BusID "$intelirisxe_pci_location"
+EndSection
+EOF
+}
+
+vbox() {
+cat <<EOF > /usr/local/etc/X11/xorg.conf.d/00-vbox.conf
+# This configuration file is useless.
+# It only permits autodetection.
+EOF
+}
+
+intel-older() {
+    clear
+    pkg info -e xf86-video-intel || pkg ins -y xf86-video-intel
+    pkg info -e drm-kmod || pkg ins -y drm-kmod
+    sysrc kld_list+=" i915kms" > /dev/null 2>&1
+
+cat <<EOF > /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
+}
+
+nvidia-gpu() {
+    TMPFILE=$(mktemp)
+
+    bsddialog --backtitle "Select your GPU driver" \
+        --title "Installing graphics" \
+        --radiolist "Select driver:" 10 60 9 \
+        "nvidia-driver-390" "Legacy NVIDIA driver" off \
+        "nvidia-driver-470" "NVIDIA driver" off \
+        "nvidia-driver-550" "Latest NVIDIA driver" off 2> "$TMPFILE"
+
+    choice=$(< "$TMPFILE" sed 's/"//g')
+    rm -f "$TMPFILE"
+
+    case "$choice" in
+
+        "nvidia-driver-390")
+            pkg info -e nvidia-driver-390 || pkg ins -y nvidia-driver-390
+            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 <<EOF > /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
+        ;;
+        "nvidia-driver-470")
+            pkg info -e nvidia-driver-470 || pkg ins -y nvidia-driver-470
+            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 <<EOF > /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
+        ;;
+        "nvidia-driver-550")
+            pkg info -e nvidia-driver-550 || pkg ins -y nvidia-driver-550
+            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 <<EOF > /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
+        ;;
+    esac
+
+}
+
+amd-cpu_amd-gpu() {
+    clear
+    pkg info -e xf86-video-amdgpu || pkg ins -y xf86-video-amdgpu
+    pkg info -e drm-kmod || pkg ins -y drm-kmod
+    pkg info -e gpu-firmware-kmod || pkg ins -y gpu-firmware-kmod
+    sysrc kld_list+=" amdgpu" > /dev/null 2>&1
+}
+
+
+graphics_selection_menu() {
+    GPU=$(bsddialog --clear \
+                    --backtitle "GPU" \
+                    --title "GPU Menu" \
+                    --menu "Select your graphics:" \
+                    12 70 10 \
+                    1 "Intel Iris Xe" \
+                    2 "Intel (before Iris Xe)" \
+                    3 "Nvidia" \
+                    4 "AMD" \
+                    5 "Virtual Machine" \
+                    3>&1 1>&2 2>&3)
+
+    case $GPU in
+        1) intel-irisxe ;;
+        2) intel-older ;;
+        3) nvidia-gpu ;;
+        4) amd-gpu;;
+    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"
+        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
+        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
+            else
+                nvidia-gpu
+            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
+            else
+                nvidia-gpu
+            fi
+        fi
+
+        # If VirtualBox is detected, ask to accept or not :
+        if [ ! -z "$vbox_pciconf_output" ]; then
+                vbox
+        fi
+
+        # If an Intel Iris Xe is detected, ask to accept or not :
+        if [ ! -z "$intelirisxe_pciconf_output" ]; then
+                intel-irisxe
+        fi
+
+        # If an Intel is detected, ask to accept or not :
+        if [ ! -z "$intel_pciconf_output" ]; then
+                intel-older
+        fi
+
+        # If an NVIDIA is detected, ask to accept or not :
+        if [ ! -z "$nvidia_pciconf_output" ]; then
+                nvidia-gpu
+        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
+        fi
+    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
+    fi
+}
+
+programs_selection_menu() {
+    # Install usual programs
+    TMPFILE=$(mktemp)
+
+    bsddialog --backtitle "Select programs" \
+        --title "Installing applications" \
+        --checklist "Select 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 \
+        "anydesk " "Remote Desktop access" 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 \
+        "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 \
+        "ytdl " "YouTube video downloader" off \
+        "musescore " "Sheet music editor" 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 info firefox || pkg install -y firefox-esr
+            ;;
+            "chrome-linux")
+
+                pkg info -e wget || pkg ins -y wget
+                pkg info -e git || pkg ins -y git
+
+
+                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 info -e wget || pkg ins -y wget
+                pkg info -e git || pkg ins -y git
+
+                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 info -e wget || pkg ins -y wget
+                pkg info -e git || pkg ins -y git
+
+                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 info -e wget || pkg ins -y wget
+                pkg info -e git || pkg ins -y git
+
+                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 info -e wget || pkg ins -y wget
+                pkg info -e git || pkg ins -y git
+
+                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/
+            ;;
+            *)
+                pkg info -e "$choice" || pkg ins -y "$choice"
+            ;;
+        esac
+    done
+
+    rm -f "$TMPFILE"
+}
+
+
+
+# usual tools bundle
+usual_tools_installation() {
+    pkg_list="wget w3m lynx rsync emacs nano sshpass fuse fusefs-ntfs fusefs-exfat
+    automount megatools dvd+rw-tools cdrtools webcamd cups cups-filters system-config-printer
+    pwcview wifimgr networkmgr zip unzip bzip2 bzip3 btop htop nmap bind-tools git
+    rdesktop xrdp tree gh hw-probe inxi python3 bhyve-firmware openssl gtkglext zpaqfranz qemu-tools"
+
+    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
+    sysrc webcamd_enable="YES"
+    service devd restart
+    pw groupmod webcamd -m "$user"
+    sysrc -f /boot/loader.conf cuse_load=YES
+    sysrc cupsd_enable="YES"
+    sysrc xrdp_enable="NO"
+    sysrc xrdp_sesman_enable="NO"
+
+    if [ ! -x /usr/local/bin/ipfwGUI ]; then
+        cd /tmp
+        git clone https://github.com/bsdlme/ipfwGUI.git
+        cd ipfwGUI
+        make install clean
+    fi
+}
+
+
+
+# Install a hypervisor
+hypervisor_selection() {
+    TMPFILE=$(mktemp)
+
+    bsddialog --backtitle "Select programs" \
+            --title "Install a hypervisor" \
+            --checklist "Select programs:" 9 70 20 \
+            "virtualbox-ose " "VirtualBox" off \
+            "BVCP " "GUI Bhyve manager" off 2>$TMPFILE
+
+    # Read the user choices from the temporary file.
+    choices=$(sed 's/"//g' < $TMPFILE | tr ' ' '\n')
+
+
+    # Install the selected programs.
+    for choice in $choices; do
+
+        if [ "$choice" = "virtualbox-ose" ]; then
+            pkg info -e virtualbox-ose || pkg ins -y virtualbox-ose
+            pkg info -e virtualbox-ose-additions || pkg ins -y virtualbox-ose-additions
+
+            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
+
+        fi
+        if [ "$choice" = "BVCP" ]; then
+            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
+        fi
+    done
+
+    rm -f "$TMPFILE"
+}
+
+
+# Add $user to wheel and operator group, add wheel group to sudo permissions
+make_administrator() {
+    pw groupmod wheel -m "$user"
+    pw groupmod operator -m "$user"
+    sed -i '' "s/# %wheel/ %wheel/" /usr/local/etc/sudoers
+}
+
+
+
+# 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 ! 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
+
+    # 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 <<EOF > /usr/local/etc/X11/xorg.conf.d/keyboard.conf
+Section "InputClass"
+Identifier  "KeyboardDefaults"
+    MatchIsKeyboard "on"
+    Option  "XkbLayout" "$kbd"
+EndSection
+EOF
+
+    fi
+
+
+}
+
+build_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
+}
+
+# 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
+}
+
+################################################################################################################
+
+checkinternet
+knowyourhardwarefirst
+installpkg
+welcome
+update
+user_for_desktop
+desktop_selection_menu
+automatic_graphics_detection # at the very moment, only Intel 'Iris Xe', Intel 'HD/UHD Graphics' and 'NVIDIA' are automatically detected, choice must be asked manually for others
+programs_selection_menu
+usual_tools_installation
+hypervisor_selection
+make_administrator
+locale_selection_menu
+build_locatedb
+reboot_now