1 -- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
2 -- This is free software, licensed under the Apache License, Version 2.0
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 "")
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"))
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"))
30 ds = m:section(NamedSection, "global", "travelmate", translate("Interface Wizard"))
32 o = ds:option(Value, "", translate("Uplink interface"))
33 o.datatype = "and(uciname,rangelength(3,15))"
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"
44 function btn.write(self, section)
45 local iface = o:formvalue(section)
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" })
54 local zone = fw:get_zone_by_network("wan")
56 zone:add_network(iface)
61 luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
63 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
68 -- Main travelmate options
70 s = m:section(NamedSection, "global", "travelmate")
72 o1 = s:option(Flag, "trm_enabled", translate("Enable travelmate"))
73 o1.default = o1.disabled
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
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
86 o4 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
87 translate("Name of the used uplink interface."))
90 for i, v in ipairs(dump.interface) do
91 if v.interface ~= "loopback" and v.interface ~= "lan" then
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)"
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"
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"))
117 -- Runtime information
119 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
121 dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
122 dv1.template = "travelmate/runtime"
124 dv1.value = parse.data.travelmate_status or translate("n/a")
126 dv1.value = translate("n/a")
129 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
130 dv2.template = "travelmate/runtime"
132 dv2.value = parse.data.travelmate_version or translate("n/a")
134 dv2.value = translate("n/a")
137 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
138 dv3.template = "travelmate/runtime"
140 dv3.value = parse.data.station_id or translate("n/a")
142 dv3.value = translate("n/a")
145 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
146 dv4.template = "travelmate/runtime"
148 dv4.value = parse.data.station_interface or translate("n/a")
150 dv4.value = translate("n/a")
153 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
154 dv5.template = "travelmate/runtime"
156 dv5.value = parse.data.station_radio or translate("n/a")
158 dv5.value = translate("n/a")
161 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
162 dv6.template = "travelmate/runtime"
164 dv6.value = parse.data.last_rundate or translate("n/a")
166 dv6.value = translate("n/a")
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."))
174 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
175 e1.default = e1.disabled
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))"
183 e3 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
184 translate("Retry limit to connect to an uplink."))
186 e3.datatype = "range(1,10)"
189 e4 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
190 translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
192 e4.datatype = "range(20,80)"
195 e5 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
196 translate("How long should travelmate wait for a successful wlan uplink connection."))
198 e5.datatype = "range(20,40)"
201 e6 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
202 translate("Timeout in seconds between retries in 'automatic' mode."))
204 e6.datatype = "range(30,300)"