1
0

updater.sh v2.1 (#554)

when argument `-l` is used, parse profiles.ini instead of just listing folders in the default profiles dir.
This allows to select profiles located outside of the default profiles directory and makes selection easier because it also shows the profile name (and selection is by number instead of having to copy-paste a path)
This commit is contained in:
earthlng 2018-11-26 14:44:52 +00:00 committed by GitHub
parent 62351bfbf5
commit d4907faa8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,13 +2,13 @@
## ghacks-user.js updater for macOS and Linux ## ghacks-user.js updater for macOS and Linux
## version: 2.0 ## version: 2.1
## Author: Pat Johnson (@overdodactyl) ## Author: Pat Johnson (@overdodactyl)
## Additional contributors: @earthlng, @ema-pe ## Additional contributors: @earthlng, @ema-pe
## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_updater() ) ## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_updater() )
readonly currdir=$(pwd) readonly CURRDIR=$(pwd)
sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null) sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi
@ -29,49 +29,39 @@ CYAN='\033[0;36m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# Argument defaults # Argument defaults
UPDATE="check" UPDATE='check'
CONFIRM="yes" CONFIRM='yes'
OVERRIDE="user-overrides.js" OVERRIDE='user-overrides.js'
BACKUP="multiple" BACKUP='multiple'
COMPARE=false COMPARE=false
SKIPOVERRIDE=false SKIPOVERRIDE=false
VIEW=false VIEW=false
PROFILE_PATH=false PROFILE_PATH=false
######################### # Download method priority: curl -> wget
# Working directory # DOWNLOAD_METHOD=''
######################### if [[ $(command -v 'curl') ]]; then
DOWNLOAD_METHOD='curl'
elif [[ $(command -v 'wget') ]]; then
DOWNLOAD_METHOD='wget'
else
echo -e "${RED}This script requires curl or wget.\nProcess aborted${NC}"
exit 0
fi
set_wd () {
declare -r macdir=~/Library/Application\ Support/Firefox/Profiles/ show_banner () {
declare -r nixdir=~/.mozilla/firefox/ echo -e "${BBLUE}\n"
local ff_profile echo ' ############################################################################'
if [ "$PROFILE_PATH" = false ]; then echo ' #### ####'
ff_profile="$SCRIPT_DIR" echo ' #### ghacks user.js ####'
elif [ "$PROFILE_PATH" = "list" ]; then echo ' #### Hardening the Privacy and Security Settings of Firefox ####'
local firefox_dir="" echo ' #### Maintained by @Thorin-Oakenpants and @earthlng ####'
if [ -d "$macdir" ]; then echo ' #### Updater for macOS and Linux by @overdodactyl ####'
firefox_dir=$macdir echo ' #### ####'
elif [ -d $nixdir ]; then echo ' ############################################################################'
firefox_dir=$nixdir echo -e "${NC}\n"
else echo -e "Documentation for this script is available here: ${CYAN}https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.3-Updater-Scripts${NC}\n"
echo -e ${RED}"Error: Sorry, -l is not supported for your OS"${NC}
exit 1
fi
if [ $(find "$firefox_dir" -maxdepth 1 -type d | wc -l) == "2" ]; then
ff_profile=$(ls -d "$firefox_dir"*)
else
echo -e ${GREEN}"The following profiles were found:\n"${ORANGE}
ls -d "$firefox_dir"*
echo -e ${RED}"\nWhich profile would you like to update?"${NC}
read -p ""
echo -e ""
ff_profile=$REPLY
fi
else
ff_profile="$PROFILE_PATH"
fi
cd "$ff_profile"
} }
######################### #########################
@ -79,8 +69,8 @@ set_wd () {
######################### #########################
usage() { usage() {
echo -e ${BLUE}"\nUsage: $0 [-h] [-p PROFILE] [-u] [-d] [-s] [-n] [-b] [-c] [-v] [-r] [-o OVERRIDE]\n"${NC} 1>&2 # Echo usage string to standard error echo -e "${BLUE}\nUsage: $0 [-h] [-p PROFILE] [-u] [-d] [-s] [-n] [-b] [-c] [-v] [-r] [-o OVERRIDE]\n${NC}" 1>&2 # Echo usage string to standard error
echo -e "Optional Arguments:" echo 'Optional Arguments:'
echo -e "\t-h,\t\t Show this help message and exit." echo -e "\t-h,\t\t Show this help message and exit."
echo -e "\t-p PROFILE,\t Path to your Firefox profile (if different than the dir of this script)" echo -e "\t-p PROFILE,\t Path to your Firefox profile (if different than the dir of this script)"
echo -e "\t\t\t IMPORTANT: if the path include spaces, wrap the entire argument in quotes." echo -e "\t\t\t IMPORTANT: if the path include spaces, wrap the entire argument in quotes."
@ -102,7 +92,7 @@ usage() {
echo -e "\t-v,\t\t Open the resulting user.js file." echo -e "\t-v,\t\t Open the resulting user.js file."
echo -e "\t-r,\t\t Only download user.js to a temporary file and open it." echo -e "\t-r,\t\t Only download user.js to a temporary file and open it."
echo -e echo -e
echo -e "Deprecated Arguments (they still work for now):" echo 'Deprecated Arguments (they still work for now):'
echo -e "\t-donotupdate,\t Use instead -d" echo -e "\t-donotupdate,\t Use instead -d"
echo -e "\t-update,\t Use instead -u" echo -e "\t-update,\t Use instead -u"
echo -e echo -e
@ -110,68 +100,95 @@ usage() {
} }
legacy_argument () { legacy_argument () {
echo -e ${ORANGE}"\nWarning: command line arguments have changed." echo -e "${ORANGE}\nWarning: command line arguments have changed."
echo -e "$1 has been deprecated and may not work in the future.\n" echo -e "$1 has been deprecated and may not work in the future.\n"
echo -e "Please view the new options using the -h argument."${NC} echo -e "Please view the new options using the -h argument.${NC}"
} }
######################### #########################
# File Handling # # File Handling #
######################### #########################
# Download method priority: curl -> wget
DOWNLOAD_METHOD=""
if [[ $(command -v "curl") ]]; then
DOWNLOAD_METHOD="curl"
elif [[ $(command -v "wget") ]]; then
DOWNLOAD_METHOD="wget"
else
echo -e ${RED}"This script requires curl or wget.\nProcess aborted"${NC}
exit 0
fi
# Download files # Download files
download_file () { download_file () {
declare -r url=$1 declare -r url=$1
declare -r tf=$(mktemp) declare -r tf=$(mktemp)
local dlcmd="" local dlcmd=''
if [ $DOWNLOAD_METHOD = "curl" ]; then if [ $DOWNLOAD_METHOD = 'curl' ]; then
dlcmd="curl -o $tf" dlcmd="curl -o $tf"
else else
dlcmd="wget -O $tf" dlcmd="wget -O $tf"
fi fi
$dlcmd "${url}" &>/dev/null && echo "$tf" || echo "" # return the temp-filename (or empty string on error) $dlcmd "${url}" &>/dev/null && echo "$tf" || echo '' # return the temp-filename (or empty string on error)
} }
open_file () { #expects one argument: file_path open_file () { #expects one argument: file_path
if [ "$(uname)" == "Darwin" ]; then if [ "$(uname)" == 'Darwin' ]; then
open "$1" open "$1"
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
xdg-open "$1" xdg-open "$1"
else else
echo -e ${RED}"Error: Sorry, opening files is not supported for your OS."${NC} echo -e "${RED}Error: Sorry, opening files is not supported for your OS.${NC}"
fi fi
} }
readIniFile () { # expects one argument: absolute path of profiles.ini
declare -r inifile="$1"
declare -r tfile=$(mktemp)
show_banner () { if [ $(grep '^\[Profile' "$inifile" | wc -l) == "1" ]; then ### only 1 profile found
echo -e grep '^\[Profile' -A 4 "$inifile" | grep -v '^\[Profile' > $tfile
echo -e else
echo -e ${BBLUE}" ############################################################################" grep -E -v '^\[General\]|^StartWithLastProfile=|^IsRelative=' "$inifile"
echo -e " #### ####" echo ''
echo -e " #### ghacks user.js ####" read -p 'Select the profile number ( 0 for Profile0, 1 for Profile1, etc ) : ' -r
echo -e " #### Hardening the Privacy and Security Settings of Firefox ####" echo -e "\n"
echo -e " #### Maintained by @Thorin-Oakenpants and @earthlng ####" if [[ $REPLY =~ ^(0|[1-9][0-9]*)$ ]]; then
echo -e " #### Updater for macOS and Linux by @overdodactyl ####" grep '^\[Profile'${REPLY} -A 4 "$inifile" | grep -v '^\[Profile'${REPLY} > $tfile
echo -e " #### ####" if [ !$? ]; then
echo -e " ############################################################################"${NC} echo "Profile${REPLY} does not exist!" && exit 1
echo -e fi
echo -e else
echo -e "Documentation for this script is available here: ${CYAN}https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.3-Updater-Scripts${NC}\n" echo "Invalid selection!" && exit 1
fi
fi
declare -r profpath=$(grep '^Path=' $tfile)
declare -r pathisrel=$(grep '^IsRelative=' $tfile)
rm "$tfile"
# update global variable
if [[ ${pathisrel#*=} == "1" ]]; then
PROFILE_PATH="$(dirname "$inifile")/${profpath#*=}"
else
PROFILE_PATH="${profpath#*=}"
fi
} }
getProfilePath () {
declare -r f1=~/Library/Application\ Support/Firefox/profiles.ini
declare -r f2=~/.mozilla/firefox/profiles.ini
if [ "$PROFILE_PATH" = false ]; then
PROFILE_PATH="$SCRIPT_DIR"
elif [ "$PROFILE_PATH" = 'list' ]; then
local ini=''
if [[ -f "$f1" ]]; then
ini="$f1"
elif [[ -f "$f2" ]]; then
ini="$f2"
else
echo -e "${RED}Error: Sorry, -l is not supported for your OS${NC}"
exit 1
fi
readIniFile "$ini" # updates PROFILE_PATH or exits on error
#else
# PROFILE_PATH already set by user with -p
fi
}
######################### #########################
# Update updater.sh # # Update updater.sh #
@ -188,14 +205,14 @@ get_updater_version () {
# -donotupdate: New version will not be looked for and update will not occur # -donotupdate: New version will not be looked for and update will not occur
# -update: Check for update, if available, execute without asking # -update: Check for update, if available, execute without asking
update_updater () { update_updater () {
if [ $UPDATE = "no" ]; then if [ $UPDATE = 'no' ]; then
return 0 # User signified not to check for updates return 0 # User signified not to check for updates
fi fi
declare -r tmpfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.sh') declare -r tmpfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.sh')
if [[ $(get_updater_version "${SCRIPT_DIR}/updater.sh") < $(get_updater_version "${tmpfile}") ]]; then if [[ $(get_updater_version "${SCRIPT_DIR}/updater.sh") < $(get_updater_version "${tmpfile}") ]]; then
if [ $UPDATE = "check" ]; then if [ $UPDATE = 'check' ]; then
echo -e "There is a newer version of updater.sh available. ${RED}Update and execute Y/N?${NC}" echo -e "There is a newer version of updater.sh available. ${RED}Update and execute Y/N?${NC}"
read -p "" -n 1 -r read -p "" -n 1 -r
echo -e "\n\n" echo -e "\n\n"
@ -255,12 +272,12 @@ update_userjs () {
echo -e "\tAvailable online: ${ORANGE}$(get_userjs_version $newfile)${NC}" echo -e "\tAvailable online: ${ORANGE}$(get_userjs_version $newfile)${NC}"
echo -e "\tCurrently using: ${ORANGE}$(get_userjs_version user.js)\n${NC}\n" echo -e "\tCurrently using: ${ORANGE}$(get_userjs_version user.js)\n${NC}\n"
if [ $CONFIRM = "yes" ]; then if [ $CONFIRM = 'yes' ]; then
echo -e "This script will update to the latest user.js file and append any custom configurations from user-overrides.js. ${RED}Continue Y/N? ${NC}" echo -e "This script will update to the latest user.js file and append any custom configurations from user-overrides.js. ${RED}Continue Y/N? ${NC}"
read -p "" -n 1 -r read -p "" -n 1 -r
echo -e "\n" echo -e "\n"
if [[ $REPLY =~ ^[Nn]$ ]]; then if [[ $REPLY =~ ^[Nn]$ ]]; then
echo -e ${RED}"Process aborted"${NC} echo -e "${RED}Process aborted${NC}"
rm $newfile rm $newfile
return 1 return 1
fi fi
@ -275,8 +292,8 @@ update_userjs () {
# backup user.js # backup user.js
mkdir -p userjs_backups mkdir -p userjs_backups
local bakname="userjs_backups/user.js.backup.$(date +"%Y-%m-%d_%H%M")" local bakname="userjs_backups/user.js.backup.$(date +"%Y-%m-%d_%H%M")"
if [ $BACKUP = "single" ]; then if [ $BACKUP = 'single' ]; then
bakname="userjs_backups/user.js.backup" bakname='userjs_backups/user.js.backup'
fi fi
cp user.js "$bakname" cp user.js "$bakname"
@ -292,9 +309,9 @@ update_userjs () {
# create diff # create diff
if [ "$COMPARE" = true ]; then if [ "$COMPARE" = true ]; then
pastuserjs=userjs_diffs/past_user.js pastuserjs='userjs_diffs/past_user.js'
past_nocomments=userjs_diffs/past_userjs.txt past_nocomments='userjs_diffs/past_userjs.txt'
current_nocomments=userjs_diffs/current_userjs.txt current_nocomments='userjs_diffs/current_userjs.txt'
remove_comments $pastuserjs $past_nocomments remove_comments $pastuserjs $past_nocomments
remove_comments user.js $current_nocomments remove_comments user.js $current_nocomments
@ -305,16 +322,13 @@ update_userjs () {
echo "$diff" > "$diffname" echo "$diff" > "$diffname"
echo -e "Status: ${GREEN}A diff file was created:${NC} ${PWD}/${diffname}" echo -e "Status: ${GREEN}A diff file was created:${NC} ${PWD}/${diffname}"
else else
echo -e "Warning: ${ORANGE}Your new user.js file appears to be identical. No diff file was created."${NC} echo -e "Warning: ${ORANGE}Your new user.js file appears to be identical. No diff file was created.${NC}"
fi fi
rm $past_nocomments $current_nocomments $pastuserjs rm $past_nocomments $current_nocomments $pastuserjs
fi fi
if [ "$VIEW" = true ]; then if [ "$VIEW" = true ]; then open_file "${PWD}/user.js"; fi
open_file "${PWD}/user.js"
fi
} }
######################### #########################
@ -327,10 +341,10 @@ if [ $# != 0 ]; then
if [ $1 = '--help' ] || [ $1 = '-help' ]; then if [ $1 = '--help' ] || [ $1 = '-help' ]; then
usage usage
elif [ $legacy_lc = '-donotupdate' ]; then elif [ $legacy_lc = '-donotupdate' ]; then
UPDATE="no" UPDATE='no'
legacy_argument $1 legacy_argument $1
elif [ $legacy_lc = '-update' ]; then elif [ $legacy_lc = '-update' ]; then
UPDATE="yes" UPDATE='yes'
legacy_argument $1 legacy_argument $1
else else
while getopts ":hp:ludsno:bcvr" opt; do while getopts ":hp:ludsno:bcvr" opt; do
@ -342,16 +356,16 @@ if [ $# != 0 ]; then
PROFILE_PATH=${OPTARG} PROFILE_PATH=${OPTARG}
;; ;;
l) l)
PROFILE_PATH="list" PROFILE_PATH='list'
;; ;;
u) u)
UPDATE="yes" UPDATE='yes'
;; ;;
d) d)
UPDATE="no" UPDATE='no'
;; ;;
s) s)
CONFIRM="no" CONFIRM='no'
;; ;;
n) n)
SKIPOVERRIDE=true SKIPOVERRIDE=true
@ -360,7 +374,7 @@ if [ $# != 0 ]; then
OVERRIDE=${OPTARG} OVERRIDE=${OPTARG}
;; ;;
b) b)
BACKUP="single" BACKUP='single'
;; ;;
c) c)
COMPARE=true COMPARE=true
@ -371,16 +385,16 @@ if [ $# != 0 ]; then
r) r)
tfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js') tfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js')
mv $tfile "${tfile}.js" mv $tfile "${tfile}.js"
echo -e ${ORANGE}"Warning: user.js was saved to temporary file ${tfile}.js"${NC} echo -e "${ORANGE}Warning: user.js was saved to temporary file ${tfile}.js${NC}"
open_file "${tfile}.js" open_file "${tfile}.js"
exit 1 exit 1
;; ;;
\?) \?)
echo -e ${RED}"\n Error! Invalid option: -$OPTARG"${NC} >&2 echo -e "${RED}\n Error! Invalid option: -$OPTARG${NC}" >&2
usage usage
;; ;;
:) :)
echo -e ${RED}"Error! Option -$OPTARG requires an argument."${NC} >&2 echo -e "${RED}Error! Option -$OPTARG requires an argument.${NC}" >&2
exit 1 exit 1
;; ;;
esac esac
@ -390,7 +404,8 @@ fi
show_banner show_banner
update_updater update_updater
set_wd # changes directory to the Firefox profile (or script-dir)
update_userjs
cd "${currdir}" getProfilePath # updates PROFILE_PATH or exits on error
cd "$PROFILE_PATH" && update_userjs
cd "$CURRDIR"