|
#!/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\" " |
|
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 contains "Ethernet" |
|
# Also assume that wireless devices contain Wi-Fi or AirPort |
|
eth_names=$(/usr/sbin/networksetup -listnetworkserviceorder | sed -En 's|^\(Hardware Port: .*Ethernet.*, Device: (en.)\)$|\1|p') |
|
air_name=$(/usr/sbin/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 previous AirPort status |
|
# If file prev_air_on exists, AirPort was active last time we checked |
|
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 |