İşte geldiğim çözüm:
Growl ve HardwareGrowler kullanıyorum , dnsmasq tarafından yapılandırılmış bir çözümleyici dosyası yazan bir komut dosyasını tetiklemek için.
Belki de yanlış anlıyorum (Growl'un dokümantasyon durumu oldukça eksik), ancak Growl 2.1'in doğrudan doğru dizinde bir kabuk betiği tetikleyebildiğini sanıyordum . Ancak, bunun işe yaramadı. Yani, bunun yerine, kabuk komut dosyasını aşağıdaki gibi çalıştırmak için bir Applescript kuralları komut dosyası kullanıyorum ...
~ / Library / Application Script / com.Growl.GrowlHelperApp / Rules.scpt içinde:
using terms from application "Growl"
on evaluate notification with notification
--Rules go in here
if notification's note title contains "IP Address" then
set shell_result to do shell script "/usr/local/sbin/set_nameservers.sh"
end if
--Ultimately return what you want Growl to do with the notification
end evaluate notification
end using terms from
Sonra benim komut / usr/local/sbin/set_nameservers.sh:
#!/bin/bash
# locking variables
LOCKDIR="/tmp/nameservers.lock"
PIDFILE="${LOCKDIR}/nameservers.pid"
# Temporary file for discovered nameservers
TMP_NAMESERVERS_FILE="${LOCKDIR}/nameservers.conf"
# List of public nameservers to add to the list
PUB_NAMESERVERS_FILE="/etc/nameservers_public.conf"
# The nameserver list read in by dnsmasq
SYS_NAMESERVERS_FILE="/etc/nameservers.conf"
# Commands
GROWL="/usr/local/bin/growlnotify"
# Setup a lock in case Growl triggers this script multiple times due to multiple network changes
if mkdir "${LOCKDIR}"; then
echo "$$" >"${PIDFILE}";
echo "# DHCP supplied nameserves:" > "${TMP_NAMESERVERS_FILE}";
# 1) For each interface listed by the networksetup command...
while IFS=" " read -r -a interfaces;
do
((int_count = ${#interfaces[@]} - 1));
for ((i = 0; i <= int_count; i++));
do
# 2) Try to get a nameserver from DHCP. (Only the first of multiple is returned)
nameserver=`/usr/sbin/ipconfig getoption ${interfaces[i]} domain_name_server`
# 3) If a nameserver was returned, add it to our configuration.
if [ ${nameserver} ]; then
echo "nameserver" ${nameserver} >> ${TMP_NAMESERVERS_FILE};
fi
done
done <<< `networksetup -listallhardwareports | grep Device | sed 's/Device: //g'`
# 4) If a file of public nameservers exists, add these to our configuration.
if [ -e ${PUB_NAMESERVERS_FILE} ]; then
cat ${PUB_NAMESERVERS_FILE} >> ${TMP_NAMESERVERS_FILE};
fi
cp ${TMP_NAMESERVERS_FILE} ${SYS_NAMESERVERS_FILE};
# Display a Growl notification showing what our new nameserver config looks like.
${GROWL} -d "us.loranz.steve.set_nameservers" \
-N "Nameserver Configuration" \
-m "`cat ${SYS_NAMESERVERS_FILE}`" \
"System nameservers set to:";
rm -rf "${LOCKDIR}";
else
# Display an informational message if we failed to establish a lock.
${GROWL} -d "us.loranz.steve.set_nameservers" \
-N "Nameserver Configuration Failed" \
-m "$0 ($$) failed to run, lock already established by process: " `cat ${PIDFILE}` \
"Failed to set nameservers:";
exit 1;
fi
exit 0
Ardından HardwareGrowler'ı ağ olaylarını gösterecek şekilde ve Growl'u IP Adresi Değişti, Ağ Bağlantısı Aşağı ve Ağ Bağlantısı Yukarı için bir ScriptAction başlatmak üzere yapılandırdım.
Sonunda, ağ sunucusundaki ad sunucumu 127.0.0.1 olarak ayarlıyorum, böylece dnsmasq'a çarpıyorum.
dnsmasq daha sonra aşağıdaki seçeneklerle kurulur:
resolv-file=/etc/nameservers.conf
all-servers
İlk satır, dnsmasq dosyasını yukarıdaki betiğin DHCP ve keşfedilen herhangi bir genel sunucu aracılığıyla keşfedilen ad sunucularıyla doldurduğu dosyaya dolduruyor.
İkinci satırın, dnsmasq'ın bildiği tüm ad sunucularına bir sorgu göndermesini ve ilk yanıtı kabul etmesini sağlaması beklenir. Mac OS X çözücüsü , verilen bu çözme dosyalarına ve DHCP etki alanı aramasına duyulan ihtiyacı ortadan kaldırmalıdır ... ve buna güvenmek, listenizdeki her sunucuyu sorgulamaktan daha iyi bir netizen yapar. Biraz daha testten sonra bu seçeneği kaldırabilirim ve başkasının bu konuda sahip olduğu her türlü görüş için minnettar olurum.