J’utilise depuis quelques années un petit script (dont j’ai oublié l’origine initiale), qui permet d’activer ou de désactiver automatiquement le WIFI du Mac quand je branche (ou je débranche) un câble réseau Ethernet, ce qui permet de forcer l’usage de la connexion la plus rapide (Ethernet en l’espèce).
Voilà la source du script en question (à enregistrer dans un fichier toggleAirport.sh par exemple) :
#!/bin/bash # Set BSD port names bsd_wifi="en0" bsd_eth1="en6" bsd_eth2="en7" bsd_eth3="en8" # Set status folder pth_status="/Users/franck" # Set status file file_airport=".prev_air_on" file_ethernet=".prev_eth_on" # Debug mode (Off/On) debug_mode="On" function log_message { if [ "$debug_mode" = "On" ]; then logger -is "toggleAirport: $1" fi } function set_airport { new_status=$1 if [ "$new_status" = "On" ]; then /usr/sbin/networksetup -setairportpower "$bsd_wifi" on touch $pth_status/$file_airport else /usr/sbin/networksetup -setairportpower "$bsd_wifi" off if [ -f "$pth_status/$file_airport" ]; then rm $pth_status/$file_airport fi fi } function growl { log_message "$1" # Use osascript rather than Growl osascript -e "display notification "$1" with title "toggleAirport" " return # Checks whether Growl is installed if [ -f "/usr/local/bin/growlnotify" ]; then /usr/local/bin/growlnotify -m "$1" -a "AirPort Utility.app" fi } function check_ethernet { # Interface exists check=$(ifconfig $1 | grep 'status: active') if [ "$check" != "" ]; then if [ "$check" != "ifconfig: interface $1 does not exist" ]; then eth_status="On" fi fi } # Set default values prev_eth_status="Off" prev_air_status="Off" eth_status="Off" # Determine previous ethernet status # If file prev_eth_on exists, ethernet was active last time we checked if [ -f "$pth_status/$file_ethernet" ]; then prev_eth_status="On" fi # Determine same for AirPort status # File is prev_air_on if [ -f "$pth_status/$file_airport" ]; then prev_air_status="On" fi # Check actual current ethernet interface status check_ethernet $bsd_eth1 check_ethernet $bsd_eth2 check_ethernet $bsd_eth3 # And actual current AirPort status air_status=$(/usr/sbin/networksetup -getairportpower $bsd_wifi | awk '{ print $4 }') # Log current status log_message "Previous ethernet status is $prev_eth_status" log_message "Current ethernet status is $eth_status" log_message "Previous airport status is $prev_air_status" log_message "Current airport status is $air_status" # If any change has occured. Run external script (if it exists) if [ "$prev_air_status" != "$air_status" ] || [ "$prev_eth_status" != "$eth_status" ]; then if [ -f "./statusChanged.sh" ]; then "./statusChanged.sh" "$eth_status" "$air_status" & fi fi # Determine whether ethernet status changed if [ "$prev_eth_status" != "$eth_status" ]; then if [ "$eth_status" = "On" ]; then set_airport "Off" growl "Wired network detected. Turning AirPort off." else set_airport "On" growl "No wired network detected. Turning AirPort on." fi # If ethernet did not change else # Check whether AirPort status changed # If so it was done manually by user if [ "$prev_air_status" != "$air_status" ]; then set_airport "$air_status" if [ "$air_status" = "On" ]; then growl "AirPort manually turned on." else growl "AirPort manually turned off." fi fi fi # Update ethernet status if [ "$eth_status" = "On" ]; then touch $pth_status/$file_ethernet else if [ -f "$pth_status/.prev_eth_on" ]; then rm $pth_status/$file_ethernet fi fi exit 0
Il est placé dans le répertoire /Library/Scripts/
, avec les droits idoines. Prenez soin de vérifier et de modifier le cas échéant les noms BSD des ports contrôlés (ici en0
pour le Wifi, en6
et en7
pour les deux ports Ethernet qui sont testés), sinon ça va faire bizarre !
Et voilà la source des propriétés (à enregistrer dans un fichier com.mine.toggleairport.sh
par exemple) à utiliser pour lancer le script à chaque fois qu’un changement se produit dans la configuration système :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.mine.toggleairport</string> <key>OnDemand</key> <true/> <key>ProgramArguments</key> <array> <string>/Library/Scripts/toggleAirport.sh</string> </array> <key>WatchPaths</key> <array> <string>/Library/Preferences/SystemConfiguration</string> </array> </dict> </plist>
Ce fichier est placé dans /System/Library/LaunchAgents/
et le tout est lancé avec une commande :
sudo launchctl load /System/Library/LaunchAgents/com.mine.toggleairport.plist
C’est tout !