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 -- We might modify these configs too:
26 function m.on_after_commit(self)
28 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
34 ds = m:section(NamedSection, "global", "travelmate", translate("Interface Wizard"))
36 o = ds:option(Value, "", translate("Uplink interface"))
37 o.datatype = "and(uciname,rangelength(3,15))"
41 btn = ds:option(Button, "trm_iface", translate("Create Uplink Interface"),
42 translate("Create a new wireless wan uplink interface, configure it to use dhcp and ")
43 .. translate("add it to the wan zone of the firewall. This step has only to be done once."))
44 btn.inputtitle = translate("Add Interface")
45 btn.inputstyle = "apply"
48 function btn.write(self, section)
49 -- Do uci changes. Note that we must not commit here as the rollback handler
50 -- needs to see "unsaved changes" in order to roll them back.
51 local iface = o:formvalue(section)
53 uci:set("travelmate", section, "trm_iface", iface)
54 local net = nw:add_network(iface, { proto = "dhcp" })
56 local zone = fw:get_zone_by_network("wan")
58 zone:add_network(iface)
63 -- Since we're prematurely terminating the cbi logic flow here and since we trigger
64 -- our modifications in a button write callback and not via cbi.apply, we do need to
65 -- tell cbi to trigger apply/rollback.
66 m.flow.autoapply = true
71 -- Main travelmate options
73 s = m:section(NamedSection, "global", "travelmate")
75 o1 = s:option(Flag, "trm_enabled", translate("Enable travelmate"))
76 o1.default = o1.disabled
79 o2 = s:option(Flag, "trm_captive", translate("Captive Portal Detection"),
80 translate("Check the internet availability, log captive portal redirections and keep the uplink connection 'alive'."))
81 o2.default = o2.enabled
84 o3 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
85 translate("Name of the used uplink interface."))
88 for i, v in ipairs(dump.interface) do
89 if v.interface ~= "loopback" and v.interface ~= "lan" then
97 if fs.access("/usr/bin/qrencode") then
98 btn = s:option(Button, "btn", translate("View AP QR-Codes"),
99 translate("Connect your Android or iOS devices to your router's WiFi using the shown QR code."))
100 btn.inputtitle = translate("QR-Codes")
101 btn.inputstyle = "apply"
105 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate", "apqr"))
109 -- Runtime information
111 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
113 dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
114 dv1.template = "travelmate/runtime"
116 dv1.value = parse.data.travelmate_status or translate("n/a")
118 dv1.value = translate("n/a")
121 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
122 dv2.template = "travelmate/runtime"
124 dv2.value = parse.data.travelmate_version or translate("n/a")
126 dv2.value = translate("n/a")
129 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
130 dv3.template = "travelmate/runtime"
132 dv3.value = parse.data.station_id or translate("n/a")
134 dv3.value = translate("n/a")
137 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
138 dv4.template = "travelmate/runtime"
140 dv4.value = parse.data.station_interface or translate("n/a")
142 dv4.value = translate("n/a")
145 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
146 dv5.template = "travelmate/runtime"
148 dv5.value = parse.data.station_radio or translate("n/a")
150 dv5.value = translate("n/a")
153 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
154 dv6.template = "travelmate/runtime"
156 dv6.value = parse.data.last_rundate or translate("n/a")
158 dv6.value = translate("n/a")
163 e = m:section(NamedSection, "global", "travelmate", translate("Extra options"),
164 translate("Options for further tweaking in case the defaults are not suitable for you."))
166 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
167 e1.default = e1.disabled
170 e2 = e:option(Value, "trm_radio", translate("Radio selection"),
171 translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'."))
172 e2.datatype = "and(uciname,rangelength(6,6))"
175 e3 = e:option(Value, "trm_triggerdelay", translate("Trigger Delay"),
176 translate("Additional trigger delay in seconds before travelmate processing begins."))
177 e3.datatype = "range(1,60)"
181 e4 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
182 translate("Retry limit to connect to an uplink."))
184 e4.datatype = "range(1,10)"
187 e5 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
188 translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
190 e5.datatype = "range(20,80)"
193 e6 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
194 translate("How long should travelmate wait for a successful wlan uplink connection."))
196 e6.datatype = "range(20,40)"
199 e7 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
200 translate("Overall retry timeout in seconds."))
202 e7.datatype = "range(30,300)"