#!/usr/bin/env bash # Installation Start *_:*:_*:*:_*_*:*:_*::*_*::*_*:_*::*_*:*:_:*:*_*:*:_*:*_:*:# function start_installation() { # Set Echo colors # for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done # shellcheck disable=SC2034 NC="\033[0m" # shellcheck disable=SC2034 RED="\033[0;31m" # shellcheck disable=SC2034 RED2="\033[38;5;196m" # shellcheck disable=SC2034 GREEN="\033[0;32m" # shellcheck disable=SC2034 YELLOW="\033[0;33m" # shellcheck disable=SC2034 BLUE="\033[0;94m" # Function to check and exit on error use, check_error "TXT" #set -euo pipefail # Can be good, but can also cause errors in things that are incorrectly aligned versions bash check_error() { if [ $? -ne 0 ]; then echo -e "${RED} An error occurred during installation and has been stopped. ${NC}" echo -e "${RED} Or you have pressed CTRL + C to cancel. ${NC}" echo -e "${RED} Error occurred during $1 ${NC}" exit 1 fi } clear #Clear the screen # Check if it's a Debian system installation and get the version codename. # shellcheck disable=SC1091 if [ -f /etc/debian_version ]; then . /etc/os-release #Get the VERSION_CODENAME # shellcheck disable=SC2034 VERSION_CODENAME_SHOULD_NOT_BE=codename-her else echo -e "${RED} This installation should only be run on a Debian Linux System. ${NC}" echo -e "${RED} See more at https://git.itmail.dk/mara/danos/ ${NC}" exit 1 fi # shellcheck disable=SC1091 echo -e "${GREEN} ${NC}" echo -e "${GREEN} " echo -e "${GREEN} Starting the DanOS installation" echo -e "${GREEN} See more info at https://git.itmail.dk/mara/danos/" echo -e "${GREEN} Enter your user password, to continue if necessary" echo -e "${GREEN} Or CTRL + C to cancel the installation" echo -e "${GREEN} " echo -e "${GREEN} ${NC}" # Run APT Update sudo apt update || exit 1 clear #Clear the screen check_error "APT Update Nr. 1" # DanOS Git install + clone # Check if the GIT is installed if ! dpkg -s git >/dev/null 2>&1; then echo "Git is not installed, Installing git now..." sudo DEBIAN_FRONTEND=noninteractive apt install -y git fi # DanOS git clone cd /tmp/ || exit git clone --depth 1 https://git.itmail.dk/mara/danos.git # danos to usr/bin sudo cp -fu danos/install.sh /usr/bin/danos sudo chmod +x /usr/bin/danos sudo sed -i 's/start_installation #main-run/help_wiki #main-run/g' /usr/bin/danos sudo sed -i 's/sudo reboot #main-run/#sudo reboot #main-run/g' /usr/bin/danos # Qtile Config file if [ -f danos/src/config/qtile-config.py ]; then mkdir -p ~/.config/qtile/ cat danos/src/config/qtile-config.py >~/.config/qtile/config.py else echo "Qtile config file already exists." fi clear #Clear the screen check_error "Qtile Config file" # Qtile Autostart.sh file mkdir -p ~/.config/qtile/ if [ -f danos/src/config/qtile-autostart.sh ]; then cat danos/src/config/qtile-autostart.sh >~/.config/qtile/autostart.sh chmod +x ~/.config/qtile/autostart.sh fi clear #Clear the screen check_error "Qtile Autostart.sh file" # ADD ETC Environment if [ -f danos/src/etc/environment ]; then # shellcheck disable=SC2002 cat "danos/src/etc/environment" | sudo tee /etc/environment fi check_error "etc environment file copy" # ADD CONFIG FILES TO ETC if [ -f danos/src/etc/modprobe.d/audio_disable_powersave.conf ]; then # shellcheck disable=SC2002 cat danos/src/etc/modprobe.d/audio_disable_powersave.conf | sudo tee /etc/modprobe.d/audio_disable_powersave.conf fi check_error "audio_disable_powersave.conf file copy" if [ -f danos/src/etc/pipewire/pipewire.conf.d/pipewire.conf ]; then sudo mkdir -p /etc/pipewire/pipewire.conf.d # shellcheck disable=SC2002 cat danos/src/etc/pipewire/pipewire.conf.d/pipewire.conf | sudo tee /etc/pipewire/pipewire.conf.d/pipewire.conf fi check_error "pipewire.conf file copy" if [ -f danos/src/etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf ]; then sudo mkdir -p /etc/wireplumber/wireplumber.conf.d # shellcheck disable=SC2002 cat danos/src/etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf | sudo tee /etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf fi check_error "51-disable-suspension.conf copy" if [ -f danos/src/config/kitty.conf ]; then mkdir -p ~/.config/kitty/themes # shellcheck disable=SC2002 cat danos/src/config/kitty.conf >~/.config/kitty/kitty.conf fi check_error "Kitty config file copy" # auto-new-wallpaper-and-colors BIN if [ -f danos/src/usr/bin/auto-new-wallpaper-and-colors.sh ]; then # shellcheck disable=SC2002 cat danos/src/usr/bin/auto-new-wallpaper-and-colors.sh | sudo tee /usr/bin/auto-new-wallpaper-and-colors sudo chmod +x /usr/bin/auto-new-wallpaper-and-colors fi clear #Clear the screen check_error "auto-new-wallpaper-and-colors bin" # Add Wallpapers if [ ! -d ~/Wallpapers ]; then mkdir -p ~/Wallpapers cp -rfu danos/wallpapers/* ~/Wallpapers/ else echo "Wallpapers folder already exists." fi # Check and Copy APT Sources List if [ -f /etc/apt/sources.list ]; then sudo mv /etc/apt/sources.list /etc/apt/old-type-sources.list.bak fi # Copy in new APT files sudo cp -rfu danos/src/apt/* /etc/apt/ check_error "Copy APT Sources list files" #Get the VERSION_CODENAME to determine changes to be made in APT source list. OS_VERSION_FOR_APT=$(lsb_release -cs) case "$OS_VERSION_FOR_APT" in bookworm) echo "Bookworm Detected." sudo sed -i 's/APTLISTOS/bookworm/g' /etc/apt/sources.list.d/debian.sources ;; trixie) echo "Trixie Detected." sudo sed -i 's/APTLISTOS/trixie/g' /etc/apt/sources.list.d/debian.sources ;; forky) echo "Forky Detected." sudo sed -i "s/Suites: APTLISTOS APTLISTOS-updates APTLISTOS-backports/Suites: sid trixie-updates trixie-backports/g" "/etc/apt/sources.list.d/debian.sources" sudo sed -i "s/Suites: APTLISTOS-security/Suites: trixie-security/g" "/etc/apt/sources.list.d/debian.sources" ;; *) echo "Unknown Debian release: $OS_VERSION_FOR_APT. Stop action taken." exit 1 ;; esac # this IF statement will be replaced by the CASE... #if [ "$VERSION_CODENAME" == "trixie" ] || [ "$VERSION_CODENAME" == "sid" ]; then # if grep -q "Suites: bookworm" "/etc/apt/sources.list.d/debian.sources"; then # echo "Sentence found. Replacing..." # sudo sed -i 's/APTLISTOSbookworm/trixie/g' /etc/apt/sources.list.d/debian.sources # #sudo sed -i "s/Suites: bookworm bookworm-updates bookworm-backports/Suites: sid bookworm-updates bookworm-backports/g" "/etc/apt/sources.list.d/debian.sources" # else # echo "APT Sources list, No changes made." # fi #fi check_error "Check and replace APT Sources list distro" # Check for version of Debian and replace in source list of necessary # Sudoers ------------------------------------------------------------------------------------------------------------------------------------ # Add User NOPASSWD to shutdown now and reboot echo "$USER ALL=(ALL) NOPASSWD: /sbin/shutdown now, /sbin/reboot, /usr/bin/systemctl suspend, /usr/bin/systemctl hibernate, /usr/bin/yazi, /usr/bin/mc" | sudo tee -a /etc/sudoers.d/"$USER" && sudo visudo -c -f /etc/sudoers.d/"$USER" check_error "Sudo User NOPASSWD to shutdown now and reboot" # Set sudo password timeout echo "Defaults timestamp_timeout=25" | sudo tee -a /etc/sudoers.d/"$USER" && sudo visudo -c -f /etc/sudoers.d/"$USER" check_error "Set sudo password timeout" # Sudoers ------------------------------------------------------------------------------------------------------------------------------------ clear #Clear the screen sudo apt update clear #Clear the screen check_error "APT Update Nr. 2" # ------------------------------------------------------------------------------------------------- # Core System APT install sudo DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install bash-completion xserver-xorg x11-utils xinit polkitd pkexec lxpolkit acl arandr autorandr picom fwupd colord mesa-utils htop wget curl git tmux numlockx kitty neovim xdg-utils ufw gufw cups cups-common lm-sensors fancontrol fastfetch xbacklight brightnessctl unzip network-manager bind9-dnsutils dunst libnotify-bin notify-osd xsecurelock pm-utils rofi 7zip jq poppler-utils fd-find ripgrep zoxide imagemagick nsxiv mpv flameshot mc thunar gvfs gvfs-backends parted gparted mpd mpc ncmpcpp fzf ccrypt xarchiver notepadqq font-manager fontconfig fontconfig-config fonts-recommended fonts-liberation fonts-freefont-ttf fonts-noto-core libfontconfig1 pipewire pipewire-audio pipewire-alsa pipewire-pulse pipewire-jack wireplumber libspa-0.2-bluetooth pavucontrol playerctl alsa-utils qpwgraph sddm-theme-breeze ffmpeg build-essential dkms cmake remmina libreoffice linux-cpupower plymouth plymouth-themes keynav yt-dlp qalculate-gtk xss-lock power-profiles-daemon sudo DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install linux-headers-"$(uname -r)" sudo DEBIAN_FRONTEND=noninteractive apt -y install sddm --no-install-recommends check_error "Core System APT install" # APT install extra packages #sudo DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install if [ "$VERSION_CODENAME" == "trixie" ] || [ "$VERSION_CODENAME" == "sid" ]; then echo " " else sudo DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install freerdp2-x11 libfreerdp-client2-2 libfreerdp2-2 libwinpr2-2 fi clear #Clear the screen check_error "APT install extra packages" # Google Chrome install. cd /tmp/ && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && sudo DEBIAN_FRONTEND=noninteractive apt install -y /tmp/google-chrome-stable_current_amd64.deb && rm google-chrome-stable_current_amd64.deb clear #Clear the screen check_error "Google Chrome install" # Network Share Components sudo DEBIAN_FRONTEND=noninteractive apt install -y ceph-common smbclient nfs-common && echo "# CEPH" | sudo tee -a /etc/fstab && echo "#:/ /mnt/cephfs ceph name=clientNAME,noatime,_netdev 0 0" | sudo tee -a /etc/fstab clear #Clear the screen check_error "Network Share Components" # Check if the CPU is a QEMU Virtual CPU using lscpu if lscpu | grep -iq "QEMU"; then echo "QEMU Virtual CPU detected. Installing xrdp and restarting service..." sudo apt update sudo DEBIAN_FRONTEND=noninteractive apt install -y xrdp sudo systemctl restart xrdp.service fi clear #Clear the screen check_error "Check if the CPU is a QEMU Virtual CPU and install xrdp" # Check for Bluetooth hardware using lsusb if lsusb | grep -iq bluetooth; then echo "Bluetooth detected, Installing required packages..." sudo DEBIAN_FRONTEND=noninteractive apt install -y bluetooth bluez bluez-cups bluez-obexd bluez-meshd pulseaudio-module-bluetooth bluez-firmware blueman fi clear #Clear the screen check_error "Check for Bluetooth hardware and install" # Check for Logitech hardware using lsusb # Solaar - Logitech Unifying Receiver - Accessory management for Linux. if lsusb | grep -iq Logitech; then echo "Logitech detected, Installing required packages..." sudo DEBIAN_FRONTEND=noninteractive apt install -y solaar fi clear #Clear the screen check_error "Check for Logitech hardware and install" # Audio Start - https://alsa.opensrc.org - https://wiki.debian.org/ALSA # See hardware run: "pacmd list-sinks" or "lspci | grep -i audio" or... sudo dmesg | grep 'snd\|firmware\|audio' # Run.: "pw-cli info" provides detailed information about the PipeWire nodes and devices, including ALSA devices. # Test file run: "aplay /usr/share/sounds/alsa/Front_Center.wav" # sudo adduser $USER audio # PipeWire Sound Server "Audio" - https://pipewire.org/ # More Audio tools # sudo DEBIAN_FRONTEND=noninteractive apt install -y alsa-tools # sudo alsactl init clear #Clear the screen check_error "Audio Core System APT install" # CPU Microcode install export LC_ALL=C # All subsequent command output will be in English CPUVENDOR=$(lscpu | grep "Vendor ID:" | awk '{print $3}') if [ "$CPUVENDOR" == "GenuineIntel" ]; then if ! dpkg -s intel-microcode >/dev/null 2>&1; then sudo DEBIAN_FRONTEND=noninteractive apt install -y intel-microcode fi else echo -e "${GREEN} Intel Microcode OK ${NC}" fi if [ "$CPUVENDOR" == "AuthenticAMD" ]; then if ! dpkg -s amd64-microcode >/dev/null 2>&1; then sudo DEBIAN_FRONTEND=noninteractive apt install -y amd64-microcode fi else echo -e "${GREEN} Amd64 Microcode OK ${NC}" fi unset LC_ALL # unset the LC_ALL=C clear #Clear the screen check_error "CPU Microcode install" # Alias echo to ~/.bashrc or ~/.bash_aliases BASHALIASFILE=~/.bashrc # shellcheck disable=SC2129 echo 'alias ls="ls --color=auto --group-directories-first -v -lah"' >>$BASHALIASFILE # shellcheck disable=SC2129 echo 'alias ll="ls --color=auto --group-directories-first -v -lah"' >>$BASHALIASFILE echo 'alias df="df -h"' >>$BASHALIASFILE echo 'alias neofetch="fastfetch"' >>$BASHALIASFILE echo 'alias upup="sudo apt update && sudo apt upgrade -y && sudo apt clean && sudo apt autoremove -y"' >>$BASHALIASFILE # shellcheck disable=SC2028,SC2016 echo 'bind '"'"'"\C-f":"open "$(fzf)"\n"'"'" >>$BASHALIASFILE echo 'alias lsman="compgen -c | fzf | xargs man"' >>$BASHALIASFILE echo 'alias qtileconfig="nano ~/.config/qtile/config.py"' >>$BASHALIASFILE echo 'alias qtileconfig-test="python3 ~/.config/qtile/config.py"' >>$BASHALIASFILE echo 'alias qtileconfig-test-venv="source /opt/qtile_venv/bin/activate && python3 ~/.config/qtile/config.py && deactivate"' >>$BASHALIASFILE echo 'alias autostart-edit="nano ~/.config/qtile/autostart.sh"' >>$BASHALIASFILE echo 'alias vi="nvim"' >>$BASHALIASFILE echo 'alias vim="nvim"' >>$BASHALIASFILE # shellcheck disable=SC2026 echo 'alias ytdl="yt-dlp -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'"' >>$BASHALIASFILE echo 'alias ytdl-ao="yt-dlp --extract-audio --audio-format mp3 --audio-quality 7 --embed-thumbnail"' >>$BASHALIASFILE clear #Clear the screen check_error "Bash Alias Echo" #PROFILESFILE=~/.profile #echo "export color_prompt=yes" >>$PROFILESFILE # Set User folders via xdg-user-dirs-update & xdg-mime default. # ls /usr/share/applications/ Find The Default run.: "xdg-mime query default inode/directory" xdg-user-dirs-update xdg-mime default kitty.desktop text/x-shellscript xdg-mime default nsxiv.desktop image/jpeg xdg-mime default nsxiv.desktop image/png xdg-mime default thunar.desktop inode/directory mkdir -p ~/Screenshots check_error "xdg-user-dirs-update and xdg-mime" sudo rm /usr/share/sddm/faces/.face.icon sudo rm /usr/share/sddm/faces/root.face.icon cd /tmp/ || exit sudo cp -fu danos/src/home/root.face.icon /usr/share/sddm/faces/root.face.icon sudo cp -fu danos/src/home/.face.icon /usr/share/sddm/faces/.face.icon cp -fu danos/src/home/.faceace.icon ~/.face.icon setfacl -m u:sddm:x ~/ setfacl -m u:sddm:r ~/.face.icon sudo setfacl -m u:sddm:x /usr/share/sddm/faces/ sudo setfacl -m u:sddm:r /usr/share/sddm/faces/.face.icon sudo setfacl -m u:sddm:r /usr/share/sddm/faces/root.face.icon check_error "Set User .face.icon file" sudo mkdir -p /etc/sddm.conf.d sudo bash -c 'cat << "SDDMCONFIG" >> /etc/sddm.conf.d/default.conf [Theme] # Set Current theme "name" breeze, maui etc. Current=breeze [Wayland] EnableHiDPI=true [X11] EnableHiDPI=true SDDMCONFIG' # Set login wallpape under background=/ in /usr/share/sddm/themes/breeze/theme.conf #/usr/share/wallpapers/login-wallpape.jpg clear #Clear the screen check_error "Setup SDDM Login" # Midnight-Commander ini file # mkdir -p ~/.config/mc # cat <<"MCINI" >~/.config/mc/ini #[Midnight-Commander] #skin=nicedark #MCINI # check_error "Setup Midnight-Commander ini file" # Qtile Core Dependencies apt install sudo DEBIAN_FRONTEND=noninteractive apt install -y feh python3-full python3-pip python3-venv pipx libxkbcommon-dev libxkbcommon-x11-dev libcairo2-dev pkg-config curl -LsSf https://astral.sh/uv/install.sh | sh # Install UV Python package and project manager. # shellcheck disable=SC1091 source "$HOME"/.local/bin/env # Activate UV after install clear #Clear the screen check_error "Qtile Core Dependencies apt install" # Install Qtile from source via github and Pip cd ~ || exit mkdir -p ~/.local/bin mkdir -p ~/.local/src # Python3 venv Qtile install # Upgrade run: python3 -m venv --upgrade qtile_venv cd /opt || exit if [ "$VERSION_CODENAME" == "bookworm" ]; then if [ -d qtile_venv ]; then sudo rm -rf qtile_venv fi sudo python3 -m venv qtile_venv sudo chmod -R 777 qtile_venv cd qtile_venv || exit git clone --depth 1 https://git.itmail.dk/mara/danos.git git clone --depth 1 https://github.com/qtile/qtile.git --branch v0.32.0 # Specific version of Qtile # shellcheck disable=SC1091 source /opt/qtile_venv/bin/activate pip install dbus-next psutil wheel pyxdg pip install -r qtile/requirements.txt bin/pip install qtile/. # PyWAL install via pip3 for auto-generated color themes #pip3 install pywal16[all] # shellcheck disable=SC2102 pip3 install pywal16[colorz] deactivate sudo cp -fu danos/install.sh /usr/bin/danos sudo chmod +x /usr/bin/danos sudo cp -fu bin/qtile /usr/bin/ sudo cp -fu bin/wal /usr/bin/ else sudo mkdir qtile_venv sudo chmod -R 777 qtile_venv && cd qtile_venv || exit #git clone --depth 1 https://github.com/qtile/qtile.git # The latest version of Qtile git clone --depth 1 https://git.itmail.dk/mara/danos.git sudo cp -fu danos/install.sh /usr/bin/danos sudo chmod +x /usr/bin/danos uv tool install qtile # The latest version of Qtile via UV # shellcheck disable=SC2102 uv tool install pywal16[colorz] sudo cp -fu ~/.local/bin/qtile /usr/bin/ sudo cp -fu ~/.local/bin/wal /usr/bin/ fi clear #Clear the screen check_error "Install Qtile and PyWAL from qtile_venv" mkdir -p ~/.cache/wal cat <<"PYWALCOLORSJSON" >~/.cache/wal/colors.json { "checksum": "85abc768e55abc92396e0c76280093cc", "wallpaper": "/home/username/Wallpapers/default_wallpaper.jpg", "alpha": "100", "special": { "background": "#06090c", "foreground": "#c0c1c2", "cursor": "#c0c1c2" }, "colors": { "color0": "#06090c", "color1": "#1f384b", "color2": "#304d5c", "color3": "#375d6e", "color4": "#4e5b61", "color5": "#526870", "color6": "#66767a", "color7": "#899195", "color8": "#555f68", "color9": "#2a4b64", "color10": "#40677b", "color11": "#4a7d93", "color12": "#687a82", "color13": "#6e8b96", "color14": "#889ea3", "color15": "#c0c1c2" } } PYWALCOLORSJSON clear #Clear the screen check_error "pywal colors json" mkdir -p ~/.config/kitty/themes mkdir -p ~/.cache/wal/ cat <<"PYWALCOLORSKITTY" >~/.cache/wal/colors-kitty.conf foreground #c0c1c2 background #06080b background_opacity 0.98 cursor #c0c1c2 active_tab_foreground #06080b active_tab_background #c0c1c2 inactive_tab_foreground #c0c1c2 inactive_tab_background #06080b active_border_color #c0c1c2 inactive_border_color #06080b bell_border_color #1b394e color0 #06080b color8 #555b67 color1 #1b394e color9 #244d68 color2 #245067 color10 #306b8a color3 #33667f color11 #4589aa color4 #4e606e color12 #698193 color5 #557384 color13 #729ab0 color6 #6c818e color14 #91adbe color7 #898d95 color15 #c0c1c2 PYWALCOLORSKITTY ln -s ~/.cache/wal/colors-kitty.conf ~/.config/kitty/themes/current-theme.conf # PyWal kitty template mkdir -p ~/.config/wal/templates/ cat <<"PYWALCOLORSTEMPALETKITTY" >~/.config/wal/templates/colors-kitty.conf foreground {foreground} background {background} background_opacity 0.98 cursor {cursor} active_tab_foreground {background} active_tab_background {foreground} inactive_tab_foreground {foreground} inactive_tab_background {background} active_border_color {foreground} inactive_border_color {background} bell_border_color {color1} color0 {color0} color8 {color8} color1 {color1} color9 {color9} color2 {color2} color10 {color10} color3 {color3} color11 {color11} color4 {color4} color12 {color12} color5 {color5} color13 {color13} color6 {color6} color14 {color14} color7 {color7} color15 {color15} PYWALCOLORSTEMPALETKITTY clear #Clear the screen check_error "pywal colors kitty" cat <<"PYWALCOLORSTEMPALETROFI" >~/.config/wal/templates/colors-rofi-dark.rasi * {{ active-background: {color2}; active-foreground: @foreground; normal-background: @background; normal-foreground: @foreground; urgent-background: {color1}; urgent-foreground: @foreground; alternate-active-background: @background; alternate-active-foreground: @foreground; alternate-normal-background: @background; alternate-normal-foreground: @foreground; alternate-urgent-background: @background; alternate-urgent-foreground: @foreground; selected-active-background: {color1}; selected-active-foreground: @foreground; selected-normal-background: {color2}; selected-normal-foreground: @foreground; selected-urgent-background: {color3}; selected-urgent-foreground: @foreground; background-color: @background; background: {background}; foreground: {foreground}; border-color: @background; spacing: 2; }} #window {{ width: 30%; background-color: @background; border: 0; padding: 2.5ch; }} #mainbox {{ border: 0; padding: 0; background-color: @background; children: [inputbar, listview]; }} #message {{ border: 2px 0px 0px; border-color: @border-color; padding: 1px; }} #textbox {{ text-color: @foreground; }} #inputbar {{ children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; }} #textbox-prompt-colon {{ expand: false; str: ":"; margin: 0px 0.3em 0em 0em; text-color: @normal-foreground; }} #listview {{ fixed-height: 0; border: 2px 0px 0px; border-color: @border-color; spacing: 2px; scrollbar: true; padding: 2px 0px 0px; }} #element {{ border: 0; padding: 8 0; }} #element-text {{ background-color: inherit; text-color: inherit; }} #element-icon {{ size: 30; }} #element.normal.normal {{ background-color: @normal-background; text-color: @normal-foreground; }} #element.normal.urgent {{ background-color: @urgent-background; text-color: @urgent-foreground; }} #element.normal.active {{ background-color: @active-background; text-color: @active-foreground; }} #element.selected.normal {{ background-color: @selected-normal-background; text-color: @selected-normal-foreground; }} #element.selected.urgent {{ background-color: @selected-urgent-background; text-color: @selected-urgent-foreground; }} #element.selected.active {{ background-color: @selected-active-background; text-color: @selected-active-foreground; }} #element.alternate.normal {{ background-color: @alternate-normal-background; text-color: @alternate-normal-foreground; }} #element.alternate.urgent {{ background-color: @alternate-urgent-background; text-color: @alternate-urgent-foreground; }} #element.alternate.active {{ background-color: @alternate-active-background; text-color: @alternate-active-foreground; }} #scrollbar {{ width: 4px; border: 0; handle-width: 8px; padding: 0; }} #sidebar {{ border: 2px 0px 0px; border-color: @border-color; }} #button {{ text-color: @normal-foreground; }} #button.selected {{ background-color: @selected-normal-background; text-color: @selected-normal-foreground; }} #inputbar {{ spacing: 0; text-color: @normal-foreground; padding: 1px; }} #case-indicator {{ spacing: 0; text-color: @normal-foreground; }} #entry {{ spacing: 0; text-color: @normal-foreground; }} #prompt {{ spacing: 0; text-color: @normal-foreground; }} PYWALCOLORSTEMPALETROFI clear #Clear the screen check_error "pywal colors rofi" # Set xdg-desktop-portal prefer dark mode. gsettings set org.gnome.desktop.interface color-scheme prefer-dark clear #Clear the screen check_error "gsettings set color-scheme" #Midnight Commander mkdir -p ~/.config/mc echo "skin=dark" >>~/.config/mc/ini clear #Clear the screen check_error "Midnight Commander config" # ------------------------------------------------------------------------ # Wireplumber disable suspension sudo mkdir -p /etc/wireplumber/wireplumber.conf.d/ sudo bash -c 'cat << "WIREPLUMERDISSUS" >> /etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf monitor.alsa.rules = [ { matches = [ { # Matches all sources node.name = "~alsa_input.*" }, { # Matches all sinks node.name = "~alsa_output.*" } ] actions = { update-props = { session.suspend-timeout-seconds = 0 } } } ] # bluetooth devices monitor.bluez.rules = [ { matches = [ { # Matches all sources node.name = "~bluez_input.*" }, { # Matches all sinks node.name = "~bluez_output.*" } ] actions = { update-props = { session.suspend-timeout-seconds = 0 } } } ] WIREPLUMERDISSUS' clear #Clear the screen check_error "Wireplumber disable suspension" # Qtile xsessions file sudo mkdir -p /usr/share/xsessions/ sudo bash -c 'cat << "QTILEDESKTOP" >> /usr/share/xsessions/qtile.desktop [Desktop Entry] Name=Qtile Comment=Qtile Session Exec=/etc/sddm/Xsession Type=Application Keywords=wm;tiling QTILEDESKTOP' # Add to user .xsession echo "exec /usr/bin/qtile start" >~/.xsession echo "exec /usr/bin/qtile start" | sudo tee -a "/etc/skel/.xsession" >/dev/null clear #Clear the screen check_error "Add Qtile .xsession" # Synaptics devices if grep -iq 'synaptics|synap' /proc/bus/input/devices; then echo "Synaptics touchpad detected. Installing xserver-xorg-input-synaptics and configuring autostart..." sudo DEBIAN_FRONTEND=noninteractive apt install -y xserver-xorg-input-synaptics check_error "Failed to install xserver-xorg-input-synaptics" cat </dev/null # Synaptics - Touchpad left click and right click. synclient TapButton1=1 TapButton2=3 & EOF fi clear #Clear the screen check_error "Add Synaptics Autostart.sh file" # MPD Setup & config START mkdir -p ~/.config/mpd/playlists mkdir -p ~/.local/state/mpd if [ ! -f ~/.config/mpd/mpd.conf ]; then touch ~/.config/mpd/database cat <~/.config/mpd/mpd.conf # ~/.config/mpd/mpd.conf or /etc/mpd.conf # Example: /usr/share/doc/mpd/mpdconf.example # Recommended location for database db_file "~/.config/mpd/database" # If running mpd using systemd, delete this line to log directly to systemd. # syslog or ~/.config/mpd/log log_file "~/.config/mpd/log" # The music directory is by default the XDG directory, uncomment to amend and choose a different directory #music_directory "~/Music" # MPD Server network bind_to_address "127.0.0.1" port "6600" # Suppress all messages below the given threshold. Use "verbose" for # troubleshooting. Available setting arguments are "notice", "info", "verbose", "warning" and "error". log_level "error" # Setting "restore_paused" to "yes" puts MPD into pause mode instead of starting playback after startup. restore_paused "yes" # Uncomment to refresh the database whenever files in the music_directory are changed auto_update "yes" # Uncomment to enable the functionalities playlist_directory "~/.config/mpd/playlists" pid_file "~/.config/mpd/pid" state_file "~/.local/state/mpd/state" sticker_file "~/.config/mpd/sticker.sql" follow_inside_symlinks "yes" # save_absolute_paths_in_playlists "no" decoder { plugin "wildmidi" config_file "/etc/timidity/timidity.cfg" enabled "no" } # Audio output audio_output { type "pipewire" name "PipeWire Sound Server" enabled "yes" } audio_output { type "pulse" name "Local PulseAudio Server" enabled "no" } MPDCONFIG else echo "mpd.conf already exists." fi # sudo systemctl enable mpd #systemctl enable --now --user mpd.service #systemctl enable --now --user mpd # systemctl status mpd.service #systemctl enable --now --user mpd.socket #systemctl enable --now --user mpd.service # mpd --version # mpd --stderr --no-daemon --verbose # aplay --list-pcm clear #Clear the screen check_error "MPD Setup & config" # Nano config START if [ ! -f ~/.nanorc ]; then cp /etc/nanorc ~/.nanorc #sed -i 's/^# set linenumbers/set linenumbers/' ~/.nanorc sed -i 's/^# set minibar/set minibar/' ~/.nanorc sed -i 's/^# set softwrap/set softwrap/' ~/.nanorc sed -i 's/^# set atblanks/set atblanks/' ~/.nanorc else echo "File .nanorc already exists." fi check_error "Nano config" # Neovim setup config Start #git clone --depth 1 https://github.com/LazyVim/starter ~/.config/nvim #rm -rf ~/.config/nvim/.git if [ ! -f ~/.config/nvim/init.vim ]; then mkdir -p ~/.config/nvim cat <<"NEOVIMCONFIG" >~/.config/nvim/init.vim syntax on set number set numberwidth=5 set relativenumber set ignorecase NEOVIMCONFIG else echo "Neovim config file already exists." fi clear #Clear the screen check_error "Neovim config" # Kitty theme.conf Start if [ ! -f ~/.cache/wal/colors-kitty.conf ]; then mkdir -p ~/.cache/wal cat <<"KITTYTHEMECONF" >~/.cache/wal/colors-kitty.conf background #1e3143 foreground #cec7bc color0 #1e3143 color1 #708191 color2 #bcc2be color3 #9ea5a3 color4 #717c7a color5 #a9a5a8 color6 #788483 color7 #c1c6c3 color8 #254657 color9 #496c80 color10 #28415a color11 #b1aea6 color12 #849aa3 color13 #c6c0b6 color14 #648896 color15 #cec7bc KITTYTHEMECONF else echo "kittytheme.conf file already exists." fi clear #Clear the screen check_error "Kitty config" # Tmux config Start if [ ! -f ~/.config/tmux/tmux.conf ]; then mkdir -p ~/.config/tmux cat <<"TMUXCONFIG" >~/.config/tmux/tmux.conf unbind r bind r source-file ~/.config/tmux/tmux.conf TMUXCONFIG else echo "Tmux config file already exists." fi clear #Clear the screen check_error "Tmux config" # ------------------------------------------------------------------------------------------------- #echo -e "${YELLOW} Xresources config Start ${NC}" #if [ ! -f ~/.Xresources ]; then #cat << "XRCONFIG" > ~/.Xresources #XRCONFIG #else # echo ".Xresources config file already exists." #fi # Themes START # Nerd Fonts - https://www.nerdfonts.com/font-downloads - https://www.nerdfonts.com/cheat-sheet # RUN "fc-list" to list the fonts install on the system. if [ ! -d /usr/share/fonts ]; then sudo mkdir -p /usr/share/fonts else echo "fonts folder already exists." fi #JetBrainsMono (The default front in the configuration) curl -OL "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip" sudo unzip -n "JetBrainsMono.zip" -d "/usr/share/fonts/JetBrainsMono/" rm JetBrainsMono.zip sudo rm -f /usr/share/fonts/JetBrainsMono/*.md sudo rm -f /usr/share/fonts/JetBrainsMono/*.txt sudo rm -f /usr/share/fonts/JetBrainsMono/LICENSE #RobotoMono curl -OL "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/RobotoMono.zip" sudo unzip -n "RobotoMono.zip" -d "/usr/share/fonts/RobotoMono/" rm RobotoMono.zip sudo rm -f /usr/share/fonts/RobotoMono/*.md sudo rm -f /usr/share/fonts/RobotoMono/*.txt sudo rm -f /usr/share/fonts/RobotoMono/LICENSE sudo rm -f /usr/share/fonts/*.md sudo rm -f /usr/share/fonts/*.txt sudo rm -f /usr/share/fonts/LICENSE clear #Clear the screen check_error "Themes Nerd Fonts" # Set the default font family to Noto in the /etc/fonts/local.conf file. if [ ! -f /etc/fonts/local.conf ]; then sudo mkdir -p /etc/fonts sudo bash -c 'cat << "FONTSLOCALCONFIG" >> /etc/fonts/local.conf Noto Sans serif Noto Serif sans-serif Noto Sans monospace Noto Mono Source Code Pro false FONTSLOCALCONFIG' else echo "fonts local.conf file already exists." fi clear #Clear the screen check_error "Themes Fonts local.conf" if [ -d /usr/share/xsessions/ ]; then # shellcheck disable=SC2061 find /usr/share/xsessions/ -name plasma* -exec sudo rm -f {} \; sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 fi if [ -d /usr/share/wayland-sessions/ ]; then # shellcheck disable=SC2061 find /usr/share/wayland-sessions/ -name plasma* -exec sudo rm -f {} \; sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 fi check_error "Remove plasma sessions .desktop" sudo rm -rf /tmp/EliverLara-Nordic sudo git clone --depth 1 https://github.com/EliverLara/Nordic /tmp/EliverLara-Nordic sudo cp -r /tmp/EliverLara-Nordic /usr/share/themes/ sudo mkdir -p /usr/share/sddm/themes/Nordic-darker/ sudo cp -r /tmp/EliverLara-Nordic/kde/sddm/Nordic-darker/* /usr/share/sddm/themes/Nordic-darker/ # Nordzy-cursors -------------------------------------------------------- # https://github.com/alvatip/Nordzy-cursors cd /tmp/ || exit if [ -d Nordzy-cursors ]; then sudo rm -rf Nordzy-cursors fi git clone --depth 1 https://github.com/alvatip/Nordzy-cursors cd Nordzy-cursors || exit sudo ./install.sh cd /tmp/ || exit # .Xresources # Xcursor.theme: Nordzy-cursors # Xcursor.size: 22 # Nordzy-icon -------------------------------------------------------- # https://github.com/alvatip/Nordzy-icon cd /tmp/ || exit if [ -d Nordzy-icon ]; then sudo rm -rf Nordzy-icon fi git clone --depth 1 https://github.com/alvatip/Nordzy-icon cd Nordzy-icon/ || exit sudo ./install.sh cd /tmp/ || exit # GTK Settings START -------------------------------------------------------- # /etc/gtk-3.0/settings.ini # https://docs.gtk.org/gtk4/property.Settings.gtk-cursor-theme-name.html if [ ! -d /etc/gtk-3.0 ]; then sudo kdir -p /etc/gtk-3.0 else echo "/etc/gtk-3.0 already exists." fi sudo bash -c 'cat << "GTK3SETTINGS" >> /etc/gtk-3.0/settings.ini [Settings] gtk-theme-name=EliverLara-Nordic gtk-fallback-icon-theme=default gtk-toolbar-style=GTK_TOOLBAR_BOTH gtk-font-name=JetBrainsMono Nerd Font 10 gtk-application-prefer-dark-theme=1 gtk-cursor-theme-name=Nordzy-cursors gtk-cursor-theme-size=0 gtk-icon-theme-name=Nordzy-icon gtk-enable-event-sounds=0 gtk-enable-input-feedback-sounds=0 GTK3SETTINGS' if [ ! -d /etc/gtk-4.0 ]; then sudo mkdir -p /etc/gtk-4.0 else echo "/etc/gtk-4.0 already exists." fi sudo bash -c 'cat << "GTK4SETTINGS" >> /etc/gtk-4.0/settings.ini [Settings] gtk-theme-name=EliverLara-Nordic gtk-fallback-icon-theme=default gtk-toolbar-style=GTK_TOOLBAR_BOTH gtk-font-name=JetBrainsMono Nerd Font 10 gtk-application-prefer-dark-theme=1 gtk-cursor-theme-name=Nordzy-cursors gtk-cursor-theme-size=0 gtk-icon-theme-name=Nordzy-icon gtk-enable-event-sounds=0 gtk-enable-input-feedback-sounds=0 GTK4SETTINGS' sudo sed -i 's/Adwaita/Nordzy-cursors/g' /usr/share/icons/default/index.theme # GTK Settings END -------------------------- sudo fc-cache -fv clear #Clear the screen check_error "GTK Settings & Fonts" # ------------------------------------------------------------------------------------------------- # xrandr-set-max + Xsession START if [ ! -f /usr/bin/xrandr-set-max ]; then xrandrsetmaxcontent=$( cat <<"XRANDRSETMAX" #!/usr/bin/env bash # Get the names of all connected displays displays=$(xrandr | awk '/ connected/{print $1}') # Loop through each connected display and set its resolution to the maximum supported resolution for display in $displays; do # Get the maximum supported resolution for the current display max_resolution=$(xrandr | awk '/'"$display"'/ && / connected/{getline; print $1}') # Set the screen resolution to the maximum supported resolution for the current display xrandr --output "$display" --mode "$max_resolution" done XRANDRSETMAX ) # Write the script content to the target file using sudo echo "$xrandrsetmaxcontent" | sudo tee /usr/bin/xrandr-set-max >/dev/null # SDDM Before Login - /usr/share/sddm/scripts/Xsetup and After Login - /usr/share/sddm/scripts/Xsession #sudo sed -i '$a\. /usr/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsetup #sudo sed -i '$a\. /usr/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsession #Old sudo chmod +x /usr/bin/xrandr-set-max else echo "xrandr-set-max already exists." fi #if [ ! -f /etc/X11/Xsession.d/90_xrandr-set-max ]; then # sudo cp /usr/bin/xrandr-set-max /etc/X11/Xsession.d/90_xrandr-set-max # # Run at Login /etc/X11/Xsession.d/FILENAME #else # echo "/etc/X11/Xsession.d/90_xrandr-set-max already exists." #fi clear #Clear the screen check_error "xrandr-set-max file" # ------------------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------------------- # Rofi Run menu START if [ ! -d ~/.config/rofi ]; then mkdir -p ~/.config/rofi else echo "Rofi folder already exists." fi if [ ! -f ~/.config/rofi/config.rasi ]; then #touch ~/.config/rofi/config.rasi cat <<"ROFICONFIG" >~/.config/rofi/config.rasi configuration { display-drun: "Applications:"; display-window: "Windows:"; drun-display-format: "{name}"; font: "JetBrainsMono Nerd Font Propo 11"; modi: "window,run,drun"; } /* The Theme */ @import "~/.cache/wal/colors-rofi-dark.rasi" // Theme location is "/usr/share/rofi/themes/name.rasi" //@theme "/usr/share/rofi/themes/Arc-Dark.rasi" ROFICONFIG else echo "Rofi config file already exists." fi # Rofi Wifi menu # https://github.com/ericmurphyxyz/rofi-wifi-menu/tree/master if [ ! -f ~/.config/rofi/rofi-wifi-menu.sh ]; then cat <<"ROFIWIFI" >~/.config/rofi/rofi-wifi-menu.sh #!/usr/bin/env bash notify-send "Getting list of available Wi-Fi networks..." # Get a list of available wifi connections and morph it into a nice-looking list wifi_list=$(nmcli --fields "SECURITY,SSID" device wifi list | sed 1d | sed 's/ */ /g' | sed -E "s/WPA*.?\S/ /g" | sed "s/^--/ /g" | sed "s/ //g" | sed "/--/d") connected=$(nmcli -fields WIFI g) if [[ "$connected" =~ "enabled" ]]; then toggle="󰖪 Disable Wi-Fi" elif [[ "$connected" =~ "disabled" ]]; then toggle="󰖩 Enable Wi-Fi" fi # Use rofi to select wifi network chosen_network=$(echo -e "$toggle\n$wifi_list" | uniq -u | rofi -dmenu -i -selected-row 1 -p "Wi-Fi SSID: " ) # Get name of connection read -r chosen_id <<< "${chosen_network:3}" if [ "$chosen_network" = "" ]; then exit elif [ "$chosen_network" = "󰖩 Enable Wi-Fi" ]; then nmcli radio wifi on elif [ "$chosen_network" = "󰖪 Disable Wi-Fi" ]; then nmcli radio wifi off else # Message to show when connection is activated successfully success_message="You are now connected to the Wi-Fi network \"$chosen_id\"." # Get saved connections saved_connections=$(nmcli -g NAME connection) if [[ $(echo "$saved_connections" | grep -w "$chosen_id") = "$chosen_id" ]]; then nmcli connection up id "$chosen_id" | grep "successfully" && notify-send "Connection Established" "$success_message" else if [[ "$chosen_network" =~ "" ]]; then wifi_password=$(rofi -dmenu -p "Password: " ) fi nmcli device wifi connect "$chosen_id" password "$wifi_password" | grep "successfully" && notify-send "Connection Established" "$success_message" fi fi ROFIWIFI chmod +x ~/.config/rofi/rofi-wifi-menu.sh else echo "Rofi WiFi menu file already exists." fi clear #Clear the screen check_error "Rofi Run menu" if [ ! -f ~/.config/rofi/powermenu.sh ]; then mkdir -p ~/.config/rofi cat <<"ROFIPOWERMENU" >~/.config/rofi/powermenu.sh #!/usr/bin/env bash chosen=$(printf " System Shutdown\n󰒲 Suspend System\n󰤄 Hibernate System\n Lockdown Mode\n Reboot" | rofi -dmenu -i -theme-str '@import "powermenu.rasi"') case "$chosen" in "󰒲 Suspend System") sudo systemctl suspend ;; " System Shutdown") sudo shutdown now ;; "󰤄 Hibernate System") sudo systemctl hibernate ;; " Lockdown Mode") xsecurelock ;; " Reboot") sudo reboot ;; *) exit 1 ;; esac ROFIPOWERMENU else echo "powermenu.sh file already exists." fi chmod +x ~/.config/rofi/powermenu.sh clear #Clear the screen check_error "Rofi Powermenu" if [ ! -f ~/.config/rofi/powermenu.rasi ]; then mkdir -p ~/.config/rofi cat <<"ROFIPOWERMENURASI" >~/.config/rofi/powermenu.rasi inputbar { children: [entry]; } listview { lines: 5; } ROFIPOWERMENURASI else echo "powermenu.rasi file already exists." fi clear #Clear the screen check_error "Rofi Powermenu rasi" # Add xfce4 file helpers if [ ! -f ~/.config/xfce4/helpers.rc ]; then mkdir -p ~/.config/xfce4 cat <<"XFCE4HELPER" >~/.config/xfce4/helpers.rc FileManager=Thunar TerminalEmulator=kitty WebBrowser=google-chrome MailReader= XFCE4HELPER else echo "xfce4 helper config file already exists." fi clear #Clear the screen check_error "xfce4 helpers.rc" # Add kitty to open nvim and vim. if [ -f /usr/share/applications/nvim.desktop ]; then sudo sed -i 's/Exec=nvim %F/Exec=kitty -e nvim %F/' /usr/share/applications/nvim.desktop else echo "no nvim.desktop file" fi if [ -f /usr/share/applications/vim.desktop ]; then sudo sed -i 's/Exec=vim %F/Exec=kitty -e vim %F/' /usr/share/applications/vim.desktop else echo "no vim.desktop file" fi clear #Clear the screen check_error "Add kitty to open nvim and vim" # SDDM SDDM LOGIN WALLPAPER sudo mkdir -p /usr/share/wallpapers sudo chmod 777 /usr/share/wallpapers sudo cp "$(find /tmp/danos/wallpapers -type f -name "*.jpg" | shuf -n 1)" /usr/share/wallpapers/login-wallpape.jpg sudo chmod 777 /usr/share/wallpapers/login-wallpape.jpg # SDDM New login wallpaper sudo chmod 777 /usr/share/sddm/themes/breeze sudo chmod 777 /usr/share/sddm/themes/breeze/theme.conf NEW_LOGIN_WALLPAPER="/usr/share/wallpapers/login-wallpape.jpg" # Check if the breeze/theme.conf file exists if [ -f "/usr/share/sddm/themes/breeze/theme.conf" ]; then # Use sed to replace the background line sed -i "s|background=.*$|background=$NEW_LOGIN_WALLPAPER|" "/usr/share/sddm/themes/breeze/theme.conf" echo "Updated background image in /usr/share/sddm/themes/breeze/theme.conf" else echo "Error: File /usr/share/sddm/themes/breeze/theme.conf not found" fi check_error "NEW SDDM LOGIN WALLPAPER" # --------------------------------------------------------------------------------------- cd /tmp/ || exit # FastFetch Install. (Is in APT) #FASTFETCH_VERSION=$(curl -s "https://api.github.com/repos/fastfetch-cli/fastfetch/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}') #wget https://github.com/fastfetch-cli/fastfetch/releases/download/"$FASTFETCH_VERSION"/fastfetch-linux-amd64.deb && sudo dpkg -i fastfetch-linux-amd64.deb && rm fastfetch-linux-amd64.deb #clear #Clear the screen #check_error "FastFetch install" # WaterFox install - https://www.waterfox.net/download/ WATERFOX_VERSION=$(curl -s "https://api.github.com/repos/BrowserWorks/waterfox/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}') wget -O waterfox.tar.bz2 https://cdn1.waterfox.net/waterfox/releases/"$WATERFOX_VERSION"/Linux_x86_64/waterfox-"$WATERFOX_VERSION".tar.bz2 tar -xvf waterfox.tar.bz2 sudo mv waterfox /opt/ sudo chown -R root:root /opt/waterfox/ cat </dev/null [Desktop Entry] Name=Waterfox Exec=/opt/waterfox/waterfox Icon=/opt/waterfox/browser/chrome/icons/default/default128.png Type=Application Categories=Network;WebBrowser; EOF sudo ln -s /opt/waterfox/waterfox /usr/bin/waterfox clear #Clear the screen check_error "WaterFox install" # Yazi File Manager # https://github.com/sxyazi/yazi/releases/latest YAZI_VERSION=$(curl -s "https://api.github.com/repos/sxyazi/yazi/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}') wget https://github.com/sxyazi/yazi/releases/download/"$YAZI_VERSION"/yazi-x86_64-unknown-linux-musl.zip unzip yazi-x86_64-unknown-linux-musl.zip sudo cp -fu yazi-x86_64-unknown-linux-musl/yazi /usr/bin/ sudo chown root:root /usr/bin/yazi sudo chmod +x /usr/bin/yazi clear #Clear the screen check_error "Yazi File Manager install" # Systemctl enable --user # See list run: systemctl list-unit-files --state=enabled if [ "$(whoami)" != "root" ]; then # Sound systemctl enable --user systemctl enable --user --now pipewire.socket pipewire-pulse.socket wireplumber.service else echo "#!/usr/bin/env bash" >>~/.first-login-user-setup echo "systemctl enable --user --now pipewire.socket pipewire-pulse.socket wireplumber.service" >>~/.first-login-user-setup fi check_error "Systemctl enable for user" # LM-Sensors config sudo sensors-detect --auto # Remove .first-login file -------------------------------------------------------------- if [ -f ~/.first-login ]; then sudo rm -f ~/.first-login fi # Check for Nvidia graphics card and install drivers if lsmod | grep -iq nouveau; then #sudo rmmod -f nouveau #remove test echo "blacklist nouveau" | sudo tee -a /etc/modprobe.d/nouveau-blacklist.conf fi if lsmod | grep -iq nvidia; then sudo rmmod -f nvidia_modeset sudo rmmod -f nvidia_drm sudo rmmod -f nvidia fi if lspci | grep -i nvidia; then echo "Installing required packages..." sudo apt -y install linux-headers-"$(uname -r)" sudo apt -y install gcc make acpid dkms libglvnd-core-dev libglvnd0 libglvnd-dev check_error "Nvidia installing required packages" echo "Removing old NVIDIA drivers..." sudo apt remove -y nvidia-* && sudo apt autoremove -y # OLD sudo apt remove -y nvidia-* && sudo apt autoremove -y "$(dpkg -l nvidia-driver* | grep ii | awk '{print $2}')" check_error "removal of old NVIDIA drivers" echo "Enabling i386 architecture and installing 32-bit libraries..." sudo dpkg --add-architecture i386 && sudo apt update && sudo apt install -y libc6:i386 check_error "installation of i386 libraries" #NVIDIAGETVERSION=570.133.07 #NVIDIAGETVERSION="$(curl -s "https://www.nvidia.com/en-us/drivers/unix/" | grep "Latest Production Branch Version:" | awk -F'"> ' '{print $2}' | cut -d'<' -f1 | awk 'NR==1')" NVIDIAGETVERSION="$(curl -s "https://api.github.com/repos/NVIDIA/open-gpu-kernel-modules/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}')" echo "Downloading and installing NVIDIA $NVIDIAGETVERSION driver..." wget https://us.download.nvidia.com/XFree86/Linux-x86_64/"$NVIDIAGETVERSION"/NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run check_error "downloading NVIDIA driver" chmod +x NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run # echo 'nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"' >> ~/.config/qtile/autostart.sh sudo ./NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run --silent --no-questions --disable-nouveau --allow-installation-with-running-driver -M proprietary --skip-module-load # --run-nvidia-xconfig if command -v docker &>/dev/null; then if [ ! -f "/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg" ]; then curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --yes --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg fi if [ ! -f "/etc/apt/sources.list.d/nvidia-container-toolkit.list" ]; then curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list fi sudo apt update sudo apt install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker || sudo systemctl --user restart docker fi fi clear #Clear the screen check_error "NVIDIA driver installation" # Edit GRUB BOOT TIMEOUT AND SPLASH sudo sed -i 's+GRUB_TIMEOUT=5+GRUB_TIMEOUT=1+g' /etc/default/grub sudo sed -i '0,/"quiet"/ s/"quiet"/"quiet splash"/' /etc/default/grub sudo update-grub # List boot themes run: sudo plymouth-set-default-theme -l sudo plymouth-set-default-theme -R tribar clear #Clear the screen check_error "GRUB BOOT TIMEOUT AND SPLASH" sudo reboot # Install done # --------------------------------------------------------------------------------------- # Install Done ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ## # --------------------------------------------------------------------------------------- # Test Qtile config file. # Run qtileconfig-test-venv or qtileconfig-test for no python venv. # End of function start_installation } # Start of update_danos function function update_danos() { cd /opt || exit # shellcheck disable=SC1091 if [[ -f /etc/os-release ]]; then . /etc/os-release #Get the VERSION_CODENAME fi # shellcheck disable=SC1091 if command -v uv &>/dev/null; then echo "UV is installed..." else curl -LsSf https://astral.sh/uv/install.sh | sh # Install UV Python package manager. source "$HOME"/.local/bin/env fi check_error() { if [ $? -ne 0 ]; then echo -e "${RED} An error occurred during installation and has been stopped. ${NC}" echo -e "${RED} Or you have pressed CTRL + C to cancel. ${NC}" echo -e "${RED} Error occurred during $1 ${NC}" exit 1 fi } cd /opt || exit # Check for Bluetooth hardware using lsusb if lsusb | grep -iq bluetooth; then echo "Bluetooth detected, Installing required packages..." sudo DEBIAN_FRONTEND=noninteractive apt install -y bluetooth bluez bluez-cups bluez-obexd bluez-meshd pulseaudio-module-bluetooth bluez-firmware blueman fi clear #Clear the screen check_error "Check for Bluetooth hardware and install" # Check for Logitech hardware using lsusb # Solaar - Logitech Unifying Receiver - Accessory management for Linux. if lsusb | grep -iq Logitech; then echo "Logitech detected, Installing required packages..." sudo DEBIAN_FRONTEND=noninteractive apt install -y solaar fi clear #Clear the screen check_error "Check for Logitech hardware and install" #Get the VERSION_CODENAME OS_VERSION_FOR_APT=$(lsb_release -cs) case "$OS_VERSION_FOR_APT" in bookworm) echo "Bookworm Detected." ;; trixie) echo "Trixie Detected." ;; sid) echo "Sid Detected." ;; *) echo "Unknown Debian release: $OS_VERSION_FOR_APT. Stop action taken." exit 1 ;; esac if [ "$VERSION_CODENAME" == "bookworm" ]; then cd /opt || exit if [ -d qtile_venv ]; then sudo rm -rf qtile_venv fi sudo python3 -m venv qtile_venv sudo chmod -R 777 qtile_venv cd qtile_venv || exit git clone --depth 1 https://git.itmail.dk/mara/danos.git git clone --depth 1 https://github.com/qtile/qtile.git --branch v0.32.0 # Specific version of Qtile # shellcheck disable=SC1091 source /opt/qtile_venv/bin/activate pip install dbus-next psutil wheel pyxdg pip install -r qtile/requirements.txt bin/pip install qtile/. # PyWAL install via pip3 for auto-generated color themes #pip3 install pywal16[all] # shellcheck disable=SC2102 pip3 install pywal16[colorz] deactivate sudo cp -fu danos/install.sh /usr/bin/danos sudo chmod +x /usr/bin/danos sudo cp -fu bin/qtile /usr/bin/ sudo cp -fu bin/wal /usr/bin/ else cd /opt || exit if [ -d qtile_venv ]; then sudo rm -rf qtile_venv fi sudo mkdir qtile_venv sudo chmod -R 777 qtile_venv && cd qtile_venv || exit #git clone --depth 1 https://github.com/qtile/qtile.git # The latest version of Qtile git clone --depth 1 https://git.itmail.dk/mara/danos.git sudo cp -fu danos/install.sh /usr/bin/danos sudo chmod +x /usr/bin/danos uv tool install qtile --force # The latest version of Qtile via UV # shellcheck disable=SC2102 uv tool install pywal16[colorz] --force # if you want all the options for color generation use [all] instead of [colorz] sudo cp -fu ~/.local/bin/qtile /usr/bin/ sudo cp -fu ~/.local/bin/wal /usr/bin/ fi # SDDM New login wallpaper sudo chmod 777 /usr/share/sddm/themes/breeze sudo chmod 777 /usr/share/sddm/themes/breeze/theme.conf sudo mkdir -p /usr/share/wallpapers sudo chmod 777 /usr/share/wallpapers sudo cp "$(find danos/wallpapers -type f -name "*.jpg" | shuf -n 1)" /usr/share/wallpapers/login-wallpape.jpg NEW_LOGIN_WALLPAPER="/usr/share/wallpapers/login-wallpape.jpg" if [ -f "/usr/share/sddm/themes/breeze/theme.conf" ]; then # Use sed to replace the background line sed -i "s|background=.*$|background=$NEW_LOGIN_WALLPAPER|" "/usr/share/sddm/themes/breeze/theme.conf" echo "Updated background image in /usr/share/sddm/themes/breeze/theme.conf" else echo "Error: File /usr/share/sddm/themes/breeze/theme.conf not found" fi if [ -d /usr/share/xsessions/ ]; then # shellcheck disable=SC2061 if find /usr/share/xsessions/ -maxdepth 1 -type f -name "plasma*" -print -quit | grep -q .; then find /usr/share/xsessions/ -name plasma* -exec sudo rm -f {} \; find /usr/share/wayland-sessions/ -name plasma* -exec sudo rm -f {} \; sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 fi fi # if [ -d /usr/share/wayland-sessions/ ]; then # # shellcheck disable=SC2061 # if find /usr/share/wayland-sessions/ -maxdepth 1 -type f -name "plasma*" -print -quit | grep -q .; then # find /usr/share/wayland-sessions/ -name plasma* -exec sudo rm -f {} \; # sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 # fi # fi # OLD # if [ -d /usr/share/xsessions/ ]; then # # shellcheck disable=SC2061 # find /usr/share/xsessions/ -name plasma* -exec sudo rm -f {} \; # sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 # fi # if [ -d /usr/share/wayland-sessions/ ]; then # # shellcheck disable=SC2061 # find /usr/share/wayland-sessions/ -name plasma* -exec sudo rm -f {} \; # sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 # fi # End of update_danos function } function update_waterfox() { cd /tmp/ || exit sudo rm -rf /opt/waterfox # WaterFox update - https://www.waterfox.net/download/ #echo -en "Enter the new version number of WaterFox: " #read WATERFOX_VERSION WATERFOX_VERSION=$(curl -s "https://api.github.com/repos/BrowserWorks/waterfox/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}') wget -O waterfox.tar.bz2 https://cdn1.waterfox.net/waterfox/releases/"$WATERFOX_VERSION"/Linux_x86_64/waterfox-"$WATERFOX_VERSION".tar.bz2 tar -xvf waterfox.tar.bz2 sudo mv waterfox /opt/ sudo chown -R root:root /opt/waterfox/ # sudo ln -s /opt/waterfox/waterfox /usr/bin/waterfox } function nvidia_install_upgrade() { check_error() { if [ $? -ne 0 ]; then echo -e "${RED} An error occurred during installation and has been stopped. ${NC}" echo -e "${RED} Or you have pressed CTRL + C to cancel. ${NC}" echo -e "${RED} Error occurred during $1 ${NC}" exit 1 fi } if [ ! -f "/etc/modprobe.d/nouveau-blacklist.conf" ]; then echo "blacklist nouveau" | sudo tee -a /etc/modprobe.d/nouveau-blacklist.conf fi if lspci | grep -i nvidia; then echo "Nvidia install / Update." echo "Installing required packages..." sudo apt -y install linux-headers-"$(uname -r)" sudo apt -y install gcc make acpid dkms libglvnd-core-dev libglvnd0 libglvnd-dev check_error "Installing required package" echo "Removing old NVIDIA drivers..." sudo apt remove -y nvidia-* && sudo apt autoremove -y # OLD sudo apt remove -y nvidia-* && sudo apt autoremove -y "$(dpkg -l nvidia-driver* | grep ii | awk '{print $2}')" check_error "removal of old NVIDIA drivers" echo "Enabling i386 architecture and installing 32-bit libraries..." sudo dpkg --add-architecture i386 && sudo apt update && sudo apt install -y libc6:i386 check_error "installation of i386 libraries" #NVIDIAGETVERSION=570.133.07 #NVIDIAGETVERSION="$(curl -s "https://www.nvidia.com/en-us/drivers/unix/" | grep "Latest Production Branch Version:" | awk -F'"> ' '{print $2}' | cut -d'<' -f1 | awk 'NR==1')" # Latest Nvidia Beta driver version NVIDIAGETVERSION="$(curl -s "https://api.github.com/repos/NVIDIA/open-gpu-kernel-modules/releases/latest" | grep '"tag_name"' | awk -F'"' '{print $4}')" echo "Downloading and installing NVIDIA $NVIDIAGETVERSION driver..." wget https://us.download.nvidia.com/XFree86/Linux-x86_64/"$NVIDIAGETVERSION"/NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run check_error "downloading NVIDIA driver" chmod +x NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run # echo 'nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"' >> ~/.config/qtile/autostart.sh sudo ./NVIDIA-Linux-x86_64-"$NVIDIAGETVERSION".run --silent --no-questions --disable-nouveau --allow-installation-with-running-driver -M proprietary --skip-module-load # --run-nvidia-xconfig sudo update-grub if command -v docker &>/dev/null; then if [ ! -f "/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg" ]; then curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --yes --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg fi if [ ! -f "/etc/apt/sources.list.d/nvidia-container-toolkit.list" ]; then curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list fi sudo apt update sudo apt install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker || sudo systemctl --user restart docker fi fi clear #Clear the screen check_error "NVIDIA driver installation" # End of nvidia_install_upgrad function } function help_wiki() { echo "Help / WiKi for DanOS" } main() { if [ -z "$1" ]; then start_installation #main-run fi case $1 in "help" | "--help" | "-h") echo "Help..!" help_wiki exit 0 ;; "update" | "--update" | "-u") echo "Update DanOS" update_danos auto-new-wallpaper-and-colors sleep 0.25 sudo sed -i 's/start_installation #main-run/help_wiki #main-run/g' /usr/bin/danos clear #Clear the screen echo "DanOS Update is finished" exit 0 ;; "system-update" | "--system-update" | "-su") echo -e "System APT Update / Upgrade + QTILE / DanOS Upgrade." sudo apt update && sudo apt upgrade -y && sudo apt clean && sudo apt autoremove -y update_danos nvidia_install_upgrade sudo dkms autoinstall sudo update-initramfs -u -k all clear #Clear the screen echo -e "We are finished with the System Update / Upgrade + QTILE & DanOS.\nYou should consider rebooting after a system update." exit 0 ;; "system-dist-upgrade" | "--system-dist-upgrade" | "-sdu") echo "Full System Distro Update and Upgrade" sudo apt update && sudo apt full-upgrade -y && sudo apt dist-upgrade update_danos update_waterfox nvidia_install_upgrade sudo dkms autoinstall sudo update-initramfs -u -k all clear #Clear the screen echo -e "We are finished with the Full System Update / Upgrade\nYou should consider rebooting after a system update." exit 0 ;; "update-waterfox" | "-uwf") echo "Updating Waterfox" update_waterfox clear #Clear the screen echo "Waterfox update is finished." exit 0 ;; *) echo -e "Unknown function: $1 \n - Available functions are: help, update or -u, system-update or -su, system-dist-upgrade or -sdu, update-waterfox or -uwf" exit 1 ;; esac } main "$@"