From b4f1b4dbbfdf3d38e51dc4f5c72a79aa04fc2895 Mon Sep 17 00:00:00 2001 From: claustromaniac <20734810+claustromaniac@users.noreply.github.com> Date: Tue, 24 Apr 2018 12:47:50 +0000 Subject: [PATCH] prefsCleaner.sh (for Linux/Mac) (#405) Port of the prefsCleaner.bat for anything(?) with a bash shell. --- prefsCleaner.sh | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 prefsCleaner.sh diff --git a/prefsCleaner.sh b/prefsCleaner.sh new file mode 100644 index 00000000..edd8b418 --- /dev/null +++ b/prefsCleaner.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash + +## prefs.js cleaner for Linux/Mac +## author: @claustromaniac +## version: 1.0 + +## special thanks to @overdodactyl and @earthlng for a few snippets that I stol..*cough* borrowed from the updater.sh + +currdir=$(pwd) + +## get the full path of this script (readlink for Linux, greadlink for Mac with coreutils installed) +sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null) + +## fallback for Macs without coreutils +if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi + +## change directory to the Firefox profile directory +cd "$(dirname "${sfp}")" + +fQuit() { + ## change directory back to the original working directory + cd "${currdir}" + echo -e "\n$2" + exit $1 +} + +fFF_check() { + # there are many ways to see if firefox is running or not, some more reliable than others + # this isn't elegant and might not be future-proof but should at least be compatible with any environment + while [ -e webappsstore.sqlite-shm ]; do + echo -e "\nThis Firefox profile seems to be in use. Close Firefox and try again.\n" + read -p "Press any key to continue." + done +} + +fClean() { + # the magic happens here + prefs="@@" + prefexp="user_pref[ ]*\([ ]*[\"']([^\"']*)[\"'][ ]*," + while read -r line; do + if [[ "$line" =~ $prefexp && $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then + prefs="${prefs}${BASH_REMATCH[1]}@@" + fi + done <<< "`grep -E \"$prefexp\" user.js`" + + while IFS='' read -r line || [[ -n "$line" ]]; do + if [[ "$line" =~ ^$prefexp ]]; then + if [[ $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then + echo "$line" + fi + else + echo "$line" + fi + done < "$1" > prefs.js +} + +echo -e "\n\n" +echo " ╔══════════════════════════╗" +echo " ║ prefs.js cleaner ║" +echo " ║ by claustromaniac ║" +echo " ║ v1.0 ║" +echo " ╚══════════════════════════╝" +echo -e "\nThis script should be run from your Firefox profile directory.\n" +echo "It will remove any entries from prefs.js that also exist in user.js." +echo "This will allow inactive preferences to be reset to their default values." +echo -e "\nThis Firefox profile shouldn't be in use during the process.\n" +select option in Start Help Exit; do + case $option in + Start) + if [ ! -e user.js ]; then + fQuit 1 "user.js not found in the current directory." + elif [ ! -e prefs.js ]; then + fQuit 1 "prefs.js not found in the current directory." + fi + + fFF_check + bakfile="prefs.js.backup.$(date +"%Y-%m-%d_%H%M")" + mv prefs.js "${bakfile}" || fQuit 1 "Operation aborted.\nReason: Could not create backup file $bakfile" + echo -e "\nprefs.js backed up: $bakfile" + echo "Cleaning prefs.js..." + fClean "$bakfile" + fQuit 0 "All done!" + ;; + Help) + echo -e "\nThis script creates a backup of your prefs.js file before doing anything." + echo -e "It should be safe, but you can follow these steps if something goes wrong:\n" + echo "1. Make sure Firefox is closed." + echo "2. Delete prefs.js in your profile folder." + echo "3. Delete Invalidprefs.js if you have one in the same folder." + echo "4. Rename or copy your latest backup to prefs.js." + echo "5. Run Firefox and see if you notice anything wrong with it." + echo "6. If you do notice something wrong, especially with your extensions, and/or with the UI, go to about:support, and restart Firefox with add-ons disabled. Then, restart it again normally, and see if the problems were solved." + echo -e "If you are able to identify the cause of your issues, please bring it up on ghacks-user.js GitHub repository.\n" + ;; + Exit) + fQuit 0 + ;; + esac +done