8 changed files with 613 additions and 483 deletions
-
21.vscode/settings.json
-
58extensions.bash
-
10interactive.bash
-
0src/bookworm.sh
-
6src/install.sh
-
434src/trixie.sh
-
154tools/gnome-extensions-helper
-
413trixie.sh
@ -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", |
|||
"**/*" |
|||
] |
|||
} |
|||
@ -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 |
|||
@ -1,10 +0,0 @@ |
|||
#!/usr/bin/env bash |
|||
|
|||
read -p 'press [ENTER] to continue:' </dev/tty |
|||
echo REPLY=$REPLY |
|||
|
|||
choices=( one two three) |
|||
select choice in "${choices[@]}"; do |
|||
[[ -n $choice ]] && break |
|||
done </dev/tty |
|||
echo "choice is: $choice" |
|||
@ -1,14 +1,16 @@ |
|||
#!/bin/bash |
|||
|
|||
# MAIN |
|||
|
|||
echo "install on: $HOSTNAME" |
|||
echo ---------------------- |
|||
|
|||
[ "$(id -u)" -eq 0 ] && echo 'normal user required: ie, not <root>!' && 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 |
|||
@ -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 |
|||
@ -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 |
|||
@ -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 <<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.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 { |
|||
echo "## prevent displaying desktop entries (gnome-terminal replaced by tilix)" |
|||
echo "========================================================================" |
|||
if [[ ! -f $HOME/.local/share/applications/org.gnome.Terminal.desktop ]]; then |
|||
cat << 'EOF' > ~/.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 <<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 |
|||
} |
|||
|
|||
## 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 |
|||
# gnome_extensions |
|||
firefox_addons |
|||
firefox_settings |
|||
libre_re_pixmap |
|||
|
|||
echo |
|||
echo |
|||
echo "# DEBIAN-GNOME successfully installed!" |
|||
echo |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue