1 module("luci.statistics.datatree", package.seeall)
3 local util = require("luci.util")
4 local sys = require("luci.sys")
5 local fs = require("luci.fs")
6 local uci = require("luci.model.uci").Session()
7 local sections = uci:sections( "luci_statistics" )
10 Instance = util.class()
12 function Instance.__init__( self, host )
13 self._host = host or sections.collectd.Hostname or sys.hostname()
14 self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd"
15 self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd"
17 self._libdir = self._libdir:gsub("/$","")
18 self._rrddir = self._rrddir:gsub("/$","")
24 function Instance._mkpath( self, plugin, pinstance )
25 local dir = self._rrddir .. "/" .. self._host
27 if type(plugin) == "string" and plugin:len() > 0 then
28 dir = dir .. "/" .. plugin
30 if type(pinstance) == "string" and pinstance:len() > 0 then
31 dir = dir .. "-" .. pinstance
38 function Instance._notzero( self, table )
39 for k in pairs(table) do
46 function Instance._scan( self )
47 local dir = fs.dir( self._libdir )
51 for i, plugin in ipairs( dir ) do
52 if plugin:match("%w+.so") then
53 self._plugins[ plugin:gsub(".so", "") ] = { }
57 for plugin, instances in pairs( self._plugins ) do
59 local dirs = fs.dir( self:_mkpath() )
61 if type(dirs) == "table" then
62 for i, dir in ipairs(dirs) do
63 if dir:find( plugin .. "%-" ) or dir == plugin then
67 instance = dir:gsub( plugin .. "%-", "", 1 )
70 instances[instance] = { }
75 for instance, data_instances in pairs( instances ) do
77 dirs = fs.dir( self:_mkpath( plugin, instance ) )
79 if type(dirs) == "table" then
80 for i, file in ipairs(dirs) do
81 if file:find("%.rrd") then
82 file = file:gsub("%.rrd","")
87 if file:find("%-") then
88 data_type = file:gsub( "%-.+","" )
89 data_instance = file:gsub( "[^%-]-%-", "", 1 )
95 if not data_instances[data_type] then
96 data_instances[data_type] = { data_instance }
98 table.insert( data_instances[data_type], data_instance )
108 function Instance.plugins( self )
111 for plugin, val in pairs( self._plugins ) do
112 if self:_notzero( val ) then
113 table.insert( rv, plugin )
120 function Instance.plugin_instances( self, plugin )
123 for instance, val in pairs( self._plugins[plugin] ) do
124 table.insert( rv, instance )
130 function Instance.data_types( self, plugin, instance )
132 local p = self._plugins[plugin]
134 if type(p) == "table" and type(p[instance]) == "table" then
135 for type, val in pairs(p[instance]) do
136 table.insert( rv, type )
143 function Instance.data_instances( self, plugin, instance, dtype )
145 local p = self._plugins[plugin]
147 if type(p) == "table" and type(p[instance]) == "table" and type(p[instance][dtype]) == "table" then
148 for i, instance in ipairs(p[instance][dtype]) do
149 table.insert( rv, instance )