luci-app-travelmate: sync with release 1.1.0
[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_automatic", translate("Enable 'automatic' mode"),
77         translate("Keep travelmate in an active state. Check every n seconds the connection status, i.e. the uplink availability."))
78 o2.default = o2.enabled
79 o2.rmempty = false
80
81 o3 = s:option(Flag, "trm_captive", translate("Captive Portal Detection"),
82         translate("Check the internet availability, log captive portal redirections and keep the uplink connection 'alive'."))
83 o3.default = o3.enabled
84 o3.rmempty = false
85
86 o4 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
87         translate("Name of the used uplink interface."))
88 if dump then
89         local i, v
90         for i, v in ipairs(dump.interface) do
91                 if v.interface ~= "loopback" and v.interface ~= "lan" then
92                         o4:value(v.interface)
93                 end
94         end
95 end
96 o4.default = trmiface
97 o4.rmempty = false
98
99 o5 = s:option(Value, "trm_triggerdelay", translate("Trigger Delay"),
100         translate("Additional trigger delay in seconds before travelmate processing begins."))
101 o5.datatype = "range(1,60)"
102 o5.default = 2
103 o5.rmempty = false
104
105 btn = s:option(Button, "", translate("Manual Rescan"),
106         translate("Force a manual uplink rescan / reconnect in 'trigger' mode."))
107 btn:depends("trm_automatic", "")
108 btn.inputtitle = translate("Rescan")
109 btn.inputstyle = "find"
110 btn.disabled = false
111
112 function btn.write()
113         luci.sys.call("env -i /etc/init.d/travelmate start >/dev/null 2>&1")
114         luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
115 end
116
117 -- Runtime information
118
119 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
120
121 dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
122 dv1.template = "travelmate/runtime"
123 if parse ~= nil then
124         dv1.value = parse.data.travelmate_status or translate("n/a")
125 else
126         dv1.value = translate("n/a")
127 end
128
129 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
130 dv2.template = "travelmate/runtime"
131 if parse ~= nil then
132         dv2.value = parse.data.travelmate_version or translate("n/a")
133 else
134         dv2.value = translate("n/a")
135 end
136
137 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
138 dv3.template = "travelmate/runtime"
139 if parse ~= nil then
140         dv3.value = parse.data.station_id or translate("n/a")
141 else
142         dv3.value = translate("n/a")
143 end
144
145 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
146 dv4.template = "travelmate/runtime"
147 if parse ~= nil then
148         dv4.value = parse.data.station_interface or translate("n/a")
149 else
150         dv4.value = translate("n/a")
151 end
152
153 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
154 dv5.template = "travelmate/runtime"
155 if parse ~= nil then
156         dv5.value = parse.data.station_radio or translate("n/a")
157 else
158         dv5.value = translate("n/a")
159 end
160
161 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
162 dv6.template = "travelmate/runtime"
163 if parse ~= nil then
164         dv6.value = parse.data.last_rundate or translate("n/a")
165 else
166         dv6.value = translate("n/a")
167 end
168
169 -- Extra options
170
171 e = m:section(NamedSection, "global", "travelmate", translate("Extra options"),
172 translate("Options for further tweaking in case the defaults are not suitable for you."))
173
174 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
175 e1.default = e1.disabled
176 e1.rmempty = false
177
178 e2 = e:option(Value, "trm_radio", translate("Radio selection"),
179         translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'."))
180 e2.datatype = "and(uciname,rangelength(6,6))"
181 e2.rmempty = true
182
183 e3 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
184         translate("Retry limit to connect to an uplink. ")
185         .. translate("To disable this feature set it to '0' which means unlimited retries."))
186 e3.default = 3
187 e3.datatype = "range(0,30)"
188 e3.rmempty = false
189
190 e4 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
191         translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
192 e4.default = 30
193 e4.datatype = "range(0,100)"
194 e4.rmempty = false
195
196 e5 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
197         translate("How long should travelmate wait for a successful wlan interface reload."))
198 e5.default = 30
199 e5.datatype = "range(5,60)"
200 e5.rmempty = false
201
202 e6 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
203         translate("Timeout in seconds between retries in 'automatic' mode."))
204 e6.default = 60
205 e6.datatype = "range(60,300)"
206 e6.rmempty = false
207
208 return m