From adceb09319c1ebf29ef5eff3a7abc77f36547ab0 Mon Sep 17 00:00:00 2001 From: pvincent Date: Wed, 12 Nov 2025 00:48:57 +0400 Subject: [PATCH] gnome-extensions-helper --- .vscode/settings.json | 21 ++ extensions.bash | 58 ----- interactive.bash | 10 - src/{main => bookworm.sh} | 0 src/install.sh | 6 +- src/trixie.sh | 434 ++++++++++++++++++++++++++++++++++ tools/gnome-extensions-helper | 154 ++++++++++++ trixie.sh | 413 -------------------------------- 8 files changed, 613 insertions(+), 483 deletions(-) create mode 100644 .vscode/settings.json delete mode 100755 extensions.bash delete mode 100755 interactive.bash rename src/{main => bookworm.sh} (100%) create mode 100755 src/trixie.sh create mode 100755 tools/gnome-extensions-helper delete mode 100644 trixie.sh diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0013ffa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "bashIde.shfmt.caseIndent": true, + "bashIde.shfmt.simplifyCode": true, + "bashIde.shfmt.spaceRedirects": true, + "editor.formatOnSave": true, + "todohighlight.include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx", + "**/*.html", + "**/*.css", + "**/*.scss", + "**/*.php", + "**/*.rb", + "**/*.txt", + "**/*.mdown", + "**/*.md", + "**/*" + ] +} \ No newline at end of file diff --git a/extensions.bash b/extensions.bash deleted file mode 100755 index af46df7..0000000 --- a/extensions.bash +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -# CONSTANTS - -array=( - netspeedsimplified@prateekmedia.extension - runcat@kolesnikov.se - dash-to-dock@micxgx.gmail.com - appindicatorsupport@rgcjonas.gmail.com - weeks-start-on-monday@extensions.gnome-shell.fifi.org -) - -# FUNCTIONS - -function find_extension_by_uuid { - local uuid=$1 - local page=${2:-1} - JSON=$(curl -Lfs "https://extensions.gnome.org/extension-query/?search='${i}'&page=$page") - local numpages=$(echo $JSON | jq ".numpages") - local extension=$(echo $JSON | jq ".extensions[] | select(.uuid==\"$i\") ") - if [[ -z $extension ]]; then - page=$((page + 1)) - [[ $page -gt $numpages ]] && echo "not found, exiting!" && exit 2 - echo >&2 "not found, trying page #$page..." - find_extension_by_uuid "$uuid" "$page" - else - echo "$extension" - fi -} - -# MAIN - -set -Eue - -gnome_version=$(gnome-extensions version | cut -d. -f1) -echo "GNOME=$gnome_version" - -for i in "${array[@]}"; do - page=1 - if ! gnome-extensions list | grep --quiet "$i"; then - EXTENSION=$(find_extension_by_uuid "$i") - - name=$(echo "$i" | sed 's/@//') - version_tag=$(echo "$EXTENSION" | jq ".shell_version_map.\"$gnome_version\".version") - echo "$i => $name => $version_tag" - zip_file="$i.zip" - URL="https://extensions.gnome.org/extension-data/$name.v$version_tag.shell-extension.zip" - wget -O "$zip_file" "$URL" - gnome-extensions install --force "$zip_file" - rm "$zip_file" - - # interactive ONLY! - busctl call --timeout 20 --expect-reply=yes --user org.gnome.Shell.Extensions /org/gnome/Shell/Extensions org.gnome.Shell.Extensions InstallRemoteExtension s "$i" - fi - gnome-extensions enable "$i" - echo "successfully enabled extension: $i" - # break -done diff --git a/interactive.bash b/interactive.bash deleted file mode 100755 index 667f070..0000000 --- a/interactive.bash +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -read -p 'press [ENTER] to continue:' !' && exit 1 -if [[ ! $PWD == '/opt/debian-gnome' ]]; then +if [[ $PWD != '/opt/debian-gnome' ]]; then if [[ ! -L /opt/debian-gnome ]]; then sudo rm -rf /opt/debian-gnome sudo git clone --depth=1 https://git.artcode.re/pvincent/debian-gnome /opt/debian-gnome fi - /opt/debian-gnome/src/main + /opt/debian-gnome/src/bookworm.sh fi diff --git a/src/trixie.sh b/src/trixie.sh new file mode 100755 index 0000000..7281efb --- /dev/null +++ b/src/trixie.sh @@ -0,0 +1,434 @@ +#!//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 +) + +# 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 | 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 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 << 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 + +} + +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 "=========================================" + + $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 | + 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 + + # gsettings --schemadir ~/.local/share/gnome-shell/extensions/dash-to-dock@micxgx.gmail.com/schemas set org.gnome.shell.extensions.dash-to-dock dash-max-icon-size 58 + 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 { + sudo rm /usr/share/gnome-shell/extensions/* -rf +} + +## MAIN +## --------- + +[ "$(id -u)" -eq 0 ] && echo 'normal user required' && exit 1 + +upgrade +apt_required_packages +fix_input_sources +miaou_bash +openssh +faster_grub +true_firefox +gnome_settings +tilix_default_terminal +no_lock_screen +favorite_apps +# golden_dict +clear_system_extensions +gnome_extensions +firefox_addons +firefox_settings +libre_re_pixmap + +echo +if [[ $LOGOUT_REQUIRED == true ]]; then + echo '# DEBIAN-GNOME new extensions have been installed, please logout/login to apply changes!' +else + echo "# DEBIAN-GNOME successfully installed!" +fi +echo diff --git a/tools/gnome-extensions-helper b/tools/gnome-extensions-helper new file mode 100755 index 0000000..660d86f --- /dev/null +++ b/tools/gnome-extensions-helper @@ -0,0 +1,154 @@ +#!/bin/bash + +# CONSTANTS + +declare -A settings=() +declare -a setting_keys=() +declare -a setting_values=() +LOGOUT_NEEDED=false + +# FUNCTIONS + +function usage { + echo "USAGE: $(basename "$0") {UUID} [--key1=value1|--key2=value2|...]" + echo "provide additional facilities to install gnome-extension based on a UUID name + optional predefined settings" + echo 'a valid UUID name would be: "runcat@kolesnikov.se"' + echo 'a valid key/value would be: "--idle-threshold=66"' + echo "thus, a valid final command would be: "$0" runcat@kolesnikov.se --idle-threshold=66" +} + +function parse_options { + [[ -z ${1:-} || $1 =~ ^- ]] && usage && exit 1 + uuid=$1 + + shift 1 + while [[ $# -gt 0 ]]; do + case "$1" in + --*) + local key_value=${1#--} + local key=$(echo $key_value | cut -d= -f1) + local value=$(echo $key_value | cut -d= -f2) + echo ["$key"]="$value" + settings+=(["$key"]="$value") + ;; + --help | -h) + usage + exit 0 + ;; + *) + echo "Unknown option: $1" + usage + exit 2 + ;; + esac + + shift 1 # Move to the next argument + done +} + +function gnome_version { + gnome-extensions version | cut -d. -f1 +} + +function find_extension_by_uuid { + local page=${2:-1} + JSON=$(curl -Lfs "https://extensions.gnome.org/extension-query/?search='${uuid}'&page=$page") + local numpages=$(echo $JSON | jq ".numpages") + local extension=$(echo $JSON | jq ".extensions[] | select(.uuid==\"$uuid\") ") + if [[ -z $extension ]]; then + page=$((page + 1)) + [[ $page -gt $numpages ]] && echo "not found, exiting!" && exit 2 + >&2 echo "not found, trying page #$page..." + find_extension_by_uuid "$uuid" "$page" + else + echo "$extension" + fi +} + +function install_extension { + if ! gnome-extensions list | grep -q "$uuid"; then + EXTENSION=$(find_extension_by_uuid "$uuid") + + name=$(echo "$uuid" | sed 's/@//') + version_tag=$(echo "$EXTENSION" | jq ".shell_version_map.\"$(gnome_version)\".version") + zip_file="$uuid.zip" + URL="https://extensions.gnome.org/extension-data/$name.v$version_tag.shell-extension.zip" + wget -qO "$zip_file" "$URL" + + gnome-extensions install --force "$zip_file" + rm "$zip_file" + LOGOUT_NEEDED=true + # busctl call --timeout 20 --expect-reply=yes --user org.gnome.Shell.Extensions /org/gnome/Shell/Extensions org.gnome.Shell.Extensions InstallRemoteExtension s "$uuid" + else + >&2 echo "$uuid already installed!" + fi +} + +function enable_extension { + status=$(gnome-extensions info $uuid | grep Enabled | cut -d' ' -f4) + if [[ $status != 'Yes' ]]; then + gnome-extensions enable $uuid + >&2 echo $uuid now enabled! + else + >&2 echo $uuid already enabled! + fi +} + +function find_settings_schema { + local gschema_file=$(ls ~/.local/share/gnome-shell/extensions/$uuid/schemas/*.gschema.xml) + gschema_file=$(basename $gschema_file) + gschema_file=${gschema_file%.gschema.xml} + echo $gschema_file +} + +function convert_to_gvalue { + value=$1 + # >&2 echo "original=[$value]" + if [[ $value =~ true|false ]]; then + echo "$value" + elif [[ $value =~ ^[0-9]+$ ]]; then + echo "$value" + elif [[ $value =~ ^-?[0-9]+\.[0-9]+$ ]]; then + echo "double $value" + else + echo "'$value'" + fi +} + +function define_settings { + local found=${#settings[@]} + if [[ $found -gt 0 ]]; then + + local schema=$(find_settings_schema) + + cd ~/.local/share/gnome-shell/extensions/$uuid/schemas + override="20_$schema.gschema.override" + [[ -f $override ]] && cp $override $override.old + + echo "[$schema]" > $override + for key in "${!settings[@]}"; do + local value=${settings[$key]} + value=$(convert_to_gvalue "$value") + echo "$key=$value" >> $override + done + glib-compile-schemas ~/.local/share/gnome-shell/extensions/$uuid/schemas + + if [[ -f $override.old ]] && diff -q $override $override.old > /dev/null; then + >&2 echo default settings already set! + else + >&2 echo "override schema: ~/.local/share/gnome-shell/extensions/$uuid/schemas/$override" + gnome-extensions disable $uuid + gnome-extensions reset $uuid + fi + fi + +} + +# MAIN + +set -Eue +parse_options $* +install_extension +define_settings +enable_extension +[[ $LOGOUT_NEEDED == 'true' ]] && echo "please logout to take effect!" || true diff --git a/trixie.sh b/trixie.sh deleted file mode 100644 index 57106a6..0000000 --- a/trixie.sh +++ /dev/null @@ -1,413 +0,0 @@ -#!//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 <