diff options
Diffstat (limited to 'applications/luci-app-statistics/luasrc')
10 files changed, 302 insertions, 34 deletions
diff --git a/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua b/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua index 36c5554d35..ec26f02d0d 100644 --- a/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua +++ b/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua @@ -23,7 +23,9 @@ function index() s_general = _("General plugins"), s_network = _("Network plugins"), + apcups = _("APC UPS"), conntrack = _("Conntrack"), + contextswitch = _("Context Switches"), cpu = _("Processor"), cpufreq = _("CPU Frequency"), csv = _("CSV Output"), @@ -58,8 +60,8 @@ function index() -- our collectd menu local collectd_menu = { output = { "csv", "network", "rrdtool", "unixsock" }, - general = { "cpu", "cpufreq", "df", "disk", "email", - "entropy", "exec", "irq", "load", "memory", + general = { "apcups", "contextswitch", "cpu", "cpufreq", "df", + "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "sensors", "thermal", "uptime" }, network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "openvpn", "ping", @@ -87,7 +89,7 @@ function index() _entry( { "admin", "statistics", "collectd", section, plugin }, cbi("luci_statistics/" .. plugin ), - labels[plugin], j * 10 + labels[plugin] or plugin, j * 10 ) end diff --git a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/apcups.lua b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/apcups.lua new file mode 100644 index 0000000000..49e28c7cfd --- /dev/null +++ b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/apcups.lua @@ -0,0 +1,28 @@ +-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org> +-- Licensed to the public under the Apache License 2.0. + +m = Map("luci_statistics", + translate("APCUPS Plugin Configuration"), + translate( + "The APCUPS plugin collects statistics about the APC UPS." + )) + +-- collectd_apcups config section +s = m:section( NamedSection, "collectd_apcups", "luci_statistics" ) + +-- collectd_apcups.enable +enable = s:option( Flag, "enable", translate("Enable this plugin") ) +enable.default = 0 + +-- collectd_apcups.host (Host) +host = s:option( Value, "Host", translate("Monitor host"), translate ("Add multiple hosts separated by space.")) +host.default = "localhost" +host:depends( "enable", 1 ) + +-- collectd_apcups.port (Port) +port = s:option( Value, "Port", translate("Port for apcupsd communication") ) +port.isinteger = true +port.default = 3551 +port:depends( "enable", 1 ) + +return m diff --git a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/contextswitch.lua b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/contextswitch.lua new file mode 100644 index 0000000000..7ae6b24ba1 --- /dev/null +++ b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/contextswitch.lua @@ -0,0 +1,14 @@ +-- Licensed to the public under the Apache License 2.0. + +m = Map("luci_statistics", + translate("CPU Context Switches Plugin Configuration"), + translate("This plugin collects statistics about the processor context switches.")) + +-- collectd_contextswitch config section +s = m:section( NamedSection, "collectd_contextswitch", "luci_statistics" ) + +-- collectd_contextswitch.enable +enable = s:option( Flag, "enable", translate("Enable this plugin") ) +enable.default = 0 + +return m diff --git a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua index f31fb20938..fa00bbbf5e 100644 --- a/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua +++ b/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua @@ -19,7 +19,12 @@ enable = s:option( Flag, "enable", translate("Enable this plugin") ) enable.default = 1 -- collectd_rrdtool.datadir (DataDir) -datadir = s:option( Value, "DataDir", translate("Storage directory") ) +datadir = s:option( Value, "DataDir", + translate("Storage directory"), + translate("Note: as pages are rendered by user 'nobody', the *.rrd files, " .. + "the storage directory and all its parent directories need " .. + "to be world readable." + )) datadir.default = "/tmp" datadir.rmempty = true datadir.optional = true diff --git a/applications/luci-app-statistics/luasrc/statistics/datatree.lua b/applications/luci-app-statistics/luasrc/statistics/datatree.lua index 806b054cb6..5176a19a22 100644 --- a/applications/luci-app-statistics/luasrc/statistics/datatree.lua +++ b/applications/luci-app-statistics/luasrc/statistics/datatree.lua @@ -13,9 +13,17 @@ local sections = uci:get_all("luci_statistics") Instance = util.class() function Instance.__init__( self, host ) - self._host = host or sections.collectd.Hostname or sys.hostname() - self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd" - self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd" + self._host = host or sys.hostname() + self._libdir = "/usr/lib/collectd" + self._rrddir = "/tmp/rrd" + + if sections and sections.collectd then + self._host = host or sections.collectd.Hostname or sys.hostname() + self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd" + end + if sections and sections.collectd_rrdtool then + self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd" + end self._libdir = self._libdir:gsub("/$","") self._rrddir = self._rrddir:gsub("/$","") diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua index 4e00e7f1fc..47e1696ece 100644 --- a/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua +++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua @@ -87,7 +87,7 @@ function Graph._rrdtool( self, def, rrd ) fs.mkdirr( dir ) -- construct commandline - local cmdline = "rrdtool graph" + local cmdline = { "rrdtool", "graph" } -- copy default arguments to def stack for i, opt in ipairs(self.args) do @@ -102,15 +102,11 @@ function Graph._rrdtool( self, def, rrd ) opt = opt:gsub( "{file}", rrd ) end - if opt:match("[^%w]") then - cmdline = cmdline .. " '" .. opt .. "'" - else - cmdline = cmdline .. " " .. opt - end + cmdline[#cmdline+1] = luci.util.shellquote(opt) end -- execute rrdtool - local rrdtool = io.popen( cmdline ) + local rrdtool = io.popen(table.concat(cmdline, " ")) rrdtool:close() end @@ -278,7 +274,7 @@ function Graph._generic( self, opts, plugin, plugin_instance, dtype, index ) -- create line1 statement _tif( _args, "LINE%d:%s_%s#%s:%s", - source.noarea and 2 or 1, + source.width or (source.noarea and 2 or 1), source.sname, var, line_color, legend ) end diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua new file mode 100644 index 0000000000..9f7a51a868 --- /dev/null +++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua @@ -0,0 +1,175 @@ +-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org> +-- Licensed to the public under the Apache License 2.0. + +module("luci.statistics.rrdtool.definitions.apcups",package.seeall) + +function rrdargs( graph, plugin, plugin_instance ) + + local lu = require("luci.util") + local rv = { } + + -- Types and instances supported by APC UPS + -- e.g. ups_types -> { 'timeleft', 'charge', 'percent', 'voltage' } + -- e.g. ups_inst['voltage'] -> { 'input', 'battery' } + + local ups_types = graph.tree:data_types( plugin, plugin_instance ) + + local ups_inst = {} + for _, t in ipairs(ups_types) do + ups_inst[t] = graph.tree:data_instances( plugin, plugin_instance, t ) + end + + + -- Check if hash table or array is empty or nil-filled + + local function empty( t ) + for _, v in pairs(t) do + if type(v) then return false end + end + return true + end + + + -- Append graph definition but only types/instances which are + -- supported and available to the plugin and UPS. + + local function add_supported( t, defs ) + local def_inst = defs['data']['instances'] + + if type(def_inst) == "table" then + for k, v in pairs( def_inst ) do + if lu.contains( ups_types, k) then + for j = #v, 1, -1 do + if not lu.contains( ups_inst[k], v[j] ) then + table.remove( v, j ) + end + end + if #v == 0 then + def_inst[k] = nil -- can't assign v: immutable + end + else + def_inst[k] = nil -- can't assign v: immutable + end + end + if empty(def_inst) then return end + end + table.insert( t, defs ) + end + + + -- Graph definitions for APC UPS measurements MUST use only 'instances': + -- e.g. instances = { voltage = { "input", "output" } } + + local voltagesdc = { + title = "%H: Voltages on APC UPS - Battery", + vlabel = "Volts DC", + alt_autoscale = true, + number_format = "%5.1lfV", + data = { + instances = { + voltage = { "battery" } + }, + options = { + voltage = { title = "Battery voltage", noarea=true } + } + } + } + add_supported( rv, voltagesdc ) + + local voltagesac = { + title = "%H: Voltages on APC UPS - AC", + vlabel = "Volts AC", + alt_autoscale = true, + number_format = "%5.1lfV", + data = { + instances = { + voltage = { "input", "output" } + }, + options = { + voltage_output = { color = "00e000", title = "Output voltage", noarea=true, overlay=true }, + voltage_input = { color = "ffb000", title = "Input voltage", noarea=true, overlay=true } + } + } + } + add_supported( rv, voltagesac ) + + local percentload = { + title = "%H: Load on APC UPS ", + vlabel = "Percent", + y_min = "0", + y_max = "100", + number_format = "%5.1lf%%", + data = { + instances = { + percent = { "load" } + }, + options = { + percent_load = { color = "00ff00", title = "Load level" } + } + } + } + add_supported( rv, percentload ) + + local charge_percent = { + title = "%H: Battery charge on APC UPS ", + vlabel = "Percent", + y_min = "0", + y_max = "100", + number_format = "%5.1lf%%", + data = { + instances = { + charge = { "" } + }, + options = { + charge = { color = "00ff0b", title = "Charge level" } + } + } + } + add_supported( rv, charge_percent ) + + local temperature = { + title = "%H: Battery temperature on APC UPS ", + vlabel = "\176C", + number_format = "%5.1lf\176C", + data = { + instances = { + temperature = { "" } + }, + options = { + temperature = { color = "ffb000", title = "Battery temperature" } } + } + } + add_supported( rv, temperature ) + + local timeleft = { + title = "%H: Time left on APC UPS ", + vlabel = "Minutes", + number_format = "%.1lfm", + data = { + instances = { + timeleft = { "" } + }, + options = { + timeleft = { color = "0000ff", title = "Time left" } + } + } + } + add_supported( rv, timeleft ) + + local frequency = { + title = "%H: Incoming line frequency on APC UPS ", + vlabel = "Hz", + number_format = "%5.0lfhz", + data = { + instances = { + frequency = { "input" } + }, + options = { + frequency_input = { color = "000fff", title = "Line frequency" } + } + } + } + add_supported( rv, frequency ) + + return rv +end diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua new file mode 100644 index 0000000000..6826e12adb --- /dev/null +++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua @@ -0,0 +1,23 @@ +-- Licensed to the public under the Apache License 2.0. + +module("luci.statistics.rrdtool.definitions.contextswitch",package.seeall) + +function rrdargs( graph, plugin, plugin_instance, dtype ) + + return { + title = "%H: Context switches", + alt_autoscale = true, + vlabel = "Switches/s", + number_format = "%5.0lf", + data = { + types = { "contextswitch" }, + sources = { + contextswitch = { "value" } + }, + options = { + contextswitch = { color = "0000ff", title = "Context switches", noarea=true, overlay=true } + } + } + } +end + diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua index d48441abd2..62d0545973 100644 --- a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua +++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua @@ -5,28 +5,30 @@ module("luci.statistics.rrdtool.definitions.processes", package.seeall) function rrdargs( graph, plugin, plugin_instance, dtype ) + if plugin_instance == "" then return { - { title = "%H: Processes", vlabel = "Processes/s", data = { instances = { ps_state = { - "sleeping", "running", "paging", "blocked", "stopped", "zombies" + "sleeping", "running", "paging", + "blocked", "stopped", "zombies" } }, options = { - ps_state_sleeping = { color = "0000ff" }, - ps_state_running = { color = "008000" }, - ps_state_paging = { color = "ffff00" }, - ps_state_blocked = { color = "ff5000" }, - ps_state_stopped = { color = "555555" }, - ps_state_zombies = { color = "ff0000" } + ps_state_sleeping = { color = "0000ff", title = "Sleeping" }, + ps_state_running = { color = "008000", title = "Running" }, + ps_state_paging = { color = "ffff00", title = "Paging" }, + ps_state_blocked = { color = "ff5000", title = "Blocked" }, + ps_state_stopped = { color = "555555", title = "Stopped" }, + ps_state_zombies = { color = "ff0000", title = "Zombies" } } } - }, - + } + else + return { { title = "%H: CPU time used by %pi", vlabel = "Jiffies", @@ -38,11 +40,13 @@ function rrdargs( graph, plugin, plugin_instance, dtype ) options = { ps_cputime__user = { color = "0000ff", + title = "User", overlay = true }, ps_cputime__syst = { color = "ff0000", + title = "System", overlay = true } } @@ -59,15 +63,15 @@ function rrdargs( graph, plugin, plugin_instance, dtype ) }, options = { - ps_count__threads = { color = "00ff00" }, - ps_count__processes = { color = "0000bb" } + ps_count__threads = { color = "00ff00", title = "Threads" }, + ps_count__processes = { color = "0000bb", title = "Processes" } } } }, { title = "%H: Page faults in %pi", - vlabel = "Pagefaults", + vlabel = "Page faults", detail = true, data = { sources = { @@ -75,14 +79,14 @@ function rrdargs( graph, plugin, plugin_instance, dtype ) }, options = { - ps_pagefaults__minflt = { color = "ff0000" }, - ps_pagefaults__majflt = { color = "ff5500" } + ps_pagefaults__minflt = { color = "0000ff", title = "Minor" }, + ps_pagefaults__majflt = { color = "ff0000", title = "Major" } } } }, { - title = "%H: Virtual memory size of %pi", + title = "%H: Resident segment size (RSS) of %pi", vlabel = "Bytes", detail = true, number_format = "%5.1lf%sB", @@ -90,9 +94,24 @@ function rrdargs( graph, plugin, plugin_instance, dtype ) types = { "ps_rss" }, options = { - ps_rss = { color = "0000ff" } + ps_rss = { color = "0000ff", title = "Resident segment" } + } + } + }, + + { + title = "%H: Virtual memory size (VSZ) of %pi", + vlabel = "Bytes", + detail = true, + number_format = "%5.1lf%sB", + data = { + types = { "ps_vm" }, + + options = { + ps_vm = { color = "0000ff", title = "Virtual memory" } } } } } + end end diff --git a/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm b/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm index ebc78badb0..85a20d993a 100644 --- a/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm +++ b/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm @@ -29,9 +29,7 @@ <div style="text-align: center"> <% for i, img in ipairs(images) do %> - <% if is_index then %><a href="<%=pcdata(images[img])%>"><% end %> <img src="<%=REQUEST_URI%>?img=<%=img%>&host=<%=current_host%>" /> - <% if is_index then %></a><% end %> <br /> <% end %> </div> |