diff options
Diffstat (limited to 'applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua')
-rw-r--r-- | applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua new file mode 100644 index 000000000..bbc0e2335 --- /dev/null +++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua @@ -0,0 +1,207 @@ +-- Copyright 2017 Eric Luehrsen <ericluehrsen@gmail.com> +-- Licensed to the public under the Apache License 2.0. + +local m5, s5 +local ztype, zones, servers, fallback, enabled + +local fs = require "nixio.fs" +local ut = require "luci.util" +local sy = require "luci.sys" +local resolvfile = "/tmp/resolv.conf.auto" + +m5 = Map("unbound") +s5 = m5:section(TypedSection, "zone", "Zones", + translatef("This shows extended zones and more details can be " + .. "changed in Files tab and <a href=\"%s\">Edit:UCI</a> subtab.", + "/cgi-bin/luci/admin/services/unbound/files" )) + +s5.addremove = false +s5.anonymous = true +s5.sortable = true +s5.template = "cbi/tblsection" + +ztype = s5:option(DummyValue, "DummyType", translate("Type")) +ztype.rawhtml = true + +zones = s5:option(DummyValue, "DummyZones", translate("Zones")) +zones.rawhtml = true + +servers = s5:option(DummyValue, "DummyServers", translate("Servers")) +servers.rawhtml = true + +fallback = s5:option(Flag, "fallback", translate("Fallback")) +fallback.rmempty = false + +enabled = s5:option(Flag, "enabled", translate("Enable")) +enabled.rmempty = false + + +function ztype.cfgvalue(self, s) + -- Format a meaninful tile for the Zone Type column + local itxt = self.map:get(s, "zone_type") + local itls = self.map:get(s, "tls_upstream") + + + if itxt and itxt:match("forward") then + if itls and (itls == "1") then + return translate("Forward TLS") + + else + return translate("Forward") + end + + elseif itxt and itxt:match("stub") then + return translate("Recurse") + + elseif itxt and itxt:match("auth") then + return translate("AXFR") + + else + return translate("Error") + end +end + + +function zones.cfgvalue(self, s) + -- Format a meaninful sentence for the Zones viewed column + local xtxt, otxt + local itxt = self.map:get(s, "zone_name") + local itype = self.map:get(s, "zone_type") + + + for xtxt in ut.imatch(itxt) do + if (xtxt == ".") then + -- zone_name lists + xtxt = translate("(root)") + end + + + if otxt and (#otxt > 0) then + otxt = otxt .. ", <var>%s</var>" % xtxt + + else + otxt = "<var>%s</var>" % xtxt + end + end + + + if itype and itype:match("forward") then + -- from zone_type create a readable hint for the action + otxt = translate("accept upstream results for ") .. otxt + + elseif itype and itype:match("stub") then + otxt = translate("select recursion for ") .. otxt + + elseif itype and itype:match("auth") then + otxt = translate("prefetch zone files for ") .. otxt + + else + otxt = translate("unknown action for ") .. otxt + end + + + if otxt and (#otxt > 0) then + return otxt + + else + return "(empty)" + end +end + + +function servers.cfgvalue(self, s) + -- Format a meaninful sentence for the Servers (and URL) column + local xtxt, otxt, rtxt, found + local itxt = self.map:get(s, "server") + local iurl = self.map:get(s, "url_dir") + local itype = self.map:get(s, "zone_type") + local itls = self.map:get(s, "tls_upstream") + local iidx = self.map:get(s, "tls_index") + local irslv = self.map:get(s, "resolv_conf") + + + for xtxt in ut.imatch(itxt) do + if otxt and (#otxt > 0) then + -- bundle and make pretty the server list + otxt = otxt .. ", <var>%s</var>" % xtxt + + else + otxt = "<var>%s</var>" % xtxt + end + end + + + if otxt and (#otxt > 0) + and itls and (itls == "1") + and iidx and (#iidx > 0) then + -- show TLS certificate name index if provided + otxt = translatef("use nameservers by <var>%s</var> at ", iidx) .. otxt + + elseif otxt and (#otxt > 0) then + otxt = translate("use nameservers ") .. otxt + end + + + if iurl and (#iurl > 0) and itype and itype:match("auth") then + if otxt and (#otxt > 0) then + -- include optional URL filed for auth-zone: type + otxt = otxt .. translatef(", and try <var>%s</var>", iurl) + + else + otxt = translatef("download from <var>%s</var>", iurl) + end + end + + + if irslv and (irslv == "1") and itype and itype:match("forward") then + for xtxt in ut.imatch(fs.readfile(resolvfile)) do + if xtxt:match("nameserver") then + found = true + + elseif (found == true) then + if rtxt and (#rtxt > 0) then + -- fetch name servers from resolv.conf + rtxt = rtxt .. ", <var>%s</var>" % xtxt + + else + rtxt = "<var>%s</var>" % xtxt + end + + + found = false + end + end + + + if otxt and (#otxt > 0) and rtxt and (#rtxt > 0) then + otxt = otxt + .. translatef(", and <var>%s</var> entries ", resolvfile) .. rtxt + + elseif rtxt and (#rtxt > 0) then + otxt = translatef("use <var>%s</var> nameservers ", resolvfile) .. rtxt + end + end + + + if otxt and (#otxt > 0) then + return otxt + + else + return "(empty)" + end +end + + +function m5.on_commit(self) + if sy.init.enabled("unbound") then + -- Restart Unbound with configuration + sy.call("/etc/init.d/unbound restart >/dev/null 2>&1") + + else + sy.call("/etc/init.d/unbound stop >/dev/null 2>&1") + end +end + + +return m5 + |