#!/bin/bash -e

DISABLE=false
SSID=
PASS=
REBOOT=false

WLAN0_CFG=/etc/network/interfaces.d/wlan0
DHCPCD_CFG=/etc/dhcpcd.conf
WPA_CFG=/etc/wpa_supplicant/wpa_supplicant.conf


function query_config() {
    SSID=$(grep wpa-ssid $WLAN0_CFG |
                sed 's/^[[:space:]]*wpa-ssid "\([^"]*\)"/\1/')
    echo "{\"ssid\": \"$SSID\"}"
}


function disable_wifi() {
    rm -f $WLAN0_CFG
}


function configure_wlan0() {
    echo "auto wlan0"
    echo "allow-hotplug wlan0"
    echo "iface wlan0 inet dhcp"
    echo "  wpa-scan-ssid 1"
    echo "  wpa-ap-scan 1"
    echo "  wpa-key-mgmt WPA-PSK"
    echo "  wpa-proto RSN WPA"
    echo "  wpa-pairwise CCMP TKIP"
    echo "  wpa-group CCMP TKIP"
    echo "  wpa-ssid \"$SSID\""

    if [ ${#PASS} -ne 0 ]; then
      echo "  wpa-psk \"$PASS\""
    fi
}


function configure_wpa() {
    echo "country=US"
    echo "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev"
    echo "update_config=1"

    if [ ${#PASS} -eq 0 ]; then
        echo "network={"
        echo "  ssid=\"$SSID\""
        echo "  key_mgmt=NONE"
        echo "}"
    fi
}


function configure_dhcpcd() {
    echo "hostname"
    echo "clientid"
    echo "persistent"
    echo "option rapid_commit"
    echo "option domain_name_servers, domain_name, domain_search, host_name"
    echo "option classless_static_routes"
    echo "option ntp_servers"
    echo "option interface_mtu"
    echo "require dhcp_server_identifier"
    echo "slaac private"
}


function configure_wifi() {
    disable_wifi
    echo "source-directory /etc/network/interfaces.d" > /etc/network/interfaces
    configure_wlan0  > $WLAN0_CFG
    configure_wpa    > $WPA_CFG
    configure_dhcpcd > $DHCPCD_CFG
}


function usage() {
    echo "Usage: config-wifi [OPTIONS]"
    echo
    echo "Configure wifi as either a client or access point."
    echo
    echo "OPTIONS:"
    echo
    echo "  -d             Disable wifi."
    echo "  -r             Reboot when done."
    echo "  -s <SSID>      Set SSID."
    echo "  -p <PASS>      Set password."
    echo "  -j             Report wifi config as JSON data."
    echo
}


# Parse args
while [ $# -ne 0 ]; do
    case "$1" in
        -d) DISABLE=true ;;
        -r) REBOOT=true; ;;
        -s) SSID="$2"; shift ;;
        -p) PASS="$2"; shift ;;
        -j) query_config; exit 0 ;;

        -h)
            usage
            exit 0
            ;;

        *)
            usage
            echo "Unknown argument '$1'"
            exit 1
    esac

    shift
done


if $DISABLE; then
    disable_wifi
else
    # Check args
    function clean_str() {
        echo "$1" | tr -d '\n\r"'
    }

    SSID=$(clean_str "$SSID")
    PASS=$(clean_str "$PASS")

    LANG=C LC_ALL=C # For correct string byte length

    if [ ${#SSID} -eq 0 -o 32 -lt ${#SSID} ]; then
        echo "Invalid or missing SSID '$SSID'"
        exit 1
    fi

    if [ ${#PASS} -ne 0 ]; then
      if [ ${#PASS} -lt 8 -o 128 -lt ${#PASS} ]; then
        echo "Invalid passsword"
        exit 1
      fi
    fi

    # Execute
    echo "Configuring Wifi"
    configure_wifi
fi


if $REBOOT; then nohup reboot & fi
