#!//usr/bin/env bash # CONSTANTS # --------- GIT_BASE_URL="https://git.artcode.re/pvincent/debian-gnome" LOGOUT_REQUIRED=false BASEDIR=$(readlink -f "$(dirname "$0")/..") ALLOWED_USERS=$(id -un) # CUSTOMIZE if needed! REQUIRED_PACKAGES=( bash-completion vim micro git wget htop jq unzip tilix zram-tools ) # FUNCTIONS # --------- function trap_error() { error_code=$1 error_line=$2 printf "\nEXIT #${error_code} due to error at line ${error_line} : \n-----------------------------------------\n" sed "${error_line}q;d" $0 echo exit $error_code } function runVoid() { trap - ERR local COMMAND="$@" bash -c "${COMMAND}" > /dev/null 2>&1 runVoidError=$? trap 'trap_error $? $LINENO' ERR } function askConfirmation() { case "$1" in y | Y | yes | YES) QUESTION="(Y/n)?" DEFAULT=0 ;; *) QUESTION="(y/N)?" DEFAULT=1 ;; esac read -p "$QUESTION : " choice case "$choice" in y | Y | yes | YES) return 0 ;; #true n | no | N | NO) return 1 ;; #false *) return $DEFAULT ;; esac } function upgrade { echo "# updating repositories" echo "===================" if [[ $(date --date='-12 hours' +%s) -gt $(date -d "$(stat -c %y /var/lib/apt/lists/partial)" +%s) ]]; then sudo apt update sudo apt autoremove -y else echo "repositories recently updated!" fi } function apt_required_packages { echo "# required packages" echo "===================" for package in ${REQUIRED_PACKAGES[@]}; do runVoid dpkg-query --status $package if [ $runVoidError -ne 0 ]; then echo -n "installing package <$package> ... " sudo DEBIAN_FRONTEND=noninteractive apt install -y $package echo "DONE" fi done } function fix_system_lang { echo "# fix system language" echo "=====================" if grep -q ^LANG=C.UTF-8 /etc/default/locale; then LANG='en_US.UTF-8' if gsettings get org.gnome.desktop.input-sources sources | grep -q "'xkb', 'fr"; then LANG='fr_FR.UTF-8' else if gsettings get org.gnome.desktop.input-sources sources | grep -q "'xkb', 'es"; then LANG='es_ES.UTF-8' fi fi echo "fix found LANG=$LANG" cat << EOF | sudo tee /etc/locale.gen $LANG UTF-8 EOF sudo locale-gen sudo update-locale LANG=$LANG xdg-user-dirs-update --force else echo 'already fixed!' fi source /etc/default/locale export LANG } function fix_input_sources { echo "# fix input sources containing french variants" echo "==============================================" if gsettings get org.gnome.desktop.input-sources sources | egrep -q 'fr\+|mozc-jp'; then gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'fr')]" echo no more french variant found, fixed else echo no french variant found, ok! fi } function miaou_bash { echo "## miaou-bash" echo "==============" if ! command -v upgrade-miaou-bash > /dev/null; then curl https://git.artcode.re/miaou/miaou-bash/raw/branch/main/install.sh | sudo bash -s else echo "miaou-bash already installed!" upgrade-miaou-bash fi } function openssh { echo "## openssh-server" echo "=================" echo TODO:... # PGKNAME='openssh-server' # runVoid dpkg-query --status $PGKNAME # if [ $runVoidError -ne 0 ]; then # set -e # sudo apt install -y $PGKNAME # sudo /opt/miaou-bash/tools/append_or_replace "^#\?PermitRootLogin.*$" "PermitRootLogin no" /etc/ssh/sshd_config # sudo /opt/miaou-bash/tools/append_or_replace "^#\?PasswordAuthentication.*$" "PasswordAuthentication no" /etc/ssh/sshd_config # sudo /opt/miaou-bash/tools/append_or_replace "^#\?AllowUsers.*$" "AllowUsers $ALLOWED_USERS" /etc/ssh/sshd_config # sudo systemctl restart sshd # set +e # else # echo "${PGKNAME} already installed!" # fi } function faster_grub { echo "## grub faster and smarter" echo "==========================" if grep -q GRUB_TIMEOUT=5 /etc/default/grub; then echo "grub was not modified yet, applying changes..." sudo /opt/miaou-bash/tools/append_or_replace "^GRUB_TIMEOUT=5$" "GRUB_TIMEOUT=0" /etc/default/grub sudo update-grub echo OK else echo changes already done! fi } function install_firefox { echo "## firefox latest" echo "=================" firefox_lang=$(echo $LANG | cut -d. -f1) case "$firefox_lang" in fr*) firefox_lang=fr ;; es*) firefox_lang=es-ES ;; *) firefox_lang=en-US ;; esac echo "$firefox_lang" if [[ ! /usr/local/bin/firefox -ef /opt/firefox/firefox ]]; then set -e cd /tmp # https://download-installer.cdn.mozilla.net/pub/firefox/releases/146.0.1/linux-x86_64/en-US/firefox-146.0.1.tar.xz firefox_version=$(curl -sI https://www.firefox.com/$firefox_lang/firefox/notes/ | grep location: | cut -d/ -f4) firefox_archive_url="https://download-installer.cdn.mozilla.net/pub/firefox/releases/$firefox_version/linux-x86_64/$firefox_lang/firefox-$firefox_version.tar.xz" echo $firefox_archive_url wget "$firefox_archive_url" firefox_archive=${firefox_archive_url##*/} sudo mkdir /opt/firefox -p sudo chown $USER /opt/firefox tar -xf "$firefox_archive" -C /opt cat << EOF | sudo tee -a /usr/share/applications/firefox.desktop [Desktop Entry] Name=Firefox Comment=Web Browser Exec=/opt/firefox/firefox %u Terminal=false Type=Application Icon=/opt/firefox/browser/chrome/icons/default/default128.png Categories=Network;WebBrowser; MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https; StartupNotify=true StartupWMClass=Navigator Actions=new-window;new-private-window;profile-manager; [Desktop Action new-window] Name=New Window Exec=/opt/firefox/firefox --new-window %u [Desktop Action new-private-window] Name=New Private Window Exec=/opt/firefox/firefox --private-window %u [Desktop Action profile-manager] Name=Profile Manager Exec=/opt/firefox/firefox -P %u EOF sudo ln -sf /opt/firefox/firefox /usr/local/bin/firefox sudo update-alternatives --install /usr/bin/x-www-browser x-www-browser /opt/firefox/firefox 200 && sudo update-alternatives --set x-www-browser /opt/firefox/firefox sudo apt remove -y firefox-esr sudo apt install -y libdbus-glib-1-2 set +e else echo "firefox latest already installed!" fi echo "## firefox by default" echo "=====================" xdg-settings set default-web-browser firefox.desktop } function gnome_settings { echo "## gnome default settings" echo "=========================" gsettings set org.gnome.nautilus.preferences click-policy 'single' gsettings set org.gtk.gtk4.Settings.FileChooser sort-directories-first true gsettings set org.gnome.mutter dynamic-workspaces false gsettings set org.gnome.desktop.wm.preferences num-workspaces 1 gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true } function tilix_default_terminal { local reload=false echo "## prevent displaying desktop entries (gnome-terminal replaced by tilix)" echo "========================================================================" if [[ ! -f ~/.local/share/applications/org.gnome.Terminal.desktop ]]; then cat << 'EOF' > ~/.local/share/applications/org.gnome.Terminal.desktop [Desktop Entry] NoDisplay=true EOF reload=true else echo Hidden default terminal in favor of Tilix! fi echo "## prevent displaying desktop entries (xiterm+thai replaced by tilix)" echo "========================================================================" if [[ ! -f ~/.local/share/applications/xiterm+thai.desktop ]]; then cat << 'EOF' > ~/.local/share/applications/xiterm+thai.desktop [Desktop Entry] NoDisplay=true EOF reload=true else echo Hidden default terminal in favor of Tilix! fi if [[ ! -f ~/.local/share/applications/com.gexperts.Tilix.desktop ]]; then cat << 'EOF' > ~/.local/share/applications/com.gexperts.Tilix.desktop [Desktop Entry] Version=1.0 Name=Tilix Comment[fr]=Un terminal scindable pour GNOME Comment=A tiling terminal for GNOME Keywords[fr]=shell;terminal;prompt;commande;ligne de commande;cmd; Keywords=shell;terminal;prompt;command;commandline;cmd; Exec=tilix Terminal=false Type=Application StartupNotify=true Categories=System;TerminalEmulator;X-GNOME-Utilities; Icon=com.gexperts.Tilix DBusActivatable=true Actions=new-window;new-session;preferences; [Desktop Action new-window] Name[fr]=Nouvelle fenêtre Name=New Window Exec=tilix --action=app-new-window [Desktop Action new-session] Name[fr]=Nouvelle session Name=New Session Exec=tilix --action=app-new-session [Desktop Action preferences] Name[fr]=Préférences Name=Preferences Exec=tilix --preferences EOF reload=true fi [[ $reload ]] && update-desktop-database ~/.local/share/applications echo "Tiling Settings" gsettings set com.gexperts.Tilix.Settings paste-strip-trailing-whitespace true gsettings set com.gexperts.Tilix.Settings focus-follow-mouse true gsettings set com.gexperts.Tilix.Settings window-style 'disable-csd-hide-toolbar' gsettings set com.gexperts.Tilix.Settings control-click-titlebar true gsettings set com.gexperts.Tilix.Settings terminal-title-show-when-single false gsettings set com.gexperts.Tilix.Settings warn-vte-config-issue false gsettings set com.gexperts.Tilix.Settings theme-variant 'dark' gsettings set com.gexperts.Tilix.Settings control-click-titlebar true } function no_lock_screen { echo "## disable automatic lock screen => use Super_L for LOCK" echo "========================================================" gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type nothing gsettings set org.gnome.desktop.screensaver lock-enabled false } function favorite_apps { echo "# favourite apps" echo "#===============" runVoid "gsettings get org.gnome.shell favorite-apps | grep firefox-esr" if [[ $runVoidError == 0 ]]; then gsettings set org.gnome.shell favorite-apps "['firefox.desktop','org.gnome.Nautilus.desktop','org.gnome.Software.desktop']" else echo "preserve existing apps!" fi } function golden_dict { echo "## golden dict" echo "================" if [[ ! -d /usr/share/goldendict/dicts ]]; then sudo git clone --depth 1 https://git.artcode.re/non-free/dicts.git /usr/share/goldendict/dicts fi if [[ ! -f $HOME/.config/goldendict/config ]] || ! grep -q "path.*/usr/share/goldendict/dicts" $HOME/.config/goldendict/config; then mkdir -p "$HOME/.config/goldendict/" cp "$BASEDIR/lib/goldendict/config" "$HOME/.config/goldendict/" nohup goldendict & fi } function golden_dict_autostart { mkdir -p $HOME/.config/autostart if [[ ! -f $HOME/.config/autostart/org.goldendict.GoldenDict.desktop ]]; then echo -n "autostart GoldenDict ..." ln -sf /usr/share/applications/org.goldendict.GoldenDict.desktop $HOME/.config/autostart/ echo OK else echo "autostart GoldenDict already installed!" fi } function gnome_extensions { echo "## gnome-shell install several extensions" echo "=========================================" $BASEDIR/tools/gnome-extensions-helper dash-to-dock@micxgx.gmail.com --apply-custom-theme=true --multi-monitor=true --dash-max-icon-size=58 | grep -q '^please logout to take effect!' && LOGOUT_REQUIRED=true $BASEDIR/tools/gnome-extensions-helper runcat@kolesnikov.se --idle-threshold=66 | grep -q 'please logout to take effect!' && LOGOUT_REQUIRED=true # $BASEDIR/tools/gnome-extensions-helper netspeedsimplified@prateekmedia.extension | # grep -q 'please logout to take effect!' && LOGOUT_REQUIRED=true $BASEDIR/tools/gnome-extensions-helper appindicatorsupport@rgcjonas.gmail.com --tray-pos=left --icon-saturation=0.9 | grep -q 'please logout to take effect!' && LOGOUT_REQUIRED=true $BASEDIR/tools/gnome-extensions-helper weeks-start-on-monday@extensions.gnome-shell.fifi.org | grep -q 'please logout to take effect!' && LOGOUT_REQUIRED=true true } function developer_flavor { gsettings set org.gnome.shell.extensions.runcat custom-system-monitor-command "xterm -fa Monospace -fs 12 -fullscreen -s htop" } function firefox_addons { echo "# firefox addons" echo "================" declare -A FIREFOX_ADDONS FIREFOX_ADDONS['uBlock0@raymondhill.net']="3740966/ublock_origin-1.34.0-an+fx.xpi" FIREFOX_ADDONS['fr-dicollecte@dictionaries.addons.mozilla.org']='3581786/dictionnaire_francais-7.0b.xpi' FIREFOX_ADDONS['chrome-gnome-shell@gnome.org']='898030/gnome_shell_integration-10.1-an+fx-linux.xpi' FIREFOX_ADDONS['jid1-ZAdIEUB7XOzOJw@jetpack']='3741831/duckduckgo_privacy_essentials-2021.3.8-an+fx.xpi' mkdir -p /opt/firefox/distribution/extensions for addon_id in "${!FIREFOX_ADDONS[@]}"; do addon_part_url="${FIREFOX_ADDONS[$addon_id]}" addon_xpi="/opt/firefox/distribution/extensions/${addon_id}.xpi" if [[ ! -f $addon_xpi ]]; then echo -n "Firefox addon <$addon_id> installing ..." wget -q "https://addons.mozilla.org/firefox/downloads/file/${addon_part_url}" -O $addon_xpi echo DONE else echo "Firefox addon <$addon_id> already installed!" fi done } function firefox_settings { echo "# Firefox default settings" echo "#=========================" if [[ ! -f /opt/firefox/firefox.cfg ]]; then cat << EOF | sudo tee -a /opt/firefox/firefox.cfg // IMPORTANT: Start your code on the 2nd line lockPref("browser.pocket.enabled", false); lockPref("extensions.pocket.enabled", false); lockPref("browser.shell.checkDefaultBrowser", false); EOF cat << EOF | sudo tee -a /opt/firefox/defaults/pref/autoconfig.js pref("general.config.filename", "firefox.cfg"); pref("general.config.obscure_value", 0); EOF else echo "Firefox default settings already defined!" fi } function libre_re_pixmap { echo "# libre_re pixmap" echo "=================" if [[ ! -f /usr/share/pixmaps/faces/libre_re.png ]]; then sudo curl -o /usr/share/pixmaps/faces/libre_re.png "$GIT_BASE_URL/raw/branch/master/lib/pixmap/libre_re.png" dbus-send --system --dest=org.freedesktop.Accounts \ --type=method_call --print-reply \ /org/freedesktop/Accounts/User$(id -u) \ org.freedesktop.Accounts.User.SetIconFile \ string:"/usr/share/pixmaps/faces/libre_re.png" else echo "pixmap already copied!" fi } function clear_system_extensions { echo "# clear system gnome-shell extensions" echo "=====================================" [[ ! -d /usr/share/gnome-shell/extensions ]] && sudo mkdir -p /usr/share/gnome-shell/extensions count_system_extensions=$(ls -1 /usr/share/gnome-shell/extensions | wc -l) [[ $count_system_extensions -gt 0 ]] && sudo rm /usr/share/gnome-shell/extensions/* -rf || true } function install_flatpak { echo "# install flatpak" echo "=================" if ! dpkg -l flatpak | grep -q ^ii; then sudo apt install -y flatpak gnome-software-plugin-flatpak sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo LOGOUT_REQUIRED=true XDG_DATA_DIRS=$HOME/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:$XDG_DATA_DIRS export XDG_DATA_DIRS flatpak update -y fi flatpak install -y org.signal.Signal flatpak install -y com.mattermost.Desktop flatpak install -y net.jami.Jami } function final_word_or_logout { echo if [[ $LOGOUT_REQUIRED == true ]]; then echo '# DEBIAN-GNOME new extensions have been installed, please logout/login to apply changes!' loginctl terminate-user $(whoami) else echo "# DEBIAN-GNOME successfully installed!" fi echo } ## MAIN ## --------- [ "$(id -u)" -eq 0 ] && echo 'normal user required' && exit 1 upgrade apt_required_packages fix_system_lang fix_input_sources miaou_bash faster_grub gnome_settings no_lock_screen tilix_default_terminal # openssh clear_system_extensions gnome_extensions install_flatpak install_firefox firefox_addons firefox_settings golden_dict # golden_dict_autostart favorite_apps libre_re_pixmap final_word_or_logout