From 6492929668ffda2ea3a7074d0a4336c3c05069bd Mon Sep 17 00:00:00 2001 From: Markus Zehnder Date: Mon, 14 Oct 2019 10:07:26 +0200 Subject: [PATCH 1/4] Improved WiFi setup, handle SSIDs with spaces - attempted fixes for 'network scan failed' errors: - make sure directory exists to create wpa_supplicant-wlan0.conf - force wlan0 interface in network scan - wait 3s after initiating network scan before retrieving result - make sure directories /mnt/boot exist for wifi-copy-config to work - suppress error messages when trying to delete inexistent files - use tab delimiter to parse wpa_cli scan_results - properly escape wifi_network_setup.sh call from php --- .gitignore | 6 +++++ .../usr/bin/yio-remote/app-launch.sh | 1 + .../yio-remote/first-time-setup/firstrun.sh | 4 +-- .../first-time-setup/wifi_network_setup.sh | 13 ++++------ .../usr/bin/yio-remote/reset-wifi.sh | 14 +++++------ .../usr/bin/yio-remote/wifi-copy-config.sh | 1 + .../usr/bin/yio-remote/wifi_network_create.sh | 10 +++----- .../usr/bin/yio-remote/wifi_network_list.sh | 25 ++++++++----------- .../usr/bin/yio-remote/www/setup/wifi.php | 2 +- 9 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index dfb9330bdd2c..bd7070fff38f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,9 @@ *.pyc board/yio-remote/rpi0/rootfs_overlay/etc/wpa_supplicant/wpa_supplicant-wlan0.conf configs/yio-remote-defconfig.old +### OSX ### +.DS_Store +# Thumbnails +._* +### Linux ### +*~ diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/app-launch.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/app-launch.sh index 8289095c2b68..100391039296 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/app-launch.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/app-launch.sh @@ -1,4 +1,5 @@ #!/bin/bash +mkdir -p /mnt/boot mount /dev/mmcblk0p1 /mnt/boot /usr/bin/yio-remote/wifi-copy-config.sh diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh index 2504698fa870..a710b55f7f32 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh @@ -31,7 +31,7 @@ then # setup hostname #-------------------- echo "$SSID" > /etc/hostname - rm /etc/hosts + rm -f /etc/hosts echo "127.0.0.1 localhost #127.0.0.1 $SSID" >> /etc/hosts hostnamectl set-hostname "$SSID" @@ -59,7 +59,7 @@ then #-------------------- # set static IP address #-------------------- - rm /etc/systemd/network/20-wireless.network + rm -f /etc/systemd/network/20-wireless.network echo "[Match]" > /etc/systemd/network/20-wireless.network echo "Name=wlan0" >> /etc/systemd/network/20-wireless.network echo "" >> /etc/systemd/network/20-wireless.network diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh index b3302f4adb36..e071712f492d 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh @@ -3,10 +3,8 @@ #-------------------- # Create WPA supplicant file #-------------------- -# delete existing configuration file -rm -rf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf - -# create a configuration file +# (re-)create a configuration file +mkdir -p /etc/wpa_supplicant echo "ctrl_interface=/var/run/wpa_supplicant ap_scan=1 @@ -14,7 +12,7 @@ network={ key_mgmt=WPA-PSK ssid="\"$1\"" psk="\"$2\"" -}" >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf +}" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf echo "{\"ssid\":\"$1\",\"password\":\"$2\"," > /wificred echo "$1" > /ssid @@ -32,12 +30,11 @@ killall -9 dnsmasq #-------------------- # set dynamic IP address #-------------------- -rm /etc/systemd/network/20-wireless.network echo "[Match] Name=wlan0 [Network] -DHCP=yes" >> /etc/systemd/network/20-wireless.network +DHCP=yes" > /etc/systemd/network/20-wireless.network #systemctl daemon-reload systemctl restart systemd-networkd @@ -58,5 +55,5 @@ sleep 1 #cp /etc/lighttpd/lighttpd-config.conf /etc/lighttpd/lighttpd.conf #systemctl restart lighttpd.service -rm /wifisetup +rm -f /wifisetup touch /firstsetup diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/reset-wifi.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/reset-wifi.sh index b39f9d808f24..7313f93e4896 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/reset-wifi.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/reset-wifi.sh @@ -1,14 +1,14 @@ #!/bin/bash -rm /networklist -rm /ssid -rm /firstsetup -rm /wificred +rm -f /networklist +rm -f /ssid +rm -f /firstsetup +rm -f /wificred touch /wifisetup -# create a configuration file -rm /etc/wpa_supplicant/wpa_supplicant-wlan0.conf +# reset configuration file +mkdir -p /etc/wpa_supplicant echo "ctrl_interface=/var/run/wpa_supplicant -ap_scan=1" >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf +ap_scan=1" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf #systemctl daemon-reload systemctl restart systemd-networkd diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi-copy-config.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi-copy-config.sh index 1a886fe8a66d..b9393ce1b37e 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi-copy-config.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi-copy-config.sh @@ -5,6 +5,7 @@ then systemctl stop wpa_supplicant@wlan0.service sleep 5 # copy config file + mkdir -p /etc/wpa_supplicant cp /mnt/boot/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf sleep 5 # restart wifi diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_create.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_create.sh index a140a7b524f1..2547f3f9095d 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_create.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_create.sh @@ -1,12 +1,10 @@ #!/bin/bash #check if there is a file +mkdir -p /etc/wpa_supplicant if [ -e /etc/wpa_supplicant/wpa_supplicant-wlan0.conf ]; then - # delete existing configuration file - rm -rf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf - - # create a configuration file + # re-create a configuration file echo "ctrl_interface=/var/run/wpa_supplicant ap_scan=1 @@ -14,7 +12,7 @@ network={ key_mgmt=WPA-PSK ssid="\"$1\"" psk="\"$2\"" -}" >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf +}" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf else # create a configuration file echo "ctrl_interface=/var/run/wpa_supplicant @@ -24,5 +22,5 @@ network={ key_mgmt=WPA-PSK ssid="\"$1\"" psk="\"$2\"" -}" >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf +}" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf fi \ No newline at end of file diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh index 9ebf423c0ef9..49f49d9d78bd 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh @@ -1,19 +1,16 @@ #!/bin/bash -i=0 +# +# Called from firstrun.sh if: +# - /wifisetup marker file present +# - and /wificopy marker file doesn't exist +# Output is appended to /networklist +# -wpa_cli scan | grep 'OK' &> /dev/null +wpa_cli -i wlan0 scan | grep 'OK' &> /dev/null if [ $? == 0 ]; then - # echo 'OK' - wpa_cli scan_results | - while IFS= read -r line - do - if [ "$i" -gt "1" ]; then - echo $line | awk '{ print $3, $5 }' | tr ' ' , - # echo $line | awk '{ print $5; }' - fi - i=$((i+1)) - done -else + sleep 3 + wpa_cli -i wlan0 scan_results | tail -n +2 | awk -v OFS=',' 'BEGIN {FS="\t"}; { print $3, substr($0, index($0,$5)) }' +else echo 'Scan failed' -fi +fi \ No newline at end of file diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/wifi.php b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/wifi.php index 7914d00de6be..16a181436950 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/wifi.php +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/wifi.php @@ -2,7 +2,7 @@ $ssid = $_POST['ssid']; $password = $_POST['password']; echo "Connecting"; -exec("/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh $ssid $password"); +exec("/usr/bin/yio-remote/first-time-setup/wifi_network_setup.sh ".escapeshellarg($ssid)." ".escapeshellarg($password)); ?> From c8fdf63f9b47cc9a58da3ed111cce9c4d68bb2b4 Mon Sep 17 00:00:00 2001 From: Markus Zehnder Date: Mon, 14 Oct 2019 10:07:40 +0200 Subject: [PATCH 2/4] Rewrote WiFi scanning with iw scan output parsing - `wpa_cli -i wlan0 scan` didn't work at initial boot - `iw wlan0 scan` always works --- .../yio-remote/first-time-setup/firstrun.sh | 3 +- .../usr/bin/yio-remote/wifi_network_list.awk | 31 +++++++++++++++++++ .../usr/bin/yio-remote/wifi_network_list.sh | 23 +++++++------- 3 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.awk mode change 100755 => 100644 board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh index a710b55f7f32..7be189c4287a 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/first-time-setup/firstrun.sh @@ -54,12 +54,11 @@ then # scan for nearby wifis #-------------------- iw dev wlan0 scan >> /dev/null - /usr/bin/yio-remote/wifi_network_list.sh >> /networklist + /usr/bin/yio-remote/wifi_network_list.sh > /networklist #-------------------- # set static IP address #-------------------- - rm -f /etc/systemd/network/20-wireless.network echo "[Match]" > /etc/systemd/network/20-wireless.network echo "Name=wlan0" >> /etc/systemd/network/20-wireless.network echo "" >> /etc/systemd/network/20-wireless.network diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.awk b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.awk new file mode 100644 index 000000000000..9098183867b0 --- /dev/null +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.awk @@ -0,0 +1,31 @@ +# BusyBox compatible awk parsing of 'iw wlan0 scan' output +# Inspired by: https://gist.github.com/elecnix/182fa522da5dc7389975 +# Returns rows of , values +#BEGIN { +# # table header +# printf("%s,%s\n","signal","SSID"); +#} +NF > 0{ + if ($1 == "BSS" && $2 ~ /^[a-z0-9:]{17}\(?/) { + if( e["MAC"] ){ + # new block: print result from last block + printf("%s,%s\n",e["sig"],e["SSID"]); + } + e["MAC"] = $2; + } + if ($1 == "SSID:") { + # $2 might not contain the full SSID name if it has an awk separator char in it's name! + e["SSID"] = substr($0, index($0,$2)); + } + if ($1 == "freq:") { + e["freq"] = $NF; + } + if ($1 == "signal:") { + e["sig"] = $2; + e["sig%"] = (60 - ((-$2) - 40)) * 100 / 60; + } +} +END { + # final block + printf("%s,%s\n",e["sig"],e["SSID"]); +} \ No newline at end of file diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh old mode 100755 new mode 100644 index 49f49d9d78bd..4425a295597b --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh @@ -1,16 +1,17 @@ #!/bin/bash -# +# ----------------------------------------------------------------------------- +# Returns a list of WiFi networks. +# Format: , +# Example: +# -35.00,Guest Network +# -61.00,Unifi +# -75.00,DIRECT-gL-BRAVIA +# ----------------------------------------------------------------------------- # Called from firstrun.sh if: # - /wifisetup marker file present # - and /wificopy marker file doesn't exist -# Output is appended to /networklist -# +# Output is written to /networklist +# ----------------------------------------------------------------------------- -wpa_cli -i wlan0 scan | grep 'OK' &> /dev/null - -if [ $? == 0 ]; then - sleep 3 - wpa_cli -i wlan0 scan_results | tail -n +2 | awk -v OFS=',' 'BEGIN {FS="\t"}; { print $3, substr($0, index($0,$5)) }' -else - echo 'Scan failed' -fi \ No newline at end of file +# 'iw wlan0 scan' should always work, whereas 'wpa_cli -i wlan0 scan' is a pain to work with +iw wlan0 scan | awk -f /usr/bin/yio-remote/wifi_network_list.awk From 59e776929d0a7a8584199fc3d20992db76250966 Mon Sep 17 00:00:00 2001 From: Markus Zehnder Date: Mon, 14 Oct 2019 09:55:33 +0200 Subject: [PATCH 3/4] Fixed typo, added TODOs --- README-YIO.md | 48 +++++++++++++++++++ .../usr/bin/yio-remote/www/setup/index.php | 4 +- .../usr/bin/yio-remote/www/setup/success.html | 5 +- 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 README-YIO.md diff --git a/README-YIO.md b/README-YIO.md new file mode 100644 index 000000000000..2133af30152b --- /dev/null +++ b/README-YIO.md @@ -0,0 +1,48 @@ +# YIO remote buildroot + +## Build + +### Prepare Build Environment + +1. Prepare Ubuntu for buildroot: + + sudo apt-get install bison g++ flex gettext texinfo patch git-core libtool autoconf build-essential libncurses5-dev python unzip + +1. Checkout sources: + + SRC_DIR=~/projects/yio + + mkdir -p ${SRC_DIR} + cd ${SRC_DIR} + git clone https://github.com/YIO-Remote/buildroot.git + +1. Retrieve matching Raspberry Pi kernel sources: + + RPI_KERNEL_VERSION=1.20180417-1 + + mkdir -p ${SRC_DIR}/buildroot/linux_kernel + cd ${SRC_DIR}/buildroot/linux_kernel + wget -O - https://github.com/raspberrypi/linux/archive/raspberrypi-kernel_${RPI_KERNEL_VERSION}.tar.gz | gunzip -c > linux-raspberrypi-kernel_${RPI_KERNEL_VERSION}.tar + +### Build SD Card Image + +1. Set configuration for YIO: + + cd ${SRC_DIR}/buildroot + make defconfig BR2_DEFCONFIG=buildroot_config + +1. Build: + + make + +## TODO + +- [x] Fix WiFi setup + - [x] Handle SSIDs with spaces (e.g. "IoT Net") + - [x] Network scanning fails after initial boot +- [ ] Create dedicated project for YIO and pull in buildroot release +- [ ] Development (runtime) flag + - [ ] Log messages (Rsyslog?) + - [ ] USB gadget drivers (UART, ethernet) for easier remote access +- [ ] Create dedicated project for webserver & shell scripts. + Buildroot should only pull in releases. diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/index.php b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/index.php index d5ff5188589e..bc44bb914390 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/index.php +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/index.php @@ -102,7 +102,7 @@ function customWifi() { } ?>
-

