@@ -284,13 +284,29 @@ set_timezone_and_locales() {
284284 done
285285 if [[ " ${response} " =~ ^(Y| y)$ ]]; then
286286
287+ # We could have multiple devices
288+ if (( $(grep - c . <<< "$WIFI_DEVICE ") > 1 )) ; then
289+ scanning=0
290+ while [[ ${scanning} -lt 3 ]]; do
291+ scanning=$(( scanning + 1 ))
292+ echo -e " \nMultiple wireless adaptors detected. Choose primary:\n"
293+ WIFI_DEVICES=($( printf ' %s\n' " ${WIFI_DEVICE[@]} " | sed ' s/^[ \t]*//' | sed ' s/"//g' | sed ' s/ESSID://' | awk ' BEGIN{FS=OFS=","} {$NF=++count OFS $NF} 1' ) )
294+ for str in ${WIFI_DEVICES[@]} ; do echo $str | sed " s/,/ \t /g" ; done
295+ echo " "
296+ read -r -p " Enter a number of wireles adaptor: " input
297+ if [[ " $input " =~ ^[0-9]{,2}$ && -n " $input " ]] ; then break ; fi
298+ done
299+ [[ -z $input ]] && input=1
300+ WIFI_DEVICE=$( echo ${WIFI_DEVICES[$input-1]} | cut -d" ," -f2)
301+ fi
302+
287303 # get list of wireless networks
288304 scanning=0
289305 broken=1
290306 while [[ ${scanning} -lt 3 ]]; do
291307 sleep 0.5
292308 scanning=$(( scanning + 1 ))
293- ARRAY=($( iwlist ${WIFI_DEVICE} scanning 2> /dev/null | egrep ' ESSID' | sed ' s/^[ \t]*//' | sed ' s/"//g' | sed ' s/ESSID://' | awk ' BEGIN{FS=OFS=","} {$NF=++count OFS $NF} 1' ) )
309+ ARRAY=($( iwlist ${WIFI_DEVICE} scanning 2> /dev/null | egrep ' ESSID' | sed ' s/^[ \t]*//' | sed ' s/"//g' | sed ' s/ESSID://' | sed ' /^$/d ' | sort | uniq | awk ' BEGIN{FS=OFS=","} {$NF=++count OFS $NF} 1' ) )
294310 if [[ $? == 0 ]]; then broken=0; break ; fi
295311 done
296312 # wifi can also fail
@@ -309,15 +325,15 @@ set_timezone_and_locales() {
309325 if [[ " $input " =~ ^[0-9]{,2}$ ]] ; then break ; fi
310326 done
311327 # get password
312- while [[ 1 ]] ; do
328+ while [[ -n " ${input} " ]] ; do
313329 SSID=$( echo ${ARRAY[$input-1]} | cut -d" ," -f2)
314330 echo " "
315331 read -r -p " Enter a password for ${SSID} : " password
316332 break
317333 done
318334
319335 # generate config
320- cat << - EOF > " ${SDCARD} " /etc/netplan/30-wifis-dhcp.yaml
336+ cat << - EOF > /etc/netplan/30-wifis-dhcp.yaml
321337 # Created by Armbian firstlogin script
322338 network:
323339 wifis:
@@ -333,14 +349,57 @@ set_timezone_and_locales() {
333349 # apply to netplan
334350 systemctl daemon-reload
335351 netplan apply --timeout 0 2> /dev/null
336- sleep 5
337352
338- # exit if connection is suffesful
339- if [[ -n $( iw " ${WIFI_DEVICE} " link 2> /dev/null | grep " $SSID " ) ]]; then broken=0; break ; fi
353+ # wireless link probing
354+ pinging=10
355+ broken=1
356+ WIRELESSLINK=" "
357+ echo " "
358+ while [[ ${pinging} -gt 1 && -n " ${input} " && -n " ${password} " ]]; do
359+ pinging=$(( pinging - 1 ))
360+ printf " \rProbing wireless link ($pinging )"
361+ WIRELESSLINK=$( iw " ${WIFI_DEVICE} " link 2> /dev/null | grep " $SSID " )
362+ sleep 2
363+ # exit if connection is suffesful
364+ if [[ " ${WIRELESSLINK} " == * $SSID * ]]; then
365+ broken=0
366+ break
367+ fi
368+ done
369+
370+ if [[ ${broken} == 1 ]]; then
371+ echo -e " \n\nWireless link was \x1B[91mnot detected\x1B[0m. Wrong password or weak signal."
372+ fi
373+ # get public IP probing
374+ broken=1
375+ pinging=10
376+
377+ while [[ ${pinging} -gt 1 && -n " ${input} " && -n " ${password} " && " ${WIRELESSLINK} " == * $SSID * ]]; do
378+ pinging=$(( pinging - 1 ))
379+ printf " \rProbing internet connection ($pinging )"
380+ PUBLIC_IP=$( curl --max-time 5 -s https://ipinfo.io/ip)
381+ if [[ -n " $PUBLIC_IP " ]]; then
382+ broken=0
383+ break
384+ else
385+ sleep 5
386+ fi
387+ done
388+ echo " "
389+
390+ if [[ ${broken} == 0 ]]; then
391+ break
392+ fi
340393 done
341- if [[ ${broken} == 1 ]]; then
342- echo -e " \n\x1B[91mUnable to connect to Access Point\x1B[0m.\n"
343- fi
394+
395+ if [[ ${broken} == 1 ]]; then
396+ echo -e " \n\x1B[91mUnable to connect to Access Point\x1B[0m.\n"
397+ rm -f /etc/netplan/30-wifis-dhcp.yaml
398+ netplan apply --timeout 0 2> /dev/null
399+ systemctl daemon-reload
400+ break
401+ fi
402+
344403 fi # detected or not detected wireless network
345404 fi
346405 echo " "
0 commit comments