Activer / désactiver le wifi si votre Mac est connecté ou non à un réseau ethernet

· 3 minutes de lecture
Activer / désactiver le wifi si votre Mac est connecté ou non à un réseau ethernet

Voici un script fort utile pour activer / désactiver le réseau Wifi de son Mac lorsqu’on se connecte à un réseau Ethernet. Malgré les évolutions récentes des protocoles wifi, le port ethernet conserve néanmoins des avantages (débit, fiabilité, etc.). MacOS ne possédant pas cette fonction par défaut, voici le script d’Albert Bori sur GitHub.

Installation et mise à jour

Ce script est très ingénieux mais il a été écrit il y a déjà quelques années et pour le faire fonctionner sur un système récent, il faut y porter quelques modifications.

  1. Récupérer les scripts sur le site de l’auteur https://gist.github.com/albertbori/1798d88a93175b9da00b
  2. Suivre cette procédure pour l’installation (celle du site n’est plus adaptée)
  • Ouvrir l'application Terminal ou équivalent et vous rendre dans le dossier téléchargé (ou bien utiliser les scripts en bas d'article)
  • Copier toggleAirport.sh dans /Library/Scripts/ :
sudo cp toggleAirport.sh /Library/Scripts/
  • Modifier les autorisations :
sudo chmod 755 /Library/Scripts/toggleAirport.sh

Copier com.mine.toggleairport.plist dans /Library/LaunchAgents/ :

sudo cp com.mine.toggleairport.plist /Library/LaunchAgents/
  • Modifier les autorisations :
sudo chmod 600 /Library/LaunchAgents/com.mine.toggleairport.plist
  • Puis la paternité :
sudo chown root:wheel /Library/LaunchAgents/com.mine.toggleairport.plist
  • Enfin, lancer le processus de surveillance de la connexion réseau :
sudo launchctl load /Library/LaunchAgents/com.mine.toggleairport.plist

Les versions plus récentes du système vont vous avertir que le mode de lancement est ancien `launchctl bootstrap` is a recommended alternative. , mais la commande précédente devrait toujours fonctionner.

Si besoin de stopper le processus : sudo launchctl unload /Library/LaunchAgents/com.mine.toggleairport.plist

3. Voici quelques modifications pour les systèmes récents :

Adapter la ligne 36 du script pour pouvoir prendre en compte les diverses façons dont macOS nomme les interfaces ethernet (notamment avec les docks et adaptateurs usb-c récents.

La ligne 36 passe de ceci :

eth_names=`networksetup -listnetworkserviceorder | sed -En 's|^\(Hardware Port: .*Ethernet, Device: (en.)\)$|\1|p'`

à cela :

eth_names=`networksetup -listnetworkserviceorder | sed -En 's|^\(Hardware Port: .*(Slot 1\|Ethernet.*\|LAN\|Thunderbolt\|AX88179A.*), Device: (en.*.\|bridge.*.)\)$|\2|p'`

Au besoin, voici les scripts modifiés :

<?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>
com.mine.toggleairport.plist
#!/bin/bash

function set_airport {

    new_status=$1

    if [ $new_status = "On" ]; then
        /usr/sbin/networksetup -setairportpower $air_name on
        touch /var/tmp/prev_air_on
    else
        /usr/sbin/networksetup -setairportpower $air_name off
        if [ -f "/var/tmp/prev_air_on" ]; then
            rm /var/tmp/prev_air_on
        fi
    fi

}

function growl {

    # Checks whether Growl is installed
    if [ -f "/usr/local/bin/growlnotify" ]; then
        /usr/local/bin/growlnotify -m "$1" -a "AirPort Utility.app"
    else
        osascript -e "display notification \"$1\" with title \"Wifi Toggle\" sound name \"Hero\""
    fi

}

# Set default values
prev_eth_status="Off"
prev_air_status="Off"
eth_status="Off"

# Grab the names of the adapters. We assume here that any ethernet connection name ends in "Ethernet"
eth_names=`networksetup -listnetworkserviceorder | sed -En 's|^\(Hardware Port: .*(Slot 1\|Ethernet.*\|LAN\|Thunderbolt\|AX88179A.*), Device: (en.*.\|bridge.*.)\)$|\2|p'`
air_name=`networksetup -listnetworkserviceorder | sed -En 's/^\(Hardware Port: (Wi-Fi|AirPort), Device: (en.)\)$/\2/p'`

# Determine previous ethernet status
# If file prev_eth_on exists, ethernet was active last time we checked
if [ -f "/var/tmp/prev_eth_on" ]; then
    prev_eth_status="On"
fi

# Determine same for AirPort status
# File is prev_air_on
if [ -f "/var/tmp/prev_air_on" ]; then
    prev_air_status="On"
fi

# Check actual current ethernet status
for eth_name in ${eth_names}; do
    if ([ "$eth_name" != "" ] && [ "`ifconfig $eth_name | grep "status: active"`" != "" ]); then
        eth_status="On"
    fi
done

# And actual current AirPort status
air_status=`/usr/sbin/networksetup -getairportpower $air_name | awk '{ print $4 }'`

# 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 /var/tmp/prev_eth_on
else
    if [ -f "/var/tmp/prev_eth_on" ]; then
        rm /var/tmp/prev_eth_on
    fi
fi

exit 0

toggleAirport.sh

Pour désinstaller les scripts :

sudo launchctl unload /Library/LaunchAgents/com.mine.toggleairport.plist
sudo rm /Library/Scripts/toggleAirport.sh
sudo rm /Library/LaunchAgents/com.mine.toggleairport.plist
sudo rm /private/var/tmp/prev_eth_on
sudo rm /private/var/tmp/prev_air_on

Les scripts originaux ont été créés par Albert Bori : https://gist.github.com/albertbori/1798d88a93175b9da00b

Crédit photo : Mario Caruso sur Unsplash