Joint other network...

+

Join other network...

@@ -143,6 +143,8 @@ function customWifi() { document.getElementById('timezonetext').innerHTML = Intl.DateTimeFormat().resolvedOptions().timeZone // get current time + // TODO use date format functions instead of manual formatting + // TODO use current locale and timezone in dateTime format var today = new Date(); var time = today.getHours() + ":" + today.getMinutes(); document.getElementById('currenttime').innerHTML = time; diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/success.html b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/success.html index d5ff5188589e..9f7f567bbb09 100755 --- a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/success.html +++ b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/www/setup/success.html @@ -87,6 +87,7 @@

-

Joint other network...

+

Join other network...

@@ -143,6 +144,8 @@ document.getElementById('timezonetext').innerHTML = Intl.DateTimeFormat().resolvedOptions().timeZone // get current time + // TODO use date format functions instead of manual formatting + // TODO use current locale and timezone in dateTime format var today = new Date(); var time = today.getHours() + ":" + today.getMinutes(); document.getElementById('currenttime').innerHTML = time; From 6e32d4ae820c06efc358a4bd9285ab6ce966aa8a Mon Sep 17 00:00:00 2001 From: Markus Zehnder Date: Mon, 14 Oct 2019 18:55:23 +0200 Subject: [PATCH 4/4] fixup! Rewrote WiFi scanning with iw scan output parsing --- .../rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh diff --git a/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh b/board/yio-remote/rpi0/rootfs_overlay/usr/bin/yio-remote/wifi_network_list.sh old mode 100644 new mode 100755