[v2,2/3] fff-web: Label Freifunk routers individually in wifiscan.html

Submitted by Adrian Schmutzler on Oct. 19, 2017, 10:25 p.m.

Details

Message ID 1508451907-49231-2-git-send-email-freifunk@adrianschmutzler.de
State Superseded
Headers show

Commit Message

Adrian Schmutzler Oct. 19, 2017, 10:25 p.m.
This patch enables labelling of routers in the WebUI's WiFi
scan page, so their hostname is displayed instead of
freifunk.franken.net. The evaluation is performed based on
a WifiAnalyzer style node file /tmp/wifinodelist.

In the WebUI, this file may be provided by file upload or by
downloading from the Monitoring API (if the router has
internet access).

Changes in v2: none

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
---
 .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 91 ++++++++++++++++++++--
 1 file changed, 85 insertions(+), 6 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html
index 254c24b..29f99e5 100755
--- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html
+++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html
@@ -1,8 +1,61 @@ 
-#!/usr/bin/haserl
+#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=12000
 
+<%
+# treat post
+if [ "$REQUEST_METHOD" == "POST" ] ; then
+	if [ "$POST_wifiupload" != "" ] ; then
+		if [ ! -f "$HASERL_nodelist_path" ] ; then
+			MSG='<span class="red">Node-Datei nicht gefunden!</span>'
+		elif [ "$(du -k "$HASERL_nodelist_path" | cut -f1)" == "0" ] ; then
+			MSG='<span class="red">Node-Datei ist leer!</span>'
+		else
+			mv "$HASERL_nodelist_path" /tmp/wifinodelist
+			MSG='<span class="green">Upload erfolgreich!</span>'
+		fi
+	fi
+	if [ "$POST_wifidownload" != "" ] ; then
+		if [ ! -n "$POST_hood" ] ; then
+			MSG='<span class="red">Hood nicht angegeben!</span>'
+		else
+			if /bin/wget -T 10 -O /tmp/wifinodelist "https://monitoring.freifunk-franken.de/api/wifianal/$POST_hood" 2> /dev/null ; then
+				MSG='<span class="green">Download erfolgreich!</span>'
+			else
+				MSG='<span class="red">Download fehlgeschlagen!</span>'
+			fi
+		fi
+	fi
+fi
+%>
 <%in /www/ssl/cgi-bin/header %>
+<%in /www/ssl/cgi-bin/helpers %>
+<% show_msg %>
+<%
+if [ -s /tmp/wifinodelist ] ; then
+	numentries="$(grep -c '^[^#]' /tmp/wifinodelist)"
+	filehood="$(grep -e "#Hood:" /tmp/wifinodelist | awk -F" " '{print $2}')"
+	havelist="<span style='color:green'>Ja (Hood: ${filehood}, ${numentries} Einträge)</span>"
+else
+	havelist='<span style="color:red">Nein</span>'
+fi
+%>
 <table style="width: 100%">
 <tr><td>
+<form method="post" enctype="multipart/form-data">
+<fieldset>
+	<legend>Wifi Node File</legend>
+	<table>
+		<tr><th style="width: 20em;text-align:left;padding-bottom:10px">Alias Liste vorhanden:</th><td style="padding-bottom:10px"><%= "$havelist" %></td></tr>
+		<tr><th style="width: 20em;text-align:left">Upload Node-Liste:</th><td><input type="file" name="nodelist" /></td></tr>
+		<tr><td colspan="2" style="padding:10px 0">Hier kann eine Node-Liste (WiFiAnalyzer-Stil) hochgeladen werden.</td></tr>
+		<tr><td colspan="2"><input type="submit" name="wifiupload" value="Datei-Upload auf Router" /></td></tr>
+		<tr><td colspan="2" style="padding:10px 0">Wenn der Router mit dem Internet verbunden ist, kann die Node-Liste vom Monitoring bezogen werden:</td></tr>
+		<tr><th style="width: 20em;text-align:left">Name der Hood:</th><td><input type="text" name="hood" value="" /></td></tr>
+		<tr><td colspan="2" style="padding:10px 0"><input type="submit" name="wifidownload" value="Datei-Download von Monitoring" /></td></tr>
+	</table>
+</fieldset>
+</form>
+</td></tr>
+<tr><td>
 <fieldset>
 	<legend>Wifi Scan</legend>
 	<table class="wifitable">
@@ -16,11 +69,37 @@ 
 		</tr>
 
 <%
