#!/bin/bash
#
#  WIFI Toggle
#  by Andrew Wyatt
#  Generic WIFI toggle utility
#

JUPITER_VAR="/var/jupiter"
WIFI_RFKILL=$(for i in /sys/class/rfkill/*; do (echo -n $i/state:;cat $i/type 2>/dev/null) | grep wlan | sed "s#:.*##"; done | head -n 1)
if [[ "$*" =~ "silent" ]]; then
  NO_NOTIFY=1
fi

. /usr/lib/jupiter/scripts/notify

NICON="/usr/share/pixmaps/jupiter/gnome-dev-wavelan.png"

if [ -e $JUPITER_VAR/wifi-saved ]; then
  RADIO_SAVED_STATE=$(cat $JUPITER_VAR/wifi-saved)
else
  RADIO_SAVED_STATE=0
fi

RADIO_CONTROL=$WIFI_RFKILL
if [ -e "$RADIO_CONTROL" ]; then
  RADIO_STATE=$(cat $RADIO_CONTROL);
else
  RADIO_STATE="-1";
fi

if [ ! -d "$JUPITER_VAR" ]; then
  mkdir $JUPITER_VAR 2>/dev/null
fi

WIFI_IF=$(iwconfig 2>/dev/null | grep ESSID | awk '{print $1}')

function wifi_status {
  if [ -e "$WIFI_RFKILL" ]; then
    if [ "$RADIO_STATE" = "-1" ]; then
      echo "UNKNOWN"
    elif [ "$RADIO_STATE" = "0" ]; then
      echo "OFF"
    else
      echo "ON"
    fi
  else
    if [ "$WIFI_DRIVER" ]; then
      echo "OFF"
    else
      echo "UNKNOWN"
    fi
  fi
}

function radio_on {
  echo 1 > $RADIO_CONTROL 2>/dev/null
  if [ "$(cat $RADIO_CONTROL 2>/dev/null)" = "1" ]; then
    echo 1 > $JUPITER_VAR/wifi-saved
    notify $"WIFI Radio on" $NICON
  else
    notify $"Could not enable WIFI radio." $NICON
  fi
}

function radio_off {
  /sbin/ifconfig $WIFI_IF down 2>/dev/null
  echo 0 > $RADIO_CONTROL
  if [ "$(cat $RADIO_CONTROL 2>/dev/null)" = "0" ] || [ "$(lsmod | grep $WIFI_DRIVER)" = "" ]; then
    echo 0 > $JUPITER_VAR/wifi-saved
    notify $"WIFI Radio off" $NICON
  else
    notify $"Could not disable WIFI radio." $NICON
  fi
}

function radio_poweroff {
  /sbin/ifconfig $WIFI_IF down 2>/dev/null
  sleep 1
  echo 0 > $RADIO_CONTROL
}

function radio_toggle {
  if [ "$RADIO_STATE" = "1" ]; then
    radio_off
  else
    radio_on
  fi
}

function radio_restore {
  NO_NOTIFY=1
  if [ "$RADIO_SAVED_STATE" = "1" ]; then
    if [ "$RADIO_STATE" = "0" ]; then
      radio_on
    fi
  else
    if [ "$RADIO_STATE" = "1" ]; then
      radio_off
    fi
  fi
}

case $1 in
  restore)
    radio_restore
  ;;
  status)
    wifi_status
  ;;
  on|enable)
    radio_on
  ;;
  off|disable)
    radio_off
  ;;
  poweroff)
    radio_poweroff
  ;;
  *)
    radio_toggle
  ;;
esac
