-- Copyright 2008 Steven Barth -- Copyright 2008 Jo-Philipp Wich -- Copyright 2017 Eric Luehrsen -- Licensed to the public under the Apache License 2.0. module("luci.controller.unbound", package.seeall) function index() local fs = require "nixio.fs" local ucl = luci.model.uci.cursor() local valman = ucl:get_first("unbound", "unbound", "manual_conf") if not fs.access("/etc/config/unbound") then return end -- Expanded View entry({"admin", "services", "unbound"}, firstchild(), _("Recursive DNS")).dependent = false -- UCI Tab(s) entry({"admin", "services", "unbound", "configure"}, cbi("unbound/configure"), _("Unbound"), 10) if (valman == "0") then entry({"admin", "services", "unbound", "zones"}, arcombine(cbi("unbound/zones"), cbi("unbound/zone-details")), _("Zones"), 15).leaf = true end -- Status Tab(s) entry({"admin", "services", "unbound", "status"}, firstchild(), _("Status"), 20) entry({"admin", "services", "unbound", "status", "syslog"}, call("QuerySysLog"), _("Log"), 50).leaf = true if fs.access("/usr/sbin/unbound-control") then -- Require unbound-control to execute entry({"admin", "services", "unbound", "status", "statistics"}, call("QueryStatistics"), _("Statistics"), 10).leaf = true entry({"admin", "services", "unbound", "status", "localdata"}, call("QueryLocalData"), _("Local Data"), 20).leaf = true entry({"admin", "services", "unbound", "status", "localzone"}, call("QueryLocalZone"), _("Local Zones"), 30).leaf = true entry({"admin", "services", "unbound", "status", "dumpcache"}, call("QueryDumpCache"), _("DNS Cache"), 40).leaf = true else entry({"admin", "services", "unbound", "status", "statistics"}, call("ShowEmpty"), _("Statistics"), 10).leaf = true end -- Raw File Tab(s) entry({"admin", "services", "unbound", "files"}, firstchild(), _("Files"), 30) if (valman == "0") then entry({"admin", "services", "unbound", "files", "uci"}, form("unbound/uciedit"), _("Edit: UCI"), 5).leaf = true entry({"admin", "services", "unbound", "files", "base"}, call("ShowUnboundConf"), _("Show: Unbound"), 10).leaf = true else entry({"admin", "services", "unbound", "files", "base"}, form("unbound/manual"), _("Edit: Unbound"), 10).leaf = true end entry({"admin", "services", "unbound", "files", "server"}, form("unbound/server"), _("Edit: Server"), 20).leaf = true entry({"admin", "services", "unbound", "files", "extended"}, form("unbound/extended"), _("Edit: Extended"), 30).leaf = true if fs.access("/var/lib/unbound/dhcp.conf") then entry({"admin", "services", "unbound", "files", "dhcp"}, call("ShowDHCPConf"), _("Show: DHCP"), 40).leaf = true end if fs.access("/var/lib/unbound/adb_list.overall") then entry({"admin", "services", "unbound", "files", "adblock"}, call("ShowAdblock"), _("Show: Adblock"), 50).leaf = true end end function ShowEmpty() local lclhead = "Unbound Control" local lcldesc = luci.i18n.translate( "This could display more statistics with the unbound-control package.") luci.template.render("unbound/show-empty", {heading = lclhead, description = lcldesc}) end function QuerySysLog() local lcldata = luci.util.exec("logread -e 'unbound'") local lcldesc = luci.i18n.translate( "This shows syslog filtered for events involving Unbound.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function QueryStatistics() local lcldata = luci.util.exec( "unbound-control -c /var/lib/unbound/unbound.conf stats_noreset") local lcldesc = luci.i18n.translate( "This shows Unbound self reported performance statistics.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function QueryLocalData() local lcldata = luci.util.exec( "unbound-control -c /var/lib/unbound/unbound.conf list_local_data") local lcldesc = luci.i18n.translate( "This shows Unbound 'local-data:' entries from default, .conf, or control.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function QueryLocalZone() local lcldata = luci.util.exec( "unbound-control -c /var/lib/unbound/unbound.conf list_local_zones") local lcldesc = luci.i18n.translate( "This shows Unbound 'local-zone:' entries from default, .conf, or control.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function QueryDumpCache() local tp = require "luci.template" local tr = require "luci.i18n" local lcldesc local lcldata = luci.util.exec( "unbound-control -c /var/lib/unbound/unbound.conf dump_cache") if #lcldata > 262144 then lcldesc = tr.translate( "Unbound cache is too large to display in LuCI.") tp.render("unbound/show-empty", {heading = "", description = lcldesc}) else lcldesc = tr.translate( "This shows 'ubound-control dump_cache' for auditing records including DNSSEC.") tp.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end end function ShowUnboundConf() local unboundfile = "/var/lib/unbound/unbound.conf" local lcldata = nixio.fs.readfile(unboundfile) local lcldesc = luci.i18n.translate( "This shows '" .. unboundfile .. "' generated from UCI configuration.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function ShowDHCPConf() local dhcpfile = "/var/lib/unbound/dhcp.conf" local lcldata = nixio.fs.readfile(dhcpfile) local lcldesc = luci.i18n.translate( "This shows '" .. dhcpfile .. "' list of hosts from DHCP hook scripts.") luci.template.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end function ShowAdblock() local fs = require "nixio.fs" local tp = require "luci.template" local tr = require "luci.i18n" local adblockfile = "/var/lib/unbound/adb_list.overall" local lcldata, lcldesc if fs.stat(adblockfile).size > 262144 then lcldesc = tr.translate( "Adblock domain list is too large to display in LuCI.") tp.render("unbound/show-empty", {heading = "", description = lcldesc}) else lcldata = fs.readfile(adblockfile) lcldesc = tr.translate( "This shows '" .. adblockfile .. "' list of adblock domains." ) tp.render("unbound/show-textbox", {heading = "", description = lcldesc, content = lcldata}) end end