7b6b9658ca5447afe9d4e3539910c8bd57a21735
[project/luci.git] / applications / luci-app-travelmate / luasrc / model / cbi / travelmate / overview_tab.lua
1 -- Copyright 2017-2018 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 json     = require("luci.jsonc")
7 local util     = require("luci.util")
8 local nw       = require("luci.model.network").init()
9 local fw       = require("luci.model.firewall").init()
10 local dump     = util.ubus("network.interface", "dump", {})
11 local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
12 local trminput = uci:get("travelmate", "global", "trm_rtfile") or "/tmp/trm_runtime.json"
13 local uplink   = uci:get("network", trmiface) or ""
14 local parse    = json.parse(fs.readfile(trminput) or "")
15
16 m = Map("travelmate", translate("Travelmate"),
17         translate("Configuration of the travelmate package to to enable travel router functionality. ")
18         .. translatef("For further information "
19         .. "<a href=\"%s\" target=\"_blank\">"
20         .. "see online documentation</a>", "https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md"))
21
22 function m.on_after_commit(self)
23         luci.sys.call("env -i /etc/init.d/travelmate restart >/dev/null 2>&1")
24         luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
25 end
26
27 -- Interface Wizard
28
29 if uplink == "" then
30         ds = m:section(NamedSection, "global", "travelmate", translate("Interface Wizard"))
31
32         o = ds:option(Value, "", translate("Uplink interface"))
33         o.datatype = "and(uciname,rangelength(3,15))"
34         o.default = trmiface
35         o.rmempty = false
36
37         btn = ds:option(Button, "trm_iface", translate("Create Uplink Interface"),
38                 translate("Create a new wireless wan uplink interface, configure it to use dhcp and ")
39                 .. translate("add it to the wan zone of the firewall. This step has only to be done once."))
40         btn.inputtitle = translate("Add Interface")
41         btn.inputstyle = "apply"
42         btn.disabled = false
43
44         function btn.write(self, section)
45                 local iface = o:formvalue(section)
46                 if iface then
47                         uci:set("travelmate", section, "trm_iface", iface)
48                         uci:save("travelmate")
49                         uci:commit("travelmate")
50                         local net = nw:add_network(iface, { proto = "dhcp" })
51                         if net then
52                                 nw:save("network")
53                                 nw:commit("network")
54                                 local zone = fw:get_zone_by_network("wan")
55                                 if zone then
56                                         zone:add_network(iface)
57                                         fw:save("firewall")
58                                         fw:commit("firewall")
59                                 end
60                         end
61                         luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
62                 end
63                 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
64         end
65         return m
66 end
67
68 -- Main travelmate options
69
70 s = m:section(NamedSection, "global", "travelmate")
71
72 o1 = s:option(Flag, "trm_enabled", translate("Enable travelmate"))
73 o1.default = o1.disabled
74 o1.rmempty = false
75
76 o2 = s:option(Flag, "trm_captive", translate("Captive Portal Detection"),
77         translate("Check the internet availability, log captive portal redirections and keep the uplink connection 'alive'."))
78 o2.default = o2.enabled
79 o2.rmempty = false
80
81 o3 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
82         translate("Name of the used uplink interface."))
83 if dump then
84         local i, v
85         for i, v in ipairs(dump.interface) do
86                 if v.interface ~= "loopback" and v.interface ~= "lan" then
87                         o3:value(v.interface)
88                 end
89         end
90 end
91 o3.default = trmiface
92 o3.rmempty = false
93
94 if fs.access("/usr/bin/qrencode") then
95         btn = s:option(Button, "btn", translate("View AP QR-Codes"),
96                 translate("Connect your Android or iOS devices to your router's WiFi using the shown QR code."))
97         btn.inputtitle = translate("QR-Codes")
98         btn.inputstyle = "apply"
99         btn.disabled = false
100
101         function btn.write()
102                 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate", "apqr"))
103         end
104 end
105
106 -- Runtime information
107
108 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
109
110 dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
111 dv1.template = "travelmate/runtime"
112 if parse ~= nil then
113         dv1.value = parse.data.travelmate_status or translate("n/a")
114 else
115         dv1.value = translate("n/a")
116 end
117
118 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
119 dv2.template = "travelmate/runtime"
120 if parse ~= nil then
121         dv2.value = parse.data.travelmate_version or translate("n/a")
122 else
123         dv2.value = translate("n/a")
124 end
125
126 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
127 dv3.template = "travelmate/runtime"
128 if parse ~= nil then
129         dv3.value = parse.data.station_id or translate("n/a")
130 else
131         dv3.value = translate("n/a")
132 end
133
134 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
135 dv4.template = "travelmate/runtime"
136 if parse ~= nil then
137         dv4.value = parse.data.station_interface or translate("n/a")
138 else
139         dv4.value = translate("n/a")
140 end
141
142 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
143 dv5.template = "travelmate/runtime"
144 if parse ~= nil then
145         dv5.value = parse.data.station_radio or translate("n/a")
146 else
147         dv5.value = translate("n/a")
148 end
149
150 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
151 dv6.template = "travelmate/runtime"
152 if parse ~= nil then
153         dv6.value = parse.data.last_rundate or translate("n/a")
154 else
155         dv6.value = translate("n/a")
156 end
157
158 -- Extra options
159
160 e = m:section(NamedSection, "global", "travelmate", translate("Extra options"),
161 translate("Options for further tweaking in case the defaults are not suitable for you."))
162
163 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
164 e1.default = e1.disabled
165 e1.rmempty = false
166
167 e2 = e:option(Value, "trm_radio", translate("Radio selection"),
168         translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'."))
169 e2.datatype = "and(uciname,rangelength(6,6))"
170 e2.rmempty = true
171
172 e3 = e:option(Value, "trm_triggerdelay", translate("Trigger Delay"),
173         translate("Additional trigger delay in seconds before travelmate processing begins."))
174 e3.datatype = "range(1,60)"
175 e3.default = 2
176 e3.rmempty = false
177
178 e4 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
179         translate("Retry limit to connect to an uplink."))
180 e4.default = 3
181 e4.datatype = "range(1,10)"
182 e4.rmempty = false
183
184 e5 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
185         translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
186 e5.default = 35
187 e5.datatype = "range(20,80)"
188 e5.rmempty = false
189
190 e6 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
191         translate("How long should travelmate wait for a successful wlan uplink connection."))
192 e6.default = 30
193 e6.datatype = "range(20,40)"
194 e6.rmempty = false
195
196 e7 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
197         translate("Overall retry timeout in seconds."))
198 e7.default = 60
199 e7.datatype = "range(30,300)"
200 e7.rmempty = false
201
202 return m