summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-adblock/luasrc
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-adblock/luasrc')
-rw-r--r--applications/luci-app-adblock/luasrc/controller/adblock.lua46
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock.lua63
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua39
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua36
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua164
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua39
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/config_css.htm10
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/logread.htm14
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/query.htm65
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/runtime.htm10
10 files changed, 420 insertions, 66 deletions
diff --git a/applications/luci-app-adblock/luasrc/controller/adblock.lua b/applications/luci-app-adblock/luasrc/controller/adblock.lua
index d8b471814..b37fcd889 100644
--- a/applications/luci-app-adblock/luasrc/controller/adblock.lua
+++ b/applications/luci-app-adblock/luasrc/controller/adblock.lua
@@ -1,12 +1,52 @@
--- Copyright 2016 Openwrt.org
--- Licensed to the public under the Apache License 2.0.
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
module("luci.controller.adblock", package.seeall)
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local template = require("luci.template")
+local i18n = require("luci.i18n")
+
function index()
if not nixio.fs.access("/etc/config/adblock") then
return
end
+ entry({"admin", "services", "adblock"}, firstchild(), _("Adblock"), 30).dependent = false
+ entry({"admin", "services", "adblock", "tab_from_cbi"}, cbi("adblock/overview_tab"), _("Overview"), 10).leaf = true
+ entry({"admin", "services", "adblock", "logfile"}, call("logread"), _("View Logfile"), 20).leaf = true
+ entry({"admin", "services", "adblock", "advanced"}, firstchild(), _("Advanced"), 100)
+ entry({"admin", "services", "adblock", "advanced", "blacklist"}, cbi("adblock/blacklist_tab"), _("Edit Blacklist"), 110).leaf = true
+ entry({"admin", "services", "adblock", "advanced", "whitelist"}, cbi("adblock/whitelist_tab"), _("Edit Whitelist"), 120).leaf = true
+ entry({"admin", "services", "adblock", "advanced", "configuration"}, cbi("adblock/configuration_tab"), _("Edit Configuration"), 130).leaf = true
+ entry({"admin", "services", "adblock", "advanced", "query"}, call("query"), _("Query domains"), 140).leaf = true
+ entry({"admin", "services", "adblock", "advanced", "result"}, call("queryData"), nil, 150).leaf = true
+end
+
+function logread()
+ local logfile = util.trim(util.exec("logread -e 'adblock'"))
+ template.render("adblock/logread", {title = i18n.translate("Adblock Logfile"), content = logfile})
+end
- entry({"admin", "services", "adblock"}, cbi("adblock"), _("Adblock"), 40)
+function query()
+ template.render("adblock/query", {title = i18n.translate("Adblock Domain Query")})
+end
+
+function queryData(domain)
+ if domain and domain:match("^[a-zA-Z0-9%-%._]+$") then
+ luci.http.prepare_content("text/plain")
+ local cmd = "/etc/init.d/adblock query %q 2>&1"
+ local util = io.popen(cmd % domain)
+ if util then
+ while true do
+ local line = util:read("*l")
+ if not line then
+ break
+ end
+ luci.http.write(line)
+ luci.http.write("\n")
+ end
+ util:close()
+ end
+ end
end
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock.lua
deleted file mode 100644
index 0a4a4cdd2..000000000
--- a/applications/luci-app-adblock/luasrc/model/cbi/adblock.lua
+++ /dev/null
@@ -1,63 +0,0 @@
--- Copyright 2016 Hannu Nyman
--- Licensed to the public under the Apache License 2.0.
-
-m = Map("adblock", translate("Adblock"),
- translate("Configuration of the adblock package to block ad/abuse domains by using DNS."))
-
--- General options
-
-s = m:section(NamedSection, "global", "adblock", translate("Global options"))
-
-o1 = s:option(Flag, "adb_enabled", translate("Enable adblock"))
-o1.rmempty = false
-o1.default = 0
-
-o3 = s:option(Value, "adb_whitelist", translate("Whitelist file"),
- translate("File with whitelisted hosts/domains that are allowed despite being on a blocklist."))
-o3.rmempty = false
-o3.datatype = "file"
-
--- Blocklist options
-
-bl = m:section(TypedSection, "source", translate("Blocklist sources"),
- translate("Available blocklist sources (")
- .. [[<a href="https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md" target="_blank">]]
- .. translate("see list details")
- .. [[</a>]]
- .. translate("). Note that list URLs and Shallalist category selections are not configurable via Luci."))
-bl.template = "cbi/tblsection"
-
-name = bl:option(Flag, "enabled", translate("Enabled"))
-name.rmempty = false
-
-des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
-
--- Additional options
-
-s2 = m:section(NamedSection, "global", "adblock", translate("Backup options"))
-
-o4 = s2:option(Flag, "adb_backup", translate("Enable blocklist backup"))
-o4.rmempty = false
-o4.default = 0
-
-o5 = s2:option(Value, "adb_backupdir", translate("Backup directory"))
-o5.rmempty = false
-o5.datatype = "directory"
-
--- Extra options
-
-e = m:section(NamedSection, "global", "adblock", translate("Extra options"),
- translate("Options for further tweaking in case the defaults are not suitable for you."))
-
-a = e:option(Flag, "adb_debug", translate("Enable verbose debug logging"))
-a.default = a.disabled
-a.rmempty = false
-
-a = e:option(Value, "adb_iface", translate("Restrict reload trigger to certain interface(s)"),
- translate("Space separated list of wan interfaces that trigger reload action. " ..
- "To disable reload trigger set it to 'false'. Default: empty"))
-a.datatype = "network"
-a.rmempty = true
-
-return m
-
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
new file mode 100644
index 000000000..d540c77d1
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
@@ -0,0 +1,39 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local uci = require("uci")
+local adbinput = uci.get("adblock", "blacklist", "adb_src" or "/etc/adblock/adblock.blacklist")
+
+if not nixio.fs.access(adbinput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translatef("This form allows you to modify the content of the adblock blacklist (%s).<br />", adbinput)
+ .. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
+
+f = s:option(TextValue, "data")
+f.datatype = "string"
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
new file mode 100644
index 000000000..1b83c949e
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
@@ -0,0 +1,36 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local adbinput = "/etc/config/adblock"
+
+if not nixio.fs.access(adbinput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translate("This form allows you to modify the content of the main adblock configuration file (/etc/config/adblock)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
new file mode 100644
index 000000000..d2740f4da
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
@@ -0,0 +1,164 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local uci = require("uci")
+local sys = require("luci.sys")
+local json = require("luci.jsonc")
+local adbinput = uci.get("adblock", "global", "adb_rtfile") or "/tmp/adb_runtime.json"
+local parse = json.parse(fs.readfile(adbinput) or "")
+local dnsFile1 = sys.exec("find '/tmp/dnsmasq.d/.adb_hidden' -maxdepth 1 -type f -name 'adb_list*' -print 2>/dev/null")
+local dnsFile2 = sys.exec("find '/var/lib/unbound/.adb_hidden' -maxdepth 1 -type f -name 'adb_list*' -print 2>/dev/null")
+
+m = Map("adblock", translate("Adblock"),
+ translate("Configuration of the adblock package to block ad/abuse domains by using DNS. ")
+ .. translate("For further information ")
+ .. [[<a href="https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md" target="_blank">]]
+ .. translate("see online documentation")
+ .. [[</a>]]
+ .. translate("."))
+m.reset = false
+
+-- Main adblock options
+
+s = m:section(NamedSection, "global", "adblock")
+
+o1 = s:option(Flag, "adb_enabled", translate("Enable adblock"))
+o1.default = o1.enabled
+o1.rmempty = false
+
+btn = s:option(Button, "", translate("Suspend / Resume adblock"))
+if dnsFile1 ~= "" or dnsFile2 ~= "" then
+ btn.inputtitle = translate("Resume adblock")
+ btn.inputstyle = "apply"
+ btn.disabled = false
+ function btn.write()
+ luci.sys.call("/etc/init.d/adblock resume >/dev/null 2>&1")
+ end
+else
+ btn.inputtitle = translate("Suspend adblock")
+ btn.inputstyle = "reset"
+ btn.disabled = false
+ function btn.write()
+ luci.sys.call("/etc/init.d/adblock suspend >/dev/null 2>&1")
+ end
+end
+
+o2 = s:option(Value, "adb_iface", translate("Restrict interface trigger to certain interface(s)"),
+ translate("Space separated list of interfaces that trigger adblock processing. "..
+ "To disable event driven (re-)starts remove all entries."))
+o2.rmempty = true
+
+o3 = s:option(Value, "adb_triggerdelay", translate("Trigger delay"),
+ translate("Additional trigger delay in seconds before adblock processing begins."))
+o3.default = 2
+o3.datatype = "range(1,90)"
+o3.rmempty = false
+
+o4 = s:option(Flag, "adb_debug", translate("Enable verbose debug logging"))
+o4.default = o4.disabled
+o4.rmempty = false
+
+-- Runtime information
+
+ds = s:option(DummyValue, "_dummy", translate("Runtime information"))
+ds.template = "cbi/nullsection"
+
+dv1 = s:option(DummyValue, "status", translate("Status"))
+dv1.template = "adblock/runtime"
+if parse == nil then
+ dv1.value = translate("n/a")
+elseif parse.data.blocked_domains == "0" then
+ dv1.value = translate("no domains blocked")
+elseif dnsFile1 ~= "" or dnsFile2 ~= "" then
+ dv1.value = translate("suspended")
+else
+ dv1.value = translate("active")
+end
+dv2 = s:option(DummyValue, "adblock_version", translate("Adblock version"))
+dv2.template = "adblock/runtime"
+if parse ~= nil then
+ dv2.value = parse.data.adblock_version or translate("n/a")
+else
+ dv2.value = translate("n/a")
+end
+
+dv3 = s:option(DummyValue, "fetch_info", translate("Download Utility (SSL Library)"),
+ translate("For SSL protected blocklist sources you need a suitable SSL library, e.g. 'libustream-ssl' or the wget 'built-in'."))
+dv3.template = "adblock/runtime"
+if parse ~= nil then
+ dv3.value = parse.data.fetch_info or translate("n/a")
+else
+ dv3.value = translate("n/a")
+end
+
+dv4 = s:option(DummyValue, "dns_backend", translate("DNS backend"))
+dv4.template = "adblock/runtime"
+if parse ~= nil then
+ dv4.value = parse.data.dns_backend or translate("n/a")
+else
+ dv4.value = translate("n/a")
+end
+
+dv5 = s:option(DummyValue, "blocked_domains", translate("Blocked domains (overall)"))
+dv5.template = "adblock/runtime"
+if parse ~= nil then
+ dv5.value = parse.data.blocked_domains or translate("n/a")
+else
+ dv5.value = translate("n/a")
+end
+
+dv6 = s:option(DummyValue, "last_rundate", translate("Last rundate"))
+dv6.template = "adblock/runtime"
+if parse ~= nil then
+ dv6.value = parse.data.last_rundate or translate("n/a")
+else
+ dv6.value = translate("n/a")
+end
+
+-- Blocklist table
+
+bl = m:section(TypedSection, "source", translate("Blocklist sources"),
+ translate("Available blocklist sources. ")
+ .. translate("Note that list URLs and Shallalist category selections are configurable in the 'Advanced' section."))
+bl.template = "cbi/tblsection"
+
+name = bl:option(Flag, "enabled", translate("Enabled"))
+name.rmempty = false
+
+ssl = bl:option(DummyValue, "adb_src", translate("SSL req."))
+function ssl.cfgvalue(self, section)
+ local source = self.map:get(section, "adb_src")
+ if source and source:match("https://") then
+ return translate("Yes")
+ else
+ return translate("No")
+ end
+end
+
+des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
+
+-- Extra options
+
+e = m:section(NamedSection, "global", "adblock", translate("Extra options"),
+ translate("Options for further tweaking in case the defaults are not suitable for you."))
+
+e1 = e:option(Flag, "adb_forcedns", translate("Force local DNS"),
+ translate("Redirect all DNS queries to the local resolver."))
+e1.default = e1.disabled
+e1.rmempty = false
+
+e2 = e:option(Flag, "adb_forcesrt", translate("Force Overall Sort"),
+ translate("Enable memory intense overall sort / duplicate removal on low memory devices (&lt; 64 MB RAM)"))
+e2.default = e2.disabled
+e2.rmempty = false
+
+e3 = e:option(Flag, "adb_backup", translate("Enable blocklist backup"))
+e3.default = e3.disabled
+e3.rmempty = false
+
+e4 = e:option(Value, "adb_backupdir", translate("Backup directory"))
+e4.datatype = "directory"
+e4.rmempty = false
+
+return m
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
new file mode 100644
index 000000000..23c99a977
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
@@ -0,0 +1,39 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local uci = require("uci")
+local adbinput = uci.get("adblock", "global", "adb_whitelist") or "/etc/adblock/adblock.whitelist"
+
+if not nixio.fs.access(adbinput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("adblock/config_css"))
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translatef("This form allows you to modify the content of the adblock whitelist (%s).<br />", adbinput)
+ .. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
+
+f = s:option(TextValue, "data")
+f.datatype = "string"
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(adbinput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/config_css.htm b/applications/luci-app-adblock/luasrc/view/adblock/config_css.htm
new file mode 100644
index 000000000..53493a18f
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/view/adblock/config_css.htm
@@ -0,0 +1,10 @@
+<style type="text/css">
+ textarea
+ {
+ border: 1px solid #cccccc;
+ padding: 5px;
+ font-size: 12px;
+ font-family: monospace;
+ resize: none;
+ }
+</style>
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/logread.htm b/applications/luci-app-adblock/luasrc/view/adblock/logread.htm
new file mode 100644
index 000000000..5e25a549c
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/view/adblock/logread.htm
@@ -0,0 +1,14 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+ <fieldset class="cbi-section">
+ <div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for adblock related messages only.%></div>
+ <textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
+ </fieldset>
+</div>
+<%+footer%>
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/query.htm b/applications/luci-app-adblock/luasrc/view/adblock/query.htm
new file mode 100644
index 000000000..ce706e40a
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/view/adblock/query.htm
@@ -0,0 +1,65 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+ var stxhr = new XHR();
+
+ function update_status(data)
+ {
+ var domain = data.value;
+ var input = document.getElementById('query_input');
+ var output = document.getElementById('query_output');
+
+ if (input && output)
+ {
+ output.innerHTML =
+ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
+ '<%:Waiting for command to complete...%>'
+ ;
+ input.parentNode.style.display = 'block';
+ input.style.display = 'inline';
+ stxhr.post('<%=luci.dispatcher.build_url('admin/services/adblock/advanced/result/')%>' + domain, { token: '<%=token%>' },
+ function(x)
+ {
+ if (x.responseText)
+ {
+ input.style.display = 'none';
+ output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
+ }
+ else
+ {
+ input.style.display = 'none';
+ output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>';
+ }
+ }
+ );
+ }
+ }
+//]]>
+</script>
+
+<form method="post" action="<%=REQUEST_URI%>">
+ <div class="cbi-map">
+ <fieldset class="cbi-section">
+ <div class="cbi-section-descr"><%:This form allows you to query active block lists for certain domains, e.g. for whitelisting.%></div>
+ <div style="width:33%; float:left;">
+ <input style="margin: 5px 0" type="text" value="www.lede-project.org" name="input" />
+ <input type="button" value="<%:Query%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.input)" />
+ </div>
+ <br style="clear:both" />
+ <br />
+ </fieldset>
+ </div>
+ <fieldset class="cbi-section" style="display:none">
+ <legend id="query_input"><%:Collecting data...%></legend>
+ <span id="query_output"></span>
+ </fieldset>
+</form>
+
+<%+footer%>
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/runtime.htm b/applications/luci-app-adblock/luasrc/view/adblock/runtime.htm
new file mode 100644
index 000000000..ee3a4553a
--- /dev/null
+++ b/applications/luci-app-adblock/luasrc/view/adblock/runtime.htm
@@ -0,0 +1,10 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+cbi/valueheader%>
+
+<input name="runtime" id="runtime" type="text" class="cbi-input-text" style="border: none; box-shadow: none; background-color: #ffffff; color: #0069d6;" value="<%=self:cfgvalue(section)%>" disabled="disabled" />
+
+<%+cbi/valuefooter%>