add some indirection around make targets of module.mk, so you can combine it more...
[project/luci.git] / applications / luci-statistics / src / 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"
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                 for i, dir in ipairs( fs.dir( self:_mkpath() ) ) do
55                         if dir:find( plugin .. "%-" ) or dir == plugin then
56                                 local instance = ""
57
58                                 if dir ~= plugin then
59                                         instance = dir:gsub( plugin .. "%-", "", 1 )
60                                 end
61
62                                 instances[instance] = { }
63                         end
64                 end
65
66                 for instance, data_instances in pairs( instances ) do
67                         for i, file in ipairs( fs.dir( self:_mkpath( plugin, instance ) ) ) do
68                                 if file:find("%.rrd") then
69                                         file = file:gsub("%.rrd","")
70
71                                         local data_type
72                                         local data_instance
73
74                                         if file:find("%-") then
75                                                 data_type     = file:gsub( "%-.+","" )
76                                                 data_instance = file:gsub( "[^%-]-%-", "", 1 )
77                                         else
78                                                 data_type     = file
79                                                 data_instance = ""
80                                         end
81
82                                         if not data_instances[data_type] then
83                                                 data_instances[data_type] = { data_instance }
84                                         else
85                                                 table.insert( data_instances[data_type], data_instance )
86                                         end
87                                 end
88                         end
89                 end
90         end
91 end
92
93
94 function Instance.plugins( self )
95         local rv = { }
96
97         for plugin, val in pairs( self._plugins ) do
98                 if self:_notzero( val ) then
99                         table.insert( rv, plugin )
100                 end
101         end
102
103         return rv
104 end
105
106 function Instance.plugin_instances( self, plugin )
107         local rv = { }
108
109         for instance, val in pairs( self._plugins[plugin] ) do
110                 table.insert( rv, instance )
111         end
112
113         return rv
114 end
115
116 function Instance.data_types( self, plugin, instance )
117         local rv = { }
118
119         for type, val in pairs( self._plugins[plugin][instance] ) do
120                 table.insert( rv, type )
121         end
122
123         return rv
124 end
125
126 function Instance.data_instances( self, plugin, instance, type )
127         local rv = { }
128
129         for i, instance in ipairs( self._plugins[plugin][instance][type] ) do
130                 table.insert( rv, instance )
131         end
132
133         return rv
134 end