-iwinfo w2mesh scan |\
-	awk -v RS='' \
-	'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
-	"<!-- \\5 --><tr><td>\\2</td><td>\\4</td><td>\\5 dBm</td><td>\\3</td><td>\\1</td><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#'
-	# The HTML comment contains the signal quality to allow sorting
+if [ -s /tmp/wifinodelist ] ; then
+	firststep=$(iwinfo w2mesh scan |\
+		awk -v RS='' \
+		'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
+		"<!-- \\5 --><tr><ssid>\\2</ssid><td>\\4</td><td>\\5 dBm</td><td>\\3</td><mac>\\1</mac><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#')
+		# The HTML comment contains the signal quality to allow sorting
+
+	echo "$firststep" | while read line ; do
+		mac="$(echo "$line" | sed -e 's#.*<mac>\(.*\)</mac>.*#\1#')"
+		routerid="$(grep -i -e "$mac" /tmp/wifinodelist | awk -F"|" '{print $2}')"
+		if [ -n "$routerid" ] ; then
+			ssid="<span style='color:green'>${routerid}</span>"
+		else
+			ssidtmp="$(echo "$line" | sed -e 's#.*<ssid>\(.*\)</ssid>.*#\1#')"
+			if [ "$ssidtmp" = "unknown" ] ; then
+				ssid="<span style='color:blue'>${ssidtmp}</span>"
+			else
+				ssid="$ssidtmp"
+			fi
+		fi
+		midpart=$(echo "$line" | sed -e 's#.*</ssid>\(.*\)<mac>.*#\1#')
+		endpart=$(echo "$line" | sed -e 's#.*</mac>\(.*\)</tr>.*#\1#')
+		echo "<tr><td>${ssid}</td>${midpart}<td>${mac}</td>${endpart}</tr>"
+	done
+else
+	iwinfo w2mesh scan |\
+		awk -v RS='' \
+		'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
+		"<!-- \\5 --><tr><td>\\2</td><td>\\4</td><td>\\5 dBm</td><td>\\3</td><td>\\1</td><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#'
+		# The HTML comment contains the signal quality to allow sorting
+fi
 %>
 	</table>
 </fieldset>

Comments

Tim Niemeyer Nov. 4, 2017, 2:32 p.m.
Hi

Am Freitag, den 20.10.2017, 00:25 +0200 schrieb Adrian Schmutzler:
> This patch enables labelling of routers in the WebUI's WiFi
> scan page, so their hostname is displayed instead of
> freifunk.franken.net. The evaluation is performed based on
> a WifiAnalyzer style node file /tmp/wifinodelist.
> 
> In the WebUI, this file may be provided by file upload or by
> downloading from the Monitoring API (if the router has
> internet access).
> 
> Changes in v2: none
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 91
> ++++++++++++++++++++--
>  1 file changed, 85 insertions(+), 6 deletions(-)
> 
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-
> bin/wifiscan.html b/src/packages/fff/fff-web/files/www/ssl/cgi-
> bin/wifiscan.html
> index 254c24b..29f99e5 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/wifiscan.html
> @@ -1,8 +1,61 @@
> -#!/usr/bin/haserl
> +#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=12000
Können bei dem upload-dir wichtige Status-Files etc überschrieben
werden? Sollte ein extra Verzeichnis gewählt werden?

Vielleicht mit sowas: mktemp -d, vielleicht geht auch -u (für den Fall,
dass gar nicht hochgeladen wurde).

> +<%
> +# treat post
> +if [ "$REQUEST_METHOD" == "POST" ] ; then
> > +	if [ "$POST_wifiupload" != "" ] ; then
> > +		if [ ! -f "$HASERL_nodelist_path" ] ; then
> > +			MSG='<span class="red">Node-Datei nicht gefunden!</span>'
> > +		elif [ "$(du -k "$HASERL_nodelist_path" | cut -f1)" == "0" ] ; then
> > +			MSG='<span class="red">Node-Datei ist leer!</span>'
> > +		else
> > +			mv "$HASERL_nodelist_path" /tmp/wifinodelist
> > +			MSG='<span class="green">Upload erfolgreich!</span>'
> > +		fi
> > +	fi
> > +	if [ "$POST_wifidownload" != "" ] ; then
> +		if [ ! -n "$POST_hood" ] ; then
Vielleicht direkt aus dem Hoodfile laden?

> +			MSG='<span class="red">Hood nicht angegeben!</span>'
> > +		else
> +			if /bin/wget -T 10 -O /tmp/wifinodelist "https://monitoring.freifunk-franken.de/api/wifianal/$POST_hood" 2> /dev/null ; then
Wenn wir das monitoring endlich per v6 im Freifunk erreichbar haben,
sollte da eigentlich jeder Knoten drauf zugreifen können.. :-)

