mirror of
https://github.com/MiSTer-devel/Scripts_MiSTer.git
synced 2026-04-19 03:05:34 +00:00
Wifi SSH (#124)
* Corrected dialog pipe redirection so script works properly in SSH and TTY sessions * Remove pointless sleep * Removed unused code * Use tab indentation instead of space (to save disk space) * Removed flickering while connecting to an access point and yet another pointless sleep command
This commit is contained in:
@@ -11,243 +11,148 @@
|
||||
|
||||
#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"
|
||||
|
||||
## @fn printMsgs()
|
||||
## @param type style of display to use - dialog, console or heading
|
||||
## @param message string or array of messages to display
|
||||
## @brief Prints messages in a variety of ways.
|
||||
function printMsgs() {
|
||||
local type="$1"
|
||||
shift
|
||||
if [[ "$__nodialog" == "1" && "$type" == "dialog" ]]; then
|
||||
type="console"
|
||||
fi
|
||||
for msg in "$@"; do
|
||||
[[ "$type" == "dialog" ]] && dialog --backtitle "$__backtitle" --cr-wrap --no-collapse --msgbox "$msg" 20 60 >/dev/tty2
|
||||
[[ "$type" == "console" ]] && echo -e "$msg"
|
||||
[[ "$type" == "heading" ]] && echo -e "\n= = = = = = = = = = = = = = = = = = = = =\n$msg\n= = = = = = = = = = = = = = = = = = = = =\n"
|
||||
done
|
||||
return 0
|
||||
local type="$1"
|
||||
shift
|
||||
if [[ "$__nodialog" == "1" && "$type" == "dialog" ]]; then
|
||||
type="console"
|
||||
fi
|
||||
for msg in "$@"; do
|
||||
[[ "$type" == "dialog" ]] && dialog --backtitle "$__backtitle" --cr-wrap --no-collapse --msgbox "$msg" 20 60 1>&2
|
||||
[[ "$type" == "console" ]] && echo -e "$msg"
|
||||
[[ "$type" == "heading" ]] && echo -e "\n= = = = = = = = = = = = = = = = = = = = =\n$msg\n= = = = = = = = = = = = = = = = = = = = =\n"
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
function _set_interface_wifi() {
|
||||
local state="$1"
|
||||
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'
|
||||
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 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_
|
||||
sed -i '/network={/,/}/d' "/media/fat/linux/wpa_supplicant.conf"
|
||||
}
|
||||
|
||||
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"
|
||||
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 connect_wifi() {
|
||||
if [[ ! -d "/sys/class/net/wlan0/" ]]; then
|
||||
printMsgs "dialog" "No wlan0 interface detected"
|
||||
return 1
|
||||
fi
|
||||
dialog --backtitle "$__backtitle" --infobox "\nSearching for WiFi networks......" 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 IFS= read -r essid; read type; do
|
||||
essids+=("${essid}")
|
||||
types+=("$type")
|
||||
options+=("$i" "${essid}")
|
||||
((i++))
|
||||
done < <(list_wifi)
|
||||
options+=("H" "Hidden ESSID")
|
||||
if [[ ! -d "/sys/class/net/wlan0/" ]]; then
|
||||
printMsgs "dialog" "No wlan0 interface detected"
|
||||
return 1
|
||||
fi
|
||||
dialog --backtitle "$__backtitle" --infobox "\nSearching for WiFi networks......" 5 40 1>&2
|
||||
local essids=()
|
||||
local essid
|
||||
local types=()
|
||||
local type
|
||||
local options=()
|
||||
i=0
|
||||
_set_interface_wifi up 2>/dev/null
|
||||
sleep 1
|
||||
while IFS= read -r 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 cmd=(dialog --backtitle "$__backtitle" --menu "Please choose the network you would like to connect to" 22 76 16)
|
||||
choice=$("${cmd[@]}" "${options[@]}" 3>&1 1>&2 2>&3)
|
||||
[[ -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
|
||||
local hidden=0
|
||||
if [[ "$choice" == "H" ]]; then
|
||||
cmd=(dialog --backtitle "$__backtitle" --inputbox "Please enter the ESSID" 10 60)
|
||||
essid=$("${cmd[@]}" 3>&1 1>&2 2>&3)
|
||||
[[ -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[@]}" 3>&1 1>&2 2>&3)
|
||||
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
|
||||
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[@]}" 3>&1 1>&2 2>&3) || 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
|
||||
create_config_wifi "$type" "$essid" "$key"
|
||||
gui_connect_wifi
|
||||
}
|
||||
|
||||
function create_config_wifi() {
|
||||
local type="$1"
|
||||
local essid="$2"
|
||||
local key="$3"
|
||||
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
|
||||
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"
|
||||
[[ $hidden -eq 1 ]] && wpa_config+="\tscan_ssid=1\n"
|
||||
|
||||
wpa_config=$(echo -e "$wpa_config")
|
||||
cat >> "/media/fat/linux/wpa_supplicant.conf" <<_EOF_
|
||||
wpa_config=$(echo -e "$wpa_config")
|
||||
cat >> "/media/fat/linux/wpa_supplicant.conf" <<_EOF_
|
||||
network={
|
||||
$wpa_config
|
||||
}
|
||||
@@ -255,92 +160,23 @@ _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
|
||||
# This workaround not applicable to MiSTer as it does not use SystemD
|
||||
# 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
|
||||
_set_interface_wifi down 2>/dev/null
|
||||
_set_interface_wifi up 2>/dev/null
|
||||
dialog --backtitle "$__backtitle" --infobox "\nConnecting ..." 5 40 1>&2
|
||||
local id=""
|
||||
i=0
|
||||
while [[ -z "$id" && $i -lt 30 ]]; do
|
||||
sleep 1
|
||||
id=$(iwgetid -r)
|
||||
((i++))
|
||||
done
|
||||
if [[ -z "$id" ]]; then
|
||||
printMsgs "dialog" "Unable to connect to network $essid"
|
||||
_set_interface_wifi down 2>/dev/null
|
||||
else
|
||||
printMsgs "dialog" "Successfully connected to network $essid"
|
||||
fi
|
||||
}
|
||||
|
||||
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)
|
||||
dialog --defaultno --yesno "This will remove the WiFi configuration and stop the WiFi.\n\nAre you sure you want to continue ?" 12 35 2>&1 >/dev/tty
|
||||
[[ $? -ne 0 ]] && continue
|
||||
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 5
|
||||
connect_wifi
|
||||
#gui_wifi
|
||||
|
||||
clear
|
||||
|
||||
Reference in New Issue
Block a user