While Wi-Fi is great for connecting to the Internet on a laptop, keeping AirPort on all the time can drain your battery. If you have access to the Internet through a wired Ethernet connection, there may be no reason to keep AirPort on. If you don’t need it, and if you want to conserve your battery, Mac OS X Hints reader Trenneren wrote the following script, which turns AirPort off whenever an Ethernet cable is connected.
To set it up, copy the following script into your favorite text editor and save the file as toggleAirport.sh in /Library/Scripts/; be sure it is formatted as plain text.
#!/bin/bashfunction set_airport { new_status=$1 if [ $new_status = "On" ]; then /usr/sbin/networksetup -setairportpower en1 on touch /var/tmp/prev_air_on else /usr/sbin/networksetup -setairportpower en1 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" fi}# Set default valuesprev_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 checkedif [ -f "/var/tmp/prev_eth_on" ]; then prev_eth_status="On"fi# Determine same for AirPort status# File is prev_air_onif [ -f "/var/tmp/prev_air_on" ]; then prev_air_status="On"fi# Check actual current ethernet statusif [ "`ifconfig en0 | grep "status: active"`" != "" ]; then eth_status="On"fi# And actual current AirPort statusair_status=`/usr/sbin/networksetup -getairportpower en1 | 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" & fifi# Determine whether ethernet status changedif [ "$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 changeelse # 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 fifi# Update ethernet statusif [ "$eth_status" == "On" ]; then touch /var/tmp/prev_eth_onelse if [ -f "/var/tmp/prev_eth_on" ]; then rm /var/tmp/prev_eth_on fifiexit 0
With that script saved, open up a Terminal window and enter chmod 755 /Library/Scripts/toggleAirport.sh
, to make the script executable. Next, copy the following text and copy it into your favorite editor:
<?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>
Save this to your desktop as com.mine.toggleairport.plist; again, make sure it’s saved as plain text. Now drag that file from the desktop into /System/Library/LaunchAgents/; you’ll be asked to authenticate by typing in your password.
Now, whenever you connect an Ethernet cable to your computer, OS X will turn off AirPort as soon as the Ethernet connection becomes valid. It will even notify you via Growl if you have GrowlNotify installed. If you want to have both AirPort and Ethernet turned on, you can turn AirPort back on manually. It won’t turn it off again until you disconnect and reconnect the Ethernet cable.
Also note that the first script above is for Mac OS X 10.6 only. The following script (fixed by brettmjohnson) should work for 10.5:
#!/bin/bashfunction set_airport { new_status=$1 if [ $new_status = "On" ]; then /usr/sbin/networksetup -setairportpower on touch /var/tmp/prev_air_on else /usr/sbin/networksetup -setairportpower 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" fi}# Set default valuesprev_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 checkedif [ -f "/var/tmp/prev_eth_on" ]; then prev_eth_status="On"fi# Determine same for AirPort status# File is prev_air_onif [ -f "/var/tmp/prev_air_on" ]; then prev_air_status="On"fi# Check actual current ethernet statusif [ "`ifconfig en0 | grep "status: active"`" != "" ]; then eth_status="On"fi# And actual current AirPort statusair_status=`/usr/sbin/networksetup -getairportpower | 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" & fifi# Determine whether ethernet status changedif [ "$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 changeelse # 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 fifi# Update ethernet statusif [ "$eth_status" = "On" ]; then touch /var/tmp/prev_eth_onelse if [ -f "/var/tmp/prev_eth_on" ]; then rm /var/tmp/prev_eth_on fifiexit 0