Basculer le WIFI du Mac quand une connexion Ethernet devient active ou inactive

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 !

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/12365

Haut de page