1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
-- Copyright 2017-2019 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
module("luci.controller.adblock", package.seeall)
local sys = require("luci.sys")
local util = require("luci.util")
local http = require("luci.http")
local i18n = require("luci.i18n")
local json = require("luci.jsonc")
local uci = require("luci.model.uci").cursor()
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", {hideresetbtn=true, hidesavebtn=true}), _("Overview"), 10).leaf = true
if nixio.fs.access("/usr/sbin/tcpdump") then
entry({"admin", "services", "adblock", "report"}, template("adblock/report"), _("DNS Query Report"), 20).leaf = true
end
entry({"admin", "services", "adblock", "log"}, template("adblock/logread"), _("Logfile"), 30).leaf = true
entry({"admin", "services", "adblock", "advanced"}, firstchild(), _("Advanced"), 100)
entry({"admin", "services", "adblock", "advanced", "blacklist"}, form("adblock/blacklist_tab"), _("Edit Blacklist"), 110).leaf = true
entry({"admin", "services", "adblock", "advanced", "whitelist"}, form("adblock/whitelist_tab"), _("Edit Whitelist"), 120).leaf = true
entry({"admin", "services", "adblock", "advanced", "configuration"}, form("adblock/configuration_tab"), _("Edit Configuration"), 130).leaf = true
entry({"admin", "services", "adblock", "advanced", "query"}, template("adblock/query"), _("Query domains"), 140).leaf = true
entry({"admin", "services", "adblock", "advanced", "result"}, call("queryData"), nil, 150).leaf = true
entry({"admin", "services", "adblock", "logread"}, call("logread"), nil).leaf = true
entry({"admin", "services", "adblock", "status_update"}, call("status_update"), nil).leaf = true
entry({"admin", "services", "adblock", "report_json"}, call("report_json"), nil).leaf = true
entry({"admin", "services", "adblock", "report_text"}, call("report_text"), nil).leaf = true
entry({"admin", "services", "adblock", "action"}, call("adb_action"), nil).leaf = true
end
function adb_action(name, ...)
local domain = select(1, ...) or ""
local search = select(2, ...) or "+"
local count = select(3, ...) or "50"
local filter = select(4, ...) or "false"
local print = select(5, ...) or "false"
local report_params = {
search,
count,
filter,
print
}
if name == "do_suspend" then
luci.sys.call("/etc/init.d/adblock suspend >/dev/null 2>&1")
elseif name == "do_resume" then
luci.sys.call("/etc/init.d/adblock resume >/dev/null 2>&1")
elseif name == "do_refresh" then
luci.sys.call("/etc/init.d/adblock reload >/dev/null 2>&1")
elseif name == "do_report" then
luci.sys.call("/etc/init.d/adblock report " ..table.concat(report_params, " ").. " >/dev/null 2>&1")
local rep_dir = uci:get("adblock", "extra", "adb_repdir") or "/tmp"
repeat
nixio.nanosleep(1)
until not nixio.fs.access(rep_dir.. "/adb_report.raw")
elseif name == "do_filter" then
luci.sys.call("/etc/init.d/adblock report " ..table.concat(report_params, " ").. " >/dev/null 2>&1")
local rep_dir = uci:get("adblock", "extra", "adb_repdir") or "/tmp"
repeat
nixio.nanosleep(1)
until nixio.fs.access(rep_dir.. "/adb_report.final")
elseif name == "add_blacklist" then
local file = uci:get("adblock", "blacklist", "adb_src") or "/etc/adblock/adblock.blacklist"
if nixio.fs.access(file) then
local blacklist = nixio.fs.readfile(file)
if not string.find(blacklist, domain, 1, true)
then
nixio.fs.writefile(file, blacklist.. domain.. "\n")
end
end
elseif name == "add_whitelist" then
local file = uci:get("adblock", "global", "adb_whitelist") or "/etc/adblock/adblock.whitelist"
if nixio.fs.access(file) then
local whitelist = nixio.fs.readfile(file)
if not string.find(whitelist, domain, 1, true)
then
nixio.fs.writefile(file, whitelist.. domain.. "\n")
end
end
end
if name == "do_suspend" or name == "do_resume" or name == "do_refresh" then
local pid_file = "/var/run/adblock.pid"
if nixio.fs.access(pid_file) then
repeat
nixio.nanosleep(1)
until nixio.fs.readfile(pid_file) == ""
end
end
luci.http.prepare_content("text/plain")
luci.http.write("0")
end
function status_update()
local rt_file
local content
rt_file = uci:get("adblock", "global", "adb_rtfile") or "/tmp/adb_runtime.json"
if nixio.fs.access(rt_file) then
content = json.parse(nixio.fs.readfile(rt_file) or "")
http.prepare_content("application/json")
http.write_json(content)
end
end
function report_json()
local rep_dir
local rep_file
local content
rep_dir = uci:get("adblock", "extra", "adb_repdir") or "/tmp"
rep_file = rep_dir.. "/adb_report.json"
http.prepare_content("application/json")
if nixio.fs.access(rep_file) then
content = json.parse(nixio.fs.readfile(rep_file) or "")
http.write_json(content)
else
http.write_json("{}")
end
end
function report_text()
local file
local rep_dir
local rep_file
local content
rep_dir = uci:get("adblock", "extra", "adb_repdir") or "/tmp"
rep_file = rep_dir.. "/adb_report.final"
http.prepare_content("text/plain")
if nixio.fs.access(rep_file) then
file = io.open(rep_file, "r")
content = file:read("*all")
file:close()
http.write(content)
else
http.write("")
end
end
function logread()
local content = util.trim(util.exec("logread -e 'adblock-'")) or ""
if content == "" then
content = "No adblock related logs yet!"
end
http.write(content)
end
function queryData(domain)
if domain then
luci.http.prepare_content("text/plain")
local cmd = "/etc/init.d/adblock query %s 2>&1"
local util = io.popen(cmd % util.shellquote(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
|