You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.0 KiB

#!/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