Skip to content

Instantly share code, notes, and snippets.

@globalbus
Created October 1, 2017 13:50
Show Gist options
  • Save globalbus/334d715a2c42f42a97239dffd744cf77 to your computer and use it in GitHub Desktop.
Save globalbus/334d715a2c42f42a97239dffd744cf77 to your computer and use it in GitHub Desktop.
Gather statistics in LuCI enabled router and encode in JSON
require "luci.jsonc"
function to_map(obj, key)
local rv = { }
for _,el in ipairs(obj) do
rv[string.upper(el[key])] = el
el[key]=nil
end
return rv
end
function wifi_networks()
local ntm = require "luci.model.network".init()
local dev = ntm:get_wifidevs()[1]
local net = dev:get_wifinets()[1]
local rv = {
up = net:is_up(),
mode = net:active_mode(),
ssid = net:active_ssid(),
bssid = net:active_bssid(),
encryption = net:active_encryption(),
frequency = net:frequency(),
channel = net:channel(),
quality = net:signal_percent(),
noise = net:noise(),
bitrate = net:bitrate(),
ifname = net:ifname(),
assoclist = net:assoclist(),
txpower = net:txpower()
}
return rv
end
local fs = require "nixio.fs"
local util = require "luci.util"
local stat = require "luci.tools.status"
local ver = require "luci.version"
local sys = require "luci.sys"
local sysinfo = luci.util.ubus("system", "info") or { }
local boardinfo = luci.util.ubus("system", "board") or { }
local unameinfo = nixio.uname() or { }
local meminfo = sysinfo.memory or {
total = 0,
free = 0,
buffered = 0,
shared = 0
}
local ntm = require "luci.model.network".init()
local wan = ntm:get_wannet()
local conn_count = tonumber(
fs.readfile("/proc/sys/net/netfilter/nf_conntrack_count")) or 0
local conn_max = tonumber((
luci.sys.exec("sysctl net.nf_conntrack_max") or
luci.sys.exec("sysctl net.ipv4.netfilter.ip_conntrack_max") or
""):match("%d+")) or 4096
local rv = {
uptime = sysinfo.uptime or 0,
localtime = os.date(),
loadavg = sysinfo.load or { 0, 0, 0 },
memory = meminfo,
connmax = conn_max,
conncount = conn_count,
leases = to_map(stat.dhcp_leases(),"macaddr"),
wifinets = wifi_networks()
}
rv.wan = {
ipaddr = wan:ipaddr(),
gwaddr = wan:gwaddr(),
netmask = wan:netmask(),
dns = wan:dnsaddrs(),
uptime = wan:uptime(),
ifname = wan:ifname()
}
local dsl_stat = sys.exec("/etc/init.d/dsl_control lucistat")
local dsl_func = loadstring(dsl_stat)
if dsl_func then
local dsl = dsl_func()
rv.dsl = {
errors_loss_far = dsl.errors_loss_far,
errors_fec_far = dsl.errors_fec_far,
errors_ses_far = dsl.errors_ses_far,
errors_crc_p_far = dsl.errors_crc_p_far,
errors_hec_near = dsl.errors_hec_near,
errors_es_far = dsl.errors_es_far,
max_data_rate_up = dsl.max_data_rate_up,
max_data_rate_down = dsl.max_data_rate_down,
actatp_up = dsl.actatp_up,
actatp_down = dsl.actatp_down,
signal_attenuation_up = dsl.signal_attenuation_up,
signal_attenuation_down = dsl.signal_attenuation_down,
noise_margin_up = dsl.noise_margin_up,
line_attenuation_down = dsl.line_attenuation_down,
data_rate_up = dsl.data_rate_up,
errors_uas_near = dsl.errors_uas_near,
errors_fec_near = dsl.errors_fec_near,
data_rate_down = dsl.data_rate_down,
noise_margin_down = dsl.noise_margin_down,
power_mode_num = dsl.power_mode_num,
errors_es_near = dsl.errors_es_near,
errors_crcp_p_far = dsl.errors_crcp_p_far,
errors_crcp_p_near = dsl.errors_crcp_p_near,
errors_loss_near = dsl.errors_loss_near,
errors_uas_far = dsl.errors_uas_far,
errors_crc_p_near = dsl.errors_crc_p_near,
errors_hec_far = dsl.errors_hec_far,
line_state_detail = dsl.line_state_detail,
errors_ses_near = dsl.errors_ses_near,
line_state = dsl.line_state,
line_attenuation_up = dsl.line_attenuation_up,
line_uptime = dsl.line_uptime
}
end
print(luci.jsonc.stringify(rv))
@globalbus
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment