diff --git a/wifi.sh b/wifi.sh new file mode 100644 index 0000000..c86b475 --- /dev/null +++ b/wifi.sh @@ -0,0 +1,325 @@ +#!/usr/bin/env bash + +# This file is part of The RetroPie Project +# +# The RetroPie Project is the legal property of its developers, whose names are +# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source. +# +# See the LICENSE.md file at the top-level directory of this distribution and +# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md +# + +#2019-10-21 - Script adapted for use with MiSTer FPGA project (http://misterfpga.org) by MiSterAddons (https://misteraddons.com) + +#rp_module_id="wifi" +#rp_module_desc="Configure Wifi" +#rp_module_section="config" +#rp_module_flags="!x11" + +function _set_interface_wifi() { + local state="$1" + + if [[ "$state" == "up" ]]; then + if ! ifup wlan0; then + ip link set wlan0 up + fi + elif [[ "$state" == "down" ]]; then + if ! ifdown wlan0; then + ip link set wlan0 down + fi + fi +} + +function parse_wpa_supplicant() { + #create wpa_supplicant if it doesn't exist + if [[ ! -e "/media/fat/linux/wpa_supplicant.conf" ]]; then + echo "ctrl_interface=/run/wpa_supplicant\n +update_config=1\n +country=US\n +\n +network={\n + ssid=""\n + psk=""\n +}" >> /media/fat/linux/wpa_supplicant.conf +fi + dialog --backtitle "$__backtitle" --infobox "\nScanning Existing Wifi Entries ..." 5 40 >/dev/tty2 + grep -i "ssid=" '/media/fat/linux/wpa_supplicant.conf' > 'media/fat/linux/wpa_supplicant_tmp' + sed -i 's/\tssid="//' 'media/fat/linux/wpa_supplicant_tmp' + sed -i 's/"//' 'media/fat/linux/wpa_supplicant_tmp' +} + +function remove_wifi() { + #dialog --backtitle "$__backtitle" --infobox "\nScanning Existing Wifi Entries ..." 5 40 >/dev/tty2 + #list_wpa_supplicants + #sed -i '/$wpa_config//d' "/media/fat/linux/wpa_supplicant.conf" + + sed -i '/network={/,/}/d' "/media/fat/linux/wpa_supplicant.conf" + #_set_interface_wifi down 2>/dev/null + +} + +function add_wifi() { + cat >> "/media/fat/linux/wpa_supplicant.conf" <<_EOF_ + network={ + $wpa_config + } +_EOF_ +} + +function list_wifi() { + local line + local essid + local type + while read line; do + [[ "$line" =~ ^Cell && -n "$essid" ]] && echo -e "$essid\n$type" + [[ "$line" =~ ^ESSID ]] && essid=$(echo "$line" | cut -d\" -f2) + [[ "$line" == "Encryption key:off" ]] && type="open" + [[ "$line" == "Encryption key:on" ]] && type="wep" + [[ "$line" =~ ^IE:.*WPA ]] && type="wpa" + done < <(iwlist wlan0 scan | grep -o "Cell .*\|ESSID:\".*\"\|IE: .*WPA\|Encryption key:.*") + echo -e "$essid\n$type" +} + +function list_wpa_supplicants() { + local line + local essids=() + local essid +# while read line; do +# [[ "$line" =~ ssid= $essid ]] && echo -e "$essid\n$type" +# echo $options +# echo $essid +# echo $type +# essids+=("$essid") +# types+=("$type") +# options+=("$i" "$essid") +# ((i++)) +# done < <(grep -o "ssid=.*" '/media/fat/linux/wpa_supplicant.conf') +# echo -e "$essid\n$type" + +# local cmd=(dialog --backtitle "$__backtitle" --menu "Please choose the network you would like to remove" 22 76 16) +# choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty2) +# [[ -z "$choice" ]] && return + +# essid=${essids[choice]} +# type=${types[choice]} + +# echo $type +# echo $essid +# echo $key + +# create_config_wifi "$type" "$essid" "$key" +} + +function parse_wpa_supplicants() { + local essids=() + local essid + #local options=() + i=0 + _set_interface_wifi up 2>/dev/null + sleep 1 + while read essid; read type; do + essids+=("$essid") + types+=("$type") + options+=("$i" "$essid") + ((i++)) + done < <(list_wpa_supplicants) + + local cmd=(dialog --backtitle "$__backtitle" --menu "Please choose the network you would like to remove" 22 76 16) + choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty2) + [[ -z "$choice" ]] && return + + essid=${essids[choice]} + type=${types[choice]} + + echo $type + echo $essid + echo $key + + create_config_wifi "$type" "$essid" "$key" +} + +function connect_wifi() { + if [[ ! -d "/sys/class/net/wlan0/" ]]; then + printMsgs "dialog" "No wlan0 interface detected" + return 1 + fi + dialog --backtitle "$__backtitle" --infobox "\nSearching ..." 5 40 >/dev/tty2 + local essids=() + local essid + local types=() + local type + local options=() + i=0 + _set_interface_wifi up 2>/dev/null + sleep 1 + while read essid; read type; do + essids+=("$essid") + types+=("$type") + options+=("$i" "$essid") + ((i++)) + done < <(list_wifi) + options+=("H" "Hidden ESSID") + + local cmd=(dialog --backtitle "$__backtitle" --menu "Please choose the network you would like to connect to" 22 76 16) + choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty2) + [[ -z "$choice" ]] && return + + local hidden=0 + if [[ "$choice" == "H" ]]; then + cmd=(dialog --backtitle "$__backtitle" --inputbox "Please enter the ESSID" 10 60) + essid=$("${cmd[@]}" 2>&1 >/dev/tty2) + [[ -z "$essid" ]] && return + cmd=(dialog --backtitle "$__backtitle" --nocancel --menu "Please choose the WiFi type" 12 40 6) + options=( + wpa "WPA/WPA2" + wep "WEP" + open "Open" + ) + type=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty2) + hidden=1 + else + essid=${essids[choice]} + type=${types[choice]} + fi + + if [[ "$type" == "wpa" || "$type" == "wep" ]]; then + local key="" + cmd=(dialog --backtitle "$__backtitle" --insecure --passwordbox "Please enter the WiFi key/password for $essid" 10 63) + local key_ok=0 + while [[ $key_ok -eq 0 ]]; do + key=$("${cmd[@]}" 2>&1 >/dev/tty2) || return + key_ok=1 + if [[ ${#key} -lt 8 || ${#key} -gt 63 ]] && [[ "$type" == "wpa" ]]; then + printMsgs "dialog" "Password must be between 8 and 63 characters" + key_ok=0 + fi + if [[ -z "$key" && $type == "wep" ]]; then + printMsgs "dialog" "Password cannot be empty" + key_ok=0 + fi + done + fi + + remove_wifi + create_config_wifi "$type" "$essid" "$key" + gui_connect_wifi +} + +function create_config_wifi() { + local type="$1" + local essid="$2" + local key="$3" + + local wpa_config + wpa_config+="\tssid=\"$essid\"\n" + case $type in + wpa) + wpa_config+="\tpsk=\"$key\"\n" + ;; + wep) + wpa_config+="\tkey_mgmt=NONE\n" + wpa_config+="\twep_tx_keyidx=0\n" + wpa_config+="\twep_key0=$key\n" + ;; + open) + wpa_config+="\tkey_mgmt=NONE\n" + ;; + esac + + [[ $hidden -eq 1 ]] && wpa_config+="\tscan_ssid=1\n" + + wpa_config=$(echo -e "$wpa_config") + cat >> "/media/fat/linux/wpa_supplicant.conf" <<_EOF_ +network={ +$wpa_config +} +_EOF_ +} + +function gui_connect_wifi() { + _set_interface_wifi down 2>/dev/null + _set_interface_wifi up 2>/dev/null + # BEGIN workaround for dhcpcd trigger failure on Raspbian stretch + systemctl restart dhcpcd &>/dev/null + # END workaround + dialog --backtitle "$__backtitle" --infobox "\nConnecting ..." 5 40 >/dev/tty2 + local id="" + i=0 + while [[ -z "$id" && $i -lt 30 ]]; do + sleep 1 + id=$(iwgetid -r) + ((i++)) + dialog --backtitle "$__backtitle" --infobox "\nSaving ..." 5 40 >/dev/tty2 + done + if [[ -z "$id" ]]; then + printMsgs "dialog" "Unable to connect to network $essid" + _set_interface_wifi down 2>/dev/null + fi + sleep 5 +} + +function _check_country_wifi() { + [[ ! -f /media/fat/linux/wpa_supplicant.conf ]] && return + iniConfig "=" "" /media/fat/linux/wpa_supplicant.conf + iniGet "country" + if [[ -z "$ini_value" ]]; then + dialog --backtitle "$__backtitle" --infobox "You don't currently have your WiFi country set in /media/fat/linux/wpa_supplicant.conf\n\nPlease run 'Set Timezone'." 5 40 >/dev/tty2 + fi +} + +function gui_wifi() { + + _check_country_wifi + + local default + while true; do + local ip_current="$(getIPAddress)" + local ip_wlan="$(getIPAddress wlan0)" + local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Exit" --item-help --help-button --default-item "$default" --menu "Configure WiFi\nCurrent IP: ${ip_current:-(unknown)}\nWireless IP: ${ip_wlan:-(unknown)}\nWireless ESSID: $(iwgetid -r)" 22 76 16) + local options=( + 1 "Connect to WiFi network" + "1 Connect to your WiFi network" + 2 "Remove WiFi network" + "2 Remove WiFi network configuration(s)" + 3 "Enable WiFi" + "3 Enable WiFi network adapter" + 4 "Disable WiFi" + "4 Disable WiFi network adapter" + ) + + local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty2) + if [[ "${choice[@]:0:4}" == "HELP" ]]; then + choice="${choice[@]:5}" + default="${choice/%\ */}" + choice="${choice#* }" + printMsgs "dialog" "$choice" + continue + fi + default="$choice" + + if [[ -n "$choice" ]]; then + case "$choice" in + 1) + connect_wifi + ;; + 2) + remove_wifi + ;; + 3) + _set_interface_wifi up 2>/dev/null + ;; + 4) _set_interface_wifi down 2>/dev/null + ;; + esac + else + break + fi + done +} + +#show_wpa_supplicants +#sleep 10 +connect_wifi +#gui_wifi + +clear \ No newline at end of file