commit 4f6198094cf4134179d1f9c9fa8f79759a27c87e
authorSteven Barth <steven@midlink.org>
Tue, 27 May 2008 12:23:39 +0000 (12:23 +0000)
committerSteven Barth <steven@midlink.org>
Tue, 27 May 2008 12:23:39 +0000 (12:23 +0000)
Author: Felix Fietkau <nbd@openwrt.org>
Date:   Tue May 27 13:56:12 2008 +0200

    rename src/ to luasrc/

291 files changed:
applications/luci-ffwizard-leipzig/luasrc/controller/luci_ffwizard_leipzig/wizard.lua [new file with mode: 0644]
applications/luci-ffwizard-leipzig/luasrc/view/freifunk/wizard.htm [new file with mode: 0644]
applications/luci-ffwizard-leipzig/src/controller/luci_ffwizard_leipzig/wizard.lua [deleted file]
applications/luci-ffwizard-leipzig/src/view/freifunk/wizard.htm [deleted file]
applications/luci-fw/luasrc/controller/luci_fw/luci_fw.lua [new file with mode: 0644]
applications/luci-fw/luasrc/model/cbi/luci_fw/firewall.lua [new file with mode: 0644]
applications/luci-fw/luasrc/model/cbi/luci_fw/portfw.lua [new file with mode: 0644]
applications/luci-fw/luasrc/model/cbi/luci_fw/routing.lua [new file with mode: 0644]
applications/luci-fw/src/controller/luci_fw/luci_fw.lua [deleted file]
applications/luci-fw/src/model/cbi/luci_fw/firewall.lua [deleted file]
applications/luci-fw/src/model/cbi/luci_fw/portfw.lua [deleted file]
applications/luci-fw/src/model/cbi/luci_fw/routing.lua [deleted file]
applications/luci-splash/luasrc/controller/splash/splash.lua [new file with mode: 0644]
applications/luci-splash/luasrc/model/cbi/splash/splash.lua [new file with mode: 0644]
applications/luci-splash/luasrc/view/splash/splash.htm [new file with mode: 0644]
applications/luci-splash/luasrc/view/splash_splash/index.htm [new file with mode: 0644]
applications/luci-splash/luasrc/view/splash_splash/splash.htm [new file with mode: 0644]
applications/luci-splash/src/controller/splash/splash.lua [deleted file]
applications/luci-splash/src/model/cbi/splash/splash.lua [deleted file]
applications/luci-splash/src/view/splash/splash.htm [deleted file]
applications/luci-splash/src/view/splash_splash/index.htm [deleted file]
applications/luci-splash/src/view/splash_splash/splash.htm [deleted file]
applications/luci-statistics/luasrc/controller/luci_statistics/luci_statistics.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/collectd.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/csv.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/df.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/disk.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/dns.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/email.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/exec.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/interface.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/iptables.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/irq.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/netlink.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/network.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/ping.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/processes.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/datatree.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/colors.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/cpu/cpu.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/iptables/ipt_packets.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/ping/ping.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/processes/ps_state.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/tcpconns/tcp_connections.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/statistics/rrdtool/definitions/wireless.lua [new file with mode: 0644]
applications/luci-statistics/luasrc/view/admin_statistics/index.htm [new file with mode: 0644]
applications/luci-statistics/luasrc/view/admin_statistics/networkplugins.htm [new file with mode: 0644]
applications/luci-statistics/luasrc/view/admin_statistics/outputplugins.htm [new file with mode: 0644]
applications/luci-statistics/luasrc/view/admin_statistics/systemplugins.htm [new file with mode: 0644]
applications/luci-statistics/luasrc/view/public_statistics/graph.htm [new file with mode: 0644]
applications/luci-statistics/src/controller/luci_statistics/luci_statistics.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/collectd.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/csv.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/df.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/disk.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/dns.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/email.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/exec.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/interface.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/iptables.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/irq.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/netlink.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/network.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/ping.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/processes.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/rrdtool.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/tcpconns.lua [deleted file]
applications/luci-statistics/src/model/cbi/luci_statistics/unixsock.lua [deleted file]
applications/luci-statistics/src/statistics/datatree.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/colors.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/cpu/cpu.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/iptables/ipt_packets.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/netlink.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/ping/ping.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/processes/ps_state.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/tcpconns/tcp_connections.lua [deleted file]
applications/luci-statistics/src/statistics/rrdtool/definitions/wireless.lua [deleted file]
applications/luci-statistics/src/view/admin_statistics/index.htm [deleted file]
applications/luci-statistics/src/view/admin_statistics/networkplugins.htm [deleted file]
applications/luci-statistics/src/view/admin_statistics/outputplugins.htm [deleted file]
applications/luci-statistics/src/view/admin_statistics/systemplugins.htm [deleted file]
applications/luci-statistics/src/view/public_statistics/graph.htm [deleted file]
build/module.mk
i18n/english/luasrc/i18n/cbi.en [new file with mode: 0644]
i18n/english/src/i18n/cbi.en [deleted file]
libs/cbi/luasrc/cbi.lua [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/dvalue.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/footer.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/full_valuefooter.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/full_valueheader.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/fvalue.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/header.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/lvalue.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/map.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/mvalue.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/nsection.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/tblsection.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/tiny_valuefooter.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/tiny_valueheader.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/tsection.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/ucisection.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/value.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/valuefooter.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/valueheader.htm [new file with mode: 0644]
libs/cbi/src/cbi.lua [deleted file]
libs/cbi/src/view/cbi/dvalue.htm [deleted file]
libs/cbi/src/view/cbi/footer.htm [deleted file]
libs/cbi/src/view/cbi/full_valuefooter.htm [deleted file]
libs/cbi/src/view/cbi/full_valueheader.htm [deleted file]
libs/cbi/src/view/cbi/fvalue.htm [deleted file]
libs/cbi/src/view/cbi/header.htm [deleted file]
libs/cbi/src/view/cbi/lvalue.htm [deleted file]
libs/cbi/src/view/cbi/map.htm [deleted file]
libs/cbi/src/view/cbi/mvalue.htm [deleted file]
libs/cbi/src/view/cbi/nsection.htm [deleted file]
libs/cbi/src/view/cbi/tblsection.htm [deleted file]
libs/cbi/src/view/cbi/tiny_valuefooter.htm [deleted file]
libs/cbi/src/view/cbi/tiny_valueheader.htm [deleted file]
libs/cbi/src/view/cbi/tsection.htm [deleted file]
libs/cbi/src/view/cbi/ucisection.htm [deleted file]
libs/cbi/src/view/cbi/value.htm [deleted file]
libs/cbi/src/view/cbi/valuefooter.htm [deleted file]
libs/cbi/src/view/cbi/valueheader.htm [deleted file]
libs/core/luasrc/bits.lua [new file with mode: 0644]
libs/core/luasrc/debug.lua [new file with mode: 0644]
libs/core/luasrc/fs.lua [new file with mode: 0644]
libs/core/luasrc/init.lua [new file with mode: 0644]
libs/core/luasrc/model/ipkg.lua [new file with mode: 0644]
libs/core/luasrc/model/uci.lua [new file with mode: 0644]
libs/core/luasrc/model/uci/libuci.lua [new file with mode: 0644]
libs/core/luasrc/model/uci/wrapper.lua [new file with mode: 0644]
libs/core/luasrc/sys.lua [new file with mode: 0644]
libs/core/luasrc/sys/iptparser.lua [new file with mode: 0644]
libs/core/luasrc/util.lua [new file with mode: 0644]
libs/core/src/bits.lua [deleted file]
libs/core/src/debug.lua [deleted file]
libs/core/src/fs.lua [deleted file]
libs/core/src/init.lua [deleted file]
libs/core/src/model/ipkg.lua [deleted file]
libs/core/src/model/uci.lua [deleted file]
libs/core/src/model/uci/libuci.lua [deleted file]
libs/core/src/model/uci/wrapper.lua [deleted file]
libs/core/src/sys.lua [deleted file]
libs/core/src/sys/iptparser.lua [deleted file]
libs/core/src/util.lua [deleted file]
libs/sgi-haserl/luasrc/sgi/haserl.lua [new file with mode: 0644]
libs/sgi-haserl/src/sgi/haserl.lua [deleted file]
libs/sgi-webuci/luasrc/sgi/webuci.lua [new file with mode: 0644]
libs/sgi-webuci/src/sgi/webuci.lua [deleted file]
libs/web/luasrc/config.lua [new file with mode: 0644]
libs/web/luasrc/dispatcher.lua [new file with mode: 0644]
libs/web/luasrc/http.lua [new file with mode: 0644]
libs/web/luasrc/i18n.lua [new file with mode: 0644]
libs/web/luasrc/template.lua [new file with mode: 0644]
libs/web/src/config.lua [deleted file]
libs/web/src/dispatcher.lua [deleted file]
libs/web/src/http.lua [deleted file]
libs/web/src/i18n.lua [deleted file]
libs/web/src/template.lua [deleted file]
modules/admin-core/luasrc/controller/admin/index.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/network.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/services.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/status.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/system.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/uci.lua [new file with mode: 0644]
modules/admin-core/luasrc/controller/admin/wifi.lua [new file with mode: 0644]
modules/admin-core/luasrc/i18n/admin_index.en [new file with mode: 0644]
modules/admin-core/luasrc/i18n/admin_uci.en [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_index/luci.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/dhcp.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/ifaces.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/ptp.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/qos.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/routes.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_network/vlan.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_services/dnsmasq.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_services/dropbear.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_services/httpd.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_services/olsrd.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_system/fstab.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_system/hostname.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_wifi/devices.lua [new file with mode: 0644]
modules/admin-core/luasrc/model/cbi/admin_wifi/networks.lua [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_index/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_network/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_services/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_status/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_status/syslog.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/editor.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/ipkg.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/packages.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/passwd.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/reboot.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/sshkeys.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_system/upgrade.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_uci/apply.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_uci/changes.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_uci/revert.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/admin_wifi/index.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/error404.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/error500.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/footer.htm [new file with mode: 0644]
modules/admin-core/luasrc/view/header.htm [new file with mode: 0644]
modules/admin-core/src/controller/admin/index.lua [deleted file]
modules/admin-core/src/controller/admin/network.lua [deleted file]
modules/admin-core/src/controller/admin/services.lua [deleted file]
modules/admin-core/src/controller/admin/status.lua [deleted file]
modules/admin-core/src/controller/admin/system.lua [deleted file]
modules/admin-core/src/controller/admin/uci.lua [deleted file]
modules/admin-core/src/controller/admin/wifi.lua [deleted file]
modules/admin-core/src/i18n/admin_index.en [deleted file]
modules/admin-core/src/i18n/admin_uci.en [deleted file]
modules/admin-core/src/model/cbi/admin_index/luci.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/dhcp.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/ifaces.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/ptp.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/qos.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/routes.lua [deleted file]
modules/admin-core/src/model/cbi/admin_network/vlan.lua [deleted file]
modules/admin-core/src/model/cbi/admin_services/dnsmasq.lua [deleted file]
modules/admin-core/src/model/cbi/admin_services/dropbear.lua [deleted file]
modules/admin-core/src/model/cbi/admin_services/httpd.lua [deleted file]
modules/admin-core/src/model/cbi/admin_services/olsrd.lua [deleted file]
modules/admin-core/src/model/cbi/admin_system/fstab.lua [deleted file]
modules/admin-core/src/model/cbi/admin_system/hostname.lua [deleted file]
modules/admin-core/src/model/cbi/admin_wifi/devices.lua [deleted file]
modules/admin-core/src/model/cbi/admin_wifi/networks.lua [deleted file]
modules/admin-core/src/view/admin_index/index.htm [deleted file]
modules/admin-core/src/view/admin_network/index.htm [deleted file]
modules/admin-core/src/view/admin_services/index.htm [deleted file]
modules/admin-core/src/view/admin_status/index.htm [deleted file]
modules/admin-core/src/view/admin_status/syslog.htm [deleted file]
modules/admin-core/src/view/admin_system/editor.htm [deleted file]
modules/admin-core/src/view/admin_system/index.htm [deleted file]
modules/admin-core/src/view/admin_system/ipkg.htm [deleted file]
modules/admin-core/src/view/admin_system/packages.htm [deleted file]
modules/admin-core/src/view/admin_system/passwd.htm [deleted file]
modules/admin-core/src/view/admin_system/reboot.htm [deleted file]
modules/admin-core/src/view/admin_system/sshkeys.htm [deleted file]
modules/admin-core/src/view/admin_system/upgrade.htm [deleted file]
modules/admin-core/src/view/admin_uci/apply.htm [deleted file]
modules/admin-core/src/view/admin_uci/changes.htm [deleted file]
modules/admin-core/src/view/admin_uci/revert.htm [deleted file]
modules/admin-core/src/view/admin_wifi/index.htm [deleted file]
modules/admin-core/src/view/error404.htm [deleted file]
modules/admin-core/src/view/error500.htm [deleted file]
modules/admin-core/src/view/footer.htm [deleted file]
modules/admin-core/src/view/header.htm [deleted file]
modules/freifunk/luasrc/controller/freifunk/freifunk.lua [new file with mode: 0644]
modules/freifunk/luasrc/controller/freifunk/luciinfo.lua [new file with mode: 0644]
modules/freifunk/luasrc/controller/freifunk/olsr.lua [new file with mode: 0644]
modules/freifunk/luasrc/i18n/admin_index_contact.en [new file with mode: 0644]
modules/freifunk/luasrc/model/cbi/freifunk/contact.lua [new file with mode: 0644]
modules/freifunk/luasrc/model/cbi/freifunk/freifunk.lua [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/error_olsr.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/hna.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/index.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/mid.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/routes.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk-olsr/topology.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk/contact.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/freifunk/index.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/public_status/index.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/public_status/iwscan.htm [new file with mode: 0644]
modules/freifunk/luasrc/view/public_status/routes.htm [new file with mode: 0644]
modules/freifunk/src/controller/freifunk/freifunk.lua [deleted file]
modules/freifunk/src/controller/freifunk/luciinfo.lua [deleted file]
modules/freifunk/src/controller/freifunk/olsr.lua [deleted file]
modules/freifunk/src/i18n/admin_index_contact.en [deleted file]
modules/freifunk/src/model/cbi/freifunk/contact.lua [deleted file]
modules/freifunk/src/model/cbi/freifunk/freifunk.lua [deleted file]
modules/freifunk/src/view/freifunk-olsr/error_olsr.htm [deleted file]
modules/freifunk/src/view/freifunk-olsr/hna.htm [deleted file]
modules/freifunk/src/view/freifunk-olsr/index.htm [deleted file]
modules/freifunk/src/view/freifunk-olsr/mid.htm [deleted file]
modules/freifunk/src/view/freifunk-olsr/routes.htm [deleted file]
modules/freifunk/src/view/freifunk-olsr/topology.htm [deleted file]
modules/freifunk/src/view/freifunk/contact.htm [deleted file]
modules/freifunk/src/view/freifunk/index.htm [deleted file]
modules/freifunk/src/view/public_status/index.htm [deleted file]
modules/freifunk/src/view/public_status/iwscan.htm [deleted file]
modules/freifunk/src/view/public_status/routes.htm [deleted file]

diff --git a/applications/luci-ffwizard-leipzig/luasrc/controller/luci_ffwizard_leipzig/wizard.lua b/applications/luci-ffwizard-leipzig/luasrc/controller/luci_ffwizard_leipzig/wizard.lua
new file mode 100644 (file)
index 0000000..4f2390b
--- /dev/null
@@ -0,0 +1,243 @@
+module("luci.controller.luci_ffwizard_leipzig.wizard", package.seeall)
+
+function index()
+       entry({"admin", "index", "wizard"}, action_wizard, "Freifunkassistent", 20)
+end
+
+
+function action_wizard()
+       if luci.http.formvalue("ip") then
+               return configure_freifunk()
+       end
+       
+       local ifaces = {}
+       local wldevs = luci.model.uci.sections("wireless")
+       
+       if wldevs then
+               for k, v in pairs(wldevs) do
+                       if v[".type"] == "wifi-device" then
+                               table.insert(ifaces, k)
+                       end
+               end
+       end
+       
+       luci.template.render("freifunk/wizard", {ifaces=ifaces})
+end
+
+function configure_freifunk()
+       local ip  = luci.http.formvalue("ip")
+       local uci = luci.model.uci.Session()
+       
+       -- Load UCI
+       uci:t_load("network")
+       uci:t_load("dhcp")
+       uci:t_load("freifunk")
+       uci:t_load("luci_splash")
+       uci:t_load("olsr")
+       uci:t_load("wireless")
+       uci:t_load("luci_fw")
+       
+       
+       -- Configure FF-Interface
+       uci:t_del("network", "ff")
+       uci:t_del("network", "ffdhcp")
+       
+       uci:t_set("network", "ff", nil, "interface")
+       uci:t_set("network", "ff", "type", "bridge")
+       uci:t_set("network", "ff", "proto", "static")
+       uci:t_set("network", "ff", "ipaddr", ip)
+       uci:t_set("network", "ff", "netmask", uci:t_get("freifunk", "community", "mask")) 
+       uci:t_set("network", "ff", "dns", uci:t_get("freifunk", "community", "dns")) 
+       
+       -- Reset Routing
+       local routing = uci:t_sections("luci_fw")
+       if routing then
+               for k, v in pairs(routing) do
+                       if v[".type"] == "routing" and (v.iface == "ff" or v.oface == "ff") then
+                               uci:t_del("luci_fw", k)
+                       end
+               end
+       
+               local int = uci:t_add("luci_fw", "routing")
+               uci:t_set("luci_fw", int, "iface", "ff")
+               uci:t_set("luci_fw", int, "oface", "ff")
+               uci:t_set("luci_fw", int, "fwd", "1")
+       end
+       
+       -- Routing from Internal
+       local iface = luci.http.formvalue("frominternal")
+       if iface and iface ~= "" then
+               local routing = uci:t_sections("luci_fw")
+               if routing then
+                       for k, v in pairs(routing) do
+                               if v[".type"] == "routing" and (v.iface == iface and v.oface == "ff") then
+                                       uci:t_del("luci_fw", k)
+                               end
+                       end
+               
+                       local int = uci:t_add("luci_fw", "routing")
+                       uci:t_set("luci_fw", int, "iface", iface)
+                       uci:t_set("luci_fw", int, "oface", "ff")
+                       uci:t_set("luci_fw", int, "fwd", "1")
+                       uci:t_set("luci_fw", int, "nat", "1")
+               end             
+       end     
+       
+       -- Routing to External
+       local iface = luci.http.formvalue("toexternal")
+       if iface and iface ~= "" then
+               local routing = uci:t_sections("luci_fw")
+               if routing then
+                       for k, v in pairs(routing) do
+                               if v[".type"] == "routing" and (v.oface == iface and v.iface == "ff") then
+                                       uci:t_del("luci_fw", k)
+                               end
+                       end
+               
+                       local int = uci:t_add("luci_fw", "routing")
+                       uci:t_set("luci_fw", int, "iface", "ff")
+                       uci:t_set("luci_fw", int, "oface", iface)
+                       uci:t_set("luci_fw", int, "fwd", "1")
+                       uci:t_set("luci_fw", int, "nat", "1")
+               end             
+       end     
+       
+       -- Configure DHCP
+       if luci.http.formvalue("dhcp") then
+               local dhcpnet = uci:t_get("freifunk", "community", "dhcp"):match("^([0-9]+)")
+               local dhcpip  = ip:gsub("^[0-9]+", dhcpnet)
+       
+               uci:t_set("network", "ffdhcp", nil, "interface")
+               uci:t_set("network", "ffdhcp", "proto", "static")
+               uci:t_set("network", "ffdhcp", "ifname", "br-ff:dhcp")
+               uci:t_set("network", "ffdhcp", "ipaddr", dhcpip)
+               uci:t_set("network", "ffdhcp", "netmask", uci:t_get("freifunk", "community", "dhcpmask"))
+               
+               local dhcp = uci:t_sections("dhcp")
+               if dhcp then
+                       for k, v in pairs(dhcp) do
+                               if v[".type"] == "dhcp" and v.interface == "ffdhcp" then
+                                       uci:t_del("dhcp", k)
+                               end
+                       end             
+                       
+                       local dhcpbeg = 48 + tonumber(ip:match("[0-9]+$")) * 4
+                       
+                       local sk = uci:t_add("dhcp", "dhcp")
+                       uci:t_set("dhcp", sk, "interface", "ffdhcp")
+                       uci:t_set("dhcp", sk, "start", dhcpbeg)
+                       uci:t_set("dhcp", sk, "limit", (dhcpbeg < 252) and 3 or 2)
+                       uci:t_set("dhcp", sk, "leasetime", "30m")
+               end 
+               
+               local splash = uci:t_sections("luci_splash")
+               if splash then
+                       for k, v in pairs(splash) do
+                               if v[".type"] == "iface" then
+                                       uci:t_del("luci_splash", k)
+                               end
+                       end             
+                       
+                       local sk = uci:t_add("luci_splash", "iface")
+                       uci:t_set("luci_splash", sk, "network", "ffdhcp")
+               end     
+               
+               local routing = uci:t_sections("luci_fw")
+               if routing then
+                       for k, v in pairs(routing) do
+                               if v[".type"] == "routing" and (v.iface == "ffdhcp" or v.oface == "ffdhcp") then
+                                       uci:t_del("luci_fw", k)
+                               end
+                       end
+                       
+                       local int = uci:t_add("luci_fw", "routing")
+                       uci:t_set("luci_fw", int, "iface", "ffdhcp")
+                       uci:t_set("luci_fw", int, "oface", "ff")
+                       uci:t_set("luci_fw", int, "nat", "1")                   
+                       
+                       local iface = luci.http.formvalue("toexternal")
+                       if iface and iface ~= "" then
+                               local int = uci:t_add("luci_fw", "routing")
+                               uci:t_set("luci_fw", int, "iface", "ffdhcp")
+                               uci:t_set("luci_fw", int, "oface", iface)
+                               uci:t_set("luci_fw", int, "nat", "1")                           
+                       end
+               end     
+       end
+       
+       -- Configure OLSR
+       if luci.http.formvalue("olsr") and uci:t_sections("olsr") then
+               for k, v in pairs(uci:t_sections("olsr")) do
+                       if v[".type"] == "Interface" or v[".type"] == "LoadPlugin" then
+                               uci:t_del("olsr", k)
+                       end
+               end
+               
+               if luci.http.formvalue("shareinet") then
+                       uci:t_set("olsr", "dyn_gw", nil, "LoadPlugin")
+                       uci:t_set("olsr", "dyn_gw", "Library", "olsrd_dyn_gw.so.0.4")
+               end
+               
+               uci:t_set("olsr", "nameservice", nil, "LoadPlugin")
+               uci:t_set("olsr", "nameservice", "Library", "olsrd_nameservice.so.0.3")
+               uci:t_set("olsr", "nameservice", "name", ip:gsub("%.", "-"))
+               uci:t_set("olsr", "nameservice", "hosts_file", "/var/etc/hosts")
+               uci:t_set("olsr", "nameservice", "suffix", ".olsr")
+               uci:t_set("olsr", "nameservice", "latlon_infile", "/tmp/latlon.txt")
+               
+               uci:t_set("olsr", "txtinfo", nil, "LoadPlugin")
+               uci:t_set("olsr", "txtinfo", "Library", "olsrd_txtinfo.so.0.1")
+               uci:t_set("olsr", "txtinfo", "Accept", "127.0.0.1")
+               
+               local oif = uci:t_add("olsr", "Interface")
+               uci:t_set("olsr", oif, "Interface", "ff")
+               uci:t_set("olsr", oif, "HelloInterval", "6.0")
+               uci:t_set("olsr", oif, "HelloValidityTime", "108.0")
+               uci:t_set("olsr", oif, "TcInterval", "4.0")
+               uci:t_set("olsr", oif, "TcValidityTime", "324.0")
+               uci:t_set("olsr", oif, "MidInterval", "18.0")
+               uci:t_set("olsr", oif, "MidValidityTime", "324.0")
+               uci:t_set("olsr", oif, "HnaInterval", "18.0")
+               uci:t_set("olsr", oif, "HnaValidityTime", "108.0")
+       end
+       
+       -- Configure Wifi
+       local wcfg = uci:t_sections("wireless")
+       if wcfg then
+               for iface, v in pairs(wcfg) do
+                       if v[".type"] == "wifi-device" and luci.http.formvalue("wifi."..iface) then
+                               -- Cleanup
+                               for k, j in pairs(wcfg) do
+                                       if j[".type"] == "wifi-iface" and j.device == iface then
+                                               uci:t_del("wireless", k)
+                                       end
+                               end
+                               
+                               uci:t_set("wireless", iface, "disabled", "0")
+                               uci:t_set("wireless", iface, "mode", "11g")
+                               uci:t_set("wireless", iface, "txantenna", 1)
+                               uci:t_set("wireless", iface, "rxantenna", 1)
+                               uci:t_set("wireless", iface, "channel", uci:t_get("freifunk", "community", "channel")) 
+                               
+                               local wif = uci:t_add("wireless", "wifi-iface")
+                               uci:t_set("wireless", wif, "device", iface)
+                               uci:t_set("wireless", wif, "network", "ff")
+                               uci:t_set("wireless", wif, "mode", "adhoc")
+                               uci:t_set("wireless", wif, "ssid", uci:t_get("freifunk", "community", "essid"))
+                               uci:t_set("wireless", wif, "bssid", uci:t_get("freifunk", "community", "bssid"))
+                               uci:t_set("wireless", wif, "txpower", 13)
+                       end
+               end
+       end
+       
+       -- Save UCI
+       uci:t_save("network")
+       uci:t_save("dhcp")
+       uci:t_save("freifunk")
+       uci:t_save("luci_splash")
+       uci:t_save("olsr")
+       uci:t_save("wireless")
+       uci:t_save("luci_fw")
+
+       luci.http.redirect(luci.dispatcher.build_url("admin", "uci", "changes"))
+end
\ No newline at end of file
diff --git a/applications/luci-ffwizard-leipzig/luasrc/view/freifunk/wizard.htm b/applications/luci-ffwizard-leipzig/luasrc/view/freifunk/wizard.htm
new file mode 100644 (file)
index 0000000..e3d6cb4
--- /dev/null
@@ -0,0 +1,58 @@
+<%+header%>
+<h1><%:ffwizard Freifunkassistent%></h1>
+<p><%:ffwizard1 Dieser Assistent konfiguriert den Router für die Benutzung im Freifunknetz%></p>
+<br />
+<form method="post" action="<%=controller%>/admin/index/wizard">
+       <div class="cbi-section-node">
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:ip IP-Adresse%>:&nbsp;
+                       <input type="text" size="20" name="ip" /></div>
+               </div>
+               <% for i, k in ipairs(ifaces) do %>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:wificfg Drahtlosgerät einrichten%>: <%=k%></div>
+                       <div class="cbi-value-field"><input type="checkbox" name="wifi.<%=k%>" value="1" checked="checked" /></div>
+               </div>
+               <% end %>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:cfgolsr OLSR konfigurieren%></div>
+                       <div class="cbi-value-field"><input type="checkbox" name="olsr" value="1" checked="checked" /></div>
+               </div>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:cfgdhcp Drahtlos DHCP konfigurieren%></div>
+                       <div class="cbi-value-field"><input type="checkbox" name="dhcp" value="1" checked="checked" /></div>
+               </div>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:cfginternal Erlaube Zugriff von internem Netzwerk%>:</div>
+                       <div class="cbi-value-field"><select name="frominternal">
+                               <option value=""></option>
+<% for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then %>
+<option value="<%=k%>"<% if k == "lan" then %> selected="selected"<% end %>><%=k%></option>
+<%     end
+end %>
+                       </select></div>
+               </div>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:cfgexternal Erlaube Zugriff auf externes Netzwerk%>:</div>
+                       <div class="cbi-value-field"><select name="toexternal">
+                               <option value=""></option>
+<% for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then %>
+<option value="<%=k%>"<% if k == "wan" then %> selected="selected"<% end %>><%=k%></option>
+<%     end
+end %>
+                       </select></div>
+               </div>
+               <div class="cbi-value">
+                       <div class="cbi-value-title"><%:shareinet Internetzugang ankündigen%></div>
+                       <div class="cbi-value-field"><input type="checkbox" name="shareinet" value="1" checked="checked" /></div>
+               </div>
+       </div>
+       <br />
+       <div>
+               <input type="submit" value="<%:configure Konfigurieren%>" />
+               <input type="reset" value="<%:reset Zurücksetzen%>" />
+       </div>
+</form> 
+<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-ffwizard-leipzig/src/controller/luci_ffwizard_leipzig/wizard.lua b/applications/luci-ffwizard-leipzig/src/controller/luci_ffwizard_leipzig/wizard.lua
deleted file mode 100644 (file)
index 4f2390b..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-module("luci.controller.luci_ffwizard_leipzig.wizard", package.seeall)
-
-function index()
-       entry({"admin", "index", "wizard"}, action_wizard, "Freifunkassistent", 20)
-end
-
-
-function action_wizard()
-       if luci.http.formvalue("ip") then
-               return configure_freifunk()
-       end
-       
-       local ifaces = {}
-       local wldevs = luci.model.uci.sections("wireless")
-       
-       if wldevs then
-               for k, v in pairs(wldevs) do
-                       if v[".type"] == "wifi-device" then
-                               table.insert(ifaces, k)
-                       end
-               end
-       end
-       
-       luci.template.render("freifunk/wizard", {ifaces=ifaces})
-end
-
-function configure_freifunk()
-       local ip  = luci.http.formvalue("ip")
-       local uci = luci.model.uci.Session()
-       
-       -- Load UCI
-       uci:t_load("network")
-       uci:t_load("dhcp")
-       uci:t_load("freifunk")
-       uci:t_load("luci_splash")
-       uci:t_load("olsr")
-       uci:t_load("wireless")
-       uci:t_load("luci_fw")
-       
-       
-       -- Configure FF-Interface
-       uci:t_del("network", "ff")
-       uci:t_del("network", "ffdhcp")
-       
-       uci:t_set("network", "ff", nil, "interface")
-       uci:t_set("network", "ff", "type", "bridge")
-       uci:t_set("network", "ff", "proto", "static")
-       uci:t_set("network", "ff", "ipaddr", ip)
-       uci:t_set("network", "ff", "netmask", uci:t_get("freifunk", "community", "mask")) 
-       uci:t_set("network", "ff", "dns", uci:t_get("freifunk", "community", "dns")) 
-       
-       -- Reset Routing
-       local routing = uci:t_sections("luci_fw")
-       if routing then
-               for k, v in pairs(routing) do
-                       if v[".type"] == "routing" and (v.iface == "ff" or v.oface == "ff") then
-                               uci:t_del("luci_fw", k)
-                       end
-               end
-       
-               local int = uci:t_add("luci_fw", "routing")
-               uci:t_set("luci_fw", int, "iface", "ff")
-               uci:t_set("luci_fw", int, "oface", "ff")
-               uci:t_set("luci_fw", int, "fwd", "1")
-       end
-       
-       -- Routing from Internal
-       local iface = luci.http.formvalue("frominternal")
-       if iface and iface ~= "" then
-               local routing = uci:t_sections("luci_fw")
-               if routing then
-                       for k, v in pairs(routing) do
-                               if v[".type"] == "routing" and (v.iface == iface and v.oface == "ff") then
-                                       uci:t_del("luci_fw", k)
-                               end
-                       end
-               
-                       local int = uci:t_add("luci_fw", "routing")
-                       uci:t_set("luci_fw", int, "iface", iface)
-                       uci:t_set("luci_fw", int, "oface", "ff")
-                       uci:t_set("luci_fw", int, "fwd", "1")
-                       uci:t_set("luci_fw", int, "nat", "1")
-               end             
-       end     
-       
-       -- Routing to External
-       local iface = luci.http.formvalue("toexternal")
-       if iface and iface ~= "" then
-               local routing = uci:t_sections("luci_fw")
-               if routing then
-                       for k, v in pairs(routing) do
-                               if v[".type"] == "routing" and (v.oface == iface and v.iface == "ff") then
-                                       uci:t_del("luci_fw", k)
-                               end
-                       end
-               
-                       local int = uci:t_add("luci_fw", "routing")
-                       uci:t_set("luci_fw", int, "iface", "ff")
-                       uci:t_set("luci_fw", int, "oface", iface)
-                       uci:t_set("luci_fw", int, "fwd", "1")
-                       uci:t_set("luci_fw", int, "nat", "1")
-               end             
-       end     
-       
-       -- Configure DHCP
-       if luci.http.formvalue("dhcp") then
-               local dhcpnet = uci:t_get("freifunk", "community", "dhcp"):match("^([0-9]+)")
-               local dhcpip  = ip:gsub("^[0-9]+", dhcpnet)
-       
-               uci:t_set("network", "ffdhcp", nil, "interface")
-               uci:t_set("network", "ffdhcp", "proto", "static")
-               uci:t_set("network", "ffdhcp", "ifname", "br-ff:dhcp")
-               uci:t_set("network", "ffdhcp", "ipaddr", dhcpip)
-               uci:t_set("network", "ffdhcp", "netmask", uci:t_get("freifunk", "community", "dhcpmask"))
-               
-               local dhcp = uci:t_sections("dhcp")
-               if dhcp then
-                       for k, v in pairs(dhcp) do
-                               if v[".type"] == "dhcp" and v.interface == "ffdhcp" then
-                                       uci:t_del("dhcp", k)
-                               end
-                       end             
-                       
-                       local dhcpbeg = 48 + tonumber(ip:match("[0-9]+$")) * 4
-                       
-                       local sk = uci:t_add("dhcp", "dhcp")
-                       uci:t_set("dhcp", sk, "interface", "ffdhcp")
-                       uci:t_set("dhcp", sk, "start", dhcpbeg)
-                       uci:t_set("dhcp", sk, "limit", (dhcpbeg < 252) and 3 or 2)
-                       uci:t_set("dhcp", sk, "leasetime", "30m")
-               end 
-               
-               local splash = uci:t_sections("luci_splash")
-               if splash then
-                       for k, v in pairs(splash) do
-                               if v[".type"] == "iface" then
-                                       uci:t_del("luci_splash", k)
-                               end
-                       end             
-                       
-                       local sk = uci:t_add("luci_splash", "iface")
-                       uci:t_set("luci_splash", sk, "network", "ffdhcp")
-               end     
-               
-               local routing = uci:t_sections("luci_fw")
-               if routing then
-                       for k, v in pairs(routing) do
-                               if v[".type"] == "routing" and (v.iface == "ffdhcp" or v.oface == "ffdhcp") then
-                                       uci:t_del("luci_fw", k)
-                               end
-                       end
-                       
-                       local int = uci:t_add("luci_fw", "routing")
-                       uci:t_set("luci_fw", int, "iface", "ffdhcp")
-                       uci:t_set("luci_fw", int, "oface", "ff")
-                       uci:t_set("luci_fw", int, "nat", "1")                   
-                       
-                       local iface = luci.http.formvalue("toexternal")
-                       if iface and iface ~= "" then
-                               local int = uci:t_add("luci_fw", "routing")
-                               uci:t_set("luci_fw", int, "iface", "ffdhcp")
-                               uci:t_set("luci_fw", int, "oface", iface)
-                               uci:t_set("luci_fw", int, "nat", "1")                           
-                       end
-               end     
-       end
-       
-       -- Configure OLSR
-       if luci.http.formvalue("olsr") and uci:t_sections("olsr") then
-               for k, v in pairs(uci:t_sections("olsr")) do
-                       if v[".type"] == "Interface" or v[".type"] == "LoadPlugin" then
-                               uci:t_del("olsr", k)
-                       end
-               end
-               
-               if luci.http.formvalue("shareinet") then
-                       uci:t_set("olsr", "dyn_gw", nil, "LoadPlugin")
-                       uci:t_set("olsr", "dyn_gw", "Library", "olsrd_dyn_gw.so.0.4")
-               end
-               
-               uci:t_set("olsr", "nameservice", nil, "LoadPlugin")
-               uci:t_set("olsr", "nameservice", "Library", "olsrd_nameservice.so.0.3")
-               uci:t_set("olsr", "nameservice", "name", ip:gsub("%.", "-"))
-               uci:t_set("olsr", "nameservice", "hosts_file", "/var/etc/hosts")
-               uci:t_set("olsr", "nameservice", "suffix", ".olsr")
-               uci:t_set("olsr", "nameservice", "latlon_infile", "/tmp/latlon.txt")
-               
-               uci:t_set("olsr", "txtinfo", nil, "LoadPlugin")
-               uci:t_set("olsr", "txtinfo", "Library", "olsrd_txtinfo.so.0.1")
-               uci:t_set("olsr", "txtinfo", "Accept", "127.0.0.1")
-               
-               local oif = uci:t_add("olsr", "Interface")
-               uci:t_set("olsr", oif, "Interface", "ff")
-               uci:t_set("olsr", oif, "HelloInterval", "6.0")
-               uci:t_set("olsr", oif, "HelloValidityTime", "108.0")
-               uci:t_set("olsr", oif, "TcInterval", "4.0")
-               uci:t_set("olsr", oif, "TcValidityTime", "324.0")
-               uci:t_set("olsr", oif, "MidInterval", "18.0")
-               uci:t_set("olsr", oif, "MidValidityTime", "324.0")
-               uci:t_set("olsr", oif, "HnaInterval", "18.0")
-               uci:t_set("olsr", oif, "HnaValidityTime", "108.0")
-       end
-       
-       -- Configure Wifi
-       local wcfg = uci:t_sections("wireless")
-       if wcfg then
-               for iface, v in pairs(wcfg) do
-                       if v[".type"] == "wifi-device" and luci.http.formvalue("wifi."..iface) then
-                               -- Cleanup
-                               for k, j in pairs(wcfg) do
-                                       if j[".type"] == "wifi-iface" and j.device == iface then
-                                               uci:t_del("wireless", k)
-                                       end
-                               end
-                               
-                               uci:t_set("wireless", iface, "disabled", "0")
-                               uci:t_set("wireless", iface, "mode", "11g")
-                               uci:t_set("wireless", iface, "txantenna", 1)
-                               uci:t_set("wireless", iface, "rxantenna", 1)
-                               uci:t_set("wireless", iface, "channel", uci:t_get("freifunk", "community", "channel")) 
-                               
-                               local wif = uci:t_add("wireless", "wifi-iface")
-                               uci:t_set("wireless", wif, "device", iface)
-                               uci:t_set("wireless", wif, "network", "ff")
-                               uci:t_set("wireless", wif, "mode", "adhoc")
-                               uci:t_set("wireless", wif, "ssid", uci:t_get("freifunk", "community", "essid"))
-                               uci:t_set("wireless", wif, "bssid", uci:t_get("freifunk", "community", "bssid"))
-                               uci:t_set("wireless", wif, "txpower", 13)
-                       end
-               end
-       end
-       
-       -- Save UCI
-       uci:t_save("network")
-       uci:t_save("dhcp")
-       uci:t_save("freifunk")
-       uci:t_save("luci_splash")
-       uci:t_save("olsr")
-       uci:t_save("wireless")
-       uci:t_save("luci_fw")
-
-       luci.http.redirect(luci.dispatcher.build_url("admin", "uci", "changes"))
-end
\ No newline at end of file
diff --git a/applications/luci-ffwizard-leipzig/src/view/freifunk/wizard.htm b/applications/luci-ffwizard-leipzig/src/view/freifunk/wizard.htm
deleted file mode 100644 (file)
index e3d6cb4..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<%+header%>
-<h1><%:ffwizard Freifunkassistent%></h1>
-<p><%:ffwizard1 Dieser Assistent konfiguriert den Router für die Benutzung im Freifunknetz%></p>
-<br />
-<form method="post" action="<%=controller%>/admin/index/wizard">
-       <div class="cbi-section-node">
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:ip IP-Adresse%>:&nbsp;
-                       <input type="text" size="20" name="ip" /></div>
-               </div>
-               <% for i, k in ipairs(ifaces) do %>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:wificfg Drahtlosgerät einrichten%>: <%=k%></div>
-                       <div class="cbi-value-field"><input type="checkbox" name="wifi.<%=k%>" value="1" checked="checked" /></div>
-               </div>
-               <% end %>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:cfgolsr OLSR konfigurieren%></div>
-                       <div class="cbi-value-field"><input type="checkbox" name="olsr" value="1" checked="checked" /></div>
-               </div>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:cfgdhcp Drahtlos DHCP konfigurieren%></div>
-                       <div class="cbi-value-field"><input type="checkbox" name="dhcp" value="1" checked="checked" /></div>
-               </div>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:cfginternal Erlaube Zugriff von internem Netzwerk%>:</div>
-                       <div class="cbi-value-field"><select name="frominternal">
-                               <option value=""></option>
-<% for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then %>
-<option value="<%=k%>"<% if k == "lan" then %> selected="selected"<% end %>><%=k%></option>
-<%     end
-end %>
-                       </select></div>
-               </div>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:cfgexternal Erlaube Zugriff auf externes Netzwerk%>:</div>
-                       <div class="cbi-value-field"><select name="toexternal">
-                               <option value=""></option>
-<% for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then %>
-<option value="<%=k%>"<% if k == "wan" then %> selected="selected"<% end %>><%=k%></option>
-<%     end
-end %>
-                       </select></div>
-               </div>
-               <div class="cbi-value">
-                       <div class="cbi-value-title"><%:shareinet Internetzugang ankündigen%></div>
-                       <div class="cbi-value-field"><input type="checkbox" name="shareinet" value="1" checked="checked" /></div>
-               </div>
-       </div>
-       <br />
-       <div>
-               <input type="submit" value="<%:configure Konfigurieren%>" />
-               <input type="reset" value="<%:reset Zurücksetzen%>" />
-       </div>
-</form> 
-<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-fw/luasrc/controller/luci_fw/luci_fw.lua b/applications/luci-fw/luasrc/controller/luci_fw/luci_fw.lua
new file mode 100644 (file)
index 0000000..4190970
--- /dev/null
@@ -0,0 +1,7 @@
+module("luci.controller.luci_fw.luci_fw", package.seeall)
+
+function index()
+       entry({"admin", "network", "portfw"}, cbi("luci_fw/portfw"), "Portweiterleitung", 70)
+       entry({"admin", "network", "routing"}, cbi("luci_fw/routing"), "Routing", 72)
+       entry({"admin", "network", "firewall"}, cbi("luci_fw/firewall"), "Firewall", 74)
+end
\ No newline at end of file
diff --git a/applications/luci-fw/luasrc/model/cbi/luci_fw/firewall.lua b/applications/luci-fw/luasrc/model/cbi/luci_fw/firewall.lua
new file mode 100644 (file)
index 0000000..f58f74c
--- /dev/null
@@ -0,0 +1,73 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("luci_fw", "Firewall", [[Mit Hilfe der Firewall können Zugriffe auf das Netzwerk
+erlaubt, verboten oder umgeleitet werden.]])
+
+s = m:section(TypedSection, "rule")
+s.addremove = true
+s.anonymous = true
+
+chain = s:option(ListValue, "chain", "Kette")
+chain:value("forward", "Forward")
+chain:value("input", "Input")
+chain:value("output", "Output")
+chain:value("prerouting", "Prerouting")
+chain:value("postrouting", "Postrouting")
+
+iface = s:option(ListValue, "iface", "Eingangsschnittstelle")
+iface.optional = true
+
+oface = s:option(ListValue, "oface", "Ausgangsschnittstelle")
+oface.optional = true
+
+for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then
+               iface:value(k)
+               oface:value(k)
+       end
+end
+
+proto = s:option(ListValue, "proto", "Protokoll")
+proto.optional = true
+proto:value("")
+proto:value("tcp", "TCP")
+proto:value("udp", "UDP")
+
+s:option(Value, "source", "Quelladresse").optional = true
+s:option(Value, "destination", "Zieladresse").optional = true
+s:option(Value, "mac", "MAC-Adresse").optional = true
+
+sport = s:option(Value, "sport", "Quellport")
+sport.optional = true
+sport:depends("proto", "tcp")
+sport:depends("proto", "udp")
+
+dport = s:option(Value, "dport", "Zielport")
+dport.optional = true
+dport:depends("proto", "tcp")
+dport:depends("proto", "udp")
+
+tosrc = s:option(Value, "tosrc", "Neue Quelladresse [SNAT]")
+tosrc.optional = true
+tosrc:depends("jump", "SNAT")
+
+tosrc = s:option(Value, "todest", "Neue Zieladresse [DNAT]")
+tosrc.optional = true
+tosrc:depends("jump", "DNAT")
+
+jump = s:option(ListValue, "jump", "Aktion")
+jump.rmempty = true
+jump:value("", "")
+jump:value("ACCEPT", "annehmen (ACCEPT)")
+jump:value("REJECT", "zurückweisen (REJECT)")
+jump:value("DROP", "verwerfen (DROP)")
+jump:value("LOG", "protokollieren (LOG)")
+jump:value("DNAT", "Ziel umschreiben (DNAT) [nur Prerouting]")
+jump:value("MASQUERADE", "maskieren (MASQUERADE) [nur Postrouting]")
+jump:value("SNAT", "Quelle umschreiben (SNAT) [nur Postrouting]")
+
+
+add = s:option(Value, "command", "Eigener Befehl")
+add.size = 50
+add.rmempty = true
+
+return m
diff --git a/applications/luci-fw/luasrc/model/cbi/luci_fw/portfw.lua b/applications/luci-fw/luasrc/model/cbi/luci_fw/portfw.lua
new file mode 100644 (file)
index 0000000..e4f4fa2
--- /dev/null
@@ -0,0 +1,28 @@
+-- ToDo: Translate, Add descriptions and help texts
+require("luci.sys")
+m = Map("luci_fw", "Portweiterleitung", [[Portweiterleitungen ermöglichen es interne
+Netzwerkdienste von einem anderen externen Netzwerk aus erreichbar zu machen.]])
+
+s = m:section(TypedSection, "portfw")
+s.template  = "cbi/tblsection"
+s.addremove = true
+s.anonymous = true
+
+iface = s:option(ListValue, "iface", "Schnittstelle", "Externe Schnittstelle")
+iface.default = "wan"
+for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then
+               iface:value(k)
+       end
+end
+
+proto = s:option(ListValue, "proto", "Protokoll")
+proto:value("tcp", "TCP")
+proto:value("udp", "UDP")
+proto:value("tcpudp", "TCP + UDP")
+
+dport = s:option(Value, "dport", "Externer Port", "Port[:Endport]")
+
+to = s:option(Value, "to", "Interne Adresse", "IP-Adresse[:Zielport[-Zielendport]]")
+
+return m
diff --git a/applications/luci-fw/luasrc/model/cbi/luci_fw/routing.lua b/applications/luci-fw/luasrc/model/cbi/luci_fw/routing.lua
new file mode 100644 (file)
index 0000000..364e69f
--- /dev/null
@@ -0,0 +1,28 @@
+-- ToDo: Translate, Add descriptions and help texts
+require("luci.sys")
+m = Map("luci_fw", "Routing", [[An dieser Stelle wird festlegt, welcher Netzverkehr zwischen einzelnen
+Schnittstellen erlaubt werden soll. Es werden jeweils nur neue Verbindungen
+betrachtet, d.h. Pakete von aufgebauten oder zugehörigen Verbindungen werden automatisch in beide Richtungen
+akzeptiert, auch wenn das Feld "beide Richtungen" nicht explizit gesetzt ist.
+NAT ermöglicht Adressübersetzung.]])
+
+s = m:section(TypedSection, "routing")
+s.template  = "cbi/tblsection"
+s.addremove = true
+s.anonymous = true
+
+iface = s:option(ListValue, "iface", "Eingang", "Eingangsschnittstelle")
+oface = s:option(ListValue, "oface", "Ausgang", "Ausgangsschnittstelle")
+
+for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then
+               iface:value(k)
+               oface:value(k)
+       end
+end
+
+s:option(Flag, "fwd", "FWD", "weiterleiten").rmempty = true
+s:option(Flag, "nat", "NAT", "übersetzen").rmempty = true
+s:option(Flag, "bidi", "<->", "beide Richtungen").rmempty = true
+
+return m
diff --git a/applications/luci-fw/src/controller/luci_fw/luci_fw.lua b/applications/luci-fw/src/controller/luci_fw/luci_fw.lua
deleted file mode 100644 (file)
index 4190970..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-module("luci.controller.luci_fw.luci_fw", package.seeall)
-
-function index()
-       entry({"admin", "network", "portfw"}, cbi("luci_fw/portfw"), "Portweiterleitung", 70)
-       entry({"admin", "network", "routing"}, cbi("luci_fw/routing"), "Routing", 72)
-       entry({"admin", "network", "firewall"}, cbi("luci_fw/firewall"), "Firewall", 74)
-end
\ No newline at end of file
diff --git a/applications/luci-fw/src/model/cbi/luci_fw/firewall.lua b/applications/luci-fw/src/model/cbi/luci_fw/firewall.lua
deleted file mode 100644 (file)
index f58f74c..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
--- ToDo: Translate, Add descriptions and help texts
-m = Map("luci_fw", "Firewall", [[Mit Hilfe der Firewall können Zugriffe auf das Netzwerk
-erlaubt, verboten oder umgeleitet werden.]])
-
-s = m:section(TypedSection, "rule")
-s.addremove = true
-s.anonymous = true
-
-chain = s:option(ListValue, "chain", "Kette")
-chain:value("forward", "Forward")
-chain:value("input", "Input")
-chain:value("output", "Output")
-chain:value("prerouting", "Prerouting")
-chain:value("postrouting", "Postrouting")
-
-iface = s:option(ListValue, "iface", "Eingangsschnittstelle")
-iface.optional = true
-
-oface = s:option(ListValue, "oface", "Ausgangsschnittstelle")
-oface.optional = true
-
-for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then
-               iface:value(k)
-               oface:value(k)
-       end
-end
-
-proto = s:option(ListValue, "proto", "Protokoll")
-proto.optional = true
-proto:value("")
-proto:value("tcp", "TCP")
-proto:value("udp", "UDP")
-
-s:option(Value, "source", "Quelladresse").optional = true
-s:option(Value, "destination", "Zieladresse").optional = true
-s:option(Value, "mac", "MAC-Adresse").optional = true
-
-sport = s:option(Value, "sport", "Quellport")
-sport.optional = true
-sport:depends("proto", "tcp")
-sport:depends("proto", "udp")
-
-dport = s:option(Value, "dport", "Zielport")
-dport.optional = true
-dport:depends("proto", "tcp")
-dport:depends("proto", "udp")
-
-tosrc = s:option(Value, "tosrc", "Neue Quelladresse [SNAT]")
-tosrc.optional = true
-tosrc:depends("jump", "SNAT")
-
-tosrc = s:option(Value, "todest", "Neue Zieladresse [DNAT]")
-tosrc.optional = true
-tosrc:depends("jump", "DNAT")
-
-jump = s:option(ListValue, "jump", "Aktion")
-jump.rmempty = true
-jump:value("", "")
-jump:value("ACCEPT", "annehmen (ACCEPT)")
-jump:value("REJECT", "zurückweisen (REJECT)")
-jump:value("DROP", "verwerfen (DROP)")
-jump:value("LOG", "protokollieren (LOG)")
-jump:value("DNAT", "Ziel umschreiben (DNAT) [nur Prerouting]")
-jump:value("MASQUERADE", "maskieren (MASQUERADE) [nur Postrouting]")
-jump:value("SNAT", "Quelle umschreiben (SNAT) [nur Postrouting]")
-
-
-add = s:option(Value, "command", "Eigener Befehl")
-add.size = 50
-add.rmempty = true
-
-return m
diff --git a/applications/luci-fw/src/model/cbi/luci_fw/portfw.lua b/applications/luci-fw/src/model/cbi/luci_fw/portfw.lua
deleted file mode 100644 (file)
index e4f4fa2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
--- ToDo: Translate, Add descriptions and help texts
-require("luci.sys")
-m = Map("luci_fw", "Portweiterleitung", [[Portweiterleitungen ermöglichen es interne
-Netzwerkdienste von einem anderen externen Netzwerk aus erreichbar zu machen.]])
-
-s = m:section(TypedSection, "portfw")
-s.template  = "cbi/tblsection"
-s.addremove = true
-s.anonymous = true
-
-iface = s:option(ListValue, "iface", "Schnittstelle", "Externe Schnittstelle")
-iface.default = "wan"
-for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then
-               iface:value(k)
-       end
-end
-
-proto = s:option(ListValue, "proto", "Protokoll")
-proto:value("tcp", "TCP")
-proto:value("udp", "UDP")
-proto:value("tcpudp", "TCP + UDP")
-
-dport = s:option(Value, "dport", "Externer Port", "Port[:Endport]")
-
-to = s:option(Value, "to", "Interne Adresse", "IP-Adresse[:Zielport[-Zielendport]]")
-
-return m
diff --git a/applications/luci-fw/src/model/cbi/luci_fw/routing.lua b/applications/luci-fw/src/model/cbi/luci_fw/routing.lua
deleted file mode 100644 (file)
index 364e69f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
--- ToDo: Translate, Add descriptions and help texts
-require("luci.sys")
-m = Map("luci_fw", "Routing", [[An dieser Stelle wird festlegt, welcher Netzverkehr zwischen einzelnen
-Schnittstellen erlaubt werden soll. Es werden jeweils nur neue Verbindungen
-betrachtet, d.h. Pakete von aufgebauten oder zugehörigen Verbindungen werden automatisch in beide Richtungen
-akzeptiert, auch wenn das Feld "beide Richtungen" nicht explizit gesetzt ist.
-NAT ermöglicht Adressübersetzung.]])
-
-s = m:section(TypedSection, "routing")
-s.template  = "cbi/tblsection"
-s.addremove = true
-s.anonymous = true
-
-iface = s:option(ListValue, "iface", "Eingang", "Eingangsschnittstelle")
-oface = s:option(ListValue, "oface", "Ausgang", "Ausgangsschnittstelle")
-
-for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then
-               iface:value(k)
-               oface:value(k)
-       end
-end
-
-s:option(Flag, "fwd", "FWD", "weiterleiten").rmempty = true
-s:option(Flag, "nat", "NAT", "übersetzen").rmempty = true
-s:option(Flag, "bidi", "<->", "beide Richtungen").rmempty = true
-
-return m
diff --git a/applications/luci-splash/luasrc/controller/splash/splash.lua b/applications/luci-splash/luasrc/controller/splash/splash.lua
new file mode 100644 (file)
index 0000000..544f1e8
--- /dev/null
@@ -0,0 +1,30 @@
+module("luci.controller.splash.splash", package.seeall)
+
+function index()
+       local page = node("admin", "services", "splash")
+       page.target = cbi("splash/splash")
+       page.title  = "Client-Splash"
+
+       node("splash", "splash", "activate").target = action_activate
+       node("splash", "splash", "allowed").target  = action_allowed
+       node("splash", "splash", "unknown").target  = action_unknown
+       node("splash", "splash", "splash").target   = template("splash_splash/splash")
+end
+
+function action_activate()
+       local mac = luci.sys.net.ip4mac(luci.http.env.REMOTE_ADDR)
+       if mac and luci.http.formvalue("accept") then
+               os.execute("luci-splash add "..mac.." >/dev/null 2>&1")
+               luci.http.redirect(luci.model.uci.get("freifunk", "community", "homepage"))
+       else
+               luci.http.redirect(luci.dispatcher.build_url())
+       end
+end
+
+function action_allowed()
+       luci.http.redirect(luci.dispatcher.build_url())
+end
+
+function action_unknown()
+       luci.http.redirect(luci.dispatcher.build_url())
+end
\ No newline at end of file
diff --git a/applications/luci-splash/luasrc/model/cbi/splash/splash.lua b/applications/luci-splash/luasrc/model/cbi/splash/splash.lua
new file mode 100644 (file)
index 0000000..6050ac8
--- /dev/null
@@ -0,0 +1,30 @@
+-- ToDo: Translate, Add descriptions and help texts
+require("luci.model.uci")
+
+m = Map("luci_splash", "Client-Splash", [[Client-Splash ist das Freifunk Hotspot-Authentifizierungs-System.]])
+
+s = m:section(NamedSection, "general", "core", "Allgemein")
+s:option(Value, "leasetime", "Freigabezeit", "h")
+
+s = m:section(TypedSection, "iface", "Schnittstellen")
+s.addremove = true
+s.anonymous = true
+
+iface = s:option(ListValue, "network", "Schnittstelle")
+for k, v in pairs(luci.model.uci.sections("network")) do
+       if v[".type"] == "interface" and k ~= "loopback" then
+               iface:value(k)
+       end
+end
+
+s = m:section(TypedSection, "whitelist", "Automatische Freigabe")
+s.addremove = true
+s.anonymous = true
+s:option(Value, "mac", "MAC-Adresse")
+
+s = m:section(TypedSection, "blacklist", "Automatische Sperrung")
+s.addremove = true
+s.anonymous = true
+s:option(Value, "mac", "MAC-Adresse")
+       
+return m
\ No newline at end of file
diff --git a/applications/luci-splash/luasrc/view/splash/splash.htm b/applications/luci-splash/luasrc/view/splash/splash.htm
new file mode 100644 (file)
index 0000000..22631e0
--- /dev/null
@@ -0,0 +1,34 @@
+<%
+local c = luci.model.uci.sections("freifunk").community
+
+<h1><%:welcome Willkommen%>!</h1>
+<p>
+Du bist jetzt mit dem freien Funknetz 
+<a href="<%=c.homepage%>"><%=c.name%></a> verbunden.<br />
+Wir sind ein experimentelles Gemeinschaftsnetzwerk, aber kein Internetanbieter.
+</p>
+
+<p>
+Ein Zugang <strong>ins Internet</strong> ist trotzdem möglich,
+da einige Freifunker ihre privaten Internetzugänge zur Verfügung stellen.
+Diese Zugänge müssen sich hier alle teilen.
+Bitte sei Dir dessen bewusst und verhalte Dich dementsprechend:
+<ul>
+<li>bitte <strong>keine Filesharing-Programme</strong> betreiben!</li>
+<li>bitte <strong>keine unnötigen Downloads oder Streams</strong> starten!</li>
+<li>bitte <strong>keine illegalen Aktivitäten</strong>!</li>
+</ul>
+</p>
+
+<p>
+Wenn Du unsere Idee gut findest, kannst Du uns unterstützen:
+<ul>
+<li><a href="<%=c.homepage%>">Werde selbst Freifunker oder teile deinen Internetzugang!</a></li>
+<li>Betreibe deine anderen WLAN-Geräte <em>NICHT</em> auf den Kanälen 1-5, diese stören oft unser Netz.</li>
+</ul>
+</p>
+
+<p>
+Mit einem Klick auf <em><%:accept Annehmen%></em> kannst du für <%=c.leasetime%> Stunden
+über unser Netz das Internet verwenden. Dann wirst du erneut aufgefordet, diese Bedingungen zu akzeptieren.
+</p>
\ No newline at end of file
diff --git a/applications/luci-splash/luasrc/view/splash_splash/index.htm b/applications/luci-splash/luasrc/view/splash_splash/index.htm
new file mode 100644 (file)
index 0000000..75aa026
--- /dev/null
@@ -0,0 +1,2 @@
+<%+header%>
+<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-splash/luasrc/view/splash_splash/splash.htm b/applications/luci-splash/luasrc/view/splash_splash/splash.htm
new file mode 100644 (file)
index 0000000..9c16580
--- /dev/null
@@ -0,0 +1,7 @@
+<%+header%>
+<%+splash/splash%>
+<form method="get" action="<%=controller%>/splash/splash/activate">
+       <input type="submit" value="<%:decline Ablehnen%>" />
+       <input type="submit" name="accept" value="<%:accept Annehmen%>" />
+</form>
+<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-splash/src/controller/splash/splash.lua b/applications/luci-splash/src/controller/splash/splash.lua
deleted file mode 100644 (file)
index 544f1e8..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-module("luci.controller.splash.splash", package.seeall)
-
-function index()
-       local page = node("admin", "services", "splash")
-       page.target = cbi("splash/splash")
-       page.title  = "Client-Splash"
-
-       node("splash", "splash", "activate").target = action_activate
-       node("splash", "splash", "allowed").target  = action_allowed
-       node("splash", "splash", "unknown").target  = action_unknown
-       node("splash", "splash", "splash").target   = template("splash_splash/splash")
-end
-
-function action_activate()
-       local mac = luci.sys.net.ip4mac(luci.http.env.REMOTE_ADDR)
-       if mac and luci.http.formvalue("accept") then
-               os.execute("luci-splash add "..mac.." >/dev/null 2>&1")
-               luci.http.redirect(luci.model.uci.get("freifunk", "community", "homepage"))
-       else
-               luci.http.redirect(luci.dispatcher.build_url())
-       end
-end
-
-function action_allowed()
-       luci.http.redirect(luci.dispatcher.build_url())
-end
-
-function action_unknown()
-       luci.http.redirect(luci.dispatcher.build_url())
-end
\ No newline at end of file
diff --git a/applications/luci-splash/src/model/cbi/splash/splash.lua b/applications/luci-splash/src/model/cbi/splash/splash.lua
deleted file mode 100644 (file)
index 6050ac8..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
--- ToDo: Translate, Add descriptions and help texts
-require("luci.model.uci")
-
-m = Map("luci_splash", "Client-Splash", [[Client-Splash ist das Freifunk Hotspot-Authentifizierungs-System.]])
-
-s = m:section(NamedSection, "general", "core", "Allgemein")
-s:option(Value, "leasetime", "Freigabezeit", "h")
-
-s = m:section(TypedSection, "iface", "Schnittstellen")
-s.addremove = true
-s.anonymous = true
-
-iface = s:option(ListValue, "network", "Schnittstelle")
-for k, v in pairs(luci.model.uci.sections("network")) do
-       if v[".type"] == "interface" and k ~= "loopback" then
-               iface:value(k)
-       end
-end
-
-s = m:section(TypedSection, "whitelist", "Automatische Freigabe")
-s.addremove = true
-s.anonymous = true
-s:option(Value, "mac", "MAC-Adresse")
-
-s = m:section(TypedSection, "blacklist", "Automatische Sperrung")
-s.addremove = true
-s.anonymous = true
-s:option(Value, "mac", "MAC-Adresse")
-       
-return m
\ No newline at end of file
diff --git a/applications/luci-splash/src/view/splash/splash.htm b/applications/luci-splash/src/view/splash/splash.htm
deleted file mode 100644 (file)
index 22631e0..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<%
-local c = luci.model.uci.sections("freifunk").community
-
-<h1><%:welcome Willkommen%>!</h1>
-<p>
-Du bist jetzt mit dem freien Funknetz 
-<a href="<%=c.homepage%>"><%=c.name%></a> verbunden.<br />
-Wir sind ein experimentelles Gemeinschaftsnetzwerk, aber kein Internetanbieter.
-</p>
-
-<p>
-Ein Zugang <strong>ins Internet</strong> ist trotzdem möglich,
-da einige Freifunker ihre privaten Internetzugänge zur Verfügung stellen.
-Diese Zugänge müssen sich hier alle teilen.
-Bitte sei Dir dessen bewusst und verhalte Dich dementsprechend:
-<ul>
-<li>bitte <strong>keine Filesharing-Programme</strong> betreiben!</li>
-<li>bitte <strong>keine unnötigen Downloads oder Streams</strong> starten!</li>
-<li>bitte <strong>keine illegalen Aktivitäten</strong>!</li>
-</ul>
-</p>
-
-<p>
-Wenn Du unsere Idee gut findest, kannst Du uns unterstützen:
-<ul>
-<li><a href="<%=c.homepage%>">Werde selbst Freifunker oder teile deinen Internetzugang!</a></li>
-<li>Betreibe deine anderen WLAN-Geräte <em>NICHT</em> auf den Kanälen 1-5, diese stören oft unser Netz.</li>
-</ul>
-</p>
-
-<p>
-Mit einem Klick auf <em><%:accept Annehmen%></em> kannst du für <%=c.leasetime%> Stunden
-über unser Netz das Internet verwenden. Dann wirst du erneut aufgefordet, diese Bedingungen zu akzeptieren.
-</p>
\ No newline at end of file
diff --git a/applications/luci-splash/src/view/splash_splash/index.htm b/applications/luci-splash/src/view/splash_splash/index.htm
deleted file mode 100644 (file)
index 75aa026..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-<%+header%>
-<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-splash/src/view/splash_splash/splash.htm b/applications/luci-splash/src/view/splash_splash/splash.htm
deleted file mode 100644 (file)
index 9c16580..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<%+header%>
-<%+splash/splash%>
-<form method="get" action="<%=controller%>/splash/splash/activate">
-       <input type="submit" value="<%:decline Ablehnen%>" />
-       <input type="submit" name="accept" value="<%:accept Annehmen%>" />
-</form>
-<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-statistics/luasrc/controller/luci_statistics/luci_statistics.lua b/applications/luci-statistics/luasrc/controller/luci_statistics/luci_statistics.lua
new file mode 100644 (file)
index 0000000..df262a1
--- /dev/null
@@ -0,0 +1,107 @@
+module("luci.controller.luci_statistics.luci_statistics", package.seeall)
+
+local fs   = require("luci.fs")
+local tpl  = require("luci.template")
+local rrd  = require("luci.statistics.rrdtool")
+local data = require("luci.statistics.datatree").Instance()
+
+
+function _entry( path, ... )
+       local file = path[4] or path[3]
+       if fs.isfile( "/usr/lib/collectd/" .. file .. ".so" ) then
+               entry( path, ... )
+       end
+end
+
+
+function index()
+       entry({"admin", "statistics"},                          statistics_index,                       "Statistiken",          80)
+       entry({"admin", "statistics", "collectd"},              cbi("luci_statistics/collectd"),        "Collectd",             10)
+
+       entry({"admin", "statistics", "output"},                statistics_outputplugins,               "Ausgabeplugins",       20)
+       _entry({"admin", "statistics", "output", "rrdtool"},    cbi("luci_statistics/rrdtool"),         "RRDTool",              10)
+       _entry({"admin", "statistics", "output", "network"},    cbi("luci_statistics/network"),         "Netzwerk",             20)
+       _entry({"admin", "statistics", "output", "unixsock"},   cbi("luci_statistics/unixsock"),        "Unix Socket",          30)
+       _entry({"admin", "statistics", "output", "csv"},        cbi("luci_statistics/csv"),             "CSV",                  40)
+
+       entry({"admin", "statistics", "system"},                statistics_systemplugins,               "Systemplugins",        30)
+       _entry({"admin", "statistics", "system", "exec"},       cbi("luci_statistics/exec"),            "Exec",                 10)
+       _entry({"admin", "statistics", "system", "email"},      cbi("luci_statistics/email"),           "E-Mail",               20)
+       _entry({"admin", "statistics", "system", "cpu"},        cbi("luci_statistics/cpu"),             "Prozessor",            30)
+       _entry({"admin", "statistics", "system", "df"},         cbi("luci_statistics/df"),              "Speicherplatz",        40)
+       _entry({"admin", "statistics", "system", "disk"},       cbi("luci_statistics/disk"),            "Datenträger",         50)
+       _entry({"admin", "statistics", "system", "irq"},        cbi("luci_statistics/irq"),             "Interrupts",           60)
+       _entry({"admin", "statistics", "system", "processes"},  cbi("luci_statistics/processes"),       "Prozesse",             70)
+
+       entry({"admin", "statistics", "network"},               statistics_networkplugins,              "Netzwerkplugins",      40)
+       _entry({"admin", "statistics", "network", "interface"}, cbi("luci_statistics/interface"),       "Schnittstellen",       10)
+       _entry({"admin", "statistics", "network", "netlink"},   cbi("luci_statistics/netlink"),         "Netlink",              20)
+       _entry({"admin", "statistics", "network", "iptables"},  cbi("luci_statistics/iptables"),        "Firewall",             30)
+       _entry({"admin", "statistics", "network", "tcpconns"},  cbi("luci_statistics/tcpconns"),        "Verbindungen",         40)
+       _entry({"admin", "statistics", "network", "ping"},      cbi("luci_statistics/ping"),            "Ping",                 50)
+       _entry({"admin", "statistics", "network", "dns"},       cbi("luci_statistics/dns"),             "DNS",                  60)
+
+       
+       -- public views
+       entry({"freifunk", "statistics"},                       statistics_index,                       "Statistiken",          80)
+       
+       for i, plugin in ipairs( data:plugins() ) do
+               _entry({"freifunk", "statistics", plugin},      statistics_render,                      plugin,                  i)
+       end
+end
+
+
+function statistics_index()
+       tpl.render("admin_statistics/index")
+end
+
+function statistics_outputplugins()
+       plugins = {
+               rrdtool="RRDTool",
+               network="Netzwerk",
+               unixsock="Unix Socket",
+               csv="CSV"
+       }
+
+       tpl.render("admin_statistics/outputplugins", {plugins=plugins})
+end
+
+function statistics_systemplugins()
+       plugins = {
+               exec="Exec",
+               email="E-Mail",
+               disk="Datenträger",
+               irq="Interrupts",
+               processes="Prozesse"
+       }
+
+       tpl.render("admin_statistics/systemplugins", {plugins=plugins})
+end
+
+function statistics_networkplugins()
+       plugins = {
+               interface="Schnittstellen",
+               netlink="Netlink",
+               iptables="Firewall",
+               tcpconns="Verbindungen",
+               ping="Ping",
+               dns="DNS"
+       }
+
+       tpl.render("admin_statistics/networkplugins", {plugins=plugins})
+end
+
+
+function statistics_render()
+       local plugin = luci.dispatcher.request[3]
+       local images = { }
+
+       for i, inst in ipairs( data:plugin_instances( plugin ) ) do
+               local graph = rrd.Graph()
+               for i, img in ipairs( graph:render( "OpenWrt", plugin, inst ) ) do
+                       table.insert( images, img )
+               end
+       end
+
+       tpl.render("public_statistics/graph", { images=images, plugin=plugin } )
+end
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/collectd.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/collectd.lua
new file mode 100644 (file)
index 0000000..e09a11d
--- /dev/null
@@ -0,0 +1,71 @@
+--[[
+
+Luci configuration model for statistics - general collectd configuration
+(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$
+
+]]--
+
+require("luci.sys")
+
+
+m = Map("luci_statistics", "Collector Daemon",
+[[Collectd ist ein kleiner und flexibler Dienst zum Sammeln und Abfragen von Daten
+aus verschieden Quellen. Zur weiteren Verarbeitung werden die Daten in RRD Datenbanken
+gespeichert oder per Multicast Relaying Ã¼ber das Netzwerk versendet.]])
+
+-- general config section
+s = m:section( NamedSection, "general", "luci_statistics", "Allgemeine Einstellungen" )
+
+-- general.basedir (BaseDir)
+basedir = s:option( Value, "BaseDir", "Basisverzeichnis" )
+basedir.default = "/var/run/collectd"
+
+-- general.include (Include)
+include = s:option( Value, "Include", "Verzeichnis für Unterkonfigurationen" )
+include.default = "/etc/collectd/conf.d/*.conf"
+
+-- general.pidfile (PIDFile)
+pidfile = s:option( Value, "PIDFile", "PID-Datei für den Collector Dienst" )
+pidfile.default = "/var/run/collectd.pid"
+
+-- general.plugindir (PluginDir)
+plugindir = s:option( Value, "PluginDir", "Verzeichnis für die Collector-Plugins" )
+plugindir.default = "/usr/lib/collectd/"
+
+-- general.typesdb (TypesDB)
+typesdb = s:option( Value, "TypesDB", "Datenbank mit den Datenset-Beschreibungen" )
+typesdb.default = "/etc/collectd/types.db"
+
+-- general.interval (Interval)
+interval = s:option( Value, "Interval", "Abfrageintervall für die Datenerfassung", "Sekunden" )
+interval.default  = 60
+interval.isnumber = true
+
+-- general.readthreads (ReadThreads)
+readthreads = s:option( Value, "ReadThreads", "Anzahl paralleler Prozesse für die Datenabfrage" )
+readthreads.default  = 5
+readthreads.isnumber = true
+
+-- general.hostname (Hostname)
+hostname = s:option( Value, "Hostname", "Hostname zur Identifikation des Collector Dienstes (leer lassen um den Namen automatisch zu bestimmen)" )
+hostname.default  = luci.sys.hostname()
+hostname.optional = true
+
+-- general.fqdnlookup (FQDNLookup)
+fqdnlookup = s:option( Flag, "FQDNLookup", "Versuchen den vollen Hostnamen dieser Installation herauszufinden" )
+fqdnlookup.enabled  = "true"
+fqdnlookup.disabled = "false"
+fqdnlookup.default  = "false"
+fqdnlookup.optional = true
+fqdnlookup:depends( "Hostname", "" )
+
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/csv.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/csv.lua
new file mode 100644 (file)
index 0000000..e1f2c35
--- /dev/null
@@ -0,0 +1,39 @@
+--[[
+
+Luci configuration model for statistics - collectd csv plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "CSV Plugin",
+[[Das CSV-Plugin schreibt in regelmäßigen Abständen die gesammelten Daten als
+CSV-Dateien in das angegebene Verzeichnis. Der Speicherbedarf wächst dabei
+kontinuierlich!]])
+
+-- collectd_csv config section
+s = m:section( NamedSection, "collectd_csv", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_csv.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_csv.datadir (DataDir)
+datadir = s:option( Value, "DataDir", "Ablageverzeichnis für die CSV-Dateien" )
+datadir.default = "127.0.0.1"
+datadir:depends( "enable", 1 )
+
+-- collectd_csv.storerates (StoreRates)
+storerates = s:option( Flag, "StoreRates", "Werte nicht absolut, sondern als Raten speichern" )
+storerates.default = 0
+storerates:depends( "enable", 1 )
+
+return m
+
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/df.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/df.lua
new file mode 100644 (file)
index 0000000..6e35afc
--- /dev/null
@@ -0,0 +1,50 @@
+--[[
+
+Luci configuration model for statistics - collectd df plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "DF Plugin",
+[[Das DF-Plugin sammelt Informationen Ã¼ber den belegten und verfügbaren Speicherplatz auf den
+angegebenen Geräten, Mountpunkten oder Dateisystemtypen.]])
+
+-- collectd_df config section
+s = m:section( NamedSection, "collectd_df", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_df.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_df.devices (Device)
+devices = s:option( Value, "Devices", "Gerätedateien", "Einträge mit Leerzeichen trennen" )
+devices.default = "/dev/mtdblock/4"
+devices.rmempty = true
+devices:depends( "enable", 1 )
+
+-- collectd_df.mountpoints (MountPoint)
+mountpoints = s:option( Value, "MountPoints", "Mountpunkte", "Einträge mit Leerzeichen trennen" )
+mountpoints.default = "/jffs"
+mountpoints.rmempty = true
+mountpoints:depends( "enable", 1 )
+
+-- collectd_df.fstypes (FSType)
+fstypes = s:option( Value, "FSTypes", "Dateisystemtypen", "Einträge mit Leerzeichen trennen" )
+fstypes.default = "tmpfs"
+fstypes.rmempty = true
+fstypes:depends( "enable", 1 )
+
+-- collectd_df.ignoreselected (IgnoreSelected)
+ignoreselected = s:option( Flag, "IgnoreSelected", "Logik umkehren und alle Datenträger Ã¼berwachen die nicht auf die obigen Kriterien zutreffen" )
+ignoreselected.default = 0
+ignoreselected:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/disk.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/disk.lua
new file mode 100644 (file)
index 0000000..587091f
--- /dev/null
@@ -0,0 +1,37 @@
+--[[
+
+Luci configuration model for statistics - collectd disk plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Disk Plugin",
+[[Das Disk-Plugin sammelt Informationen Ã¼ber Augewählte Fesplatten.]])
+
+-- collectd_disk config section
+s = m:section( NamedSection, "collectd_disk", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_disk.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_disk.disks (Disk)
+devices = s:option( Value, "Disks", "Fesplatten oder Partitionen", "Einträge mit Leerzeichen trennen" )
+devices.default = "hda1 hdb"
+devices.rmempty = true
+devices:depends( "enable", 1 )
+
+-- collectd_disk.ignoreselected (IgnoreSelected)
+ignoreselected = s:option( Flag, "IgnoreSelected", "Logik umkehren und alle Datenträger und Partitionen Ã¼berwachen die nicht auf die obigen Kriterien zutreffen" )
+ignoreselected.default = 0
+ignoreselected:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/dns.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/dns.lua
new file mode 100644 (file)
index 0000000..dc7f57d
--- /dev/null
@@ -0,0 +1,42 @@
+--[[
+
+Luci configuration model for statistics - collectd dns plugin configuration
+(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$
+
+]]--
+
+require("luci.sys")
+
+
+m = Map("luci_statistics", "DNS Plugin",
+[[Das DNS-Plugin nutzt die pcap Bibliothek um DNS-Verkehr zu analysieren.]])
+
+-- collectd_dns config section
+s = m:section( NamedSection, "collectd_dns", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_dns.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_dns.interfaces (Interface)
+interfaces = s:option( ListValue, "Interface", "Folgende Schnittstelle Ã¼berwachen:" )
+interfaces:depends( "enable", 1 )
+interfaces:value("any")
+for k, v in pairs(luci.sys.net.devices()) do
+       interfaces:value(v)
+end
+
+-- collectd_dns.ignoresources (IgnoreSource)
+ignoresources = s:option( Value, "IgnoreSources", "Verkehr von folgenden IP Adressen ignorieren:", "mehrere Einträge mit Leerzeichen trennen" )
+ignoresources.default = "127.0.0.1"
+ignoresources:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/email.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/email.lua
new file mode 100644 (file)
index 0000000..7b259e8
--- /dev/null
@@ -0,0 +1,55 @@
+--[[
+
+Luci configuration model for statistics - collectd email plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "E-Mail Plugin",
+[[Das E-Mail-Plugin Ã¶ffnet einen Unix-Socket Ã¼ber welchen E-Mail Statistiken an collectd
+übergeben werden können. Dieses Plugin ist primär für die Verwendung mit
+Mail::SpamAssassin::Plugin::Collectd gedacht, lässt sich aber auch anderweitig einsetzen.]])
+
+-- collectd_email config section
+s = m:section( NamedSection, "collectd_email", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_email.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_email.socketfile (SocketFile)
+socketfile = s:option( Value, "SocketFile", "Pfad für den Unix-Socket" )
+socketfile.default = "/var/run/collect-email.sock"
+socketfile:depends( "enable", 1 )
+
+-- collectd_email.socketgroup (SocketGroup)
+socketgroup = s:option( Value, "SocketGroup", "Dateibesitzergruppe für den Unix-Socket Ã¤ndern" )
+socketgroup.default  = "nobody"
+socketgroup.rmempty  = true
+socketgroup.optional = true
+socketgroup:depends( "enable", 1 )
+
+-- collectd_email.socketperms (SocketPerms)
+socketperms = s:option( Value, "SocketPerms", "Dateiberechtigungen für den Unix-Socket Ã¤ndern" )
+socketperms.default  = "0770"
+socketperms.rmempty  = true
+socketperms.optional = true
+socketperms:depends( "enable", 1 )
+
+-- collectd_email.maxconns (MaxConns)
+maxconns = s:option( Value, "MaxConns", "Maximale Anzahl paralleler Verbindungen", "Werte von 1 bis 16384" )
+maxconns.default   = 5
+maxconns.isinteger = true
+maxconns.rmempty   = true
+maxconns.optional  = true
+maxconns:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/exec.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/exec.lua
new file mode 100644 (file)
index 0000000..d1fe0f0
--- /dev/null
@@ -0,0 +1,77 @@
+--[[
+
+Luci configuration model for statistics - collectd exec plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Exec Plugin",
+[[Das Exec-Plugin ermöglicht das Ausführen von externen Programmen um Werte einzulesen
+oder Aktionen beim Eintreten bestimmter Ereignisse anzustoßen.]])
+
+-- collectd_exec config section
+s = m:section( NamedSection, "collectd_exec", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_exec.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+
+-- collectd_exec_input config section (Exec directives)
+exec = m:section( TypedSection, "collectd_exec_input", "Befehl zum Einlesen von Daten hinzufügen",
+[[Hier können externe Kommandos definiert werden welche durch collectd gestartet werden um bestimmte
+Daten zu sammeln. Die Werte werden dabei von der Standardausgabe des Programmes gelesen.]])
+exec.addremove = true
+exec.anonymous = true
+
+-- collectd_exec_input.cmdline
+exec_cmdline = exec:option( Value, "cmdline", "Kommandozeile" )
+exec_cmdline.default = "/usr/bin/stat-dhcpusers"
+
+-- collectd_exec_input.cmdline
+exec_cmduser = exec:option( Value, "cmduser", "Als anderer Benutzer ausführen" )
+exec_cmduser.default  = "nobody"
+exec_cmduser.rmempty  = true
+exec_cmduser.optional = true
+
+-- collectd_exec_input.cmdline
+exec_cmdgroup = exec:option( Value, "cmdgroup", "Als andere Gruppe ausführen" )
+exec_cmdgroup.default  = "nogroup"
+exec_cmdgroup.rmempty  = true
+exec_cmdgroup.optional = true
+
+
+-- collectd_exec_notify config section (NotifyExec directives)
+notify = m:section( TypedSection, "collectd_exec_notify", "Befehl zum Ausgeben von Daten hinzufügen",
+[[Hier können externe Kommandos definiert werden welche zur Ausführung kommen sobald bestimmte
+Ereignise eintreten. Die Daten werden dabei an die Standardeingabe des aufgerufenen Programmes gesendet.
+Siehe dazu auch die Sektion "Limits".]])
+notify.addremove = true
+notify.anonymous = true
+
+-- collectd_notify_input.cmdline
+notify_cmdline = notify:option( Value, "cmdline", "Kommandozeile" )
+notify_cmdline.default = "/usr/bin/stat-dhcpusers"
+
+-- collectd_notify_input.cmdline
+notify_cmduser = notify:option( Value, "cmduser", "Als anderer Benutzer ausführen" )
+notify_cmduser.default  = "nobody"
+notify_cmduser.rmempty  = true
+notify_cmduser.optional = true
+
+-- collectd_notify_input.cmdline
+notify_cmdgroup = notify:option( Value, "cmdgroup", "Als andere Gruppe ausführen" )
+notify_cmdgroup.default  = "nogroup"
+notify_cmdgroup.rmempty  = true
+notify_cmdgroup.optional = true
+
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/interface.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/interface.lua
new file mode 100644 (file)
index 0000000..3cd71a1
--- /dev/null
@@ -0,0 +1,42 @@
+--[[
+
+Luci configuration model for statistics - collectd interface plugin configuration
+(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$
+
+]]--
+
+require("luci.sys")
+
+
+m = Map("luci_statistics", "Interface Plugin",
+[[Das Interface-Plugin sammelt Informationen zum Netzwerkverkehr auf den einzelnen Schnittstellen.]])
+
+-- collectd_interface config section
+s = m:section( NamedSection, "collectd_interface", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_interface.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_interface.interfaces (Interface)
+interfaces = s:option( MultiValue, "Interfaces", "Überwachte Schnittstellen", "mehrere Einträge mit Strg selektieren" )
+interfaces.widget = "select"
+interfaces:depends( "enable", 1 )
+for k, v in pairs(luci.sys.net.devices()) do
+       interfaces:value(v)
+end
+
+-- collectd_interface.ignoreselected (IgnoreSelected)
+ignoreselected = s:option( Flag, "IgnoreSelected", "Alle Schnittstellen außer ausgewählte Ã¼berwachen" )
+ignoreselected.default = 0
+ignoreselected:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/iptables.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/iptables.lua
new file mode 100644 (file)
index 0000000..4b6d9db
--- /dev/null
@@ -0,0 +1,121 @@
+--[[
+
+Luci configuration model for statistics - collectd iptables plugin configuration
+(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$
+
+]]--
+
+require("luci.sys.iptparser")
+
+ip = luci.sys.iptparser.IptParser()
+chains  = { }
+targets = { }
+
+for i, rule in ipairs( ip:find() ) do 
+       chains[rule.chain] = true
+       targets[rule.target] = true
+end
+
+
+m = Map("luci_statistics", "Iptables Plugin",
+[[Das Iptables-Plugin ermöglicht die Ãœberwachung bestimmter Firewallregeln um
+Werte wie die Anzahl der verarbeiteten Pakete oder die insgesamt erfasste Datenmenge
+zu speichern.]])
+
+-- collectd_iptables config section
+s = m:section( NamedSection, "collectd_iptables", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_iptables.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+
+-- collectd_iptables_match config section (Chain directives)
+rule = m:section( TypedSection, "collectd_iptables_match", "Regel hinzufügen",
+[[Hier werden die Kriterien festgelegt, nach welchen die Firewall-Regeln zur Ãœberwachung
+ausgewählt werden.]])
+rule.addremove = true
+rule.anonymous = true
+
+
+-- collectd_iptables_match.name
+rule_table = rule:option( Value, "name", "Name der Regel", "wird im Diagram verwendet" )
+
+-- collectd_iptables_match.table
+rule_table = rule:option( ListValue, "table", "Firewall-Tabelle" )
+rule_table.default  = "filter"
+rule_table.rmempty  = true
+rule_table.optional = true
+rule_table:value("")
+rule_table:value("filter")
+rule_table:value("nat")
+rule_table:value("mangle")
+
+
+-- collectd_iptables_match.chain
+rule_chain = rule:option( ListValue, "chain", "Firewall-Kette (Chain)" )
+rule_chain.rmempty  = true
+rule_chain.optional = true
+rule_chain:value("")
+
+for chain, void in pairs( chains ) do
+       rule_chain:value( chain )
+end
+
+
+-- collectd_iptables_match.target
+rule_target = rule:option( ListValue, "target", "Firewall-Aktion (Target)" )
+rule_target.rmempty  = true
+rule_target.optional = true
+rule_target:value("")
+
+for target, void in pairs( targets ) do
+       rule_target:value( target )
+end
+
+
+-- collectd_iptables_match.protocol
+rule_protocol = rule:option( ListValue, "protocol", "Netzwerkprotokoll" )
+rule_protocol.rmempty  = true
+rule_protocol.optional = true
+rule_protocol:value("")
+rule_protocol:value("tcp")
+rule_protocol:value("udp")
+rule_protocol:value("icmp")
+
+-- collectd_iptables_match.source
+rule_source = rule:option( Value, "source", "Quell-IP-Bereich", "Bereich in CIDR Notation" )
+rule_source.default  = "0.0.0.0/0"
+rule_source.rmempty  = true
+rule_source.optional = true
+
+-- collectd_iptables_match.destination
+rule_destination = rule:option( Value, "destination", "Ziel-IP-Bereich", "Bereich in CIDR Notation" )
+rule_destination.default  = "0.0.0.0/0"
+rule_destination.rmempty  = true
+rule_destination.optional = true
+
+-- collectd_iptables_match.inputif
+rule_inputif = rule:option( Value, "inputif", "eingehende Schnittstelle", "z.B. eth0.0" )
+rule_inputif.rmempty  = true
+rule_inputif.optional = true
+
+-- collectd_iptables_match.outputif
+rule_outputif = rule:option( Value, "outputif", "ausgehende Schnittstelle", "z.B. eth0.1" )
+rule_outputif.rmempty  = true
+rule_outputif.optional = true
+
+-- collectd_iptables_match.options
+rule_options = rule:option( Value, "options", "Optionen", "z.B. reject-with tcp-reset" )
+rule_options.rmempty  = true
+rule_options.optional = true
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/irq.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/irq.lua
new file mode 100644 (file)
index 0000000..2d15e52
--- /dev/null
@@ -0,0 +1,39 @@
+--[[
+
+Luci configuration model for statistics - collectd irq plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "IRQ Plugin",
+[[Das IRQ-Plugin sammelt Informationen zur Auslastung einzelner Interrupts.
+Werden keine Interrupts angegeben, Ã¼berwacht das Plugin alle vorhanden IRQs im System.
+]])
+
+-- collectd_irq config section
+s = m:section( NamedSection, "collectd_irq", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_irq.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_irq.irqs (Irq)
+irqs = s:option( Value, "Irqs", "Überwachte Interrupts", "mehrere mit Leerzeichen trennen" )
+irqs.optional = true
+irqs:depends( "enable", 1 )
+
+-- collectd_irq.ignoreselected (IgnoreSelected)
+ignoreselected = s:option( Flag, "IgnoreSelected", "Alle Interrupts außer ausgewählte Ã¼berwachen" )
+ignoreselected.default  = 0
+ignoreselected.optional = "true"
+ignoreselected:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/netlink.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/netlink.lua
new file mode 100644 (file)
index 0000000..a27def8
--- /dev/null
@@ -0,0 +1,84 @@
+--[[
+
+Luci configuration model for statistics - collectd netlink plugin configuration
+(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$
+
+]]--
+
+require("luci.sys")
+
+
+m = Map("luci_statistics", "Interface Plugin",
+[[Das Netlink-Plugin sammelt erweiterte Informationen wie Qdisc-, Class- und Filter-Werten auf einzelnen Schnittstellen.]])
+
+-- collectd_netlink config section
+s = m:section( NamedSection, "collectd_netlink", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_netlink.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_netlink.interfaces (Interface)
+interfaces = s:option( MultiValue, "Interfaces", "einfach Ãœberwachte Schnittstellen", "mehrere Einträge mit Strg selektieren" )
+interfaces.widget   = "select"
+interfaces.optional = true
+interfaces:depends( "enable", 1 )
+interfaces:value("")
+for i, v in ipairs(luci.sys.net.devices()) do
+       interfaces:value(v)
+end
+
+-- collectd_netlink.verboseinterfaces (VerboseInterface)
+verboseinterfaces = s:option( MultiValue, "VerboseInterfaces", "detailliert Ãœberwachte Schnittstellen", "mehrere Einträge mit Strg selektieren" )
+verboseinterfaces.widget   = "select"
+verboseinterfaces.optional = true
+verboseinterfaces:depends( "enable", 1 )
+verboseinterfaces:value("")
+for i, v in ipairs(luci.sys.net.devices()) do
+       verboseinterfaces:value(v)
+end
+
+-- collectd_netlink.qdiscs (QDisc)
+qdiscs = s:option( MultiValue, "QDiscs", "Queue Discipline auf Schnittstellen Ãœberwachen", "mehrere Einträge mit Strg selektieren" )
+qdiscs.widget   = "select"
+qdiscs.optional = true
+qdiscs:depends( "enable", 1 )
+qdiscs:value("")
+for i, v in ipairs(luci.sys.net.devices()) do
+        qdiscs:value(v)
+end
+
+-- collectd_netlink.classes (Class)
+classs = s:option( MultiValue, "Classes", "Shapingklassen auf Schnittstellen Ãœberwachen", "mehrere Einträge mit Strg selektieren" )
+classs.widget   = "select"
+classs.optional = true
+classs:depends( "enable", 1 )
+classs:value("")
+for i, v in ipairs(luci.sys.net.devices()) do
+        classs:value(v)
+end
+
+-- collectd_netlink.filters (Filter)
+filters = s:option( MultiValue, "Filters", "Filterklassen auf Schnittstellen Ãœberwachen", "mehrere Einträge mit Strg selektieren" )
+filters.widget   = "select"
+filters.optional = true
+filters:depends( "enable", 1 )
+filters:value("")
+for i, v in ipairs(luci.sys.net.devices()) do
+        filters:value(v)
+end
+
+-- collectd_netlink.ignoreselected (IgnoreSelected)
+ignoreselected = s:option( Flag, "IgnoreSelected", "Alle Schnittstellen außer ausgewählte Ã¼berwachen" )
+ignoreselected.default = 0
+ignoreselected:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/network.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/network.lua
new file mode 100644 (file)
index 0000000..ab3c630
--- /dev/null
@@ -0,0 +1,84 @@
+--[[
+
+Luci configuration model for statistics - collectd network plugin configuration
+(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$
+
+]]--
+
+
+m = Map("luci_statistics", "Network Plugin",
+[[Das Network-Plugin ermöglicht den netzwerkgestützen Austausch von Statistikdaten.]])
+
+-- collectd_network config section
+s = m:section( NamedSection, "collectd_network", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_network.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+
+-- collectd_network_listen config section (Listen)
+listen = m:section( TypedSection, "collectd_network_listen", "Schnittstellen für eingehende Verbindungen",
+[[Legt fest auf welchen Schnittstellen bzw. IP-Adressen collectd auf eingehende Verbindungen wartet.]])
+listen.addremove = true
+listen.anonymous = true
+
+
+-- collectd_network_listen.host
+listen_host = listen:option( Value, "host", "Listen-Host", "Host-, IP- oder IPv6-Adresse" )
+listen_host.default = "0.0.0.0"
+
+-- collectd_network_listen.port
+listen_port = listen:option( Value, "port", "Listen-Port", "Partnummer 0 - 65535" )
+listen_port.default   = 25826
+listen_port.isinteger = true
+listen_port.optional  = true
+
+
+-- collectd_network_server config section (Server)
+server = m:section( TypedSection, "collectd_network_server", "Schnittstellen für ausgehende Verbindungen",
+[[Legt fest auf welchen Schnittstellen bzw. IP-Adressen collectd als Server agiert.]])
+server.addremove = true
+server.anonymous = true
+
+
+-- collectd_network_server.host
+server_host = server:option( Value, "host", "Server-Host", "Host-, IP- oder IPv6-Adresse" )
+server_host.default = "0.0.0.0"
+
+-- collectd_network_server.port
+server_port = server:option( Value, "port", "Server-Port", "Partnummer 0 - 65535" )
+server_port.default   = 25826
+server_port.isinteger = true
+server_port.optional  = true
+
+-- collectd_network.timetolive (TimeToLive)
+ttl = s:option( Value, "TimeToLive", "Time-to-Live für die Pakete", "Werte 0 bis 255" )
+ttl.default   = 128
+ttl.isinteger = true
+ttl.optional  = true
+ttl:depends( "enable", 1 )
+
+-- collectd_network.forward (Forward)
+forward = s:option( Flag, "Forward", "Weiterleitung zwischen verschiedenen Listen- und Server-Adressen" )
+forward.default  = 0
+forward.optional = true
+forward:depends( "enable", 1 )
+
+-- collectd_network.forward (CacheFlush)
+forward = s:option( Value, "CacheFlush", "Löschintervall für temporäre Daten", "in Sekunden" )
+forward.default   = 86400
+forward.isinteger = true
+forward.optional  = true
+forward:depends( "enable", 1 )
+
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/ping.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/ping.lua
new file mode 100644 (file)
index 0000000..334a030
--- /dev/null
@@ -0,0 +1,38 @@
+--[[
+
+Luci configuration model for statistics - collectd ping plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Ping Plugin",
+[[Das Ping-Plugin veranlasst periodische ICMP-Requests an die angegebenen Adressen und zeichnet
+Parameter wie Verfügbarkeit und Antwortzeiten auf.]])
+
+-- collectd_ping config section
+s = m:section( NamedSection, "collectd_ping", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_ping.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_ping.hosts (Host)
+hosts = s:option( Value, "Hosts", "Zieladressen", "Einträge durch Leerzeichen trennen" )
+hosts.default = "127.0.0.1"
+hosts:depends( "enable", 1 )
+
+-- collectd_ping.ttl (TTL)
+ttl = s:option( Value, "TTL", "Time-to-Live für die ICMP-Pakete (Werte 0 bis 255)" )
+ttl.isinteger = true
+ttl.default   = 128
+ttl:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/processes.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/processes.lua
new file mode 100644 (file)
index 0000000..354ceca
--- /dev/null
@@ -0,0 +1,31 @@
+--[[
+
+Luci configuration model for statistics - collectd processes plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Processes Plugin",
+[[Das Processes-Plugin sammelt Informationen Ã¼ber ausgewählte Prozesse auf diesem Gerät.]])
+
+-- collectd_processes config section
+s = m:section( NamedSection, "collectd_processes", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_processes.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_processes.processes (Process)
+processes = s:option( Value, "Processes", "Überwachte Prozesse", "mehrere mit Leerzeichen trennen" )
+processes.default = "olsrd bmxd httpd dnsmasq dropbear tinc"
+processes:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua
new file mode 100644 (file)
index 0000000..89adf52
--- /dev/null
@@ -0,0 +1,99 @@
+--[[
+
+Luci configuration model for statistics - collectd rrdtool plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "RRDTool Plugin",
+[[Das RRDTool-Plugin schreibt die gesammelten Werte in sogenannte RRD Datenbanken, welche die
+Grundlage für die Statistik-Diagramme bilden.<br /><br />
+<strong>Die Einstellungen auf dieser Seite sollten nur in Ausnahmefällen geändert werden,
+falsche Einstellungen führen zu einem sehr hohem Platzverbrauch im Temp-Verzeichnis und das
+Gerät kann nur noch im Failsafe-Modus repariert werden!</strong>]])
+
+-- collectd_rrdtool config section
+s = m:section( NamedSection, "collectd_rrdtool", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_rrdtool.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 1
+
+-- collectd_rrdtool.datadir (DataDir)
+datadir = s:option( Value, "DataDir", "Speicherort für die RRD Datenbanken" )
+datadir.default  = "/tmp"
+datadir.rmempty  = true
+datadir.optional = true
+datadir:depends( "enable", 1 )
+
+-- collectd_rrdtool.stepsize (StepSize)
+stepsize = s:option( Value, "StepSize", "Schritt-Interval", "in Sekunden" )
+stepsize.default   = 30
+stepsize.isinteger = true
+stepsize.rmempty   = true
+stepsize.optional  = true
+stepsize:depends( "enable", 1 )
+
+-- collectd_rrdtool.heartbeat (HeartBeat)
+heartbeat = s:option( Value, "HeartBeat", "Heart-Beat-Interval", "in Sekunden" )
+heartbeat.default   = 60
+heartbeat.isinteger = true
+heartbeat.rmempty   = true
+heartbeat.optional  = true
+heartbeat:depends( "enable", 1 )
+
+-- collectd_rrdtool.rrasingle (RRASingle)
+rrasingle = s:option( Flag, "RRASingle", 'Jeweils nur ein RRA anlegen', "reduziert die Größe der RRDs" )
+rrasingle.default  = true
+rrasingle.rmempty  = true
+rrasingle.optional = true
+rrasingle:depends( "enable", 1 )
+
+-- collectd_rrdtool.rratimespans (RRATimespan)
+rratimespans = s:option( Value, "RRATimespans", "Gespeicherte Zeitspannen", "in Sekunden; mehrere mit Leerzeichen trennen" )
+rratimespans.default  = "600 86400 604800 2678400 31622400"
+rratimespans.rmempty  = true
+rratimespans.optional = true
+rratimespans:depends( "enable", 1 )
+
+-- collectd_rrdtool.rrarows (RRARows)
+rrarows = s:option( Value, "RRARows", "Anzahl der Datenpunkte pro Zeitspanne" )
+rrarows.isinteger = true
+rrarows.default   = 100
+rrarows.rmempty   = true
+rrarows.optional  = true
+rrarows:depends( "enable", 1 )
+
+-- collectd_rrdtool.xff (XFF)
+xff = s:option( Value, "XFF", "RRD XFiles Faktor" )
+xff.default  = 0.1
+xff.isnumber = true
+xff.rmempty  = true
+xff.optional = true
+xff:depends( "enable", 1 )
+
+-- collectd_rrdtool.cachetimeout (CacheTimeout)
+cachetimeout = s:option( Value, "CacheTimeout", "Daten für Zeitspanne cachen", "in Sekunden" )
+cachetimeout.isinteger = true
+cachetimeout.default   = 100
+cachetimeout.rmempty   = true
+cachetimeout.optional  = true
+cachetimeout:depends( "enable", 1 )
+
+-- collectd_rrdtool.cacheflush (CacheFlush)
+cacheflush = s:option( Value, "CacheFlush", "Cache nach Zeitspanne leeren", "in Sekunden" )
+cacheflush.isinteger = true
+cacheflush.default   = 100
+cacheflush.rmempty   = true
+cacheflush.optional  = true
+cacheflush:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua
new file mode 100644 (file)
index 0000000..079befa
--- /dev/null
@@ -0,0 +1,41 @@
+--[[
+
+Luci configuration model for statistics - collectd tcpconns plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Tcpconns Plugin",
+[[Das Tcpconns-Plugin zählt TCP-Verbindungen auf einzelnen Ports.]])
+
+-- collectd_tcpconns config section
+s = m:section( NamedSection, "collectd_tcpconns", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_tcpconns.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_tcpconns.listeningports (ListeningPorts)
+listeningports = s:option( Flag, "ListeningPorts", "Alle von lokalen Diensten genutzen Ports Ã¼berwachen" )
+listeningports.default = 1
+listeningports:depends( "enable", 1 )
+
+-- collectd_tcpconns.localports (LocalPort)
+localports = s:option( Value, "LocalPorts", "Lokale Ports", "mit Leerzeichen trennen" )
+localports.optional = true
+localports:depends( "enable", 1 )
+
+-- collectd_tcpconns.remoteports (RemotePort)
+remoteports = s:option( Value, "RemotePorts", "Entfernte Ports", "mit Leerzeichen trennen" )
+remoteports.optional = true
+remoteports:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua b/applications/luci-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua
new file mode 100644 (file)
index 0000000..dcedd38
--- /dev/null
@@ -0,0 +1,46 @@
+--[[
+
+Luci configuration model for statistics - collectd unixsock plugin configuration
+(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$
+
+]]--
+
+m = Map("luci_statistics", "Unixsock Plugin",
+[[Das Unixsock-Plugin Ã¶ffnet einen Socket Ã¼ber welchen die gesammelten Werte des
+laufenden collectd Prozesses abgefragt werden können.]])
+
+-- collectd_unixsock config section
+s = m:section( NamedSection, "collectd_unixsock", "luci_statistics", "Pluginkonfiguration" )
+
+-- collectd_unixsock.enable
+enable = s:option( Flag, "enable", "Plugin aktivieren" )
+enable.default = 0
+
+-- collectd_unixsock.socketfile (SocketFile)
+socketfile = s:option( Value, "SocketFile", "Pfad für den Unix-Socket" )
+socketfile.default = "/var/run/collect-query.socket"
+socketfile:depends( "enable", 1 )
+
+-- collectd_unixsock.socketgroup (SocketGroup)
+socketgroup = s:option( Value, "SocketGroup", "Dateibesitzergruppe für den Unix-Socket Ã¤ndern" )
+socketgroup.default  = "nobody"
+socketgroup.rmempty  = true
+socketgroup.optional = true
+socketgroup:depends( "enable", 1 )
+
+-- collectd_unixsock.socketperms (SocketPerms)
+socketperms = s:option( Value, "SocketPerms", "Dateiberechtigungen für den Unix-Socket Ã¤ndern" )
+socketperms.default  = "0770"
+socketperms.rmempty  = true
+socketperms.optional = true
+socketperms:depends( "enable", 1 )
+
+return m
diff --git a/applications/luci-statistics/luasrc/statistics/datatree.lua b/applications/luci-statistics/luasrc/statistics/datatree.lua
new file mode 100644 (file)
index 0000000..957b230
--- /dev/null
@@ -0,0 +1,134 @@
+module("luci.statistics.datatree", package.seeall)
+
+local util = require("luci.util")
+local sys  = require("luci.sys")
+local fs   = require("luci.fs")
+local uci  = require("luci.model.uci").Session()
+local sections, names = uci:sections( "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"
+
+       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._notzero( self, table )
+       for k in pairs(table) do
+               return true
+       end
+
+       return false
+end
+
+function Instance._scan( self )
+       for i, plugin in ipairs( fs.dir( self._libdir ) ) do
+               if plugin:match("%w+.so") then
+                       self._plugins[ plugin:gsub(".so", "") ] = { }
+               end
+       end
+
+       for plugin, instances in pairs( self._plugins ) do
+               for i, dir in ipairs( fs.dir( self:_mkpath() ) ) 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
+
+               for instance, data_instances in pairs( instances ) do
+                       for i, file in ipairs( fs.dir( self:_mkpath( plugin, instance ) ) ) 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
+
+
+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 = { }
+
+       for type, val in pairs( self._plugins[plugin][instance] ) do
+               table.insert( rv, type )
+       end
+
+       return rv
+end
+
+function Instance.data_instances( self, plugin, instance, type )
+       local rv = { }
+
+       for i, instance in ipairs( self._plugins[plugin][instance][type] ) do
+               table.insert( rv, instance )
+       end
+
+       return rv
+end
diff --git a/applications/luci-statistics/luasrc/statistics/rrdtool.lua b/applications/luci-statistics/luasrc/statistics/rrdtool.lua
new file mode 100644 (file)
index 0000000..b399866
--- /dev/null
@@ -0,0 +1,264 @@
+module("luci.statistics.rrdtool", package.seeall)
+
+require("luci.statistics.datatree")
+require("luci.statistics.rrdtool.colors")
+require("luci.statistics.rrdtool.definitions")
+require("luci.util")
+require("luci.bits")
+require("luci.fs")
+
+
+Graph = luci.util.class()
+
+function Graph.__init__( self, timespan, opts )
+
+       opts = opts or { }
+       opts.width = opts.width or "400"
+
+       self.colors = luci.statistics.rrdtool.colors.Instance()
+       self.defs   = luci.statistics.rrdtool.definitions.Instance()
+       self.tree   = luci.statistics.datatree.Instance()
+
+       -- rrdtool defalt args
+       self.args   = {
+               "-a", "PNG",
+               "-s", "NOW-" .. ( timespan or 900 ),
+               "-w", opts.width
+       }
+end
+
+function Graph.mktitle( self, host, plugin, plugin_instance, dtype, dtype_instance )
+       local t = host .. "/" .. plugin
+       if type(plugin_instance) == "string" and plugin_instance:len() > 0 then
+               t = t .. "-" .. plugin_instance
+       end
+       t = t .. "/" .. dtype
+       if type(dtype_instance) == "string" and dtype_instance:len() > 0 then
+               t = t .. "-" .. dtype_instance
+       end
+       return t
+end
+
+function Graph.mkrrdpath( self, ... )
+       return string.format( "/tmp/%s.rrd", self:mktitle( ... ) )
+end
+
+function Graph.mkpngpath( self, ... )
+       return string.format( "/tmp/rrdimg/%s.png", self:mktitle( ... ) )
+end
+
+function Graph._push( self, elem )
+
+       if type(elem) == "string" then
+               table.insert( self.args, elem )
+       else
+               for i, item in ipairs(elem) do
+                       table.insert( self.args, item )
+               end
+       end
+
+       return( self.args )
+end
+
+function Graph._clearargs( self )
+       for i = #self.args, 7, -1 do
+               table.remove( self.args, i )
+       end
+end
+
+function Graph._forcelol( self, list )
+       if type(list[1]) ~= "table" then
+               return( { list } )
+       end
+       return( list )
+end
+
+function Graph._rrdtool( self, png, rrd )
+
+       -- prepare directory
+       local dir = png:gsub("/[^/]+$","")
+       luci.fs.mkdir( dir, true )
+
+       -- construct commandline
+       local cmdline = "rrdtool graph " .. png
+
+       for i, opt in ipairs(self.args) do
+
+               opt = opt .. ""    -- force string
+               
+               if rrd then
+                       opt = opt:gsub( "{file}", rrd )
+               end
+
+               if opt:match("[^%w]") then
+                       cmdline = cmdline .. " '" .. opt .. "'"
+               else
+                       cmdline = cmdline .. " " .. opt
+               end
+       end
+
+       -- execute rrdtool
+       local rrdtool = io.popen( cmdline )
+       rrdtool:close()
+end
+
+function Graph._generic( self, opts )
+
+       local images = { }
+
+       -- remember images
+       table.insert( images, opts.image )
+
+       -- insert provided addition rrd options
+       self:_push( { "-t", opts.title or "Unknown title" } )
+       self:_push( opts.rrd )
+
+       -- construct an array of safe instance names
+       local inst_names = { }
+       for i, source in ipairs(opts.sources) do
+               inst_names[i] = i .. source.name:gsub("[^A-Za-z0-9%-_]","_")
+       end
+
+       -- create DEF statements for each instance, find longest instance name
+       local longest_name = 0
+       for i, source in ipairs(opts.sources) do
+               if source.name:len() > longest_name then
+                       longest_name = source.name:len()
+               end
+
+               local ds = source.ds or "value"
+
+               self:_push( "DEF:" .. inst_names[i] .. "_min=" ..source.rrd .. ":" .. ds .. ":MIN" )
+               self:_push( "DEF:" .. inst_names[i] .. "_avg=" ..source.rrd .. ":" .. ds .. ":AVERAGE" )
+               self:_push( "DEF:" .. inst_names[i] .. "_max=" ..source.rrd .. ":" .. ds .. ":MAX" )
+               self:_push( "CDEF:" .. inst_names[i] .. "_nnl=" .. inst_names[i] .. "_avg,UN,0," .. inst_names[i] .. "_avg,IF" )
+       end
+
+       -- create CDEF statement for last instance name
+       self:_push( "CDEF:" .. inst_names[#inst_names] .. "_stk=" .. inst_names[#inst_names] .. "_nnl" )
+
+       -- create CDEF statements for each instance
+       for i, source in ipairs(inst_names) do
+               if i > 1 then
+                       self:_push(
+                               "CDEF:" ..
+                               inst_names[1 + #inst_names - i] .. "_stk=" ..
+                               inst_names[1 + #inst_names - i] .. "_nnl," ..
+                               inst_names[2 + #inst_names - i] .. "_stk,+"
+                       )
+               end
+       end
+
+       -- create LINE and GPRINT statements for each instance
+       for i, source in ipairs(opts.sources) do
+
+               local legend = string.format(
+                       "%-" .. longest_name .. "s",
+                       source.name
+               )
+
+               local numfmt = opts.number_format or "%6.1lf"
+
+               local line_color
+               local area_color
+
+               -- find color: try source, then opts.colors; fall back to random color
+               if type(source.color) == "string" then
+                       line_color = source.color
+                       area_color = self.colors:from_string( line_color )
+               elseif type(opts.colors[source.name:gsub("[^%w]","_")]) == "string" then
+                       line_color = opts.colors[source.name:gsub("[^%w]","_")]
+                       area_color = self.colors:from_string( line_color )
+               else
+                       area_color = self.colors:random()
+                       line_color = self.colors:to_string( area_color )
+               end
+
+               -- derive area background color from line color
+               area_color = self.colors:to_string( self.colors:faded( area_color ) )
+
+
+               self:_push( "AREA:"   .. inst_names[i] .. "_stk#" .. area_color )
+               self:_push( "LINE1:"  .. inst_names[i] .. "_stk#" .. line_color .. ":" .. legend )
+               self:_push( "GPRINT:" .. inst_names[i] .. "_min:MIN:" .. numfmt .. " Min" )
+               self:_push( "GPRINT:" .. inst_names[i] .. "_avg:AVERAGE:" .. numfmt .. " Avg" )
+               self:_push( "GPRINT:" .. inst_names[i] .. "_max:MAX:" .. numfmt .. " Max" )
+               self:_push( "GPRINT:" .. inst_names[i] .. "_avg:LAST:" .. numfmt .. " Last\\l" )
+       end
+
+       return images
+end
+
+function Graph.render( self, host, plugin, plugin_instance )
+
+       dtype_instances = dtype_instances or { "" }
+       local pngs = { }
+
+       -- check for a whole graph handler
+       local plugin_def = "luci.statistics.rrdtool.definitions." .. plugin
+       local stat, def = pcall( require, plugin_def )
+
+       if stat and def and type(def.rrdargs) == "function" then
+               for i, opts in ipairs( self:_forcelol( def.rrdargs( self, host, plugin, plugin_instance, dtype ) ) ) do
+                       for i, png in ipairs( self:_generic( opts ) ) do
+                               table.insert( pngs, png )
+
+                               -- exec
+                               self:_rrdtool( png )
+
+                               -- clear args
+                               self:_clearargs()
+                       end
+               end
+       else
+
+               -- no graph handler, iterate over data types
+               for i, dtype in ipairs( self.tree:data_types( plugin, plugin_instance ) ) do
+
+                       -- check for data type handler
+                       local dtype_def = plugin_def .. "." .. dtype
+                       local stat, def = pcall( require, dtype_def )
+
+                       if stat and def and type(def.rrdargs) == "function" then
+                               for i, opts in ipairs( self:_forcelol( def.rrdargs( self, host, plugin, plugin_instance, dtype ) ) ) do
+                                       for i, png in ipairs( self:_generic( opts ) ) do
+                                               table.insert( pngs, png )
+
+                                               -- exec
+                                               self:_rrdtool( png )
+
+                                               -- clear args
+                                               self:_clearargs()
+                                       end
+                               end
+                       else
+
+                               -- no data type handler, fall back to builtin definition
+                               if type(self.defs.definitions[dtype]) == "table" then
+
+                                       -- iterate over data type instances
+                                       for i, inst in ipairs( self.tree:data_instances( plugin, plugin_instance, dtype ) ) do
+
+                                               local title = self:mktitle( host, plugin, plugin_instance, dtype, inst )
+                                               local png   = self:mkpngpath( host, plugin, plugin_instance, dtype, inst )
+                                               local rrd   = self:mkrrdpath( host, plugin, plugin_instance, dtype, inst )
+
+                                               self:_push( { "-t", title } )
+                                               self:_push( self.defs.definitions[dtype] )
+
+                                               table.insert( pngs, png )
+
+                                               -- exec
+                                               self:_rrdtool( png, rrd )
+
+                                               -- clear args
+                                               self:_clearargs()
+                                       end
+                               end
+                       end
+               end
+       end
+
+       return pngs
+end
+
diff --git a/applications/luci-statistics/luasrc/statistics/rrdtool/colors.lua b/applications/luci-statistics/luasrc/statistics/rrdtool/colors.lua
new file mode 100644 (file)
index 0000000..cdd6f71
--- /dev/null
@@ -0,0 +1,59 @@
+module("luci.statistics.rrdtool.colors", package.seeall)
+
+require("luci.util")
+require("luci.bits")
+
+
+Instance = luci.util.class()
+
+function Instance.from_string( self, s )
+       return {
+               luci.bits.Hex2Dec(s:sub(1,2)),
+               luci.bits.Hex2Dec(s:sub(3,4)),
+               luci.bits.Hex2Dec(s:sub(5,6))
+       }
+end
+
+function Instance.to_string( self, c )
+       return string.format(
+               "%02x%02x%02x",
+               math.floor(c[1]),
+               math.floor(c[2]),
+               math.floor(c[3])
+       )
+end
+
+function Instance.random( self )
+       local r   = math.random(255)
+       local g   = math.random(255)
+       local min = 0
+       local max = 255
+
+       if ( r + g ) < 255 then
+               min = 255 - r - g
+       else
+               max = 511 - r - g
+       end
+
+       local b = min + math.floor( math.random() * ( max - min ) )
+
+       return { r, g, b }
+end
+
+function Instance.faded( self, fg, opts )
+       opts = opts or {}
+       opts.background = opts.background or { 255, 255, 255 }
+       opts.alpha      = opts.alpha      or 0.25
+
+       if type(opts.background) == "string" then
+               opts.background = _string_to_color(opts.background)
+       end
+
+       local bg = opts.background
+
+       return {
+               ( opts.alpha * fg[1] ) + ( ( 1.0 - opts.alpha ) * bg[1] ),
+               ( opts.alpha * fg[2] ) + ( ( 1.0 - opts.alpha ) * bg[2] ),
+               ( opts.alpha * fg[3] ) + ( ( 1.0 - opts.alpha ) * bg[3] )
+       }
+end
diff --git a/applications/luci-statistics/luasrc/statistics/rrdtool/definitions.lua b/applications/luci-statistics/luasrc/statistics/rrdtool/definitions.lua
new file mode 100644 (file)
index 0000000..add69e4
--- /dev/null
@@ -0,0 +1,3177 @@
+module("luci.statistics.rrdtool.definitions", package.seeall)
+
+require("luci.util")
+require("luci.fs")
+
+
+Instance = luci.util.class()
+
+function Instance.__init__( self, ... )
+
+       -- used color palette
+       self.palette = {
+               Canvas          = "FFFFFF",
+               FullRed         = "FF0000",
+               FullGreen       = "00E000",
+               FullBlue        = "0000FF",
+               FullYellow      = "F0A000",
+               FullCyan        = "00A0FF",
+               FullMagenta     = "A000FF",
+               HalfRed         = "F7B7B7",
+               HalfGreen       = "B7EFB7",
+               HalfBlue        = "B7B7F7",
+               HalfYellow      = "F3DFB7",
+               HalfCyan        = "B7DFF7",
+               HalfMagenta     = "DFB7F7",
+               HalfBlueGreen   = "89B3C9"
+       }
+
+       -- plotting arguments for each defined datasource
+       self.definitions = {
+               apache_bytes = {
+                       "DEF:min_raw={file}:count:MIN",
+                       "DEF:avg_raw={file}:count:AVERAGE",
+                       "DEF:max_raw={file}:count:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "CDEF:mytime=avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:avg_sample=avg_raw,UN,0,avg_raw,IF,sample_len,*",
+                       "CDEF:avg_sum=PREV,UN,0,PREV,IF,avg_sample,+",
+                       "AREA:avg#" .. self.palette.HalfBlue,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bit/s",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               apache_requests = {
+                       "DEF:min={file}:count:MIN",
+                       "DEF:avg={file}:count:AVERAGE",
+                       "DEF:max={file}:count:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Requests/s",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               apache_scoreboard = {
+                       "DEF:min={file}:count:MIN",
+                       "DEF:avg={file}:count:AVERAGE",
+                       "DEF:max={file}:count:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Processes",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               bitrate = {
+                       "-v", "Bits/s",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bits/s",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Average,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               charge = {
+                       "-v", "Ah",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Charge",
+                       "GPRINT:min:MIN:%5.1lf%sAh Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sAh Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sAh Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sAh Last\\l"
+               },
+
+               __cpu = {
+                       "-v", "CPU load",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Percent",
+                       "GPRINT:min:MIN:%6.2lf%% Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf%% Avg,",
+                       "GPRINT:max:MAX:%6.2lf%% Max,",
+                       "GPRINT:avg:LAST:%6.2lf%% Last\\l"
+               },
+
+               current = {
+                       "-v", "Ampere",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Current",
+                       "GPRINT:min:MIN:%5.1lf%sA Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sA Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sA Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sA Last\\l"
+               },
+
+               df = {
+                       "-v", "Percent", "-l", "0",
+                       "DEF:free_avg={file}:free:AVERAGE",
+                       "DEF:free_min={file}:free:MIN",
+                       "DEF:free_max={file}:free:MAX",
+                       "DEF:used_avg={file}:used:AVERAGE",
+                       "DEF:used_min={file}:used:MIN",
+                       "DEF:used_max={file}:used:MAX",
+                       "CDEF:total=free_avg,used_avg,+",
+                       "CDEF:free_pct=100,free_avg,*,total,/",
+                       "CDEF:used_pct=100,used_avg,*,total,/",
+                       "CDEF:free_acc=free_pct,used_pct,+",
+                       "CDEF:used_acc=used_pct",
+                       "AREA:free_acc#" .. self.palette.HalfGreen,
+                       "AREA:used_acc#" .. self.palette.HalfRed,
+                       "LINE1:free_acc#" .. self.palette.FullGreen .. ":Free",
+                       "GPRINT:free_min:MIN:%5.1lf%sB Min,",
+                       "GPRINT:free_avg:AVERAGE:%5.1lf%sB Avg,",
+                       "GPRINT:free_max:MAX:%5.1lf%sB Max,",
+                       "GPRINT:free_avg:LAST:%5.1lf%sB Last\\l",
+                       "LINE1:used_acc#" .. self.palette.FullRed .. ":Used",
+                       "GPRINT:used_min:MIN:%5.1lf%sB Min,",
+                       "GPRINT:used_avg:AVERAGE:%5.1lf%sB Avg,",
+                       "GPRINT:used_max:MAX:%5.1lf%sB Max,",
+                       "GPRINT:used_avg:LAST:%5.1lf%sB Last\\l"
+               },
+
+               disk = {
+                       "DEF:rtime_avg={file}:rtime:AVERAGE",
+                       "DEF:rtime_min={file}:rtime:MIN",
+                       "DEF:rtime_max={file}:rtime:MAX",
+                       "DEF:wtime_avg={file}:wtime:AVERAGE",
+                       "DEF:wtime_min={file}:wtime:MIN",
+                       "DEF:wtime_max={file}:wtime:MAX",
+                       "CDEF:rtime_avg_ms=rtime_avg,1000,/",
+                       "CDEF:rtime_min_ms=rtime_min,1000,/",
+                       "CDEF:rtime_max_ms=rtime_max,1000,/",
+                       "CDEF:wtime_avg_ms=wtime_avg,1000,/",
+                       "CDEF:wtime_min_ms=wtime_min,1000,/",
+                       "CDEF:wtime_max_ms=wtime_max,1000,/",
+                       "CDEF:total_avg_ms=rtime_avg_ms,wtime_avg_ms,+",
+                       "CDEF:total_min_ms=rtime_min_ms,wtime_min_ms,+",
+                       "CDEF:total_max_ms=rtime_max_ms,wtime_max_ms,+",
+                       "AREA:total_max_ms#" .. self.palette.HalfRed,
+                       "AREA:total_min_ms#" .. self.palette.Canvas,
+                       "LINE1:wtime_avg_ms#" .. self.palette.FullGreen .. ":Write",
+                       "GPRINT:wtime_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:wtime_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:wtime_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:wtime_avg_ms:LAST:%5.1lf%s Last\n",
+                       "LINE1:rtime_avg_ms#" .. self.palette.FullBlue .. ":Read ",
+                       "GPRINT:rtime_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:rtime_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rtime_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:rtime_avg_ms:LAST:%5.1lf%s Last\n",
+                       "LINE1:total_avg_ms#" .. self.palette.FullRed .. ":Total",
+                       "GPRINT:total_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:total_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:total_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:total_avg_ms:LAST:%5.1lf%s Last\\l"
+               },
+
+               disk_octets = {
+                       "-v", "Bytes/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "CDEF:mytime=out_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:out_avg_sample=out_avg,UN,0,out_avg,IF,sample_len,*",
+                       "CDEF:out_avg_sum=PREV,UN,0,PREV,IF,out_avg_sample,+",
+                       "CDEF:inc_avg_sample=inc_avg,UN,0,inc_avg,IF,sample_len,*",
+                       "CDEF:inc_avg_sum=PREV,UN,0,PREV,IF,inc_avg_sample,+",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:out_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:out_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:out_avg_sum:LAST:(ca. %5.1lf%sB Total)",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:inc_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:inc_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:inc_avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               disk_merged = {
+                       "-v", "Merged Ops/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:out_max:MAX:%6.2lf Max,",
+                       "GPRINT:out_avg:LAST:%6.2lf Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:inc_max:MAX:%6.2lf Max,",
+                       "GPRINT:inc_avg:LAST:%6.2lf Last\\l"
+               },
+
+               disk_ops = {
+                       "-v", "Ops/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:out_max:MAX:%6.2lf Max,",
+                       "GPRINT:out_avg:LAST:%6.2lf Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:inc_max:MAX:%6.2lf Max,",
+                       "GPRINT:inc_avg:LAST:%6.2lf Last\\l"
+               },
+
+               disk_time = {
+                       "-v", "Seconds/s",
+                       "DEF:out_min_raw={file}:write:MIN",
+                       "DEF:out_avg_raw={file}:write:AVERAGE",
+                       "DEF:out_max_raw={file}:write:MAX",
+                       "DEF:inc_min_raw={file}:read:MIN",
+                       "DEF:inc_avg_raw={file}:read:AVERAGE",
+                       "DEF:inc_max_raw={file}:read:MAX",
+                       "CDEF:out_min=out_min_raw,1000,/",
+                       "CDEF:out_avg=out_avg_raw,1000,/",
+                       "CDEF:out_max=out_max_raw,1000,/",
+                       "CDEF:inc_min=inc_min_raw,1000,/",
+                       "CDEF:inc_avg=inc_avg_raw,1000,/",
+                       "CDEF:inc_max=inc_max_raw,1000,/",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%5.1lf%ss Avg,",
+                       "GPRINT:out_max:MAX:%5.1lf%ss Max,",
+                       "GPRINT:out_avg:LAST:%5.1lf%ss Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%5.1lf%ss Avg,",
+                       "GPRINT:inc_max:MAX:%5.1lf%ss Max,",
+                       "GPRINT:inc_avg:LAST:%5.1lf%ss Last\\l"
+               },
+
+               dns_octets = {
+                       "DEF:rsp_min_raw={file}:responses:MIN",
+                       "DEF:rsp_avg_raw={file}:responses:AVERAGE",
+                       "DEF:rsp_max_raw={file}:responses:MAX",
+                       "DEF:qry_min_raw={file}:queries:MIN",
+                       "DEF:qry_avg_raw={file}:queries:AVERAGE",
+                       "DEF:qry_max_raw={file}:queries:MAX",
+                       "CDEF:rsp_min=rsp_min_raw,8,*",
+                       "CDEF:rsp_avg=rsp_avg_raw,8,*",
+                       "CDEF:rsp_max=rsp_max_raw,8,*",
+                       "CDEF:qry_min=qry_min_raw,8,*",
+                       "CDEF:qry_avg=qry_avg_raw,8,*",
+                       "CDEF:qry_max=qry_max_raw,8,*",
+                       "CDEF:overlap=rsp_avg,qry_avg,GT,qry_avg,rsp_avg,IF",
+                       "CDEF:mytime=rsp_avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:rsp_avg_sample=rsp_avg_raw,UN,0,rsp_avg_raw,IF,sample_len,*",
+                       "CDEF:rsp_avg_sum=PREV,UN,0,PREV,IF,rsp_avg_sample,+",
+                       "CDEF:qry_avg_sample=qry_avg_raw,UN,0,qry_avg_raw,IF,sample_len,*",
+                       "CDEF:qry_avg_sum=PREV,UN,0,PREV,IF,qry_avg_sample,+",
+                       "AREA:rsp_avg#" .. self.palette.HalfGreen,
+                       "AREA:qry_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:rsp_avg#" .. self.palette.FullGreen .. ":Responses",
+                       "GPRINT:rsp_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rsp_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rsp_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rsp_avg_sum:LAST:(ca. %5.1lf%sB Total)",
+                       "LINE1:qry_avg#" .. self.palette.FullBlue .. ":Queries  ",
+                       #"GPRINT:qry_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:qry_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:qry_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:qry_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:qry_avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               dns_opcode = {
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Queries/s",
+                       "GPRINT:min:MIN:%9.3lf Min,",
+                       "GPRINT:avg:AVERAGE:%9.3lf Average,",
+                       "GPRINT:max:MAX:%9.3lf Max,",
+                       "GPRINT:avg:LAST:%9.3lf Last\\l"
+               },
+
+               email_count = {
+                       "-v", "Mails",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               email_size = {
+                       "-v", "Bytes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               spam_score = {
+                       "-v", "Score",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Score ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               spam_check = {
+                       "DEF:avg={file}:hits:AVERAGE",
+                       "DEF:min={file}:hits:MIN",
+                       "DEF:max={file}:hits:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               entropy = {
+                       "-v", "Bits",
+                       "DEF:avg={file}:entropy:AVERAGE",
+                       "DEF:min={file}:entropy:MIN",
+                       "DEF:max={file}:entropy:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bits",
+                       "GPRINT:min:MIN:%4.0lfbit Min,",
+                       "GPRINT:avg:AVERAGE:%4.0lfbit Avg,",
+                       "GPRINT:max:MAX:%4.0lfbit Max,",
+                       "GPRINT:avg:LAST:%4.0lfbit Last\\l"
+               },
+
+               fanspeed = {
+                       "-v", "RPM",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":RPM",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               frequency = {
+                       "-v", "Hertz",
+                       "DEF:avg={file}:frequency:AVERAGE",
+                       "DEF:min={file}:frequency:MIN",
+                       "DEF:max={file}:frequency:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Frequency [Hz]",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               frequency_offset = {
+                       "DEF:ppm_avg={file}:ppm:AVERAGE",
+                       "DEF:ppm_min={file}:ppm:MIN",
+                       "DEF:ppm_max={file}:ppm:MAX",
+                       "AREA:ppm_max#" .. self.palette.HalfBlue,
+                       "AREA:ppm_min#" .. self.palette.Canvas,
+                       "LINE1:ppm_avg#" .. self.palette.FullBlue .. ":{inst}",
+                       "GPRINT:ppm_min:MIN:%5.2lf Min,",
+                       "GPRINT:ppm_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:ppm_max:MAX:%5.2lf Max,",
+                       "GPRINT:ppm_avg:LAST:%5.2lf Last\\l"
+               },
+
+               gauge = {
+                       "-v", "Exec value",
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfBlue,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullBlue .. ":Exec value",
+                       "GPRINT:temp_min:MIN:%6.2lf Min,",
+                       "GPRINT:temp_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:temp_max:MAX:%6.2lf Max,",
+                       "GPRINT:temp_avg:LAST:%6.2lf Last\\l"
+               },
+
+               hddtemp = {
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfRed,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullRed .. ":Temperature",
+                       "GPRINT:temp_min:MIN:%4.1lf Min,",
+                       "GPRINT:temp_avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:temp_max:MAX:%4.1lf Max,",
+                       "GPRINT:temp_avg:LAST:%4.1lf Last\\l"
+               },
+
+               humidity = {
+                       "-v", "Percent",
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfGreen,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullGreen .. ":Temperature",
+                       "GPRINT:temp_min:MIN:%4.1lf%% Min,",
+                       "GPRINT:temp_avg:AVERAGE:%4.1lf%% Avg,",
+                       "GPRINT:temp_max:MAX:%4.1lf%% Max,",
+                       "GPRINT:temp_avg:LAST:%4.1lf%% Last\\l"
+               },
+
+               if_errors = {
+                       "-v", "Errors/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_collisions = {
+                       "-v", "Collisions/s",
+                       "DEF:min_raw={file}:value:MIN",
+                       "DEF:avg_raw={file}:value:AVERAGE",
+                       "DEF:max_raw={file}:value:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Collisions/s",
+                       "GPRINT:min:MIN:%5.1lf %s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               if_dropped = {
+                       "-v", "Packets/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_packets = {
+                       "-v", "Packets/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_rx_errors = {
+                       "-v", "Errors/s",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:max={file}:value:MAX",
+                       "CDEF:mytime=avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:avg_sample=avg,UN,0,avg,IF,sample_len,*",
+                       "CDEF:avg_sum=PREV,UN,0,PREV,IF,avg_sample,+",
+                       "AREA:avg#" .. self.palette.HalfBlue,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Errors/s",
+                       "GPRINT:avg:AVERAGE:%3.1lf%s Avg,",
+                       "GPRINT:max:MAX:%3.1lf%s Max,",
+                       "GPRINT:avg:LAST:%3.1lf%s Last\\l",
+                       "GPRINT:avg_sum:LAST:(ca. %2.0lf%s Total)"
+               },
+
+               ipt_bytes = {
+                       "-v", "Bits/s",
+                       "DEF:min_raw={file}:value:MIN",
+                       "DEF:avg_raw={file}:value:AVERAGE",
+                       "DEF:max_raw={file}:value:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "CDEF:mytime=avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:avg_sample=avg_raw,UN,0,avg_raw,IF,sample_len,*",
+                       "CDEF:avg_sum=PREV,UN,0,PREV,IF,avg_sample,+",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bits/s",
+                       #"GPRINT:min:MIN:%5.1lf %s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               ipt_packets = {
+                       "-v", "Packets/s",
+                       "DEF:min_raw={file}:value:MIN",
+                       "DEF:avg_raw={file}:value:AVERAGE",
+                       "DEF:max_raw={file}:value:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Packets/s",
+                       "GPRINT:min:MIN:%5.1lf %s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               irq = {
+                       "-v", "Issues/s",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Issues/s",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               load = {
+                       "-v", "System load",
+                       "DEF:s_avg={file}:shortterm:AVERAGE",
+                       "DEF:s_min={file}:shortterm:MIN",
+                       "DEF:s_max={file}:shortterm:MAX",
+                       "DEF:m_avg={file}:midterm:AVERAGE",
+                       "DEF:m_min={file}:midterm:MIN",
+                       "DEF:m_max={file}:midterm:MAX",
+                       "DEF:l_avg={file}:longterm:AVERAGE",
+                       "DEF:l_min={file}:longterm:MIN",
+                       "DEF:l_max={file}:longterm:MAX",
+                       "AREA:s_max#" .. self.palette.HalfGreen,
+                       "AREA:s_min#" .. self.palette.Canvas,
+                       "LINE1:s_avg#" .. self.palette.FullGreen .. ": 1m average",
+                       "GPRINT:s_min:MIN:%4.2lf Min,",
+                       "GPRINT:s_avg:AVERAGE:%4.2lf Avg,",
+                       "GPRINT:s_max:MAX:%4.2lf Max,",
+                       "GPRINT:s_avg:LAST:%4.2lf Last\n",
+                       "LINE1:m_avg#" .. self.palette.FullBlue .. ": 5m average",
+                       "GPRINT:m_min:MIN:%4.2lf Min,",
+                       "GPRINT:m_avg:AVERAGE:%4.2lf Avg,",
+                       "GPRINT:m_max:MAX:%4.2lf Max,",
+                       "GPRINT:m_avg:LAST:%4.2lf Last\n",
+                       "LINE1:l_avg#" .. self.palette.FullRed .. ":15m average",
+                       "GPRINT:l_min:MIN:%4.2lf Min,",
+                       "GPRINT:l_avg:AVERAGE:%4.2lf Avg,",
+                       "GPRINT:l_max:MAX:%4.2lf Max,",
+                       "GPRINT:l_avg:LAST:%4.2lf Last\\l"
+               },
+
+               load_percent = {
+                       "DEF:avg={file}:percent:AVERAGE",
+                       "DEF:min={file}:percent:MIN",
+                       "DEF:max={file}:percent:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Load",
+                       "GPRINT:min:MIN:%5.1lf%s%% Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s%% Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s%% Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s%% Last\\l"
+               },
+
+               mails = {
+                       "DEF:rawgood={file}:good:AVERAGE",
+                       "DEF:rawspam={file}:spam:AVERAGE",
+                       "CDEF:good=rawgood,UN,0,rawgood,IF",
+                       "CDEF:spam=rawspam,UN,0,rawspam,IF",
+                       "CDEF:negspam=spam,-1,*",
+                       "AREA:good#" .. self.palette.HalfGreen,
+                       "LINE1:good#" .. self.palette.FullGreen .. ":Good mails",
+                       "GPRINT:good:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:good:MAX:%4.1lf Max,",
+                       "GPRINT:good:LAST:%4.1lf Last\n",
+                       "AREA:negspam#" .. self.palette.HalfRed,
+                       "LINE1:negspam#" .. self.palette.FullRed .. ":Spam mails",
+                       "GPRINT:spam:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:spam:MAX:%4.1lf Max,",
+                       "GPRINT:spam:LAST:%4.1lf Last\\l",
+                       "HRULE:0#000000"
+               },
+
+               memory = {
+                       "-b", "1024", "-v", "Bytes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Memory",
+                       "GPRINT:min:MIN:%5.1lf%sbyte Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sbyte Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sbyte Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sbyte Last\\l"
+               },
+
+               old_memory = {
+                       "DEF:used_avg={file}:used:AVERAGE",
+                       "DEF:free_avg={file}:free:AVERAGE",
+                       "DEF:buffers_avg={file}:buffers:AVERAGE",
+                       "DEF:cached_avg={file}:cached:AVERAGE",
+                       "DEF:used_min={file}:used:MIN",
+                       "DEF:free_min={file}:free:MIN",
+                       "DEF:buffers_min={file}:buffers:MIN",
+                       "DEF:cached_min={file}:cached:MIN",
+                       "DEF:used_max={file}:used:MAX",
+                       "DEF:free_max={file}:free:MAX",
+                       "DEF:buffers_max={file}:buffers:MAX",
+                       "DEF:cached_max={file}:cached:MAX",
+                       "CDEF:cached_avg_nn=cached_avg,UN,0,cached_avg,IF",
+                       "CDEF:buffers_avg_nn=buffers_avg,UN,0,buffers_avg,IF",
+                       "CDEF:free_cached_buffers_used=free_avg,cached_avg_nn,+,buffers_avg_nn,+,used_avg,+",
+                       "CDEF:cached_buffers_used=cached_avg,buffers_avg_nn,+,used_avg,+",
+                       "CDEF:buffers_used=buffers_avg,used_avg,+",
+                       "AREA:free_cached_buffers_used#" .. self.palette.HalfGreen,
+                       "AREA:cached_buffers_used#" .. self.palette.HalfBlue,
+                       "AREA:buffers_used#" .. self.palette.HalfYellow,
+                       "AREA:used_avg#" .. self.palette.HalfRed,
+                       "LINE1:free_cached_buffers_used#" .. self.palette.FullGreen .. ":Free        ",
+                       "GPRINT:free_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:free_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:free_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:free_avg:LAST:%5.1lf%s Last\n",
+                       "LINE1:cached_buffers_used#" .. self.palette.FullBlue .. ":Page cache  ",
+                       "GPRINT:cached_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:cached_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:cached_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:cached_avg:LAST:%5.1lf%s Last\n",
+                       "LINE1:buffers_used#" .. self.palette.FullYellow .. ":Buffer cache",
+                       "GPRINT:buffers_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:buffers_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:buffers_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:buffers_avg:LAST:%5.1lf%s Last\n",
+                       "LINE1:used_avg#" .. self.palette.FullRed .. ":Used        ",
+                       "GPRINT:used_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:used_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:used_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:used_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               mysql_commands = {
+                       "-v", "Issues/s",
+                       "DEF:val_avg={file}:value:AVERAGE",
+                       "DEF:val_min={file}:value:MIN",
+                       "DEF:val_max={file}:value:MAX",
+                       "AREA:val_max#" .. self.palette.HalfBlue,
+                       "AREA:val_min#" .. self.palette.Canvas,
+                       "LINE1:val_avg#" .. self.palette.FullBlue .. ":Issues/s",
+                       "GPRINT:val_min:MIN:%5.2lf Min,",
+                       "GPRINT:val_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:val_max:MAX:%5.2lf Max,",
+                       "GPRINT:val_avg:LAST:%5.2lf Last\\l"
+               },
+
+               mysql_handler = {
+                       "-v", "Issues/s",
+                       "DEF:val_avg={file}:value:AVERAGE",
+                       "DEF:val_min={file}:value:MIN",
+                       "DEF:val_max={file}:value:MAX",
+                       "AREA:val_max#" .. self.palette.HalfBlue,
+                       "AREA:val_min#" .. self.palette.Canvas,
+                       "LINE1:val_avg#" .. self.palette.FullBlue .. ":Issues/s",
+                       "GPRINT:val_min:MIN:%5.2lf Min,",
+                       "GPRINT:val_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:val_max:MAX:%5.2lf Max,",
+                       "GPRINT:val_avg:LAST:%5.2lf Last\\l"
+               },
+
+               mysql_octets = {
+                       "-v", "Bits/s",
+                       "DEF:out_min={file}:tx:MIN",
+                       "DEF:out_avg={file}:tx:AVERAGE",
+                       "DEF:out_max={file}:tx:MAX",
+                       "DEF:inc_min={file}:rx:MIN",
+                       "DEF:inc_avg={file}:rx:AVERAGE",
+                       "DEF:inc_max={file}:rx:MAX",
+                       "CDEF:mytime=out_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:out_avg_sample=out_avg,UN,0,out_avg,IF,sample_len,*",
+                       "CDEF:out_avg_sum=PREV,UN,0,PREV,IF,out_avg_sample,+",
+                       "CDEF:inc_avg_sample=inc_avg,UN,0,inc_avg,IF,sample_len,*",
+                       "CDEF:inc_avg_sum=PREV,UN,0,PREV,IF,inc_avg_sample,+",
+                       "CDEF:out_bit_min=out_min,8,*",
+                       "CDEF:out_bit_avg=out_avg,8,*",
+                       "CDEF:out_bit_max=out_max,8,*",
+                       "CDEF:inc_bit_min=inc_min,8,*",
+                       "CDEF:inc_bit_avg=inc_avg,8,*",
+                       "CDEF:inc_bit_max=inc_max,8,*",
+                       "CDEF:overlap=out_bit_avg,inc_bit_avg,GT,inc_bit_avg,out_bit_avg,IF",
+                       "AREA:out_bit_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_bit_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_bit_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_bit_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:out_bit_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:out_bit_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:out_avg_sum:LAST:(ca. %5.1lf%sB Total)",
+                       "LINE1:inc_bit_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_bit_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:inc_bit_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:inc_bit_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:inc_avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               mysql_qcache = {
+                       "-v", "Queries/s",
+                       "DEF:hits_min={file}:hits:MIN",
+                       "DEF:hits_avg={file}:hits:AVERAGE",
+                       "DEF:hits_max={file}:hits:MAX",
+                       "DEF:inserts_min={file}:inserts:MIN",
+                       "DEF:inserts_avg={file}:inserts:AVERAGE",
+                       "DEF:inserts_max={file}:inserts:MAX",
+                       "DEF:not_cached_min={file}:not_cached:MIN",
+                       "DEF:not_cached_avg={file}:not_cached:AVERAGE",
+                       "DEF:not_cached_max={file}:not_cached:MAX",
+                       "DEF:lowmem_prunes_min={file}:lowmem_prunes:MIN",
+                       "DEF:lowmem_prunes_avg={file}:lowmem_prunes:AVERAGE",
+                       "DEF:lowmem_prunes_max={file}:lowmem_prunes:MAX",
+                       "DEF:queries_min={file}:queries_in_cache:MIN",
+                       "DEF:queries_avg={file}:queries_in_cache:AVERAGE",
+                       "DEF:queries_max={file}:queries_in_cache:MAX",
+                       "CDEF:unknown=queries_avg,UNKN,+",
+                       "CDEF:not_cached_agg=hits_avg,inserts_avg,+,not_cached_avg,+",
+                       "CDEF:inserts_agg=hits_avg,inserts_avg,+",
+                       "CDEF:hits_agg=hits_avg",
+                       "AREA:not_cached_agg#" .. self.palette.HalfYellow,
+                       "AREA:inserts_agg#" .. self.palette.HalfBlue,
+                       "AREA:hits_agg#" .. self.palette.HalfGreen,
+                       "LINE1:not_cached_agg#" .. self.palette.FullYellow .. ":Not Cached      ",
+                       "GPRINT:not_cached_min:MIN:%5.2lf Min,",
+                       "GPRINT:not_cached_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:not_cached_max:MAX:%5.2lf Max,",
+                       "GPRINT:not_cached_avg:LAST:%5.2lf Last\\l",
+                       "LINE1:inserts_agg#" .. self.palette.FullBlue .. ":Inserts         ",
+                       "GPRINT:inserts_min:MIN:%5.2lf Min,",
+                       "GPRINT:inserts_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:inserts_max:MAX:%5.2lf Max,",
+                       "GPRINT:inserts_avg:LAST:%5.2lf Last\\l",
+                       "LINE1:hits_agg#" .. self.palette.FullGreen .. ":Hits            ",
+                       "GPRINT:hits_min:MIN:%5.2lf Min,",
+                       "GPRINT:hits_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:hits_max:MAX:%5.2lf Max,",
+                       "GPRINT:hits_avg:LAST:%5.2lf Last\\l",
+                       "LINE1:lowmem_prunes_avg#" .. self.palette.FullRed .. ":Lowmem Prunes   ",
+                       "GPRINT:lowmem_prunes_min:MIN:%5.2lf Min,",
+                       "GPRINT:lowmem_prunes_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:lowmem_prunes_max:MAX:%5.2lf Max,",
+                       "GPRINT:lowmem_prunes_avg:LAST:%5.2lf Last\\l",
+                       "LINE1:unknown#" .. self.palette.Canvas .. ":Queries in cache",
+                       "GPRINT:queries_min:MIN:%5.0lf Min,",
+                       "GPRINT:queries_avg:AVERAGE:%5.0lf Avg,",
+                       "GPRINT:queries_max:MAX:%5.0lf Max,",
+                       "GPRINT:queries_avg:LAST:%5.0lf Last\\l"
+               },
+
+               mysql_threads = {
+                       "-v", "Threads",
+                       "DEF:running_min={file}:running:MIN",
+                       "DEF:running_avg={file}:running:AVERAGE",
+                       "DEF:running_max={file}:running:MAX",
+                       "DEF:connected_min={file}:connected:MIN",
+                       "DEF:connected_avg={file}:connected:AVERAGE",
+                       "DEF:connected_max={file}:connected:MAX",
+                       "DEF:cached_min={file}:cached:MIN",
+                       "DEF:cached_avg={file}:cached:AVERAGE",
+                       "DEF:cached_max={file}:cached:MAX",
+                       "DEF:created_min={file}:created:MIN",
+                       "DEF:created_avg={file}:created:AVERAGE",
+                       "DEF:created_max={file}:created:MAX",
+                       "CDEF:unknown=created_avg,UNKN,+",
+                       "CDEF:cached_agg=connected_avg,cached_avg,+",
+                       "AREA:cached_agg#" .. self.palette.HalfGreen,
+                       "AREA:connected_avg#" .. self.palette.HalfBlue,
+                       "AREA:running_avg#" .. self.palette.HalfRed,
+                       "LINE1:cached_agg#" .. self.palette.FullGreen .. ":Cached   ",
+                       "GPRINT:cached_min:MIN:%5.1lf Min,",
+                       "GPRINT:cached_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:cached_max:MAX:%5.1lf Max,",
+                       "GPRINT:cached_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:connected_avg#" .. self.palette.FullBlue .. ":Connected",
+                       "GPRINT:connected_min:MIN:%5.1lf Min,",
+                       "GPRINT:connected_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:connected_max:MAX:%5.1lf Max,",
+                       "GPRINT:connected_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:running_avg#" .. self.palette.FullRed .. ":Running  ",
+                       "GPRINT:running_min:MIN:%5.1lf Min,",
+                       "GPRINT:running_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:running_max:MAX:%5.1lf Max,",
+                       "GPRINT:running_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:unknown#" .. self.palette.Canvas .. ":Created  ",
+                       "GPRINT:created_min:MIN:%5.0lf Min,",
+                       "GPRINT:created_avg:AVERAGE:%5.0lf Avg,",
+                       "GPRINT:created_max:MAX:%5.0lf Max,",
+                       "GPRINT:created_avg:LAST:%5.0lf Last\\l"
+               },
+
+               nfs_procedure = {
+                       "-v", "Issues/s",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Issues/s",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               nfs3_procedures = {
+                       "DEF:null_avg={file}:null:AVERAGE",
+                       "DEF:getattr_avg={file}:getattr:AVERAGE",
+                       "DEF:setattr_avg={file}:setattr:AVERAGE",
+                       "DEF:lookup_avg={file}:lookup:AVERAGE",
+                       "DEF:access_avg={file}:access:AVERAGE",
+                       "DEF:readlink_avg={file}:readlink:AVERAGE",
+                       "DEF:read_avg={file}:read:AVERAGE",
+                       "DEF:write_avg={file}:write:AVERAGE",
+                       "DEF:create_avg={file}:create:AVERAGE",
+                       "DEF:mkdir_avg={file}:mkdir:AVERAGE",
+                       "DEF:symlink_avg={file}:symlink:AVERAGE",
+                       "DEF:mknod_avg={file}:mknod:AVERAGE",
+                       "DEF:remove_avg={file}:remove:AVERAGE",
+                       "DEF:rmdir_avg={file}:rmdir:AVERAGE",
+                       "DEF:rename_avg={file}:rename:AVERAGE",
+                       "DEF:link_avg={file}:link:AVERAGE",
+                       "DEF:readdir_avg={file}:readdir:AVERAGE",
+                       "DEF:readdirplus_avg={file}:readdirplus:AVERAGE",
+                       "DEF:fsstat_avg={file}:fsstat:AVERAGE",
+                       "DEF:fsinfo_avg={file}:fsinfo:AVERAGE",
+                       "DEF:pathconf_avg={file}:pathconf:AVERAGE",
+                       "DEF:commit_avg={file}:commit:AVERAGE",
+                       "DEF:null_max={file}:null:MAX",
+                       "DEF:getattr_max={file}:getattr:MAX",
+                       "DEF:setattr_max={file}:setattr:MAX",
+                       "DEF:lookup_max={file}:lookup:MAX",
+                       "DEF:access_max={file}:access:MAX",
+                       "DEF:readlink_max={file}:readlink:MAX",
+                       "DEF:read_max={file}:read:MAX",
+                       "DEF:write_max={file}:write:MAX",
+                       "DEF:create_max={file}:create:MAX",
+                       "DEF:mkdir_max={file}:mkdir:MAX",
+                       "DEF:symlink_max={file}:symlink:MAX",
+                       "DEF:mknod_max={file}:mknod:MAX",
+                       "DEF:remove_max={file}:remove:MAX",
+                       "DEF:rmdir_max={file}:rmdir:MAX",
+                       "DEF:rename_max={file}:rename:MAX",
+                       "DEF:link_max={file}:link:MAX",
+                       "DEF:readdir_max={file}:readdir:MAX",
+                       "DEF:readdirplus_max={file}:readdirplus:MAX",
+                       "DEF:fsstat_max={file}:fsstat:MAX",
+                       "DEF:fsinfo_max={file}:fsinfo:MAX",
+                       "DEF:pathconf_max={file}:pathconf:MAX",
+                       "DEF:commit_max={file}:commit:MAX",
+                       "CDEF:other_avg=null_avg,readlink_avg,create_avg,mkdir_avg,symlink_avg,mknod_avg,remove_avg,rmdir_avg,rename_avg,link_avg,readdir_avg,readdirplus_avg,fsstat_avg,fsinfo_avg,pathconf_avg,+,+,+,+,+,+,+,+,+,+,+,+,+,+",
+                       "CDEF:other_max=null_max,readlink_max,create_max,mkdir_max,symlink_max,mknod_max,remove_max,rmdir_max,rename_max,link_max,readdir_max,readdirplus_max,fsstat_max,fsinfo_max,pathconf_max,+,+,+,+,+,+,+,+,+,+,+,+,+,+",
+                       "CDEF:stack_read=read_avg",
+                       "CDEF:stack_getattr=stack_read,getattr_avg,+",
+                       "CDEF:stack_access=stack_getattr,access_avg,+",
+                       "CDEF:stack_lookup=stack_access,lookup_avg,+",
+                       "CDEF:stack_write=stack_lookup,write_avg,+",
+                       "CDEF:stack_commit=stack_write,commit_avg,+",
+                       "CDEF:stack_setattr=stack_commit,setattr_avg,+",
+                       "CDEF:stack_other=stack_setattr,other_avg,+",
+                       "AREA:stack_other#" .. self.palette.HalfRed,
+                       "AREA:stack_setattr#" .. self.palette.HalfGreen,
+                       "AREA:stack_commit#" .. self.palette.HalfYellow,
+                       "AREA:stack_write#" .. self.palette.HalfGreen,
+                       "AREA:stack_lookup#" .. self.palette.HalfBlue,
+                       "AREA:stack_access#" .. self.palette.HalfMagenta,
+                       "AREA:stack_getattr#" .. self.palette.HalfCyan,
+                       "AREA:stack_read#" .. self.palette.HalfBlue,
+                       "LINE1:stack_other#" .. self.palette.FullRed .. ":Other  ",
+                       "GPRINT:other_max:MAX:%5.1lf Max,",
+                       "GPRINT:other_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:other_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_setattr#" .. self.palette.FullGreen .. ":setattr",
+                       "GPRINT:setattr_max:MAX:%5.1lf Max,",
+                       "GPRINT:setattr_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:setattr_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_commit#" .. self.palette.FullYellow .. ":commit ",
+                       "GPRINT:commit_max:MAX:%5.1lf Max,",
+                       "GPRINT:commit_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:commit_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_write#" .. self.palette.FullGreen .. ":write  ",
+                       "GPRINT:write_max:MAX:%5.1lf Max,",
+                       "GPRINT:write_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:write_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_lookup#" .. self.palette.FullBlue .. ":lookup ",
+                       "GPRINT:lookup_max:MAX:%5.1lf Max,",
+                       "GPRINT:lookup_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:lookup_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_access#" .. self.palette.FullMagenta .. ":access ",
+                       "GPRINT:access_max:MAX:%5.1lf Max,",
+                       "GPRINT:access_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:access_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_getattr#" .. self.palette.FullCyan .. ":getattr",
+                       "GPRINT:getattr_max:MAX:%5.1lf Max,",
+                       "GPRINT:getattr_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:getattr_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stack_read#" .. self.palette.FullBlue .. ":read   ",
+                       "GPRINT:read_max:MAX:%5.1lf Max,",
+                       "GPRINT:read_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:read_avg:LAST:%5.1lf Last\\l"
+               },
+
+               partition = {
+                       "DEF:rbyte_avg={file}:rbytes:AVERAGE",
+                       "DEF:rbyte_min={file}:rbytes:MIN",
+                       "DEF:rbyte_max={file}:rbytes:MAX",
+                       "DEF:wbyte_avg={file}:wbytes:AVERAGE",
+                       "DEF:wbyte_min={file}:wbytes:MIN",
+                       "DEF:wbyte_max={file}:wbytes:MAX",
+                       "CDEF:overlap=wbyte_avg,rbyte_avg,GT,rbyte_avg,wbyte_avg,IF",
+                       "AREA:wbyte_avg#" .. self.palette.HalfGreen,
+                       "AREA:rbyte_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:wbyte_avg#" .. self.palette.FullGreen .. ":Write",
+                       "GPRINT:wbyte_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:wbyte_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:wbyte_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:wbyte_avg:LAST:%5.1lf%s Last\\l",
+                       "LINE1:rbyte_avg#" .. self.palette.FullBlue .. ":Read ",
+                       "GPRINT:rbyte_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:rbyte_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rbyte_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rbyte_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               percent = {
+                       "-v", "Percent",
+                       "DEF:avg={file}:percent:AVERAGE",
+                       "DEF:min={file}:percent:MIN",
+                       "DEF:max={file}:percent:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Percent",
+                       "GPRINT:min:MIN:%5.1lf%% Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%% Avg,",
+                       "GPRINT:max:MAX:%5.1lf%% Max,",
+                       "GPRINT:avg:LAST:%5.1lf%% Last\\l"
+               },
+
+               ping = {
+                       "DEF:ping_avg={file}:ping:AVERAGE",
+                       "DEF:ping_min={file}:ping:MIN",
+                       "DEF:ping_max={file}:ping:MAX",
+                       "AREA:ping_max#" .. self.palette.HalfBlue,
+                       "AREA:ping_min#" .. self.palette.Canvas,
+                       "LINE1:ping_avg#" .. self.palette.FullBlue .. ":Ping",
+                       "GPRINT:ping_min:MIN:%4.1lf ms Min,",
+                       "GPRINT:ping_avg:AVERAGE:%4.1lf ms Avg,",
+                       "GPRINT:ping_max:MAX:%4.1lf ms Max,",
+                       "GPRINT:ping_avg:LAST:%4.1lf ms Last\\l"
+               },
+
+               power = {
+                       "-v", "Watt",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Watt",
+                       "GPRINT:min:MIN:%5.1lf%sW Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sW Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sW Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sW Last\\l"
+               },
+
+               _processes = {
+                       "DEF:running_avg={file}:running:AVERAGE",
+                       "DEF:running_min={file}:running:MIN",
+                       "DEF:running_max={file}:running:MAX",
+                       "DEF:sleeping_avg={file}:sleeping:AVERAGE",
+                       "DEF:sleeping_min={file}:sleeping:MIN",
+                       "DEF:sleeping_max={file}:sleeping:MAX",
+                       "DEF:zombies_avg={file}:zombies:AVERAGE",
+                       "DEF:zombies_min={file}:zombies:MIN",
+                       "DEF:zombies_max={file}:zombies:MAX",
+                       "DEF:stopped_avg={file}:stopped:AVERAGE",
+                       "DEF:stopped_min={file}:stopped:MIN",
+                       "DEF:stopped_max={file}:stopped:MAX",
+                       "DEF:paging_avg={file}:paging:AVERAGE",
+                       "DEF:paging_min={file}:paging:MIN",
+                       "DEF:paging_max={file}:paging:MAX",
+                       "DEF:blocked_avg={file}:blocked:AVERAGE",
+                       "DEF:blocked_min={file}:blocked:MIN",
+                       "DEF:blocked_max={file}:blocked:MAX",
+                       "CDEF:paging_acc=sleeping_avg,running_avg,stopped_avg,zombies_avg,blocked_avg,paging_avg,+,+,+,+,+",
+                       "CDEF:blocked_acc=sleeping_avg,running_avg,stopped_avg,zombies_avg,blocked_avg,+,+,+,+",
+                       "CDEF:zombies_acc=sleeping_avg,running_avg,stopped_avg,zombies_avg,+,+,+",
+                       "CDEF:stopped_acc=sleeping_avg,running_avg,stopped_avg,+,+",
+                       "CDEF:running_acc=sleeping_avg,running_avg,+",
+                       "CDEF:sleeping_acc=sleeping_avg",
+                       "AREA:paging_acc#" .. self.palette.HalfYellow,
+                       "AREA:blocked_acc#" .. self.palette.HalfCyan,
+                       "AREA:zombies_acc#" .. self.palette.HalfRed,
+                       "AREA:stopped_acc#" .. self.palette.HalfMagenta,
+                       "AREA:running_acc#" .. self.palette.HalfGreen,
+                       "AREA:sleeping_acc#" .. self.palette.HalfBlue,
+                       "LINE1:paging_acc#" .. self.palette.FullYellow .. ":Paging  ",
+                       "GPRINT:paging_min:MIN:%5.1lf Min,",
+                       "GPRINT:paging_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:paging_max:MAX:%5.1lf Max,",
+                       "GPRINT:paging_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:blocked_acc#" .. self.palette.FullCyan .. ":Blocked ",
+                       "GPRINT:blocked_min:MIN:%5.1lf Min,",
+                       "GPRINT:blocked_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:blocked_max:MAX:%5.1lf Max,",
+                       "GPRINT:blocked_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:zombies_acc#" .. self.palette.FullRed .. ":Zombies ",
+                       "GPRINT:zombies_min:MIN:%5.1lf Min,",
+                       "GPRINT:zombies_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:zombies_max:MAX:%5.1lf Max,",
+                       "GPRINT:zombies_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:stopped_acc#" .. self.palette.FullMagenta .. ":Stopped ",
+                       "GPRINT:stopped_min:MIN:%5.1lf Min,",
+                       "GPRINT:stopped_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:stopped_max:MAX:%5.1lf Max,",
+                       "GPRINT:stopped_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:running_acc#" .. self.palette.FullGreen .. ":Running ",
+                       "GPRINT:running_min:MIN:%5.1lf Min,",
+                       "GPRINT:running_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:running_max:MAX:%5.1lf Max,",
+                       "GPRINT:running_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:sleeping_acc#" .. self.palette.FullBlue .. ":Sleeping",
+                       "GPRINT:sleeping_min:MIN:%5.1lf Min,",
+                       "GPRINT:sleeping_avg:AVERAGE:%5.1lf Average,",
+                       "GPRINT:sleeping_max:MAX:%5.1lf Max,",
+                       "GPRINT:sleeping_avg:LAST:%5.1lf Last\\l"
+               },
+
+               ps_count = {
+                       "-v", "Processes",
+                       "DEF:procs_avg={file}:processes:AVERAGE",
+                       "DEF:procs_min={file}:processes:MIN",
+                       "DEF:procs_max={file}:processes:MAX",
+                       "DEF:thrds_avg={file}:threads:AVERAGE",
+                       "DEF:thrds_min={file}:threads:MIN",
+                       "DEF:thrds_max={file}:threads:MAX",
+                       "AREA:thrds_avg#" .. self.palette.HalfBlue,
+                       "AREA:procs_avg#" .. self.palette.HalfRed,
+                       "LINE1:thrds_avg#" .. self.palette.FullBlue .. ":Threads  ",
+                       "GPRINT:thrds_min:MIN:%5.1lf Min,",
+                       "GPRINT:thrds_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:thrds_max:MAX:%5.1lf Max,",
+                       "GPRINT:thrds_avg:LAST:%5.1lf Last\\l",
+                       "LINE1:procs_avg#" .. self.palette.FullRed .. ":Processes",
+                       "GPRINT:procs_min:MIN:%5.1lf Min,",
+                       "GPRINT:procs_avg:AVERAGE:%5.1lf Avg,",
+                       "GPRINT:procs_max:MAX:%5.1lf Max,",
+                       "GPRINT:procs_avg:LAST:%5.1lf Last\\l"
+               },
+
+               ps_cputime = {
+                       "-v", "Jiffies",
+                       "DEF:user_avg_raw={file}:user:AVERAGE",
+                       "DEF:user_min_raw={file}:user:MIN",
+                       "DEF:user_max_raw={file}:user:MAX",
+                       "DEF:syst_avg_raw={file}:syst:AVERAGE",
+                       "DEF:syst_min_raw={file}:syst:MIN",
+                       "DEF:syst_max_raw={file}:syst:MAX",
+                       "CDEF:user_avg=user_avg_raw,1000000,/",
+                       "CDEF:user_min=user_min_raw,1000000,/",
+                       "CDEF:user_max=user_max_raw,1000000,/",
+                       "CDEF:syst_avg=syst_avg_raw,1000000,/",
+                       "CDEF:syst_min=syst_min_raw,1000000,/",
+                       "CDEF:syst_max=syst_max_raw,1000000,/",
+                       "CDEF:user_syst=syst_avg,UN,0,syst_avg,IF,user_avg,+",
+                       "AREA:user_syst#" .. self.palette.HalfBlue,
+                       "AREA:syst_avg#" .. self.palette.HalfRed,
+                       "LINE1:user_syst#" .. self.palette.FullBlue .. ":User  ",
+                       "GPRINT:user_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:user_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:user_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:user_avg:LAST:%5.1lf%s Last\\l",
+                       "LINE1:syst_avg#" .. self.palette.FullRed .. ":System",
+                       "GPRINT:syst_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:syst_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:syst_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:syst_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               ps_pagefaults = {
+                       "-v", "Pagefaults/s",
+                       "DEF:minor_avg={file}:minflt:AVERAGE",
+                       "DEF:minor_min={file}:minflt:MIN",
+                       "DEF:minor_max={file}:minflt:MAX",
+                       "DEF:major_avg={file}:majflt:AVERAGE",
+                       "DEF:major_min={file}:majflt:MIN",
+                       "DEF:major_max={file}:majflt:MAX",
+                       "CDEF:minor_major=major_avg,UN,0,major_avg,IF,minor_avg,+",
+                       "AREA:minor_major#" .. self.palette.HalfBlue,
+                       "AREA:major_avg#" .. self.palette.HalfRed,
+                       "LINE1:minor_major#" .. self.palette.FullBlue .. ":Minor",
+                       "GPRINT:minor_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:minor_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:minor_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:minor_avg:LAST:%5.1lf%s Last\\l",
+                       "LINE1:major_avg#" .. self.palette.FullRed .. ":Major",
+                       "GPRINT:major_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:major_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:major_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:major_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               ps_rss = {
+                       "-v", "Bytes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:avg#" .. self.palette.HalfBlue,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":RSS",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               _ps_state = {
+                       "-v", "Processes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Processes",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               _signal_noise = {
+                       "-v", "dBm",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Noise",
+                       "GPRINT:min:MIN:%5.1lf%sdBm Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sdBm Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sdBm Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sdBm Last\\l"
+               },
+
+               _signal_power = {
+                       "-v", "dBm",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Power",
+                       "GPRINT:min:MIN:%5.1lf%sdBm Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sdBm Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sdBm Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sdBm Last\\l"
+               },
+
+               _signal_quality = {
+                       "-v", "%",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Quality",
+                       "GPRINT:min:MIN:%5.1lf%s%% Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s%% Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s%% Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s%% Last\\l"
+               },
+
+               swap = {
+                       "-v", "Bytes", "-b", "1024",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bytes",
+                       "GPRINT:min:MIN:%6.2lf%sByte Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf%sByte Avg,",
+                       "GPRINT:max:MAX:%6.2lf%sByte Max,",
+                       "GPRINT:avg:LAST:%6.2lf%sByte Last\\l"
+               },
+
+               old_swap = {
+                       "DEF:used_avg={file}:used:AVERAGE",
+                       "DEF:used_min={file}:used:MIN",
+                       "DEF:used_max={file}:used:MAX",
+                       "DEF:free_avg={file}:free:AVERAGE",
+                       "DEF:free_min={file}:free:MIN",
+                       "DEF:free_max={file}:free:MAX",
+                       "DEF:cach_avg={file}:cached:AVERAGE",
+                       "DEF:cach_min={file}:cached:MIN",
+                       "DEF:cach_max={file}:cached:MAX",
+                       "DEF:resv_avg={file}:resv:AVERAGE",
+                       "DEF:resv_min={file}:resv:MIN",
+                       "DEF:resv_max={file}:resv:MAX",
+                       "CDEF:cach_avg_notnull=cach_avg,UN,0,cach_avg,IF",
+                       "CDEF:resv_avg_notnull=resv_avg,UN,0,resv_avg,IF",
+                       "CDEF:used_acc=used_avg",
+                       "CDEF:resv_acc=used_acc,resv_avg_notnull,+",
+                       "CDEF:cach_acc=resv_acc,cach_avg_notnull,+",
+                       "CDEF:free_acc=cach_acc,free_avg,+",
+                       "AREA:free_acc#" .. self.palette.HalfGreen,
+                       "AREA:cach_acc#" .. self.palette.HalfBlue,
+                       "AREA:resv_acc#" .. self.palette.HalfYellow,
+                       "AREA:used_acc#" .. self.palette.HalfRed,
+                       "LINE1:free_acc#" .. self.palette.FullGreen .. ":Free    ",
+                       "GPRINT:free_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:free_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:free_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:free_avg:LAST:%5.1lf%s Last\n",
+                       "LINE1:cach_acc#" .. self.palette.FullBlue .. ":Cached  ",
+                       "GPRINT:cach_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:cach_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:cach_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:cach_avg:LAST:%5.1lf%s Last\\l",
+                       "LINE1:resv_acc#" .. self.palette.FullYellow .. ":Reserved",
+                       "GPRINT:resv_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:resv_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:resv_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:resv_avg:LAST:%5.1lf%s Last\n",
+                       "LINE1:used_acc#" .. self.palette.FullRed .. ":Used    ",
+                       "GPRINT:used_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:used_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:used_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:used_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               tcp_connections = {
+                       "-v", "Connections",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Connections",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               temperature = {
+                       "-v", "Celsius",
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "CDEF:average=temp_avg,0.2,*,PREV,UN,temp_avg,PREV,IF,0.8,*,+",
+                       "AREA:temp_max#" .. self.palette.HalfRed,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullRed .. ":Temperature",
+                       "GPRINT:temp_min:MIN:%4.1lf Min,",
+                       "GPRINT:temp_avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:temp_max:MAX:%4.1lf Max,",
+                       "GPRINT:temp_avg:LAST:%4.1lf Last\\l"
+               },
+
+               timeleft = {
+                       "-v", "Minutes",
+                       "DEF:avg={file}:timeleft:AVERAGE",
+                       "DEF:min={file}:timeleft:MIN",
+                       "DEF:max={file}:timeleft:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Time left [min]",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               time_offset = {
+                       "DEF:s_avg={file}:seconds:AVERAGE",
+                       "DEF:s_min={file}:seconds:MIN",
+                       "DEF:s_max={file}:seconds:MAX",
+                       "AREA:s_max#" .. self.palette.HalfBlue,
+                       "AREA:s_min#" .. self.palette.Canvas,
+                       "LINE1:s_avg#" .. self.palette.FullBlue .. ":{inst}",
+                       "GPRINT:s_min:MIN:%7.3lf%s Min,",
+                       "GPRINT:s_avg:AVERAGE:%7.3lf%s Avg,",
+                       "GPRINT:s_max:MAX:%7.3lf%s Max,",
+                       "GPRINT:s_avg:LAST:%7.3lf%s Last\\l"
+               },
+
+               if_octets = {
+                       "-v", "Bits/s", "-l", "0",
+                       "DEF:out_min_raw={file}:tx:MIN",
+                       "DEF:out_avg_raw={file}:tx:AVERAGE",
+                       "DEF:out_max_raw={file}:tx:MAX",
+                       "DEF:inc_min_raw={file}:rx:MIN",
+                       "DEF:inc_avg_raw={file}:rx:AVERAGE",
+                       "DEF:inc_max_raw={file}:rx:MAX",
+                       "CDEF:out_min=out_min_raw,8,*",
+                       "CDEF:out_avg=out_avg_raw,8,*",
+                       "CDEF:out_max=out_max_raw,8,*",
+                       "CDEF:inc_min=inc_min_raw,8,*",
+                       "CDEF:inc_avg=inc_avg_raw,8,*",
+                       "CDEF:inc_max=inc_max_raw,8,*",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "CDEF:mytime=out_avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:out_avg_sample=out_avg_raw,UN,0,out_avg_raw,IF,sample_len,*",
+                       "CDEF:out_avg_sum=PREV,UN,0,PREV,IF,out_avg_sample,+",
+                       "CDEF:inc_avg_sample=inc_avg_raw,UN,0,inc_avg_raw,IF,sample_len,*",
+                       "CDEF:inc_avg_sum=PREV,UN,0,PREV,IF,inc_avg_sample,+",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Outgoing",
+                       "GPRINT:out_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:out_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:out_avg:LAST:%5.1lf%s Last",
+                       "GPRINT:out_avg_sum:LAST:(ca. %5.1lf%sB Total)\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Incoming",
+                       --"GPRINT:inc_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:inc_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:inc_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:inc_avg:LAST:%5.1lf%s Last",
+                       "GPRINT:inc_avg_sum:LAST:(ca. %5.1lf%sB Total)\\l"
+               },
+
+               cpufreq = {
+                       "DEF:cpufreq_avg={file}:value:AVERAGE",
+                       "DEF:cpufreq_min={file}:value:MIN",
+                       "DEF:cpufreq_max={file}:value:MAX",
+                       "AREA:cpufreq_max#" .. self.palette.HalfBlue,
+                       "AREA:cpufreq_min#" .. self.palette.Canvas,
+                       "LINE1:cpufreq_avg#" .. self.palette.FullBlue .. ":Frequency",
+                       "GPRINT:cpufreq_min:MIN:%5.1lf%s Min,",
+                       "GPRINT:cpufreq_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:cpufreq_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:cpufreq_avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               multimeter = {
+                       "DEF:multimeter_avg={file}:value:AVERAGE",
+                       "DEF:multimeter_min={file}:value:MIN",
+                       "DEF:multimeter_max={file}:value:MAX",
+                       "AREA:multimeter_max#" .. self.palette.HalfBlue,
+                       "AREA:multimeter_min#" .. self.palette.Canvas,
+                       "LINE1:multimeter_avg#" .. self.palette.FullBlue .. ":Multimeter",
+                       "GPRINT:multimeter_min:MIN:%4.1lf Min,",
+                       "GPRINT:multimeter_avg:AVERAGE:%4.1lf Average,",
+                       "GPRINT:multimeter_max:MAX:%4.1lf Max,",
+                       "GPRINT:multimeter_avg:LAST:%4.1lf Last\\l"
+               },
+
+               users = {
+                       "-v", "Users",
+                       "DEF:users_avg={file}:users:AVERAGE",
+                       "DEF:users_min={file}:users:MIN",
+                       "DEF:users_max={file}:users:MAX",
+                       "AREA:users_max#" .. self.palette.HalfBlue,
+                       "AREA:users_min#" .. self.palette.Canvas,
+                       "LINE1:users_avg#" .. self.palette.FullBlue .. ":Users",
+                       "GPRINT:users_min:MIN:%4.1lf Min,",
+                       "GPRINT:users_avg:AVERAGE:%4.1lf Average,",
+                       "GPRINT:users_max:MAX:%4.1lf Max,",
+                       "GPRINT:users_avg:LAST:%4.1lf Last\\l"
+               },
+
+               voltage = {
+                       "-v", "Voltage",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Voltage",
+                       "GPRINT:min:MIN:%5.1lf%sV Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sV Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sV Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sV Last\\l"
+               },
+
+               vs_threads = {
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Threads",
+                       "GPRINT:min:MIN:%5.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf Avg.,",
+                       "GPRINT:max:MAX:%5.1lf Max,",
+                       "GPRINT:avg:LAST:%5.1lf Last\\l",
+               },
+
+               vs_memory = {
+                       "-b", "1024", "-v", "Bytes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":",
+                       "GPRINT:min:MIN:%5.1lf%sbytes Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sbytes Avg.,",
+                       "GPRINT:max:MAX:%5.1lf%sbytes Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sbytes Last\\l",
+               },
+
+               vs_processes = {
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Processes",
+                       "GPRINT:min:MIN:%5.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf Avg.,",
+                       "GPRINT:max:MAX:%5.1lf Max,",
+                       "GPRINT:avg:LAST:%5.1lf Last\\l",
+               },
+       }
+
+
+
+       -- used color palette
+       colors = {
+               Canvas          = "FFFFFF",
+
+               FullRed         = "FF0000",
+               FullGreen       = "00E000",
+               FullBlue        = "0000FF",
+               FullYellow      = "F0A000",
+               FullCyan        = "00A0FF",
+               FullMagenta     = "A000FF",
+
+               HalfRed         = "F7B7B7",
+               HalfGreen       = "B7EFB7",
+               HalfBlue        = "B7B7F7",
+               HalfYellow      = "F3DFB7",
+               HalfCyan        = "B7DFF7",
+               HalfMagenta     = "DFB7F7",
+
+               HalfBlueGreen   = "89B3C9"
+       }
+
+
+       -- plotting arguments for each defined datasource
+       rrd_args = {
+               apache_bytes = {
+                       "DEF:min_raw={file}:count:MIN",
+                       "DEF:avg_raw={file}:count:AVERAGE",
+                       "DEF:max_raw={file}:count:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "CDEF:mytime=avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:avg_sample=avg_raw,UN,0,avg_raw,IF,sample_len,*",
+                       "CDEF:avg_sum=PREV,UN,0,PREV,IF,avg_sample,+",
+                       "AREA:avg#" .. self.palette.HalfBlue,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bit/s",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               apache_requests = {
+                       "DEF:min={file}:count:MIN",
+                       "DEF:avg={file}:count:AVERAGE",
+                       "DEF:max={file}:count:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Requests/s",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               apache_scoreboard = {
+                       "DEF:min={file}:count:MIN",
+                       "DEF:avg={file}:count:AVERAGE",
+                       "DEF:max={file}:count:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Processes",
+                       "GPRINT:min:MIN:%6.2lf Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:max:MAX:%6.2lf Max,",
+                       "GPRINT:avg:LAST:%6.2lf Last\\l"
+               },
+
+               bitrate = {
+                       "-v", "Bits/s",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bits/s",
+                       "GPRINT:min:MIN:%5.1lf%s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Average,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               charge = {
+                       "-v", "Ah",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Charge",
+                       "GPRINT:min:MIN:%5.1lf%sAh Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sAh Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sAh Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sAh Last\\l"
+               },
+
+               cpu = {
+                       "-v", "CPU load",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Percent",
+                       "GPRINT:min:MIN:%6.2lf%% Min,",
+                       "GPRINT:avg:AVERAGE:%6.2lf%% Avg,",
+                       "GPRINT:max:MAX:%6.2lf%% Max,",
+                       "GPRINT:avg:LAST:%6.2lf%% Last\\l"
+               },
+
+               current = {
+                       "-v", "Ampere",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Current",
+                       "GPRINT:min:MIN:%5.1lf%sA Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%sA Avg,",
+                       "GPRINT:max:MAX:%5.1lf%sA Max,",
+                       "GPRINT:avg:LAST:%5.1lf%sA Last\\l"
+               },
+
+               df = {
+                       "-v", "Percent", "-l", "0",
+                       "DEF:free_avg={file}:free:AVERAGE",
+                       "DEF:free_min={file}:free:MIN",
+                       "DEF:free_max={file}:free:MAX",
+                       "DEF:used_avg={file}:used:AVERAGE",
+                       "DEF:used_min={file}:used:MIN",
+                       "DEF:used_max={file}:used:MAX",
+                       "CDEF:total=free_avg,used_avg,+",
+                       "CDEF:free_pct=100,free_avg,*,total,/",
+                       "CDEF:used_pct=100,used_avg,*,total,/",
+                       "CDEF:free_acc=free_pct,used_pct,+",
+                       "CDEF:used_acc=used_pct",
+                       "AREA:free_acc#" .. self.palette.HalfGreen,
+                       "AREA:used_acc#" .. self.palette.HalfRed,
+                       "LINE1:free_acc#" .. self.palette.FullGreen .. ":Free",
+                       "GPRINT:free_min:MIN:%5.1lf%sB Min,",
+                       "GPRINT:free_avg:AVERAGE:%5.1lf%sB Avg,",
+                       "GPRINT:free_max:MAX:%5.1lf%sB Max,",
+                       "GPRINT:free_avg:LAST:%5.1lf%sB Last\\l",
+                       "LINE1:used_acc#" .. self.palette.FullRed .. ":Used",
+                       "GPRINT:used_min:MIN:%5.1lf%sB Min,",
+                       "GPRINT:used_avg:AVERAGE:%5.1lf%sB Avg,",
+                       "GPRINT:used_max:MAX:%5.1lf%sB Max,",
+                       "GPRINT:used_avg:LAST:%5.1lf%sB Last\\l"
+               },
+
+               disk = {
+                       "DEF:rtime_avg={file}:rtime:AVERAGE",
+                       "DEF:rtime_min={file}:rtime:MIN",
+                       "DEF:rtime_max={file}:rtime:MAX",
+                       "DEF:wtime_avg={file}:wtime:AVERAGE",
+                       "DEF:wtime_min={file}:wtime:MIN",
+                       "DEF:wtime_max={file}:wtime:MAX",
+                       "CDEF:rtime_avg_ms=rtime_avg,1000,/",
+                       "CDEF:rtime_min_ms=rtime_min,1000,/",
+                       "CDEF:rtime_max_ms=rtime_max,1000,/",
+                       "CDEF:wtime_avg_ms=wtime_avg,1000,/",
+                       "CDEF:wtime_min_ms=wtime_min,1000,/",
+                       "CDEF:wtime_max_ms=wtime_max,1000,/",
+                       "CDEF:total_avg_ms=rtime_avg_ms,wtime_avg_ms,+",
+                       "CDEF:total_min_ms=rtime_min_ms,wtime_min_ms,+",
+                       "CDEF:total_max_ms=rtime_max_ms,wtime_max_ms,+",
+                       "AREA:total_max_ms#" .. self.palette.HalfRed,
+                       "AREA:total_min_ms#" .. self.palette.Canvas,
+                       "LINE1:wtime_avg_ms#" .. self.palette.FullGreen .. ":Write",
+                       "GPRINT:wtime_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:wtime_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:wtime_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:wtime_avg_ms:LAST:%5.1lf%s Last\n",
+                       "LINE1:rtime_avg_ms#" .. self.palette.FullBlue .. ":Read ",
+                       "GPRINT:rtime_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:rtime_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rtime_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:rtime_avg_ms:LAST:%5.1lf%s Last\n",
+                       "LINE1:total_avg_ms#" .. self.palette.FullRed .. ":Total",
+                       "GPRINT:total_min_ms:MIN:%5.1lf%s Min,",
+                       "GPRINT:total_avg_ms:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:total_max_ms:MAX:%5.1lf%s Max,",
+                       "GPRINT:total_avg_ms:LAST:%5.1lf%s Last\\l"
+               },
+
+               disk_octets = {
+                       "-v", "Bytes/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "CDEF:mytime=out_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:out_avg_sample=out_avg,UN,0,out_avg,IF,sample_len,*",
+                       "CDEF:out_avg_sum=PREV,UN,0,PREV,IF,out_avg_sample,+",
+                       "CDEF:inc_avg_sample=inc_avg,UN,0,inc_avg,IF,sample_len,*",
+                       "CDEF:inc_avg_sum=PREV,UN,0,PREV,IF,inc_avg_sample,+",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:out_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:out_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:out_avg_sum:LAST:(ca. %5.1lf%sB Total)",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:inc_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:inc_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:inc_avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               disk_merged = {
+                       "-v", "Merged Ops/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:out_max:MAX:%6.2lf Max,",
+                       "GPRINT:out_avg:LAST:%6.2lf Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:inc_max:MAX:%6.2lf Max,",
+                       "GPRINT:inc_avg:LAST:%6.2lf Last\\l"
+               },
+
+               disk_ops = {
+                       "-v", "Ops/s",
+                       "DEF:out_min={file}:write:MIN",
+                       "DEF:out_avg={file}:write:AVERAGE",
+                       "DEF:out_max={file}:write:MAX",
+                       "DEF:inc_min={file}:read:MIN",
+                       "DEF:inc_avg={file}:read:AVERAGE",
+                       "DEF:inc_max={file}:read:MAX",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:out_max:MAX:%6.2lf Max,",
+                       "GPRINT:out_avg:LAST:%6.2lf Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:inc_max:MAX:%6.2lf Max,",
+                       "GPRINT:inc_avg:LAST:%6.2lf Last\\l"
+               },
+
+               disk_time = {
+                       "-v", "Seconds/s",
+                       "DEF:out_min_raw={file}:write:MIN",
+                       "DEF:out_avg_raw={file}:write:AVERAGE",
+                       "DEF:out_max_raw={file}:write:MAX",
+                       "DEF:inc_min_raw={file}:read:MIN",
+                       "DEF:inc_avg_raw={file}:read:AVERAGE",
+                       "DEF:inc_max_raw={file}:read:MAX",
+                       "CDEF:out_min=out_min_raw,1000,/",
+                       "CDEF:out_avg=out_avg_raw,1000,/",
+                       "CDEF:out_max=out_max_raw,1000,/",
+                       "CDEF:inc_min=inc_min_raw,1000,/",
+                       "CDEF:inc_avg=inc_avg_raw,1000,/",
+                       "CDEF:inc_max=inc_max_raw,1000,/",
+                       "CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF",
+                       "AREA:out_avg#" .. self.palette.HalfGreen,
+                       "AREA:inc_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:out_avg#" .. self.palette.FullGreen .. ":Written",
+                       "GPRINT:out_avg:AVERAGE:%5.1lf%ss Avg,",
+                       "GPRINT:out_max:MAX:%5.1lf%ss Max,",
+                       "GPRINT:out_avg:LAST:%5.1lf%ss Last\\l",
+                       "LINE1:inc_avg#" .. self.palette.FullBlue .. ":Read   ",
+                       "GPRINT:inc_avg:AVERAGE:%5.1lf%ss Avg,",
+                       "GPRINT:inc_max:MAX:%5.1lf%ss Max,",
+                       "GPRINT:inc_avg:LAST:%5.1lf%ss Last\\l"
+               },
+
+               dns_octets = {
+                       "DEF:rsp_min_raw={file}:responses:MIN",
+                       "DEF:rsp_avg_raw={file}:responses:AVERAGE",
+                       "DEF:rsp_max_raw={file}:responses:MAX",
+                       "DEF:qry_min_raw={file}:queries:MIN",
+                       "DEF:qry_avg_raw={file}:queries:AVERAGE",
+                       "DEF:qry_max_raw={file}:queries:MAX",
+                       "CDEF:rsp_min=rsp_min_raw,8,*",
+                       "CDEF:rsp_avg=rsp_avg_raw,8,*",
+                       "CDEF:rsp_max=rsp_max_raw,8,*",
+                       "CDEF:qry_min=qry_min_raw,8,*",
+                       "CDEF:qry_avg=qry_avg_raw,8,*",
+                       "CDEF:qry_max=qry_max_raw,8,*",
+                       "CDEF:overlap=rsp_avg,qry_avg,GT,qry_avg,rsp_avg,IF",
+                       "CDEF:mytime=rsp_avg_raw,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:rsp_avg_sample=rsp_avg_raw,UN,0,rsp_avg_raw,IF,sample_len,*",
+                       "CDEF:rsp_avg_sum=PREV,UN,0,PREV,IF,rsp_avg_sample,+",
+                       "CDEF:qry_avg_sample=qry_avg_raw,UN,0,qry_avg_raw,IF,sample_len,*",
+                       "CDEF:qry_avg_sum=PREV,UN,0,PREV,IF,qry_avg_sample,+",
+                       "AREA:rsp_avg#" .. self.palette.HalfGreen,
+                       "AREA:qry_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:rsp_avg#" .. self.palette.FullGreen .. ":Responses",
+                       "GPRINT:rsp_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rsp_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rsp_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rsp_avg_sum:LAST:(ca. %5.1lf%sB Total)",
+                       "LINE1:qry_avg#" .. self.palette.FullBlue .. ":Queries  ",
+                       #"GPRINT:qry_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:qry_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:qry_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:qry_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:qry_avg_sum:LAST:(ca. %5.1lf%sB Total)"
+               },
+
+               dns_opcode = {
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Queries/s",
+                       "GPRINT:min:MIN:%9.3lf Min,",
+                       "GPRINT:avg:AVERAGE:%9.3lf Average,",
+                       "GPRINT:max:MAX:%9.3lf Max,",
+                       "GPRINT:avg:LAST:%9.3lf Last\\l"
+               },
+
+               email_count = {
+                       "-v", "Mails",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               email_size = {
+                       "-v", "Bytes",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               spam_score = {
+                       "-v", "Score",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Score ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               spam_check = {
+                       "DEF:avg={file}:hits:AVERAGE",
+                       "DEF:min={file}:hits:MIN",
+                       "DEF:max={file}:hits:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":Count ",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               entropy = {
+                       "-v", "Bits",
+                       "DEF:avg={file}:entropy:AVERAGE",
+                       "DEF:min={file}:entropy:MIN",
+                       "DEF:max={file}:entropy:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Bits",
+                       "GPRINT:min:MIN:%4.0lfbit Min,",
+                       "GPRINT:avg:AVERAGE:%4.0lfbit Avg,",
+                       "GPRINT:max:MAX:%4.0lfbit Max,",
+                       "GPRINT:avg:LAST:%4.0lfbit Last\\l"
+               },
+
+               fanspeed = {
+                       "-v", "RPM",
+                       "DEF:avg={file}:value:AVERAGE",
+                       "DEF:min={file}:value:MIN",
+                       "DEF:max={file}:value:MAX",
+                       "AREA:max#" .. self.palette.HalfMagenta,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullMagenta .. ":RPM",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               frequency = {
+                       "-v", "Hertz",
+                       "DEF:avg={file}:frequency:AVERAGE",
+                       "DEF:min={file}:frequency:MIN",
+                       "DEF:max={file}:frequency:MAX",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Frequency [Hz]",
+                       "GPRINT:min:MIN:%4.1lf Min,",
+                       "GPRINT:avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:max:MAX:%4.1lf Max,",
+                       "GPRINT:avg:LAST:%4.1lf Last\\l"
+               },
+
+               frequency_offset = {
+                       "DEF:ppm_avg={file}:ppm:AVERAGE",
+                       "DEF:ppm_min={file}:ppm:MIN",
+                       "DEF:ppm_max={file}:ppm:MAX",
+                       "AREA:ppm_max#" .. self.palette.HalfBlue,
+                       "AREA:ppm_min#" .. self.palette.Canvas,
+                       "LINE1:ppm_avg#" .. self.palette.FullBlue .. ":{inst}",
+                       "GPRINT:ppm_min:MIN:%5.2lf Min,",
+                       "GPRINT:ppm_avg:AVERAGE:%5.2lf Avg,",
+                       "GPRINT:ppm_max:MAX:%5.2lf Max,",
+                       "GPRINT:ppm_avg:LAST:%5.2lf Last\\l"
+               },
+
+               gauge = {
+                       "-v", "Exec value",
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfBlue,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullBlue .. ":Exec value",
+                       "GPRINT:temp_min:MIN:%6.2lf Min,",
+                       "GPRINT:temp_avg:AVERAGE:%6.2lf Avg,",
+                       "GPRINT:temp_max:MAX:%6.2lf Max,",
+                       "GPRINT:temp_avg:LAST:%6.2lf Last\\l"
+               },
+
+               hddtemp = {
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfRed,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullRed .. ":Temperature",
+                       "GPRINT:temp_min:MIN:%4.1lf Min,",
+                       "GPRINT:temp_avg:AVERAGE:%4.1lf Avg,",
+                       "GPRINT:temp_max:MAX:%4.1lf Max,",
+                       "GPRINT:temp_avg:LAST:%4.1lf Last\\l"
+               },
+
+               humidity = {
+                       "-v", "Percent",
+                       "DEF:temp_avg={file}:value:AVERAGE",
+                       "DEF:temp_min={file}:value:MIN",
+                       "DEF:temp_max={file}:value:MAX",
+                       "AREA:temp_max#" .. self.palette.HalfGreen,
+                       "AREA:temp_min#" .. self.palette.Canvas,
+                       "LINE1:temp_avg#" .. self.palette.FullGreen .. ":Temperature",
+                       "GPRINT:temp_min:MIN:%4.1lf%% Min,",
+                       "GPRINT:temp_avg:AVERAGE:%4.1lf%% Avg,",
+                       "GPRINT:temp_max:MAX:%4.1lf%% Max,",
+                       "GPRINT:temp_avg:LAST:%4.1lf%% Last\\l"
+               },
+
+               if_errors = {
+                       "-v", "Errors/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_collisions = {
+                       "-v", "Collisions/s",
+                       "DEF:min_raw={file}:value:MIN",
+                       "DEF:avg_raw={file}:value:AVERAGE",
+                       "DEF:max_raw={file}:value:MAX",
+                       "CDEF:min=min_raw,8,*",
+                       "CDEF:avg=avg_raw,8,*",
+                       "CDEF:max=max_raw,8,*",
+                       "AREA:max#" .. self.palette.HalfBlue,
+                       "AREA:min#" .. self.palette.Canvas,
+                       "LINE1:avg#" .. self.palette.FullBlue .. ":Collisions/s",
+                       "GPRINT:min:MIN:%5.1lf %s Min,",
+                       "GPRINT:avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:max:MAX:%5.1lf%s Max,",
+                       "GPRINT:avg:LAST:%5.1lf%s Last\\l"
+               },
+
+               if_dropped = {
+                       "-v", "Packets/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_packets = {
+                       "-v", "Packets/s",
+                       "DEF:tx_min={file}:tx:MIN",
+                       "DEF:tx_avg={file}:tx:AVERAGE",
+                       "DEF:tx_max={file}:tx:MAX",
+                       "DEF:rx_min={file}:rx:MIN",
+                       "DEF:rx_avg={file}:rx:AVERAGE",
+                       "DEF:rx_max={file}:rx:MAX",
+                       "CDEF:overlap=tx_avg,rx_avg,GT,rx_avg,tx_avg,IF",
+                       "CDEF:mytime=tx_avg,TIME,TIME,IF",
+                       "CDEF:sample_len_raw=mytime,PREV(mytime),-",
+                       "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF",
+                       "CDEF:tx_avg_sample=tx_avg,UN,0,tx_avg,IF,sample_len,*",
+                       "CDEF:tx_avg_sum=PREV,UN,0,PREV,IF,tx_avg_sample,+",
+                       "CDEF:rx_avg_sample=rx_avg,UN,0,rx_avg,IF,sample_len,*",
+                       "CDEF:rx_avg_sum=PREV,UN,0,PREV,IF,rx_avg_sample,+",
+                       "AREA:tx_avg#" .. self.palette.HalfGreen,
+                       "AREA:rx_avg#" .. self.palette.HalfBlue,
+                       "AREA:overlap#" .. self.palette.HalfBlueGreen,
+                       "LINE1:tx_avg#" .. self.palette.FullGreen .. ":TX",
+                       "GPRINT:tx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:tx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:tx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:tx_avg_sum:LAST:(ca. %4.0lf%s Total)",
+                       "LINE1:rx_avg#" .. self.palette.FullBlue .. ":RX",
+                       #"GPRINT:rx_min:MIN:%5.1lf %s Min,",
+                       "GPRINT:rx_avg:AVERAGE:%5.1lf%s Avg,",
+                       "GPRINT:rx_max:MAX:%5.1lf%s Max,",
+                       "GPRINT:rx_avg:LAST:%5.1lf%s Last\\l",
+                       "GPRINT:rx_avg_sum:LAST:(ca. %4.0lf%s Total)"
+               },
+
+               if_rx_errors = {
+