From 494af600134a2c65051707666796b6522c9d3cbb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 26 Apr 2016 19:50:01 +0100 Subject: [PATCH] Read wifi networks from file --- src/freedombone-wifi | 446 +++++++++++++++++++++++++------------------ 1 file changed, 260 insertions(+), 186 deletions(-) diff --git a/src/freedombone-wifi b/src/freedombone-wifi index eca5896a..916d26a6 100755 --- a/src/freedombone-wifi +++ b/src/freedombone-wifi @@ -41,241 +41,315 @@ WIFI_TYPE='wpa2-psk' WIFI_SSID= WIFI_PASSPHRASE= WIFI_HOTSPOT='no' +WIFI_CONFIG=/etc/wpa_supplicant/wpa_supplicant.conf +WIFI_FILE=/root/${PROJECT_NAME}-wifi.cfg function wifi_get_psk { - ssid=$1 - passphrase=$2 + ssid=$1 + passphrase=$2 - psk=$(wpa_passphrase "$ssid" "$passphrase" | grep 'psk=' | sed -n 2p | awk -F '=' '{print $2}') - echo $psk + psk=$(wpa_passphrase "$ssid" "$passphrase" | grep 'psk=' | sed -n 2p | awk -F '=' '{print $2}') + echo $psk } function hotspot_off { - if [ ! -f /etc/hostapd/hostapd.conf ]; then - return - fi - systemctl stop hostapd + if [ ! -f /etc/hostapd/hostapd.conf ]; then + return + fi + systemctl stop hostapd - rm /etc/hostapd/hostapd.conf + rm /etc/hostapd/hostapd.conf - if [ -f /etc/network/interfaces_original ]; then - cp /etc/network/interfaces_original /etc/network/interfaces - else - echo '# interfaces(5) file used by ifup(8) and ifdown(8)' > /etc/network/interfaces - echo '# Include files from /etc/network/interfaces.d:' >> /etc/network/interfaces - echo 'source-directory /etc/network/interfaces.d' >> /etc/network/interfaces - fi - - systemctl restart network-manager + if [ -f /etc/network/interfaces_original ]; then + cp /etc/network/interfaces_original /etc/network/interfaces + else + echo '# interfaces(5) file used by ifup(8) and ifdown(8)' > /etc/network/interfaces + echo '# Include files from /etc/network/interfaces.d:' >> /etc/network/interfaces + echo 'source-directory /etc/network/interfaces.d' >> /etc/network/interfaces + fi + + systemctl restart network-manager } function hotspot_on { - if [ ! -f /etc/default/hostapd ]; then - echo $'/etc/default/hostapd was not found' - exit 67241 - fi - if [ ${#WIFI_PASSPHRASE} -lt 8 ]; then - echo $'Wifi hotspot passphrase is too short' - exit 25719 - fi - - sed -i 's|#DAEMON_CONF=.*|DAEMON_CONF="/etc/hostapd/hostapd.conf"|g' /etc/default/hostapd + if [ ! -f /etc/default/hostapd ]; then + echo $'/etc/default/hostapd was not found' + exit 67241 + fi + if [ ${#WIFI_PASSPHRASE} -lt 8 ]; then + echo $'Wifi hotspot passphrase is too short' + exit 25719 + fi - echo '### Wireless network name ###' > /etc/hostapd/hostapd.conf - echo "interface=$WIFI_INTERFACE" >> /etc/hostapd/hostapd.conf - echo '' >> /etc/hostapd/hostapd.conf - echo '### Set your bridge name ###' >> /etc/hostapd/hostapd.conf - echo 'bridge=br0' >> /etc/hostapd/hostapd.conf - echo '' >> /etc/hostapd/hostapd.conf - echo 'driver=nl80211' >> /etc/hostapd/hostapd.conf - echo "country_code=UK" >> /etc/hostapd/hostapd.conf - echo "ssid=$WIFI_SSID" >> /etc/hostapd/hostapd.conf - echo 'hw_mode=g' >> /etc/hostapd/hostapd.conf - echo 'channel=6' >> /etc/hostapd/hostapd.conf - echo 'wpa=2' >> /etc/hostapd/hostapd.conf - echo "wpa_passphrase=$WIFI_PASSPHRASE" >> /etc/hostapd/hostapd.conf - echo '' >> /etc/hostapd/hostapd.conf - echo '## Key management algorithms ##' >> /etc/hostapd/hostapd.conf - echo 'wpa_key_mgmt=WPA-PSK' >> /etc/hostapd/hostapd.conf - echo '' >> /etc/hostapd/hostapd.conf - echo '## Set cipher suites (encryption algorithms) ##' >> /etc/hostapd/hostapd.conf - echo '## TKIP = Temporal Key Integrity Protocol' >> /etc/hostapd/hostapd.conf - echo '## CCMP = AES in Counter mode with CBC-MAC' >> /etc/hostapd/hostapd.conf - echo 'wpa_pairwise=TKIP' >> /etc/hostapd/hostapd.conf - echo 'rsn_pairwise=CCMP' >> /etc/hostapd/hostapd.conf - echo '' >> /etc/hostapd/hostapd.conf - echo '## Shared Key Authentication ##' - echo 'auth_algs=1' - echo '' >> /etc/hostapd/hostapd.conf - echo '## Accept all MAC address ###' >> /etc/hostapd/hostapd.conf - echo 'macaddr_acl=0' >> /etc/hostapd/hostapd.conf + sed -i 's|#DAEMON_CONF=.*|DAEMON_CONF="/etc/hostapd/hostapd.conf"|g' /etc/default/hostapd - if [ ! -f /etc/network/interfaces_original ]; then - if ! grep -q "# wifi enabled" /etc/network/interfaces; then - cp /etc/network/interfaces /etc/network/interfaces_original - fi - fi - - echo '# wifi enabled' > /etc/network/interfaces - echo 'auto lo br0' >> /etc/network/interfaces - echo 'iface lo inet loopback' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo "# wireless $WIFI_INTERFACE" >> /etc/network/interfaces - echo "allow-hotplug $WIFI_INTERFACE" >> /etc/network/interfaces - echo "iface $WIFI_INTERFACE inet manual" >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo '# eth0 connected to the ISP router' >> /etc/network/interfaces - echo 'allow-hotplug eth0' >> /etc/network/interfaces - echo 'iface eth0 inet manual' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo '# Setup bridge' >> /etc/network/interfaces - echo 'iface br0 inet static' >> /etc/network/interfaces - echo " bridge_ports $WIFI_INTERFACE eth0" >> /etc/network/interfaces + echo '### Wireless network name ###' > /etc/hostapd/hostapd.conf + echo "interface=$WIFI_INTERFACE" >> /etc/hostapd/hostapd.conf + echo '' >> /etc/hostapd/hostapd.conf + echo '### Set your bridge name ###' >> /etc/hostapd/hostapd.conf + echo 'bridge=br0' >> /etc/hostapd/hostapd.conf + echo '' >> /etc/hostapd/hostapd.conf + echo 'driver=nl80211' >> /etc/hostapd/hostapd.conf + echo "country_code=UK" >> /etc/hostapd/hostapd.conf + echo "ssid=$WIFI_SSID" >> /etc/hostapd/hostapd.conf + echo 'hw_mode=g' >> /etc/hostapd/hostapd.conf + echo 'channel=6' >> /etc/hostapd/hostapd.conf + echo 'wpa=2' >> /etc/hostapd/hostapd.conf + echo "wpa_passphrase=$WIFI_PASSPHRASE" >> /etc/hostapd/hostapd.conf + echo '' >> /etc/hostapd/hostapd.conf + echo '## Key management algorithms ##' >> /etc/hostapd/hostapd.conf + echo 'wpa_key_mgmt=WPA-PSK' >> /etc/hostapd/hostapd.conf + echo '' >> /etc/hostapd/hostapd.conf + echo '## Set cipher suites (encryption algorithms) ##' >> /etc/hostapd/hostapd.conf + echo '## TKIP = Temporal Key Integrity Protocol' >> /etc/hostapd/hostapd.conf + echo '## CCMP = AES in Counter mode with CBC-MAC' >> /etc/hostapd/hostapd.conf + echo 'wpa_pairwise=TKIP' >> /etc/hostapd/hostapd.conf + echo 'rsn_pairwise=CCMP' >> /etc/hostapd/hostapd.conf + echo '' >> /etc/hostapd/hostapd.conf + echo '## Shared Key Authentication ##' + echo 'auth_algs=1' + echo '' >> /etc/hostapd/hostapd.conf + echo '## Accept all MAC address ###' >> /etc/hostapd/hostapd.conf + echo 'macaddr_acl=0' >> /etc/hostapd/hostapd.conf - systemctl restart network-manager - systemctl restart hostapd + if [ ! -f /etc/network/interfaces_original ]; then + if ! grep -q "# wifi enabled" /etc/network/interfaces; then + cp /etc/network/interfaces /etc/network/interfaces_original + fi + fi + + echo '# wifi enabled' > /etc/network/interfaces + echo 'auto lo br0' >> /etc/network/interfaces + echo 'iface lo inet loopback' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo "# wireless $WIFI_INTERFACE" >> /etc/network/interfaces + echo "allow-hotplug $WIFI_INTERFACE" >> /etc/network/interfaces + echo "iface $WIFI_INTERFACE inet manual" >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo '# eth0 connected to the ISP router' >> /etc/network/interfaces + echo 'allow-hotplug eth0' >> /etc/network/interfaces + echo 'iface eth0 inet manual' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo '# Setup bridge' >> /etc/network/interfaces + echo 'iface br0 inet static' >> /etc/network/interfaces + echo " bridge_ports $WIFI_INTERFACE eth0" >> /etc/network/interfaces + + systemctl restart network-manager + systemctl restart hostapd } function wifi_wpa2_psk { - ssid=$1 - passphrase=$2 + ssid=$1 + passphrase=$2 - if [ ! -f /etc/network/interfaces_original ]; then - if ! grep -q "# wifi enabled" /etc/network/interfaces; then - cp /etc/network/interfaces /etc/network/interfaces_original - fi - fi - - echo '# wifi enabled' > /etc/network/interfaces - echo 'auto lo' >> /etc/network/interfaces - echo 'iface lo inet loopback' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'allow-hotplug eth0' >> /etc/network/interfaces - echo 'iface eth0 inet dhcp' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'allow-hotplug wlan0' >> /etc/network/interfaces - echo 'iface wlan0 inet manual' >> /etc/network/interfaces - echo 'wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'iface default inet dhcp' >> /etc/network/interfaces + if [ ! -f /etc/network/interfaces_original ]; then + if ! grep -q "# wifi enabled" /etc/network/interfaces; then + cp /etc/network/interfaces /etc/network/interfaces_original + fi + fi - wpa_passphrase "$ssid" "$passphrase" > /etc/wpa_supplicant/wpa_supplicant.conf + echo '# wifi enabled' > /etc/network/interfaces + echo 'auto lo' >> /etc/network/interfaces + echo 'iface lo inet loopback' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug eth0' >> /etc/network/interfaces + echo 'iface eth0 inet dhcp' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug wlan0' >> /etc/network/interfaces + echo 'iface wlan0 inet manual' >> /etc/network/interfaces + echo " wpa-roam $WIFI_CONFIG" >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'iface default inet dhcp' >> /etc/network/interfaces - systemctl restart network-manager + wpa_passphrase "$ssid" "$passphrase" > $WIFI_CONFIG + + systemctl restart network-manager } function wifi_none { - ssid=$1 + ssid=$1 - if [ ! -f /etc/network/interfaces_original ]; then - if ! grep -q "# wifi enabled" /etc/network/interfaces; then - cp /etc/network/interfaces /etc/network/interfaces_original - fi - fi - - echo '# wifi enabled' > /etc/network/interfaces - echo 'auto lo' >> /etc/network/interfaces - echo 'iface lo inet loopback' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'allow-hotplug eth0' >> /etc/network/interfaces - echo 'iface eth0 inet dhcp' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'allow-hotplug wlan0' >> /etc/network/interfaces - echo 'iface wlan0 inet manual' >> /etc/network/interfaces - echo 'wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf' >> /etc/network/interfaces - echo '' >> /etc/network/interfaces - echo 'iface default inet dhcp' >> /etc/network/interfaces - - echo 'network={' > /etc/wpa_supplicant/wpa_supplicant.conf - echo " ssid=\"${ssid}\"" >> /etc/wpa_supplicant/wpa_supplicant.conf - echo ' key_mgmt=NONE' >> /etc/wpa_supplicant/wpa_supplicant.conf - echo '}' >> /etc/wpa_supplicant/wpa_supplicant.conf + if [ ! -f /etc/network/interfaces_original ]; then + if ! grep -q "# wifi enabled" /etc/network/interfaces; then + cp /etc/network/interfaces /etc/network/interfaces_original + fi + fi - systemctl restart network-manager + echo '# wifi enabled' > /etc/network/interfaces + echo 'auto lo' >> /etc/network/interfaces + echo 'iface lo inet loopback' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug eth0' >> /etc/network/interfaces + echo 'iface eth0 inet dhcp' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug wlan0' >> /etc/network/interfaces + echo 'iface wlan0 inet manual' >> /etc/network/interfaces + echo " wpa-roam $WIFI_CONFIG" >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'iface default inet dhcp' >> /etc/network/interfaces + + echo 'network={' > $WIFI_CONFIG + echo " ssid=\"${ssid}\"" >> $WIFI_CONFIG + echo ' key_mgmt=NONE' >> $WIFI_CONFIG + echo '}' >> $WIFI_CONFIG + + systemctl restart network-manager +} + +function create_networks_from_file { + if [ ! -f $WIFI_FILE ]; then + return + fi + + if [ ! -f /etc/network/interfaces_original ]; then + if ! grep -q "# wifi enabled" /etc/network/interfaces; then + cp /etc/network/interfaces /etc/network/interfaces_original + fi + fi + + echo '# wifi enabled' > /etc/network/interfaces + echo 'auto lo' >> /etc/network/interfaces + echo 'iface lo inet loopback' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug eth0' >> /etc/network/interfaces + echo 'iface eth0 inet dhcp' >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'allow-hotplug wlan0' >> /etc/network/interfaces + echo 'iface wlan0 inet manual' >> /etc/network/interfaces + echo " wpa-roam $WIFI_CONFIG" >> /etc/network/interfaces + echo '' >> /etc/network/interfaces + echo 'iface default inet dhcp' >> /etc/network/interfaces + + # remove wpa_supplicant.conf if it exists + if [ -f $WIFI_CONFIG ]; then + rm -f $WIFI_CONFIG + fi + + ctr=0 + while read -r line + do + if [ ${#line} -gt 1 ]; then + if [[ "$line" != '#'* ]]; then + if [ $ctr -eq 0 ]; then + WIFI_SSID="$line" + fi + if [ $ctr -eq 1 ]; then + WIFI_TYPE="$line" + if [[ $WIFI_TYPE == $'none' || $WIFI_TYPE == $'None' ]]; then + echo 'network={' >> $WIFI_CONFIG + echo " ssid=\"${WIFI_SSID}\"" >> $WIFI_CONFIG + echo ' key_mgmt=NONE' >> $WIFI_CONFIG + echo '}' >> $WIFI_CONFIG + ctr=0 + continue + fi + fi + if [ $ctr -eq 2 ]; then + WIFI_PASSPHRASE="$line" + wpa_passphrase "$WIFI_SSID" "$WIFI_PASSPHRASE" >> $WIFI_CONFIG + ctr=0 + continue + fi + + ctr=$((ctr + 1)) + fi + fi + done < $WIFI_FILE + + systemctl restart network-manager } function show_help { - echo '' - echo $"${PROJECT_NAME}-wifi -i [interface] -t [type] -s [ssid] -p [passphrase]" - echo '' - echo $'Wifi configuration tool' - echo '' - echo $' --help Show help' - echo $' -i --interface [wlan0|wlan1...] Device name' - echo $' -t --type [wpa2-psk|none] Security type' - echo $' -s --ssid [id] Set SSID' - echo $' -p --passphrase [text] Set passphrase' - echo $' --hotspot [yes|no] Create a hotspot' - echo '' - exit 0 + echo '' + echo $"${PROJECT_NAME}-wifi -i [interface] -t [type] -s [ssid] -p [passphrase]" + echo '' + echo $'Wifi configuration tool' + echo '' + echo $' --help Show help' + echo $' -i --interface [wlan0|wlan1...] Device name' + echo $' -t --type [wpa2-psk|none] Security type' + echo $' -s --ssid [id] Set SSID' + echo $' -p --passphrase [text] Set passphrase' + echo $' --hotspot [yes|no] Create a hotspot' + echo '' + exit 0 } while [[ $# > 1 ]] do - key="$1" + key="$1" - case $key in - --help) - show_help - ;; - -i|--if|--interface) - shift - WIFI_INTERFACE=${1} - ;; - -t|--type) - shift - WIFI_TYPE=${1} - ;; - -s|--ssid) - shift - WIFI_SSID=${1} - ;; - -p|--pass|--passphrase) - shift - WIFI_PASSPHRASE=${1} - ;; - --hostpot) - shift - WIFI_HOTSPOT=${1} - ;; - *) - # unknown option - ;; - esac - shift + case $key in + --help) + show_help + ;; + -i|--if|--interface) + shift + WIFI_INTERFACE=${1} + ;; + -t|--type) + shift + WIFI_TYPE=${1} + ;; + -s|--ssid) + shift + WIFI_SSID=${1} + ;; + -p|--pass|--passphrase) + shift + WIFI_PASSPHRASE=${1} + ;; + --hostpot) + shift + WIFI_HOTSPOT=${1} + ;; + --config) + shift + WIFI_FILE=${1} + ;; + *) + # unknown option + ;; + esac + shift done +if [ -f $WIFI_FILE ]; then + create_networks_from_file + exit 0 +fi + if [ ! $WIFI_SSID ]; then - echo $'No SSID given' - exit 1 + echo $'No SSID given' + exit 1 fi if [[ $WIFI_HOTSPOT != 'no' ]]; then - hotspot_on - exit 0 + hotspot_on + exit 0 else - hotspot_off + hotspot_off fi if [[ $WIFI_TYPE != 'none' ]]; then - if [ ! $WIFI_PASSPHRASE ]; then - echo $'No wifi passphrase was given' - exit 2 - fi + if [ ! $WIFI_PASSPHRASE ]; then + echo $'No wifi passphrase was given' + exit 2 + fi fi if [[ $WIFI_TYPE == 'wpa2-psk' ]]; then - if [ ! -d /etc/wpa_supplicant ]; then - echo $'wpasupplicant package is not installed' - exit 3 - fi - wifi_wpa2_psk "$WIFI_SSID" "$WIFI_PASSPHRASE" - exit 0 + if [ ! -d /etc/wpa_supplicant ]; then + echo $'wpasupplicant package is not installed' + exit 3 + fi + wifi_wpa2_psk "$WIFI_SSID" "$WIFI_PASSPHRASE" + exit 0 fi if [[ $WIFI_TYPE == 'none' ]]; then - wifi_none "$WIFI_SSID" - exit 0 + wifi_none "$WIFI_SSID" + exit 0 fi exit 0