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_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
81 o3 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
82 translate("Name of the used uplink interface."))
85 for i, v in ipairs(dump.interface) do
86 if v.interface ~= "loopback" and v.interface ~= "lan" then
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"
102 luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate", "apqr"))
106 -- Runtime information
108 ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
110 dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
111 dv1.template = "travelmate/runtime"
113 dv1.value = parse.data.travelmate_status or translate("n/a")
115 dv1.value = translate("n/a")
118 dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
119 dv2.template = "travelmate/runtime"
121 dv2.value = parse.data.travelmate_version or translate("n/a")
123 dv2.value = translate("n/a")
126 dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
127 dv3.template = "travelmate/runtime"
129 dv3.value = parse.data.station_id or translate("n/a")
131 dv3.value = translate("n/a")
134 dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
135 dv4.template = "travelmate/runtime"
137 dv4.value = parse.data.station_interface or translate("n/a")
139 dv4.value = translate("n/a")
142 dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
143 dv5.template = "travelmate/runtime"
145 dv5.value = parse.data.station_radio or translate("n/a")
147 dv5.value = translate("n/a")
150 dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
151 dv6.template = "travelmate/runtime"
153 dv6.value = parse.data.last_rundate or translate("n/a")
155 dv6.value = translate("n/a")
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."))
163 e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
164 e1.default = e1.disabled
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))"
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)"
178 e4 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
179 translate("Retry limit to connect to an uplink."))
181 e4.datatype = "range(1,10)"
184 e5 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
185 translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
187 e5.datatype = "range(20,80)"
190 e6 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
191 translate("How long should travelmate wait for a successful wlan uplink connection."))
193 e6.datatype = "range(20,40)"
196 e7 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
197 translate("Overall retry timeout in seconds."))
199 e7.datatype = "range(30,300)"