#!/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 Set SSID." echo " -p 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