> +				MSG='<span class="green">Download erfolgreich!</span>'
> > +			else
> > +				MSG='<span class="red">Download fehlgeschlagen!</span>'
> > +			fi
> > +		fi
> > +	fi
> +fi
> +%>
>  <%in /www/ssl/cgi-bin/header %>
> +<%in /www/ssl/cgi-bin/helpers %>
> +<% show_msg %>
> +<%
> +if [ -s /tmp/wifinodelist ] ; then
> > +	numentries="$(grep -c '^[^#]' /tmp/wifinodelist)"
> > +	filehood="$(grep -e "#Hood:" /tmp/wifinodelist | awk -F" " '{print $2}')"
> > +	havelist="<span style='color:green'>Ja (Hood: ${filehood}, ${numentries} Einträge)</span>"
> +else
> > +	havelist='<span style="color:red">Nein</span>'
> +fi
> +%>
>  <table style="width: 100%">
>  <tr><td>
> +<form method="post" enctype="multipart/form-data">
> +<fieldset>
> > +	<legend>Wifi Node File</legend>
> > +	<table>
> > +		<tr><th style="width: 20em;text-align:left;padding-bottom:10px">Alias Liste vorhanden:</th><td style="padding-bottom:10px"><%= "$havelist" %></td></tr>
> > +		<tr><th style="width: 20em;text-align:left">Upload Node-Liste:</th><td><input type="file" name="nodelist" /></td></tr>
> > +		<tr><td colspan="2" style="padding:10px 0">Hier kann eine Node-Liste (WiFiAnalyzer-Stil) hochgeladen werden.</td></tr>
> > +		<tr><td colspan="2"><input type="submit" name="wifiupload" value="Datei-Upload auf Router" /></td></tr>
> > +		<tr><td colspan="2" style="padding:10px 0">Wenn der Router mit dem Internet verbunden ist, kann die Node-Liste vom Monitoring bezogen werden:</td></tr>
> > +		<tr><th style="width: 20em;text-align:left">Name der Hood:</th><td><input type="text" name="hood" value="" /></td></tr>
> > +		<tr><td colspan="2" style="padding:10px 0"><input type="submit" name="wifidownload" value="Datei-Download von Monitoring" /></td></tr>
> > +	</table>
> +</fieldset>
> +</form>
> +</td></tr>
> +<tr><td>
>  <fieldset>
> >  	<legend>Wifi Scan</legend>
> >  	<table class="wifitable">
> @@ -16,11 +69,37 @@
> >  		</tr>
>  
>  <%
> -iwinfo w2mesh scan |\
> > -	awk -v RS='' \
> > -	'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
> > -	"<!-- \\5 --><tr><td>\\2</td><td>\\4</td><td>\\5 dBm</td><td>\\3</td><td>\\1</td><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#'
> > -	# The HTML comment contains the signal quality to allow sorting
> +if [ -s /tmp/wifinodelist ] ; then
> > +	firststep=$(iwinfo w2mesh scan |\
> > +		awk -v RS='' \
> > +		'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
> > +		"<!-- \\5 --><tr><ssid>\\2</ssid><td>\\4</td><td>\\5 dBm</td><td>\\3</td><mac>\\1</mac><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#')
> +		# The HTML comment contains the signal quality to allow sorting
Die Zuweisung von firststep kann man vor der If-Abfrage machen.

> +
> > +	echo "$firststep" | while read line ; do
> > +		mac="$(echo "$line" | sed -e 's#.*<mac>\(.*\)</mac>.*#\1#')"
> > +		routerid="$(grep -i -e "$mac" /tmp/wifinodelist | awk -F"|" '{print $2}')"
> > +		if [ -n "$routerid" ] ; then
> > +			ssid="<span style='color:green'>${routerid}</span>"
> > +		else
> > +			ssidtmp="$(echo "$line" | sed -e 's#.*<ssid>\(.*\)</ssid>.*#\1#')"
> > +			if [ "$ssidtmp" = "unknown" ] ; then
> > +				ssid="<span style='color:blue'>${ssidtmp}</span>"
> > +			else
> > +				ssid="$ssidtmp"
> > +			fi
> > +		fi
> > +		midpart=$(echo "$line" | sed -e 's#.*</ssid>\(.*\)<mac>.*#\1#')
> > +		endpart=$(echo "$line" | sed -e 's#.*</mac>\(.*\)</tr>.*#\1#')
> +		echo "<tr><td>${ssid}</td>${midpart}<td>${mac}</td>${endpart}</tr>"
Irgendwie wirkt der ganze Abschnitt von hinten durchs Knie.. Erst wird
alles kompliziert geparsed und in HTML gebracht. Dann schnibbelst du
das ganze html wieder auseinader, um am Ende teile davon dann doch
wieder dran zu kleben .. uff .. Naja. Es ist eine Lösung, ich könnte
damit leben, aber wirklich schön ist das nicht.

Vielleicht kann man das Zeug aus firststep irgendwie in ein
Übergangsformat bringen? Vielleicht sogar einfach eine Funktion
aufrufen oder so..


> +	done
> +else
+	iwinfo w2mesh scan |\
> > +		awk -v RS='' \
> > +		'{r = gensub(/.*Address: ([0-9A-F:]*)?.*ESSID: "?(unknown|[^"]*)"?[ ]*\n.*Mode: ([^ ]*).*Channel: ([0-9]*).*Signal: (-[0-9]*) dBm.*Encryption: ([^"]*).*/, \
> > +		"<!-- \\5 --><tr><td>\\2</td><td>\\4</td><td>\\5 dBm</td><td>\\3</td><td>\\1</td><td>\\6</td></tr>", "g"); print r;}' | sort -n | sed 's#&#\&amp;#'
> +		# The HTML comment contains the signal quality to allow sorting
Man kann hier einfach "echo $firststep" machen.

Tim
> +fi
>  %>
> >  	</table>
>  </fieldset>
> -- 
> 2.7.4
>