luci-app-travelmate: sync with travelmate 1.0.0
[project/luci.git] / applications / luci-app-travelmate / luasrc / model / cbi / travelmate / 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 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(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 o4 = s:option(Value, "trm_triggerdelay", translate("Trigger delay"),
95         translate("Additional trigger delay in seconds before travelmate processing begins."))
96 o4.default = 2
97 o4.datatype = "range(1,90)"
98 o4.rmempty = false
99
100 btn = s:option(Button, "", translate("Manual Rescan"),
101         translate("Force a manual uplink rescan / reconnect in 'trigger' mode."))
102 btn:depends("trm_automatic", "")
103 btn.inputtitle = translate("Rescan")
104 btn.inputstyle = "find"
105 btn.disabled = false
106
107 function btn.write()
108         luci.sys.call("env -i /etc/init.d/travelmate start >/dev/null 2>&1")
109         luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
110 end
111
112 -- Runtime information
113
114 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
115
116 dv1 = ds:option(DummyValue, "status", translate("Online Status"))
117 dv1.template = "travelmate/runtime"
118 if parse == nil then
119         dv1.value = translate("n/a")
120 elseif parse.data.station_connection == "true" then
121         dv1.value = translate("connected")
122 else
123         dv1.value = translate("not connected")
124 end
125
126 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate version"))
127 dv2.template = "travelmate/runtime"
128 if parse ~= nil then
129         dv2.value = parse.data.travelmate_version or translate("n/a")
130 else
131         dv2.value = translate("n/a")
132 end
133
134 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
135 dv3.template = "travelmate/runtime"
136 if parse ~= nil then
137         dv3.value = parse.data.station_id or translate("n/a")
138 else
139         dv3.value = translate("n/a")
140 end
141
142 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
143 dv4.template = "travelmate/runtime"
144 if parse ~= nil then
145         dv4.value = parse.data.station_interface or translate("n/a")
146 else
147         dv4.value = translate("n/a")
148 end
149
150 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
151 dv5.template = "travelmate/runtime"
152 if parse ~= nil then
153         dv5.value = parse.data.station_radio or translate("n/a")
154 else
155         dv5.value = translate("n/a")
156 end
157
158 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
159 dv6.template = "travelmate/runtime"
160 if parse ~= nil then
161         dv6.value = parse.data.last_rundate or translate("n/a")
162 else
163         dv6.value = translate("n/a")
164 end
165
166 -- Extra options
167
168 e = m:section(NamedSection, "global", "travelmate", translate("Extra options"),
169 translate("Options for further tweaking in case the defaults are not suitable for you."))
170
171 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
172 e1.default = e1.disabled
173 e1.rmempty = false
174
175 e2 = e:option(Value, "trm_radio", translate("Radio selection"),
176         translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'."))
177 e2.datatype = "and(uciname,rangelength(6,6))"
178 e2.rmempty = true
179
180 e3 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
181         translate("How many times should travelmate try to connect to an Uplink. ")
182         .. translate("To disable this feature set it to '0' which means unlimited retries."))
183 e3.default = 3
184 e3.datatype = "range(0,30)"
185 e3.rmempty = false
186
187 e4 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
188         translate("How long should travelmate wait for a successful wlan interface reload."))
189 e4.default = 30
190 e4.datatype = "range(5,60)"
191 e4.rmempty = false
192
193 e5 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
194         translate("Timeout in seconds between retries in 'automatic' mode."))
195 e5.default = 60
196 e5.datatype = "range(60,300)"
197 e5.rmempty = false
198
199 return m