diff options
Diffstat (limited to 'applications/luci-app-statistics/luasrc/statistics/datatree.lua')
-rw-r--r-- | applications/luci-app-statistics/luasrc/statistics/datatree.lua | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/applications/luci-app-statistics/luasrc/statistics/datatree.lua b/applications/luci-app-statistics/luasrc/statistics/datatree.lua new file mode 100644 index 000000000..850b83a99 --- /dev/null +++ b/applications/luci-app-statistics/luasrc/statistics/datatree.lua @@ -0,0 +1,209 @@ +--[[ + +Luci statistics - rrd data tree builder +(c) 2008 Freifunk Leipzig / Jo-Philipp Wich <xm@leipzig.freifunk.net> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +]]-- + +module("luci.statistics.datatree", package.seeall) + +local util = require("luci.util") +local sys = require("luci.sys") +local fs = require("nixio.fs") +local uci = require("luci.model.uci").cursor() +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._libdir = self._libdir:gsub("/$","") + self._rrddir = self._rrddir:gsub("/$","") + self._plugins = { } + + self:_scan() +end + +function Instance._mkpath( self, plugin, pinstance ) + local dir = self._rrddir .. "/" .. self._host + + if type(plugin) == "string" and plugin:len() > 0 then + dir = dir .. "/" .. plugin + + if type(pinstance) == "string" and pinstance:len() > 0 then + dir = dir .. "-" .. pinstance + end + end + + return dir +end + +function Instance._ls( self, ... ) + local ditr = fs.dir(self:_mkpath(...)) + if ditr then + local dirs = { } + while true do + local d = ditr() + if not d then break end + dirs[#dirs+1] = d + end + return dirs + end +end + +function Instance._notzero( self, table ) + for k in pairs(table) do + return true + end + + return false +end + +function Instance._scan( self ) + local dirs = self:_ls() + if not dirs then + return + end + +-- for i, plugin in ipairs( dirs ) do +-- if plugin:match("%w+.so") then +-- self._plugins[ plugin:gsub("%.so$", "") ] = { } +-- end +-- end + + for _, dir in ipairs(dirs) do + if dir ~= "." and dir ~= ".." and + fs.stat(self:_mkpath(dir)).type == "dir" + then + local plugin = dir:gsub("%-.+$", "") + if not self._plugins[plugin] then + self._plugins[plugin] = { } + end + end + end + + for plugin, instances in pairs( self._plugins ) do + + local dirs = self:_ls() + + if type(dirs) == "table" then + for i, dir in ipairs(dirs) do + if dir:find( plugin .. "%-" ) or dir == plugin then + local instance = "" + + if dir ~= plugin then + instance = dir:gsub( plugin .. "%-", "", 1 ) + end + + instances[instance] = { } + end + end + end + + for instance, data_instances in pairs( instances ) do + + dirs = self:_ls(plugin, instance) + + if type(dirs) == "table" then + for i, file in ipairs(dirs) do + if file:find("%.rrd") then + file = file:gsub("%.rrd","") + + local data_type + local data_instance + + if file:find("%-") then + data_type = file:gsub( "%-.+","" ) + data_instance = file:gsub( "[^%-]-%-", "", 1 ) + else + data_type = file + data_instance = "" + end + + if not data_instances[data_type] then + data_instances[data_type] = { data_instance } + else + table.insert( data_instances[data_type], data_instance ) + end + end + end + end + end + end +end + + +function Instance.plugins( self ) + local rv = { } + + for plugin, val in pairs( self._plugins ) do + if self:_notzero( val ) then + table.insert( rv, plugin ) + end + end + + return rv +end + +function Instance.plugin_instances( self, plugin ) + local rv = { } + + for instance, val in pairs( self._plugins[plugin] ) do + table.insert( rv, instance ) + end + + return rv +end + +function Instance.data_types( self, plugin, instance ) + local rv = { } + local p = self._plugins[plugin] + + if type(p) == "table" and type(p[instance]) == "table" then + for type, val in pairs(p[instance]) do + table.insert( rv, type ) + end + end + + return rv +end + +function Instance.data_instances( self, plugin, instance, dtype ) + local rv = { } + local p = self._plugins[plugin] + + if type(p) == "table" and type(p[instance]) == "table" and type(p[instance][dtype]) == "table" then + for i, instance in ipairs(p[instance][dtype]) do + table.insert( rv, instance ) + end + end + + return rv +end + +function Instance.host_instances( self ) + local hosts_path = fs.glob(self._rrddir..'/*') + local hosts = { } + + if hosts_path then + local path + for path in hosts_path do + hosts[#hosts+1] = fs.basename(path) + end + end + + return hosts +end + |