Parcourir la source

status-page: lua rewrite, use gluon-neighbour-info

Nils Schneider il y a 9 ans
Parent
commit
710cb8b36c

+ 1 - 1
package/gluon-status-page/Makefile

@@ -12,7 +12,7 @@ define Package/gluon-status-page
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=Adds a status page showing information about the node.
-  DEPENDS:=+gluon-core +uhttpd
+  DEPENDS:=+gluon-core +gluon-neighbour-info +uhttpd
 endef
 
 define Package/gluon-status-page/description

+ 94 - 67
package/gluon-status-page/files/lib/gluon/status-page/www/cgi-bin/status

@@ -1,67 +1,94 @@
-#!/bin/sh
-
-model="$(lua -e 'print(require("platform_info").get_model())')"
-
-escape_html() {
-  sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'
-}
-
-linknodes() {
-  PREFIX=$(uci get network.local_node_route6.target | cut -d: -f 1-4)
-  sed 's#\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\)#<a href="http://['$PREFIX':\1\2:\3ff:fe\4:\5\6]/">&</a>#g'
-}
-
-echo Content-type: text/html
-echo ""
-
-cat <<EOF
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>$(cat /proc/sys/kernel/hostname)</title>
-  </head>
-  <body>
-EOF
-
-echo "<h1>$(cat /proc/sys/kernel/hostname)</h1>"
-
-echo "<pre>"
-
-echo "Model: $model" | escape_html
-echo "Firmware release: $(cat /lib/gluon/release | escape_html)"
-echo
-
-uptime | sed 's/^ \+//' | escape_html
-echo
-
-ip address show dev br-client | escape_html
-echo
-
-free -m | escape_html
-echo
-
-df /rom /overlay | escape_html
-
-echo "</pre>"
-
-echo "<h2>Neighbours</h2>"
-
-
-iw dev | grep IBSS -B 5 | grep Interface | cut -d' ' -f2 | while read if
-do
-  echo "<h3>$if</h3>"
-  echo "<pre>"
-
-  iw dev $if link | escape_html
-
-  echo
-
-  iw dev $if station dump | escape_html | linknodes
-
-  echo "</pre>"
-done
-
-cat <<EOF
-  </body>
-</html>
-EOF
+#!/usr/bin/lua
+
+local util = require("luci.util")
+local fs = require("luci.fs")
+local sys = require("luci.sys")
+local json = require("luci.json")
+local platform_info = require("platform_info")
+
+local hostname = sys.hostname()
+local model = platform_info.get_model()
+local release = util.trim(fs.readfile("/lib/gluon/release") or "")
+
+function neighbours(ifname)
+  local info = util.exec("gluon-neighbour-info -d ff02::2:1001 -p 1001 -r nodeinfo -t 3 -i " .. ifname)
+  local macs = {}
+  for _, line in ipairs(util.split(info)) do
+    local data = json.decode(line)
+    if data then
+      if data["network"] and data["network"]["mesh_interfaces"] then
+        for _, mac in ipairs(data["network"]["mesh_interfaces"]) do
+          macs[mac] = data
+        end
+      end
+    end
+  end
+
+  return macs
+end
+
+io.write("Content-type: text/html\n\n")
+io.write("<!DOCTYPE html>\n")
+io.write("<html>")
+io.write("<head>")
+io.write("<script src=\"/status.js\"></script>")
+io.write("<title>" .. hostname .. "</title>")
+io.write("</head>")
+io.write("<body>")
+
+io.write("<h1>" .. hostname .. "</h1>")
+io.write("<pre>")
+
+io.write("Model: " .. model .. "\n")
+io.write("Firmware release: " .. release .. "\n\n")
+
+io.write(util.trim(sys.exec("uptime | sed 's/^ \+//'")) .. "\n\n")
+io.write(sys.exec("ip address show dev br-client") .. "\n")
+io.write(sys.exec("free -m") .. "\n")
+io.write(sys.exec("df /rom /overlay"))
+io.write("</pre>")
+
+io.write("<h2>Neighbours</h2>")
+
+local interfaces = util.split(util.trim(util.exec("iw dev | grep IBSS -B 5 | grep Interface | cut -d' ' -f2")))
+
+for _, ifname in ipairs(interfaces) do
+  io.write("<h3>" .. ifname .. "</h3>")
+  io.write("<pre>")
+
+  io.write(sys.exec("iw dev " .. ifname .. " link") .. "\n")
+
+  for _, line in ipairs(util.split(util.exec("iw dev " .. ifname .. " station dump"))) do
+    local mac = line:match("^Station (.*) %(on ")
+    if mac then
+      io.write("Station <a id=\"" .. ifname .. "-" .. mac .. "\">" .. mac .. "</a> (on " .. ifname .. ")\n")
+    else
+      io.write(line .. "\n")
+    end
+  end
+
+  io.write("</pre>")
+end
+
+io.write("</body>")
+io.write("<script>")
+for _, ifname in ipairs(interfaces) do
+  local macs = neighbours(ifname)
+  for mac, node in pairs(macs) do
+    local hostname = node["hostname"]
+    local ip
+    if node["network"] and node["network"]["addresses"] then
+      for _, myip in ipairs(node["network"]["addresses"]) do
+        if ip == nil and myip:sub(1, 5) ~= "fe80:" then
+          ip = myip
+        end
+      end
+    end
+
+    if ip and hostname then
+      io.write("update_node(\"" .. ifname .. "-" .. mac .. "\", \"" .. ip .. "\", \"" .. hostname .. "\");")
+    end
+  end
+end
+io.write("</script>")
+io.write("</html>")

+ 9 - 0
package/gluon-status-page/files/lib/gluon/status-page/www/status.js

@@ -0,0 +1,9 @@
+function update_node(id, ip, hostname) {
+  var el = document.getElementById(id);
+
+  if (!el)
+    return;
+
+  el.href = "http://[" + ip + "]/";
+  el.textContent += " (" + hostname + ")";
+}