From a8edfb8287e58b699a22befe6bb0f143685c2050 Mon Sep 17 00:00:00 2001 From: pvincent Date: Wed, 5 Nov 2025 14:51:21 +0400 Subject: [PATCH] trixie --- trixie.sh | 413 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 trixie.sh diff --git a/trixie.sh b/trixie.sh new file mode 100644 index 0000000..57106a6 --- /dev/null +++ b/trixie.sh @@ -0,0 +1,413 @@ +#!//usr/bin/env bash + +## CONSTANTS +## --------- + +GIT_BASE_URL="https://git.artcode.re/pvincent/debian-gnome" + +BASEDIR=$(readlink -f "$(dirname "$0")/..") +ALLOWED_USERS=$(id -un) #CUSTOMIZE if needed! +REQUIRED_PACKAGES=( + bash-completion + vim git wget curl + htop jq unzip +) + + +## 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_input_sources { + echo "# fix input sources containing french variants" + echo "==============================================" + if gsettings get org.gnome.desktop.input-sources sources | grep fr+; 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 true_firefox { +echo "## firefox latest" +echo "=================" +firefox_lang=$(echo $LANG | cut -d. -f1) + +[[ $firefox_lang =~ C|en|es ]] && firefox_lang="en-US" +echo "$firefox_lang" +if [[ ! /usr/local/bin/firefox -ef /opt/firefox/firefox ]]; then + set -e + cd /tmp + firefox_archive_url=$(curl -s "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=$firefox_lang" | cut -d '"' -f2) + 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 < ~/.local/share/applications/org.gnome.Terminal.desktop +[Desktop Entry] +Name=Terminal +Exec=gnome-terminal +NoDisplay=true +Icon=org.gnome.Terminal +Type=Application +Categories=GNOME;GTK;System;TerminalEmulator; +StartupNotify=true +StartupWMClass=Gnome-terminal +X-GNOME-SingleWindow=false +OnlyShowIn=GNOME;Unity; +EOF + else + echo Tilix already set up! + fi + + echo TODO: configure Tilix + echo 'dconf load /com/gexperts/Tilix/ < tilix.dconf' + +} + +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 "['org.gnome.Nautilus.desktop','firefox-stable.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 + 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 "=========================================" + + curl https://mise.run | sh + echo "eval \"\$(/home/pvincent/.local/bin/mise activate bash)\"" >> ~/.bashrc + source ~/.bashrc + mise install python + mise use -g python + mise exec -- pip3 install --upgrade gnome-extensions-cli + + echo APPINDICATOR + echo Alignment: left + echo DASH TO DOCK + echo icon size: 58 + echo apparence: default theme + echo RUNCAT + echo idle threshold: 66 + + EXTENSIONS=( + "dash-to-dock@micxgx.gmail.com" + "appindicatorsupport@rgcjonas.gmail.com" + "runcat@kolesnikov.se" + ) + for extension in "${EXTENSIONS[@]}"; do + if [[ ! -d $HOME/.local/share/gnome-shell/extensions/$extension ]]; then + gext install "$extension" + sudo cp "$HOME"/.local/share/gnome-shell/extensions/"$extension"/schemas/*.gschema.xml /usr/share/glib-2.0/schemas/ + else + echo "extension <${extension}> already installed!" + fi + done + sudo glib-compile-schemas /usr/share/glib-2.0/schemas/ + +echo "# gnome extra settings" +echo "======================" +# gsettings set org.gnome.shell.extensions.system-monitor show-tooltip true +# gsettings set org.gnome.shell.extensions.system-monitor cpu-show-text false +# gsettings set org.gnome.shell.extensions.system-monitor cpu-graph-width 60 +# gsettings set org.gnome.shell.extensions.system-monitor memory-display false +# gsettings set org.gnome.shell.extensions.system-monitor net-display false +# gsettings set org.gnome.shell.extensions.system-monitor net-show-text false +# gsettings set org.gnome.shell.extensions.system-monitor net-graph-width 40 +# gsettings set org.gnome.shell.extensions.system-monitor disk-display false +# gsettings set org.gnome.shell.extensions.system-monitor icon-display false + +gsettings set org.gnome.shell.extensions.dash-to-dock apply-custom-theme true +gsettings set org.gnome.shell.extensions.dash-to-dock multi-monitor true + +# gsettings set org.gnome.shell.extensions.network-stats display-bytes true +# if [[ $(gsettings get org.gnome.shell.extensions.network-stats show-icon) == "true" ]]; then +# gsettings set org.gnome.shell.extensions.network-stats show-icon false +# "$HOME/.local/bin/gext" disable network-stats@gnome.noroadsleft.xyz +# "$HOME/.local/bin/gext" enable network-stats@gnome.noroadsleft.xyz +# fi +} + +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 <