Files
firefox-prefetch-addons/firefox-prefetch-addons.sh

118 lines
3.7 KiB
Bash

if [[ "$*" == *"--help"* ]]; then
echo 'Usage: firefox-prefetch-addons [FLAGS...] [ADDONS...]'
echo 'A simple bash script to fetch Firefox addons IDs, to be used in ExtensionSettings policy.'
echo ''
echo 'ADDONS can be both just the name of the extension or the URL of the extensions page, so'
echo 'for example: "ublock-origin" and "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/"'
echo 'are treated as the same.'
echo ''
echo 'Options:'
echo ''
echo ' --format-json: format resulting addons object as JSON.'
echo ' --format-nix: format resulting addons object as a Nix expression (requires the "nix" command to be installed).'
echo ' --pretty: prettify resulting object output (requires "alejandra" to be installed for Nix output).'
echo ' --no-pretty: do not prettify resulting object output.'
echo ''
echo 'Dependencies:'
echo ''
echo ' alejandra: OPTIONAL, used for formatting the output Nix expression.'
echo ' jq: REQUIRED, used to properly work with extensions JSON values.'
echo ' nix: OPTIONAL, used to transform the JSON output to a Nix expression.'
echo ' unzip: REQUIRED, used to unzip downloaded extension.'
echo ' wget: REQUIRED, used to download manifest of extensions.'
echo ''
echo '2025 (c) Gustavo "Guz" L. de Mello <contact@guz.one>'
echo 'Licensed under WTFPL license. PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.'
exit 0
fi
addons_object="{}"
format_as_nix=false
exit_1=false
# Check if command is being piped to another
if [[ -t 1 ]]; then
pretty=true
fi
for a in "$@"; do
if [[ "$a" == "--format-json" ]]; then
format_as_nix=false
continue
fi
if [[ "$a" == "--format-nix" ]]; then
format_as_nix=true
continue
fi
if [[ "$a" == "--pretty" ]]; then
pretty=true
continue
fi
if [[ "$a" == "--no-pretty" ]]; then
pretty=false
continue
fi
addon_name="$a"
if [[ "$addon_name" == "http"* ]]; then
addon_name="''${addon_name%/}"
addon_name="''${addon_name##*/}"
fi
install_url="https://addons.mozilla.org/firefox/downloads/latest/$addon_name/latest.xpi"
temp_extension_xpi="/tmp/firefox-prefetch-addons-$addon_name.xpi"
temp_extension_directory="/tmp/firefox-prefetch-addons-$addon_name-dir"
error="$(wget -O "$temp_extension_xpi" "$install_url" 2>&1 1>/dev/null)"
if [[ "$?" -ne 0 ]]; then
echo "Failed to download manifest for addon \"$a\""
echo "$error"
exit_1=true
fi
error="$(unzip "$temp_extension_xpi" -d "$temp_extension_directory" 2>&1 1>/dev/null)"
if [[ "$?" -ne 0 ]]; then
echo "Failed to unzip manifest for addon \"$a\""
echo "$error"
exit_1=true
fi
addon_id="$(jq -r '.browser_specific_settings.gecko.id' "$temp_extension_directory/manifest.json")"
addons_object="$(echo "$addons_object" | jq -r ". += {\"$addon_id\": {install_url: \"$install_url\", installation_mode: \"force_installed\"}}")"
rm "$temp_extension_xpi"
rm -r "$temp_extension_directory"
done
if [[ "$format_as_nix" == true ]]; then
echo "$addons_object" >"/tmp/firefox-prefetch-addons-json-object.json"
nix eval --impure --expr 'builtins.fromJSON (builtins.readFile /tmp/firefox-prefetch-addons-json-object.json)' >"/tmp/firefox-prefetch-addons-json-object.nix"
if [[ "$pretty" == true ]]; then
error="$(alejandra "/tmp/firefox-prefetch-addons-json-object.nix" 2>&1 1>/dev/null)"
if [[ "$?" -ne 0 ]]; then
echo "Failed to format Nix file of addons object"
echo "$error"
exit_1=true
fi
fi
cat "/tmp/firefox-prefetch-addons-json-object.nix"
rm "/tmp/firefox-prefetch-addons-json-object.json"
rm "/tmp/firefox-prefetch-addons-json-object.nix"
else
if [[ "$pretty" == true ]]; then
echo "$addons_object" | jq . | cat
else
echo "$addons_object" | jq -c . | cat
fi
fi
if [[ "$exit_1" == true ]]; then
exit 1
else
exit 0
fi