Created
July 16, 2021 00:58
-
-
Save J-Swift/5aef3173d7201d7f04f1fc637cd0e263 to your computer and use it in GitHub Desktop.
Helper for comparing what macOS user defaults change between 2 points in time
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env nix-shell | |
#!nix-shell -i bash -p bash | |
set -euo pipefail | |
readonly _mode="${1:-}" | |
case "$_mode" in | |
'pre' | 'post' | 'compare') | |
readonly mode="${_mode}" | |
;; | |
*) | |
echo "Unsupported mode [${_mode}]. Must be one of [pre, post, compare]" | |
exit 1 | |
esac | |
if [ "${mode}" == 'compare' ]; then | |
readonly target="${2:-}" | |
if [ -z "${target}" ]; then | |
echo "Must provide a comparison target" | |
exit 1 | |
fi | |
fi | |
readonly basedir="$HOME/.local/share/apple_defaults_helper" | |
containsElement () { | |
local e match="$1" | |
shift | |
for e; do [[ "$e" == "$match" ]] && return 0; done | |
return 1 | |
} | |
setup() { | |
mkdir -p "${basedir}"/{pre,post} | |
rm -rf "${basedir}/${mode}"/* | |
} | |
write_all_domains() { | |
local -r targetdir="${1}" | |
local -r ignored_domains=( ContextStoreAgent com.apple.xpc.activity2 ) | |
echo "--------------------" | |
echo "Reading defaults" | |
echo "--------------------" | |
orig_ifs=$IFS | |
IFS=',' | |
for domain in $( defaults domains | sort ); do | |
local trimmed_domain=$( echo $domain | xargs ) | |
local destfile="${targetdir}/default__${trimmed_domain}" | |
if containsElement "${trimmed_domain}" "${ignored_domains[@]}"; then | |
continue | |
fi | |
(defaults read $trimmed_domain 2>/dev/null || echo 'unknown') > "${destfile}" | |
local sum=$( md5 -q "${destfile}" ) | |
echo "$trimmed_domain: $sum" >> "${targetdir}/default__md5sums" | |
done | |
IFS=$orig_ifs | |
echo "Done" | |
} | |
write_all_preferences() { | |
local -r targetdir="${1}" | |
local -r ignored_prefs=( com.apple.TimeMachine.plist com.apple.apsd.plist com.apple.Bluetooth.plist com.apple.networkextension.uuidcache.plist ) | |
echo | |
echo "--------------------" | |
echo "Reading preferences" | |
echo "--------------------" | |
for plist in /Library/Preferences/*.plist; do | |
local base_plist=$( basename $plist ) | |
local destfile="${targetdir}/plist__${base_plist}" | |
if containsElement "${base_plist}" "${ignored_prefs[@]}"; then | |
continue | |
fi | |
/usr/libexec/PlistBuddy -c "Print" "${plist}" > "${destfile}" || (echo "Error reading ${base_plist}"; continue) | |
local sum=$( md5 -q "${destfile}" ) | |
echo "$base_plist: $sum" >> "${targetdir}/plist__md5sums" | |
done | |
echo "Done" | |
} | |
do_compare() { | |
echo | |
echo "--------------------" | |
echo "comparing defaults" | |
echo "--------------------" | |
(diff --side-by-side --suppress-common-lines "${basedir}/pre/default__md5sums" "${basedir}/post/default__md5sums" && echo "No changes") || true | |
echo | |
echo "--------------------" | |
echo "comparing plists" | |
echo "--------------------" | |
(diff --side-by-side --suppress-common-lines "${basedir}/pre/plist__md5sums" "${basedir}/post/plist__md5sums" && echo "No changes") || true | |
} | |
main() { | |
if [ "${mode}" == "compare" ]; then | |
if [ "${target##*.}" == "plist" ]; then | |
diff --text --side-by-side "${basedir}/pre/plist__${target}" "${basedir}/post/plist__${target}" | |
else | |
diff --text --side-by-side "${basedir}/pre/default__${target}" "${basedir}/post/default__${target}" | |
fi | |
else | |
setup | |
write_all_domains "${basedir}/${mode}" | |
write_all_preferences "${basedir}/${mode}" | |
if [ "${mode}" == "post" ]; then | |
do_compare | |
fi | |
fi | |
echo | |
echo 'Done.' | |
} | |
main | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment