- -- Copyright 2019 Florian Eckert <fe@dev.tdt.de>
- -- Copyright 2021 Jeroen Peelaerts <jeroen@steganos.dev>
- -- Licensed to the public under the GNU General Public License v2.
-
- local ubus = require("ubus")
-
- local hostname_file = "/proc/sys/kernel/hostname"
-
- local line_vars = {
- {
- name = "vector",
- type = "bool"
- },
- {
- name = "trellis",
- type = "bool"
- },
- {
- name = "bitswap",
- type = "bool"
- },
- {
- name = "retx",
- type = "bool"
- },
- {
- name = "satn",
- type = "snr"
- },
- {
- name = "latn",
- type = "snr"
- },
- {
- name = "attndr",
- type = "bitrate"
- },
- {
- name = "snr",
- type = "snr"
- },
- {
- name = "data_rate",
- type = "bitrate"
- },
- {
- name = "interleave_delay",
- type = "latency"
- }
- }
-
- local errors = {
- {
- name = "uas",
- type = "count"
- },
- {
- name = "rx_corrupted",
- type = "errors"
- },
- {
- name = "rx_retransmitted",
- type = "errors"
- },
- {
- name = "tx_retransmitted",
- type = "errors"
- }
- }
-
- local erb_vars = {
- {
- name = "sent",
- type = "gauge"
- },
- {
- name = "discarded",
- type = "gauge"
- }
- }
-
- local general_vars = {
- {
- name = "state_num",
- type = "gauge"
- },
- {
- name = "power_state_num",
- type = "gauge"
- },
- {
- name = "uptime",
- type = "uptime"
- }
- }
-
- local function build_metric(name, direction)
- if direction ~= '' then
- return string.format("%s_%s", name, direction)
- else
- return name
- end
- end
-
- local function get_values(hostname, variables, metrics, direction)
- for _, information in pairs(variables) do
- local name = information["name"]
-
- if metrics and metrics[name] ~= nil then
- local value = metrics[name]
- local metric = build_metric(name, direction)
- if information["type"] == "bool" then
- if metrics[name] == true then
- value = 1
- else
- value = 0
- end
- end
-
- local t = {
- host = host,
- plugin = 'dsl',
- type = information["type"],
- type_instance = metric,
- values = {value}
- }
- collectd.log_debug(string.format("%s: %s=%s", "collectd-mod-dsl(lua)", metric, tostring(value)))
- collectd.dispatch_values(t)
- else
- collectd.log_info(string.format("%s: Unable to get %s", "collectd-mod-dsl(lua)", name))
- end
- end
- end
-
- local function read()
- local lines = io.lines(hostname_file)
- local hostname = lines()
-
- local conn = ubus.connect()
- if not conn then
- collectd.log_error("collectd-mod-dsl(lua): Failed to connect to ubus")
- return 0
- end
-
- local metrics = conn:call("dsl", "metrics", {})
-
- if metrics then
- if metrics["up"] then
- local near_errors = metrics["errors"]["near"]
- local far_errors = metrics["errors"]["far"]
- local down_line = metrics["downstream"]
- local up_line = metrics["upstream"]
- local erb = metrics["erb"]
-
- get_values(hostname, errors, near_errors, "near")
- get_values(hostname, errors, far_errors, "far")
- get_values(hostname, line_vars, down_line, "down")
- get_values(hostname, line_vars, up_line, "up")
- get_values(hostname, erb_vars, erb, "")
- end
- get_values(hostname, general_vars, metrics, "")
- return 0
- end
-
- collectd.log_error("collectd-mod-dsl(lua): No ubus dsl object found")
- return 0
- end
-
- collectd.register_read(read)
|