-
-
Save markaltmann/de9d4e9dc5bb6583d971 to your computer and use it in GitHub Desktop.
Automatically disable Wifi when an Ethernet connection (cable) is plugged in on a Mac.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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.asb.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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Overview | |
This is a bash script that will automatically turn your wifi off if you connect your computer to an ethernet connection and turn wifi back on when you unplug your ethernet cable/adapter. If you decide to turn wifi on for whatever reason, it will remember that choice. This was improvised from [this mac hint](http://hints.macworld.com/article.php?story=20100927161027611) to work with Yosemite, and without hard-coding the adapter names. It's supposed to support growl, but I didn't check that part. I did, however, add OSX notification center support. Feel free to fork and fix any issues you encounter. | |
Most the credit for these changes go to [Dave Holland](https://github.com/davidholland) and [Albert Bori](https://github.com/albertbori) | |
## Requirements | |
- Mac OSX 10+ | |
- Administrator privileges | |
## Installation Instructions | |
- Copy `toggleAirport.sh` to `/Library/Scripts/` | |
- Run `chmod 755 /Library/Scripts/toggleAirport.sh` | |
- Copy `com.mine.toggleairport.plist` to `/Library/LaunchAgents/` | |
- Run `chmod 600 /Library/LaunchAgents/com.mine.toggleairport.plist` | |
- Run `sudo launchctl load /Library/LaunchAgents/com.mine.toggleairport.plist` to start the watcher | |
## Uninstall Instructions | |
- Run `sudo launchctl unload /Library/LaunchAgents/com.mine.toggleairport.plist` to stop the watcher | |
- Delete `/Library/Scripts/toggleAirport.sh` | |
- Delete `/Library/LaunchAgents/com.mine.toggleairport.plist` | |
- Delete `/private/var/tmp/prev_eth_on` | |
- Delete `/private/var/tmp/prev_air_on` | |
## Misc | |
To debug, just run: `sudo /Library/Scripts/toggleAirport.sh` and add echo's wherever you'd like |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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: .*Ethernet, Device: (en.)\)$|\1|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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment