Skip to content

Instantly share code, notes, and snippets.

@jperkin
Last active December 27, 2019 05:56
Show Gist options
  • Save jperkin/4e8afddeccd83a5c0117 to your computer and use it in GitHub Desktop.
Save jperkin/4e8afddeccd83a5c0117 to your computer and use it in GitHub Desktop.
Dynamically add/remove mDNSResponder chroot socket
#!/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}
@leavez
Copy link

leavez commented Dec 27, 2019

On Mojave, need sudo to modify /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment