* luci/statistics: generate submenus for plugins with multiple instances, i18n menu...
[project/luci.git] / applications / luci-statistics / luasrc / controller / luci_statistics / luci_statistics.lua
1 module("luci.controller.luci_statistics.luci_statistics", package.seeall)
2
3 local fs   = require("luci.fs")
4 local i18n = require("luci.i18n")
5 local tpl  = require("luci.template")
6 local rrd  = require("luci.statistics.rrdtool")
7 local data = require("luci.statistics.datatree").Instance()
8
9 function index()
10
11         -- XXX: fixme
12         i18n.load("statistics.en")
13
14         function _entry( path, ... )
15                 local file = path[4] or path[3]
16                 if fs.isfile( "/usr/lib/collectd/" .. file .. ".so" ) then
17                         entry( path, ... )
18                 end
19         end
20
21         function _i18n( str )
22                 return i18n.translate( "stat_" .. str, str )
23         end
24
25         entry({"admin", "statistics"},                          call("statistics_index"),               "Statistiken",          80)
26         entry({"admin", "statistics", "collectd"},              cbi("luci_statistics/collectd"),        "Collectd",             10)
27
28         entry({"admin", "statistics", "output"},                call("statistics_outputplugins"),       "Ausgabeplugins",       20)
29         _entry({"admin", "statistics", "output", "rrdtool"},    cbi("luci_statistics/rrdtool"),         "RRDTool",              10)
30         _entry({"admin", "statistics", "output", "network"},    cbi("luci_statistics/network"),         "Netzwerk",             20)
31         _entry({"admin", "statistics", "output", "unixsock"},   cbi("luci_statistics/unixsock"),        "Unix Socket",          30)
32         _entry({"admin", "statistics", "output", "csv"},        cbi("luci_statistics/csv"),             "CSV",                  40)
33
34         entry({"admin", "statistics", "system"},                call("statistics_systemplugins"),       "Systemplugins",        30)
35         _entry({"admin", "statistics", "system", "exec"},       cbi("luci_statistics/exec"),            "Exec",                 10)
36         _entry({"admin", "statistics", "system", "email"},      cbi("luci_statistics/email"),           "E-Mail",               20)
37         _entry({"admin", "statistics", "system", "cpu"},        cbi("luci_statistics/cpu"),             "Prozessor",            30)
38         _entry({"admin", "statistics", "system", "df"},         cbi("luci_statistics/df"),              "Speicherplatz",        40)
39         _entry({"admin", "statistics", "system", "disk"},       cbi("luci_statistics/disk"),            "Datenträger",         50)
40         _entry({"admin", "statistics", "system", "irq"},        cbi("luci_statistics/irq"),             "Interrupts",           60)
41         _entry({"admin", "statistics", "system", "processes"},  cbi("luci_statistics/processes"),       "Prozesse",             70)
42
43         entry({"admin", "statistics", "network"},               call("statistics_networkplugins"),      "Netzwerkplugins",      40)
44         _entry({"admin", "statistics", "network", "interface"}, cbi("luci_statistics/interface"),       "Schnittstellen",       10)
45         _entry({"admin", "statistics", "network", "netlink"},   cbi("luci_statistics/netlink"),         "Netlink",              20)
46         _entry({"admin", "statistics", "network", "iptables"},  cbi("luci_statistics/iptables"),        "Firewall",             30)
47         _entry({"admin", "statistics", "network", "tcpconns"},  cbi("luci_statistics/tcpconns"),        "Verbindungen",         40)
48         _entry({"admin", "statistics", "network", "ping"},      cbi("luci_statistics/ping"),            "Ping",                 50)
49         _entry({"admin", "statistics", "network", "dns"},       cbi("luci_statistics/dns"),             "DNS",                  60)
50
51         
52         -- public views
53         entry({"freifunk", "statistics"},                       call("statistics_index"),               "Statistiken",          80).i18n = "statistics"
54         
55         for i, plugin in ipairs( data:plugins() ) do
56
57                 -- get plugin instances
58                 local instances = data:plugin_instances( plugin )
59
60                 -- plugin menu entry
61                 _entry( { "freifunk", "statistics", plugin }, call("statistics_render"), _i18n( plugin ), i )
62
63                 -- if more then one instance is found then generate submenu
64                 if #instances > 1 then
65                         for j, inst in ipairs(instances) do
66                                 -- instance menu entry
67                                 entry( { "freifunk", "statistics", plugin, inst }, call("statistics_render"), inst, j )
68                         end
69                 end                     
70         end
71 end
72
73
74 function statistics_index()
75         tpl.render("admin_statistics/index")
76 end
77
78 function statistics_outputplugins()
79         plugins = {
80                 rrdtool="RRDTool",
81                 network="Netzwerk",
82                 unixsock="Unix Socket",
83                 csv="CSV"
84         }
85
86         tpl.render("admin_statistics/outputplugins", {plugins=plugins})
87 end
88
89 function statistics_systemplugins()
90         plugins = {
91                 exec="Exec",
92                 email="E-Mail",
93                 disk="Datenträger",
94                 irq="Interrupts",
95                 processes="Prozesse"
96         }
97
98         tpl.render("admin_statistics/systemplugins", {plugins=plugins})
99 end
100
101 function statistics_networkplugins()
102         plugins = {
103                 interface="Schnittstellen",
104                 netlink="Netlink",
105                 iptables="Firewall",
106                 tcpconns="Verbindungen",
107                 ping="Ping",
108                 dns="DNS"
109         }
110
111         tpl.render("admin_statistics/networkplugins", {plugins=plugins})
112 end
113
114
115 function statistics_render()
116         local plugin    = luci.dispatcher.request[3]
117         local instances = { luci.dispatcher.request[4] }
118         local images    = { }
119
120         -- no instance requested, find all instances
121         if #instances == 0 then
122
123                 instances = data:plugin_instances( plugin )
124
125                 -- more than one available instance
126                 if #instances > 1 then
127
128                         -- redirect to first instance and return
129                         local r = luci.dispatcher.request
130
131                         luci.http.redirect( luci.dispatcher.build_url( {
132                                 r[1], r[2], r[3], instances[1]
133                         } ) )
134
135                         return
136                 end
137         end
138
139         -- render graphs
140         for i, inst in ipairs( instances ) do
141                 local graph = rrd.Graph()
142                 for i, img in ipairs( graph:render( plugin, inst ) ) do
143                         table.insert( images, img )
144                 end
145         end
146
147         tpl.render("public_statistics/graph", { images=images, plugin=plugin } )
148 end