[v3,4/4] fff-web: Label Freifunk routers individually in wifiscan.html

Submitted by Adrian Schmutzler on Nov. 26, 2017, 1:01 p.m.

Details

Message ID 1511701300-3004-4-git-send-email-freifunk@adrianschmutzler.de
State Rejected
Headers show

Commit Message

Adrian Schmutzler Nov. 26, 2017, 1:01 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).

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

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

---

Changes in v2:
none

Changes in v3:
- Put to the end of the patchset
- Use wifianalall API (hood-independent) as this is now available
  and eves the file for all hoods has only < 200 kB
- Reduced upload file size to 1MB
---
 .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 79 +++++++++++++++++++++-
 1 file changed, 77 insertions(+), 2 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 f9186d2..320019b 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,7 +1,40 @@ 
-#!/usr/bin/haserl
+#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=1000
 
+<%
+# 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 /bin/wget -T 10 -O /tmp/wifinodelist "https://monitoring.freifunk-franken.de/api/wifianalall" 2> /dev/null ; then
+			MSG='<span class="green">Download erfolgreich!</span>'
+		else
+			MSG='<span class="red">Download fehlgeschlagen!</span>'
+		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}')"
+	[ -n "$filehood" ] || filehood="Alle Hoods"
+	havelist="<span style='color:green'>Ja (Hood: ${filehood}, ${numentries} Einträge)</span>"
+else
+	havelist='<span style="color:red">Nein</span>'
+fi
+
 readIWinfo() {
 	local iface=$1
 	local ssid=$2
@@ -13,6 +46,28 @@  readIWinfo() {
 		"<!-- \\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
 }
+
+rewriteIWinfo() {
+	local data="$1"
+
+	echo "$data" | 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
+}
 printWifiScan() {
 	local iface=$1
 	local freq="2.4 GHz"
@@ -34,7 +89,12 @@  printWifiScan() {
 			</tr>
 
 <%
-	readIWinfo "$iface" "td" "td"
+	if [ -s /tmp/wifinodelist ] ; then
+		firststep="$(readIWinfo "$iface" "ssid" "mac")"
+		rewriteIWinfo "$firststep"
+	else
+		readIWinfo "$iface" "td" "td"
+	fi
 %>
 		</table>
 	</fieldset>
@@ -44,6 +104,21 @@  printWifiScan() {
 
 %>
 <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-top:20px">Wenn der Router mit dem Internet verbunden ist, kann die Node-Liste vom Monitoring bezogen werden.</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>
 <%
 if uci -q get wireless.w2ap > /dev/null ; then
 	printWifiScan "w2ap"

Comments

Tim Niemeyer Jan. 20, 2018, 11:43 a.m.
Am Sonntag, den 26.11.2017, 14:01 +0100 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).
> 
> > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> > Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> ---
> 
> Changes in v2:
> none
> 
> Changes in v3:
> - Put to the end of the patchset
> - Use wifianalall API (hood-independent) as this is now available
>   and eves the file for all hoods has only < 200 kB
Was meinst du mit "eves"?

Skaliert das mit allen Knoten überhaupt?

> - Reduced upload file size to 1MB
> ---
>  .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 79 +++++++++++++++++++++-
>  1 file changed, 77 insertions(+), 2 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 f9186d2..320019b 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,7 +1,40 @@
> -#!/usr/bin/haserl
> +#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=1000
Ich sehe hier immer noch ein Sicherheitsrisiko!

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 /bin/wget -T 10 -O /tmp/wifinodelist "https://monitoring.freifunk-franken.de/api/wifianalall" 2> /dev/null ; then
> > +			MSG='<span class="green">Download erfolgreich!</span>'
> > +		else
> > +			MSG='<span class="red">Download fehlgeschlagen!</span>'
> > +		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}')"
> +	[ -n "$filehood" ] || filehood="Alle Hoods"
Achso, die Unterscheidung ist noch nötig, falls jemand eine Liste für
nur eine Hood manuell hochgeladen hat..

> +	havelist="<span style='color:green'>Ja (Hood: ${filehood}, ${numentries} Einträge)</span>"
> +else
> > +	havelist='<span style="color:red">Nein</span>'
> +fi
> +
>  readIWinfo() {
> >  	local iface=$1
> >  	local ssid=$2
> @@ -13,6 +46,28 @@ readIWinfo() {
> >  		"<!-- \\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
>  }
> +
> +rewriteIWinfo() {
> > +	local data="$1"
> +
> > +	echo "$data" | 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
> +}
>  printWifiScan() {
> >  	local iface=$1
> >  	local freq="2.4 GHz"
> @@ -34,7 +89,12 @@ printWifiScan() {
> >  			</tr>
>  
>  <%
> > -	readIWinfo "$iface" "td" "td"
> > +	if [ -s /tmp/wifinodelist ] ; then
> > +		firststep="$(readIWinfo "$iface" "ssid" "mac")"
> +		rewriteIWinfo "$firststep"
Ich hab hier ein bisschen Angst, dass ggfs die Command-Line zu lang
werden könnte.

Tim

> +	else
> > +		readIWinfo "$iface" "td" "td"
> > +	fi
>  %>
> >  		</table>
> >  	</fieldset>
> @@ -44,6 +104,21 @@ printWifiScan() {
>  
>  %>
>  <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-top:20px">Wenn der Router mit dem Internet verbunden ist, kann die Node-Liste vom Monitoring bezogen werden.</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>
>  <%
>  if uci -q get wireless.w2ap > /dev/null ; then
> >  	printWifiScan "w2ap"
> -- 
> 2.7.4
>
Adrian Schmutzler Jan. 20, 2018, 10:17 p.m.
Hallo Tim,

siehe unten.

> -----Original Message-----
> From: Tim Niemeyer [mailto:tim@tn-x.org]
> Sent: Samstag, 20. Januar 2018 12:43
> To: Adrian Schmutzler <freifunk@adrianschmutzler.de>; franken-
> dev@freifunk.net
> Subject: Re: [PATCH v3 4/4] fff-web: Label Freifunk routers individually in
> wifiscan.html
> 
> Am Sonntag, den 26.11.2017, 14:01 +0100 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).
> >
> > > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> >
> > > Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> >
> > ---
> >
> > Changes in v2:
> > none
> >
> > Changes in v3:
> > - Put to the end of the patchset
> > - Use wifianalall API (hood-independent) as this is now available
> >   and eves the file for all hoods has only < 200 kB
> Was meinst du mit "eves"?

Typo: "even"

> 
> Skaliert das mit allen Knoten überhaupt?

Die Frage verstehe ich nicht. Hat im Test wunderbar geklappt.

> 
> > - Reduced upload file size to 1MB
> > ---
> >  .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 79
> > +++++++++++++++++++++-
> >  1 file changed, 77 insertions(+), 2 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 f9186d2..320019b 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,7 +1,40 @@
> > -#!/usr/bin/haserl
> > +#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=1000
> Ich sehe hier immer noch ein Sicherheitsrisiko!
> 
> 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).

Ich habe das so verstanden, dass haserl da eh einen random Namen generiert:

http://haserl.sourceforge.net/manpage.html

--upload-dir=dirspec  Defaults to "/tmp". All uploaded files are created with temporary filename in this directory HASERL_xxx_path contains the name of the temporary file. FORM_xxx_name contains the original name of the file, as specified by the client.

Ist nicht ganz eindeutig. Ggf. teste ich mal, was für Namen der so macht, kann die ja ausgeben lassen. Ich verstehe das so, dass der sowas wie mktemp ohnehin intrinsisch macht. Oder habe ich falsch verstanden, worum es dir geht?

> 
> > +<%
> > +# 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 /bin/wget -T 10 -O /tmp/wifinodelist
> "https://monitoring.freifunk-franken.de/api/wifianalall" 2> /dev/null ; then
> > > +			MSG='<span class="green">Download
> erfolgreich!</span>'
> > > +		else
> > > +			MSG='<span class="red">Download
> fehlgeschlagen!</span>'
> > > +		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}')"
> > +	[ -n "$filehood" ] || filehood="Alle Hoods"
> Achso, die Unterscheidung ist noch nötig, falls jemand eine Liste für nur eine
> Hood manuell hochgeladen hat..

Genau. Im Monitoring bleibt beides.

> 
> > +	havelist="<span style='color:green'>Ja (Hood: ${filehood},
> ${numentries} Einträge)</span>"
> > +else
> > > +	havelist='<span style="color:red">Nein</span>'
> > +fi
> > +
> >  readIWinfo() {
> > >  	local iface=$1
> > >  	local ssid=$2
> > @@ -13,6 +46,28 @@ readIWinfo() {
> > >  		"<!-- \\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
> >  }
> > +
> > +rewriteIWinfo() {
> > > +	local data="$1"
> > +
> > > +	echo "$data" | 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
> > +}
> >  printWifiScan() {
> > >  	local iface=$1
> > >  	local freq="2.4 GHz"
> > @@ -34,7 +89,12 @@ printWifiScan() {
> > >  			</tr>
> >
> >  <%
> > > -	readIWinfo "$iface" "td" "td"
> > > +	if [ -s /tmp/wifinodelist ] ; then
> > > +		firststep="$(readIWinfo "$iface" "ssid" "mac")"
> > +		rewriteIWinfo "$firststep"
> Ich hab hier ein bisschen Angst, dass ggfs die Command-Line zu lang werden
> könnte.

Was sind da die Limits? In meinem sehr vollen Netz war das nie ein Problem, aber das muss ja nichts heißen.

Hast du eine bessere Idee?

Grüße

Adrian

> 
> Tim
> 
> > +	else
> > > +		readIWinfo "$iface" "td" "td"
> > > +	fi
> >  %>
> > >  		</table>
> > >  	</fieldset>
> > @@ -44,6 +104,21 @@ printWifiScan() {
> >
> >  %>
> >  <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-top:20px">Wenn der
> Router mit dem Internet verbunden ist, kann die Node-Liste vom Monitoring
> bezogen werden.</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>
> >  <%
> >  if uci -q get wireless.w2ap > /dev/null ; then
> > >  	printWifiScan "w2ap"
> > --
> > 2.7.4
> >
Tim Niemeyer Jan. 21, 2018, 9:16 a.m.
Hi Adrian

Am Samstag, den 20.01.2018, 23:17 +0100 schrieb mail@adrianschmutzler.de:
> Hallo Tim,
> 
> siehe unten.
> 
> > -----Original Message-----
> > > > From: Tim Niemeyer [mailto:tim@tn-x.org]
> > Sent: Samstag, 20. Januar 2018 12:43
> > > > To: Adrian Schmutzler <freifunk@adrianschmutzler.de>; franken-
> > dev@freifunk.net
> > Subject: Re: [PATCH v3 4/4] fff-web: Label Freifunk routers individually in
> > wifiscan.html
> > 
> > Am Sonntag, den 26.11.2017, 14:01 +0100 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).
> > > 
> > > > > > > > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > > > Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > > 
> > > ---
> > > 
> > > Changes in v2:
> > > none
> > > 
> > > Changes in v3:
> > > - Put to the end of the patchset
> > > - Use wifianalall API (hood-independent) as this is now available
> > >   and eves the file for all hoods has only < 200 kB
> > 
> > Was meinst du mit "eves"?
> 
> Typo: "even"
Achso ich war mir nicht ganz sicher, ob das eine Feststellung (die ja
nur für den Moment gilt) war, oder ob das ein Ausdruck oder Hoffnung
sein sollte. Die Feststellung beruhigt mich, für den Moment, etwas. ;)

> 
> > 
> > Skaliert das mit allen Knoten überhaupt?
> 
> Die Frage verstehe ich nicht. Hat im Test wunderbar geklappt.

Du hast es vielleicht mit 5000 Knoten getestet. Aber was ist, wenn es
mal 15000 sind?

> 
> > 
> > > - Reduced upload file size to 1MB
> > > ---
> > >  .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 79
> > > +++++++++++++++++++++-
> > >  1 file changed, 77 insertions(+), 2 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 f9186d2..320019b 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,7 +1,40 @@
> > > -#!/usr/bin/haserl
> > > +#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=1000
> > 
> > Ich sehe hier immer noch ein Sicherheitsrisiko!
> > 
> > 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).
> 
> Ich habe das so verstanden, dass haserl da eh einen random Namen generiert:
> 
> http://haserl.sourceforge.net/manpage.html
> 
> --upload-dir=dirspec  Defaults to "/tmp". All uploaded files are
> created with temporary filename in this directory HASERL_xxx_path
> contains the name of the temporary file. FORM_xxx_name contains the
> original name of the file, as specified by the client.
> 
> Ist nicht ganz eindeutig. Ggf. teste ich mal, was für Namen der so
> macht, kann die ja ausgeben lassen. Ich verstehe das so, dass der
> sowas wie mktemp ohnehin intrinsisch macht. Oder habe ich falsch
> verstanden, worum es dir geht?

Mir geht es darum, dass ein möglicher Angreifer ggfs Dateien in /tmp
ablegen kann, die aber gerade einen wichtigen System-Zustand speichern.

Das ist es jetzt konstruiert, aber z.B. könnte in /tmp/ eine Datei
namens 3254jkh2 stehen, in dieser steht: "system operate: normal". Ein
script wertet das regelmäßig aus, und wenn da was anderes drin steht
machts ein reboot. Das als Verzeichnis /tmp gewählt ist, könnte ein
Angreifer ggfs die Datei 3254jkh2 überschreiben und so das System zum
restarten zwingen.

Wenn du sicher sagen kannst, dass sich das haserl bereits darum
kümmert, dass da nichts ausversehen überschrieben wird und und das
temporary filename auch auf keinen Fall so sein kann wie eine Datei die
eh da grad liegt, dann ist ja alles in Ordnung. Auf der anderen Seite
frage ich mich, warum wir da überhaupt ein Risiko eingehen sollten,
wenn man es ganz einfach ohne lange Diskussion in einen eigenen Ordner
stopfen könnte.

> > > 
[..]
> > >  <%
> > > > > > > > -	readIWinfo "$iface" "td" "td"
> > > > > > > > +	if [ -s /tmp/wifinodelist ] ; then
> > > > +		firststep="$(readIWinfo "$iface" "ssid" "mac")"
> > > 
> > > +		rewriteIWinfo "$firststep"
> > 
> > Ich hab hier ein bisschen Angst, dass ggfs die Command-Line zu lang werden
> > könnte.
> 
> Was sind da die Limits? In meinem sehr vollen Netz war das nie ein
> Problem, aber das muss ja nichts heißen.
Das weiß ich grad nicht, aber es wird sicher welche geben.

> Hast du eine bessere Idee?
Ja, aber ich weiß nicht genau wie man das umsetzt.

Letztlich sollte der Code dann so aussehen:
if [ -s /tmp/wifinodelist ]; then
	readIWinfo "$iface" "ssid" "mac" | rewriteIWinfo
fi

So wäre das von der Commandline weg und würde sauber über eine Pipe
übergeben werden. Da in der rewriteIWinfo eh ein readline gemacht wird,
liegt das irgendwie sowie nahe.

Aber wie gesagt, wie und ob das mit einer Shell Funktion geht, müsste
man sich nochmal eben angucken.

Tim
Tim Niemeyer Jan. 28, 2018, 12:13 p.m.
Hi

Ich hab grad ein wenig gegrübelt. Eigentlich wäre es im Sinne des
Komforts und der Dezentralität irgendwie geiler, wenn die Knoten ihren
Namen einfach selber mit im Beacon mitsenden würden.

Hat sich da schon mal jemand mit befasst? Platz wäre im Beacon wohl
genug da..

Tim

Am Sonntag, den 26.11.2017, 14:01 +0100 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).
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> ---
> 
> Changes in v2:
> none
> 
> Changes in v3:
> - Put to the end of the patchset
> - Use wifianalall API (hood-independent) as this is now available
>   and eves the file for all hoods has only < 200 kB
> - Reduced upload file size to 1MB
> ---
>  .../fff-web/files/www/ssl/cgi-bin/wifiscan.html    | 79
> +++++++++++++++++++++-
>  1 file changed, 77 insertions(+), 2 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 f9186d2..320019b 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,7 +1,40 @@
> -#!/usr/bin/haserl
> +#!/usr/bin/haserl --upload-dir=/tmp --upload-limit=1000
>  
> +<%
> +# 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 /bin/wget -T 10 -O /tmp/wifinodelist "https://mon
> itoring.freifunk-franken.de/api/wifianalall" 2> /dev/null ; then
> +			MSG='<span class="green">Download
> erfolgreich!</span>'
> +		else
> +			MSG='<span class="red">Download
> fehlgeschlagen!</span>'
> +		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}')"
> +	[ -n "$filehood" ] || filehood="Alle Hoods"
> +	havelist="<span style='color:green'>Ja (Hood: ${filehood},
> ${numentries} Einträge)</span>"
> +else
> +	havelist='<span style="color:red">Nein</span>'
> +fi
> +
>  readIWinfo() {
>  	local iface=$1
>  	local ssid=$2
> @@ -13,6 +46,28 @@ readIWinfo() {
>  		"<!-- \\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
>  }
> +
> +rewriteIWinfo() {
> +	local data="$1"
> +
> +	echo "$data" | 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
> +}
>  printWifiScan() {
>  	local iface=$1
>  	local freq="2.4 GHz"
> @@ -34,7 +89,12 @@ printWifiScan() {
>  			</tr>
>  
>  <%
> -	readIWinfo "$iface" "td" "td"
> +	if [ -s /tmp/wifinodelist ] ; then
> +		firststep="$(readIWinfo "$iface" "ssid" "mac")"
> +		rewriteIWinfo "$firststep"
> +	else
> +		readIWinfo "$iface" "td" "td"
> +	fi
>  %>
>  		</table>
>  	</fieldset>
> @@ -44,6 +104,21 @@ printWifiScan() {
>  
>  %>
>  <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-top:20px">Wenn
> der Router mit dem Internet verbunden ist, kann die Node-Liste vom
> Monitoring bezogen werden.</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>
>  <%
>  if uci -q get wireless.w2ap > /dev/null ; then
>  	printWifiScan "w2ap"
> -- 
> 2.7.4
>