* luci/statistics: let rrdtool.lua use values from the configuration, added irq diagr...
[project/luci.git] / applications / luci-statistics / luasrc / statistics / datatree.lua
1 module("luci.statistics.datatree", package.seeall)
2
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, names = uci:sections( "luci_statistics" )
8
9
10 Instance = util.class()
11
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"
16
17 self._libdir = self._libdir:gsub("/$","")
18 self._rrddir = self._rrddir:gsub("/$","")
19 self._plugins = { }
20
21 self:_scan()
22 end
23
24 function Instance._mkpath( self, plugin, pinstance )
25 local dir = self._rrddir .. "/" .. self._host
26
27 if type(plugin) == "string" and plugin:len() > 0 then
28 dir = dir .. "/" .. plugin
29
30 if type(pinstance) == "string" and pinstance:len() > 0 then
31 dir = dir .. "-" .. pinstance
32 end
33 end
34
35 return dir
36 end
37
38 function Instance._notzero( self, table )
39 for k in pairs(table) do
40 return true
41 end
42
43 return false
44 end
45
46 function Instance._scan( self )
47 for i, plugin in ipairs( fs.dir( self._libdir ) ) do
48 if plugin:match("%w+.so") then
49 self._plugins[ plugin:gsub(".so", "") ] = { }
50 end
51 end
52
53 for plugin, instances in pairs( self._plugins ) do
54
55 local dirs = fs.dir( self:_mkpath() )
56
57 if type(dirs) == "table" then
58 for i, dir in ipairs(dirs) do
59 if dir:find( plugin .. "%-" ) or dir == plugin then
60 local instance = ""
61
62 if dir ~= plugin then
63 instance = dir:gsub( plugin .. "%-", "", 1 )
64 end
65
66 instances[instance] = { }
67 end
68 end
69 end
70
71 for instance, data_instances in pairs( instances ) do
72
73 dirs = fs.dir( self:_mkpath( plugin, instance ) )
74
75 if type(dirs) == "table" then
76 for i, file in ipairs(dirs) do
77 if file:find("%.rrd") then
78 file = file:gsub("%.rrd","")
79
80 local data_type
81 local data_instance
82
83 if file:find("%-") then
84 data_type = file:gsub( "%-.+","" )
85 data_instance = file:gsub( "[^%-]-%-", "", 1 )
86 else
87 data_type = file
88 data_instance = ""
89 end
90
91 if not data_instances[data_type] then
92 data_instances[data_type] = { data_instance }
93 else
94 table.insert( data_instances[data_type], data_instance )
95 end
96 end
97 end
98 end
99 end
100 end
101 end
102
103
104 function Instance.plugins( self )
105 local rv = { }
106
107 for plugin, val in pairs( self._plugins ) do
108 if self:_notzero( val ) then
109 table.insert( rv, plugin )
110 end
111 end
112
113 return rv
114 end
115
116 function Instance.plugin_instances( self, plugin )
117 local rv = { }
118
119 for instance, val in pairs( self._plugins[plugin] ) do
120 table.insert( rv, instance )
121 end
122
123 return rv
124 end
125
126 function Instance.data_types( self, plugin, instance )
127 local rv = { }
128 local p = self._plugins[plugin]
129
130 if type(p) == "table" and type(p[instance]) == "table" then
131 for type, val in pairs(p[instance]) do
132 table.insert( rv, type )
133 end
134 end
135
136 return rv
137 end
138
139 function Instance.data_instances( self, plugin, instance, dtype )
140 local rv = { }
141 local p = self._plugins[plugin]
142
143 if type(p) == "table" and type(p[instance]) == "table" and type(p[instance][dtype]) == "table" then
144 for i, instance in ipairs(p[instance][dtype]) do
145 table.insert( rv, instance )
146 end
147 end
148
149 return rv
150 end