|
@@ -1,117 +1,44 @@
|
|
|
#!/usr/bin/lua
|
|
|
|
|
|
-local json = require "luci.json"
|
|
|
-local ltn12 = require "luci.ltn12"
|
|
|
-local util = require "luci.util"
|
|
|
+local alfred_data_type = 158
|
|
|
+local announce_dir = '/lib/gluon/alfred/announce.d'
|
|
|
|
|
|
-require "luci.model.uci"
|
|
|
-local uci = luci.model.uci.cursor()
|
|
|
|
|
|
-local alfred_data_type = tonumber(os.getenv("ALFRED_DATA_TYPE")) or 158
|
|
|
-local net_if = os.getenv("NET_IF") or "br-client"
|
|
|
+fs = require 'luci.fs'
|
|
|
+uci = require('luci.model.uci').cursor()
|
|
|
+util = require 'luci.util'
|
|
|
|
|
|
-function readAll(file)
|
|
|
- local f = io.open(file, "rb")
|
|
|
- local content = f:read("*all")
|
|
|
- f:close()
|
|
|
- return content
|
|
|
-end
|
|
|
-
|
|
|
-function chomp(s)
|
|
|
- return (s:gsub("^(.-)\n?$", "%1"))
|
|
|
-end
|
|
|
-
|
|
|
-function trim(s)
|
|
|
- return (s:gsub("^%s*(.-)%s*$", "%1"))
|
|
|
-end
|
|
|
-
|
|
|
-output = {}
|
|
|
|
|
|
-output["hostname"] = uci:get_first("system", "system", "hostname")
|
|
|
+local json = require 'luci.json'
|
|
|
+local ltn12 = require 'luci.ltn12'
|
|
|
|
|
|
-if uci:get_first("gluon-node-info", "location", "share_location", false) then
|
|
|
- output["location"] =
|
|
|
- { latitude = tonumber(uci:get_first("gluon-node-info", "location", "latitude"))
|
|
|
- , longitude = tonumber(uci:get_first("gluon-node-info", "location", "longitude"))
|
|
|
- }
|
|
|
-end
|
|
|
|
|
|
-local contact = uci:get_first("gluon-node-info", "owner", "contact", "")
|
|
|
-if contact ~= "" then
|
|
|
- output["owner"] = { contact = contact }
|
|
|
+local function collect_entry(entry)
|
|
|
+ if fs.isdirectory(entry) then
|
|
|
+ return collect_dir(entry)
|
|
|
+ else
|
|
|
+ return dofile(entry)
|
|
|
+ end
|
|
|
end
|
|
|
|
|
|
-output["software"] =
|
|
|
- { firmware = { base = "gluon-" .. chomp(readAll("/lib/gluon/gluon-version"))
|
|
|
- , release = chomp(readAll("/lib/gluon/release"))
|
|
|
- }
|
|
|
- }
|
|
|
+function collect_dir(dir)
|
|
|
+ local ret = {}
|
|
|
|
|
|
-local autoupdater = uci:get_all("autoupdater", "settings")
|
|
|
-if autoupdater then
|
|
|
- output["software"]["autoupdater"] =
|
|
|
- { branch = autoupdater["branch"]
|
|
|
- , enabled = uci:get_bool("autoupdater", "settings", "enabled")
|
|
|
- }
|
|
|
-end
|
|
|
+ for _, entry in ipairs(fs.dir(dir)) do
|
|
|
+ if entry:sub(1, 1) ~= '.' then
|
|
|
+ err, val = pcall(collect_entry, dir .. '/' .. entry)
|
|
|
+ if err then
|
|
|
+ ret[entry] = val
|
|
|
+ else
|
|
|
+ io.stderr:write(val, '\n')
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
|
|
|
-local fastd = uci:get_all("fastd", "mesh_vpn")
|
|
|
-if fastd then
|
|
|
- output["software"]["fastd"] =
|
|
|
- { enabled = uci:get_bool("fastd", "mesh_vpn", "enabled")
|
|
|
- , version = chomp(util.exec("fastd -v | cut -d' ' -f2"))
|
|
|
- }
|
|
|
+ return ret
|
|
|
end
|
|
|
|
|
|
-output["hardware"] =
|
|
|
- { model = chomp(util.exec(". /lib/gluon/functions/model.sh; get_model")) }
|
|
|
-
|
|
|
-
|
|
|
-local addresses = {}
|
|
|
-local tmp = util.exec("ip -o -6 addr show dev \"" .. net_if .. "\" | "
|
|
|
- .. "grep -oE 'inet6 [0-9a-fA-F:]+' | cut -d' ' -f2")
|
|
|
-
|
|
|
-for address in tmp:gmatch("[^\n]+") do
|
|
|
- table.insert(addresses, address)
|
|
|
-end
|
|
|
|
|
|
-output["network"] =
|
|
|
- { mac = chomp(util.exec(". /lib/gluon/functions/sysconfig.sh; sysconfig primary_mac"))
|
|
|
- , addresses = addresses
|
|
|
- }
|
|
|
-
|
|
|
-local gateway =
|
|
|
- chomp(util.exec("batctl -m bat0 gateways | awk '/^=>/ { print $2 }'"))
|
|
|
-
|
|
|
-if gateway ~= "" then
|
|
|
- output["network"]["gateway"] = gateway
|
|
|
-end
|
|
|
-
|
|
|
-local traffic = {}
|
|
|
-local ethtool = util.exec("ethtool -S bat0")
|
|
|
-for k, v in ethtool:gmatch("([%a_]+): ([0-9]+)") do
|
|
|
- traffic[k] = v
|
|
|
-end
|
|
|
-
|
|
|
-for _,class in ipairs({"rx", "tx", "forward", "mgmt_rx", "mgmt_tx"}) do
|
|
|
- traffic[class] =
|
|
|
- { bytes = traffic[class .. "_bytes"]
|
|
|
- , packets = traffic[class]
|
|
|
- }
|
|
|
-
|
|
|
- if class == "tx" then
|
|
|
- traffic[class]["dropped"] = traffic[class .. "_dropped"]
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-output["statistics"] =
|
|
|
- { uptime = chomp(util.exec("cut -d' ' -f1 /proc/uptime"))
|
|
|
- , loadavg = chomp(util.exec("cut -d' ' -f1 /proc/loadavg"))
|
|
|
- , traffic = traffic
|
|
|
- }
|
|
|
-
|
|
|
-encoder = json.Encoder(output)
|
|
|
-alfred = io.popen("alfred -s " .. tostring(alfred_data_type), "w")
|
|
|
+encoder = json.Encoder(collect_dir(announce_dir))
|
|
|
+alfred = io.popen('alfred -s ' .. tostring(alfred_data_type), 'w')
|
|
|
ltn12.pump.all(encoder:source(), ltn12.sink.file(alfred))
|
|
|
-
|
|
|
-
|