Existe-t-il un moyen d'exécuter un script chaque fois qu'une interface réseau finit de se présenter ? Ou, existe-t-il une réponse équivalente à cette question sur Debian sur OSX ?
Réponses
Trop de publicités?Ce qui suit fonctionne sur Mac OS X 10.11.3 (El Capitan)
-
Créez un fichier :
networkchange.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \ "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>networkchange</string> <key>LowPriorityIO</key> <true/> <key>ProgramArguments</key> <array> <string>/Users/Shared/bin/networkchange.sh</string> </array> <key>WatchPaths</key> <array> <string>/etc/resolv.conf</string> <string>/var/run/resolv.conf</string> <string>/private/var/run/resolv.conf</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
-
Ensuite, enregistrez-vous en exécutant les commandes suivantes dans le Terminal :
launchctl load networkchange.plist launchctl start networkchange
Notez que le script est exécuté par l'utilisateur qui enregistre la plist.
Un agent launchd qui surveille /etc/resolv.conf
et deux fichiers .plist liés au réseau sous le nom de /Library/Preferences/SystemConfiguration/
semble fonctionner pour moi (sous Mac OS X 10.8.4) :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>ifup.ddns</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/bin/ddns-update.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/etc/resolv.conf</string>
<string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
<string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Auparavant, je n'utilisais que /etc/resolv.conf, mais dans certains cas, cela ne suffisait pas.
Je me suis retrouvé avec ce script :
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
let COUNTER=COUNTER+1
# assign to test at each iteration otherwise the output won't be changed
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
# do the job here
# exit the loop
let COUNTER=COUNTER+10
break
fi
# give a little time for a network to get up
sleep 2
done
Il vérifie un réseau 10 fois et le réseau a 2*10 secondes pour se lever.