602076ce0e1d49a21e4b3b35705125bab5c8a065
[project/luci.git] / applications / luci-app-dnscrypt-proxy / luasrc / model / cbi / dnscrypt-proxy / overview_tab.lua
1 -- Copyright 2017 Dirk Brenken (dev@brenken.org)
2 -- This is free software, licensed under the Apache License, Version 2.0
3
4 local fs        = require("nixio.fs")
5 local uci       = require("luci.model.uci").cursor()
6 local util      = require("luci.util")
7 local date      = require("luci.http.protocol.date")
8 local res_input = "/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv"
9 local dump      = util.ubus("network.interface", "dump", {})
10 local plug_cnt  = tonumber(luci.sys.exec("env -i /usr/sbin/dnscrypt-proxy --version | grep 'Support for plugins: present' | wc -l"))
11 local res_list  = {}
12 local url       = "https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-resolvers.csv"
13
14 if not fs.access("/lib/libustream-ssl.so") then
15         m = SimpleForm("error", nil, translate("SSL support not available, please install an libustream-ssl variant to use this package."))
16         m.submit = false
17         m.reset = false
18         return m
19 end
20
21 if not fs.access(res_input) then
22         luci.sys.call("env -i /bin/uclient-fetch --no-check-certificate -O " .. res_input .. " " .. url .. " >/dev/null 2>&1")
23 end
24
25 for line in io.lines(res_input) do
26         local name = line:match("^[%w_.-]*")
27         res_list[#res_list + 1] = { name = name }
28 end
29
30 m = Map("dnscrypt-proxy", translate("DNSCrypt-Proxy"),
31         translate("Configuration of the DNSCrypt-Proxy package. ")
32         .. translate("Keep in mind to configure Dnsmasq as well. ")
33         .. translatef("For further information "
34         .. "<a href=\"%s\" target=\"_blank\">"
35         .. "see the wiki online</a>", "https://wiki.openwrt.org/inbox/dnscrypt"))
36
37 function m.on_after_commit(self)
38         luci.sys.call("env -i /etc/init.d/dnsmasq restart >/dev/null 2>&1")
39         luci.sys.call("env -i /etc/init.d/dnscrypt-proxy restart >/dev/null 2>&1")
40 end
41
42 -- Trigger selection
43
44 s = m:section(TypedSection, "global", translate("General options"))
45 s.anonymous = true
46
47 -- Main dnscrypt-proxy resource list
48
49 o1 = s:option(DummyValue, "", translate("Default Resolver List"))
50 o1.template = "dnscrypt-proxy/res_options"
51 o1.value = res_input
52
53 o2 = s:option(DummyValue, "", translate("File Date"))
54 o2.template = "dnscrypt-proxy/res_options"
55 o2.value = date.to_http(nixio.fs.stat(res_input).mtime)
56
57 o3 = s:option(DummyValue, "", translate("File Checksum"))
58 o3.template = "dnscrypt-proxy/res_options"
59 o3.value = luci.sys.exec("sha256sum " .. res_input .. " | awk '{print $1}'")
60
61 btn = s:option(Button, "", translate("Refresh Resolver List"))
62 btn.inputtitle = translate("Refresh List")
63 btn.inputstyle = "apply"
64 btn.disabled = false
65 function btn.write(self, section, value)
66         luci.sys.call("env -i /bin/uclient-fetch --no-check-certificate -O " .. res_input .. " " .. url .. " >/dev/null 2>&1")
67         luci.http.redirect(luci.dispatcher.build_url("admin", "services", "dnscrypt-proxy"))
68 end
69
70 -- Trigger settings
71
72 t = s:option(DynamicList, "procd_trigger", translate("Startup Trigger"),
73         translate("By default the DNSCrypt-Proxy startup will be triggered by ifup events of multiple network interfaces. ")
74         .. translate("To restrict the trigger, add only the relevant network interface(s). ")
75         .. translate("Usually the 'wan' interface should work for most users."))
76 if dump then
77         local i, v
78         for i, v in ipairs(dump.interface) do
79                 if v.interface ~= "loopback" then
80                         t:value(v.interface)
81                 end
82         end
83 end
84 t.rmempty = true
85
86 -- Mandatory options per instance
87
88 s = m:section(TypedSection, "dnscrypt-proxy", translate("Instance options"))
89 s.anonymous = true
90 s.addremove = true
91
92 o1 = s:option(Value, "address", translate("IP Address"),
93         translate("The local IP address."))
94 o1.datatype = "ip4addr"
95 o1.default = address or "127.0.0.1"
96 o1.rmempty = false
97
98 o2 = s:option(Value, "port", translate("Port"),
99         translate("The listening port for DNS queries."))
100 o2.datatype = "port"
101 o2.default = port
102 o2.rmempty = false
103
104 o3 = s:option(ListValue, "resolver", translate("Resolver"),
105         translate("Name of the remote DNS service for resolving queries."))
106 o3.datatype = "hostname"
107 o3.widget = "select"
108 local i, v
109 for i, v in ipairs(res_list) do
110         if v.name ~= "Name" then
111                 o3:value(v.name)
112         end
113 end
114 o3.default = resolver
115 o3.rmempty = false
116
117 -- Extra options per instance
118
119 e1 = s:option(Value, "resolvers_list", translate("Alternate Resolver List"),
120         translate("Specify a non-default Resolver List."))
121 e1.datatype = "file"
122 e1.optional = true
123
124 e2 = s:option(Value, "ephemeral_keys", translate("Ephemeral Keys"),
125         translate("Improve privacy by using an ephemeral public key for each query. ")
126         .. translate("This option requires extra CPU cycles and is useless with most DNSCrypt server."))
127 e2.datatype = "bool"
128 e2.value = 1
129 e2.optional = true
130
131 if plug_cnt > 0 then
132         e3 = s:option(DynamicList, "blacklist", translate("Blacklist"),
133                 translate("Local blacklists allow you to block abuse sites by domains or ip addresses. ")
134                 .. translate("The value for this property is the blocklist type and path to the file, e.g.'domains:/path/to/dbl.txt' or 'ips:/path/to/ipbl.txt'."))
135         e3.optional = true
136
137         e4 = s:option(Value, "block_ipv6", translate("Block IPv6"),
138                 translate("Disable IPv6 to speed up DNSCrypt-Proxy."))
139         e4.datatype = "bool"
140         e4.value = 1
141         e4.optional = true
142
143         e5 = s:option(Value, "local_cache", translate("Local Cache"),
144                 translate("Enable Caching to speed up DNSCcrypt-Proxy."))
145         e5.datatype = "bool"
146         e5.value = 1
147         e5.optional = true
148         
149         e6 = s:option(Value, "query_log_file", translate("DNS Query Logfile"),
150         translate("Log the received DNS queries to a file, so you can watch in real-time what is happening on the network."))
151         e6.optional = true
152 end
153
154 return m