Last active
December 27, 2019 05:56
-
-
Save jperkin/4e8afddeccd83a5c0117 to your computer and use it in GitHub Desktop.
Dynamically add/remove mDNSResponder chroot socket
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
#!/bin/bash | |
# | |
# This is an example script to dynamically update mDNSResponder on OSX to | |
# add/remove a chroot socket to enable DNS resolution inside it. | |
# | |
# If the chroot is not added, add it, otherwise delete it. | |
# | |
# You will probably want a more robust version for production. | |
# | |
chroot="${1%%/}"; shift | |
PB="/usr/libexec/PlistBuddy" | |
PLIST="/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist" | |
ENTRY="Sockets:Listeners" | |
# | |
# Check that Sockets:Listeners is an array (it is not by default), if not | |
# then make it so. | |
# | |
${PB} -c "Print ${ENTRY}:0" ${PLIST} >/dev/null 2>&1 | |
if [ $? -ne 0 ]; then | |
echo "Converting ${ENTRY} to an array" | |
tmplist=/tmp/import.$$.plist | |
${PB} -x -c "Print ${ENTRY}" ${PLIST} >${tmplist} | |
${PB} -c "Delete ${ENTRY}" ${PLIST} | |
${PB} -c "Add ${ENTRY} array" ${PLIST} | |
${PB} -c "Add ${ENTRY}:0 dict" ${PLIST} | |
${PB} -c "Merge ${tmplist} ${ENTRY}:0" ${PLIST} | |
rm -f ${tmplist} | |
fi | |
# | |
# Get size of Listeners array | |
# | |
entries=$(${PB} -c "Print ${ENTRY}" ${PLIST} | grep -c "Dict {") | |
# | |
# Find an entry which corresponds to our chroot. | |
# | |
e=0 | |
while [ ${e} -lt ${entries} ]; do | |
sockpath="$(${PB} -c 'Print '${ENTRY}':'$e':SockPathName' ${PLIST})" | |
if [ "${sockpath}" = "${chroot}/var/run/mDNSResponder" ]; then | |
break | |
fi | |
e=$((e + 1)) | |
done | |
# | |
# If we didn't find an entry, add it, otherwise remove it. | |
# | |
if [ ${e} -eq ${entries} ]; then | |
addlist="/tmp/add.$$.plist" | |
cat >${addlist} <<-EOF | |
<array> | |
<dict> | |
<key>SockFamily</key> | |
<string>Unix</string> | |
<key>SockPathName</key> | |
<string>${chroot}/var/run/mDNSResponder</string> | |
<key>SockPathMode</key> | |
<integer>438</integer> | |
</dict> | |
</array> | |
EOF | |
echo "Adding ${chroot}/var/run/mDNSResponder" | |
${PB} -c "Merge ${addlist} ${ENTRY}" ${PLIST} | |
rm -f ${addlist} | |
else | |
echo "Deleting ${chroot}/var/run/mDNSResponder" | |
${PB} -c "Delete ${ENTRY}:${e}" ${PLIST} | |
fi | |
# | |
# Reload mDNSResponder | |
# | |
launchctl unload ${PLIST} | |
launchctl load -w ${PLIST} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
On Mojave, need sudo to modify /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist