summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-travelmate
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-travelmate')
-rw-r--r--applications/luci-app-travelmate/Makefile6
-rw-r--r--applications/luci-app-travelmate/luasrc/controller/travelmate.lua34
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate.lua53
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua37
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua37
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua37
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua39
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua193
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua183
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua14
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua169
-rw-r--r--applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua36
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/ap_qr.htm65
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/config_css.htm13
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm20
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/runtime.htm10
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm78
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm97
-rw-r--r--applications/luci-app-travelmate/po/ja/travelmate.po399
-rw-r--r--applications/luci-app-travelmate/po/pt-br/travelmate.po423
-rw-r--r--applications/luci-app-travelmate/po/ru/travelmate.po461
-rw-r--r--applications/luci-app-travelmate/po/templates/travelmate.pot329
22 files changed, 2609 insertions, 124 deletions
diff --git a/applications/luci-app-travelmate/Makefile b/applications/luci-app-travelmate/Makefile
index f4b1b0a4e3..58d9bf37d4 100644
--- a/applications/luci-app-travelmate/Makefile
+++ b/applications/luci-app-travelmate/Makefile
@@ -1,11 +1,11 @@
-#
-# This is free software, licensed under the Apache License, Version 2.0 .
+# Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+# This is free software, licensed under the Apache License, Version 2.0
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for Travelmate
-LUCI_DEPENDS:=+travelmate
+LUCI_DEPENDS:=+travelmate +luci-lib-jsonc
LUCI_PKGARCH:=all
include ../../luci.mk
diff --git a/applications/luci-app-travelmate/luasrc/controller/travelmate.lua b/applications/luci-app-travelmate/luasrc/controller/travelmate.lua
index 27c19c4e52..493a387c3e 100644
--- a/applications/luci-app-travelmate/luasrc/controller/travelmate.lua
+++ b/applications/luci-app-travelmate/luasrc/controller/travelmate.lua
@@ -1,11 +1,41 @@
--- Licensed to the public under the Apache License 2.0.
+-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
module("luci.controller.travelmate", package.seeall)
+local util = require("luci.util")
+local i18n = require("luci.i18n")
+local templ = require("luci.template")
+
function index()
if not nixio.fs.access("/etc/config/travelmate") then
return
end
+ entry({"admin", "services", "travelmate"}, firstchild(), _("Travelmate"), 40).dependent = false
+ entry({"admin", "services", "travelmate", "tab_from_cbi"}, cbi("travelmate/overview_tab", {hideresetbtn=true, hidesavebtn=true}), _("Overview"), 10).leaf = true
+ entry({"admin", "services", "travelmate", "stations"}, template("travelmate/stations"), _("Wireless Stations"), 20).leaf = true
+ entry({"admin", "services", "travelmate", "logfile"}, call("logread"), _("View Logfile"), 30).leaf = true
+ entry({"admin", "services", "travelmate", "advanced"}, firstchild(), _("Advanced"), 100)
+ entry({"admin", "services", "travelmate", "advanced", "configuration"}, form("travelmate/configuration_tab"), _("Edit Travelmate Configuration"), 110).leaf = true
+ entry({"admin", "services", "travelmate", "advanced", "cfg_wireless"}, form("travelmate/cfg_wireless_tab"), _("Edit Wireless Configuration"), 120).leaf = true
+ entry({"admin", "services", "travelmate", "advanced", "cfg_network"}, form("travelmate/cfg_network_tab"), _("Edit Network Configuration"), 130).leaf = true
+ entry({"admin", "services", "travelmate", "advanced", "cfg_firewall"}, form("travelmate/cfg_firewall_tab"), _("Edit Firewall Configuration"), 140).leaf = true
+
+ entry({"admin", "services", "travelmate", "apqr"}, template("travelmate/ap_qr")).leaf = true
+ entry({"admin", "services", "travelmate", "wifiscan"}, template("travelmate/wifi_scan")).leaf = true
+ entry({"admin", "services", "travelmate", "wifiadd"}, form("travelmate/wifi_add", {hideresetbtn=true, hidesavebtn=true})).leaf = true
+ entry({"admin", "services", "travelmate", "wifiedit"}, form("travelmate/wifi_edit", {hideresetbtn=true, hidesavebtn=true})).leaf = true
+ entry({"admin", "services", "travelmate", "wifidelete"}, form("travelmate/wifi_delete", {hideresetbtn=true, hidesavebtn=true})).leaf = true
+ entry({"admin", "services", "travelmate", "wifiorder"}, form("travelmate/wifi_order", {hideresetbtn=true, hidesavebtn=true})).leaf = true
+end
- entry({"admin", "services", "travelmate"}, cbi("travelmate"), _("Travelmate"), 60)
+function logread()
+ local logfile = ""
+
+ if nixio.fs.access("/var/log/messages") then
+ logfile = util.trim(util.exec("grep -F 'travelmate-' /var/log/messages"))
+ elseif nixio.fs.access("/sbin/logread") then
+ logfile = util.trim(util.exec("logread -e 'travelmate-'"))
+ end
+ templ.render("travelmate/logread", {title = i18n.translate("Travelmate Logfile"), content = logfile})
end
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate.lua
deleted file mode 100644
index fa44d4b523..0000000000
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate.lua
+++ /dev/null
@@ -1,53 +0,0 @@
--- Licensed to the public under the Apache License 2.0.
-
-m = Map("travelmate", translate("Travelmate"),
- translate("Configuration of the Travelmate package to enable travel router functionality. ") .. [[</p>]] ..
- translate("Brief advice: Create a wwan interface, configure it to use dhcp and " ..
- "add it to the wan zone in firewall. Create the wifi interfaces to be used ('client' mode, " ..
- "assigned to wwan network, left as disabled). Travelmate will try " ..
- "to connect to the known wifi client interfaces in the defined order. ") ..
- [[<a href="https://github.com/openwrt/packages/tree/master/net/travelmate/files/README.md" target="_blank">]]
- .. translate("Link to detailed advice")
- .. [[</a>]] )
-
--- General options
-
-s = m:section(NamedSection, "global", "travelmate", translate("Global options"))
-
-o = s:option(Flag, "trm_enabled", translate("Enable Travelmate"))
-o.rmempty = false
-o.default = 0
-
-o = s:option(Value, "trm_maxwait", translate("Max. timeout in seconds for wlan interface reload"),
- translate("Default 20, range 10-60"))
-o.rmempty = false
-o.default = 20
-o.datatype = "range(10,60)"
-
-o = s:option(Value, "trm_maxretry", translate("Max. number of connection retries to an uplink"),
- translate("Default 3, range 1-10"))
-o.rmempty = false
-o.default = 3
-o.datatype = "range(1,10)"
-
--- Extra options
-
-e = m:section(NamedSection, "global", "travelmate", translate("Extra options"))
-
-a = e:option(Flag, "trm_debug", translate("Debug logging"))
-a.rmempty = true
-a.default = a.disabled
-
-a = e:option(Value, "trm_iface", translate("Restrict reload trigger to certain interface(s)"),
- translate("Space separated list of wwan interfaces that trigger reload action. To disable reload trigger set it to 'false'. Default: empty"))
-a.rmempty = true
-a.default = ""
-a.datatype = "uciname"
-
-a = e:option(Flag, "trm_iw", translate("Use iw for scanning"),
- translate("Disable this if you want to use iwinfo instead of iw"))
-a.rmempty = true
-a.default = a.enabled
-
-return m
-
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua
new file mode 100644
index 0000000000..e5a048fa88
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua
@@ -0,0 +1,37 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local trminput = "/etc/config/firewall"
+
+if not nixio.fs.access(trminput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translate("This form allows you to modify the content of the main firewall configuration file (/etc/config/firewall)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(trminput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(trminput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua
new file mode 100644
index 0000000000..0096d6a8c2
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua
@@ -0,0 +1,37 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local trminput = "/etc/config/network"
+
+if not nixio.fs.access(trminput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translate("This form allows you to modify the content of the main network configuration file (/etc/config/network)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(trminput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(trminput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua
new file mode 100644
index 0000000000..7ef9920a08
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua
@@ -0,0 +1,37 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local trminput = "/etc/config/wireless"
+
+if not nixio.fs.access(trminput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translate("This form allows you to modify the content of the main wireless configuration file (/etc/config/wireless)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(trminput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(trminput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua
new file mode 100644
index 0000000000..8a20ab9cce
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua
@@ -0,0 +1,39 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local util = require("luci.util")
+local trminput = "/etc/config/travelmate"
+
+if not nixio.fs.access(trminput) then
+ m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
+ m.reset = false
+ m.submit = false
+ return m
+end
+
+m = SimpleForm("input", nil)
+m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
+m.reset = false
+
+s = m:section(SimpleSection, nil,
+ translate("This form allows you to modify the content of the main travelmate configuration file (/etc/config/travelmate)."))
+
+f = s:option(TextValue, "data")
+f.rows = 20
+f.rmempty = true
+
+function f.cfgvalue()
+ return nixio.fs.readfile(trminput) or ""
+end
+
+function f.write(self, section, data)
+ return nixio.fs.writefile(trminput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+function s.handle(self, state, data)
+ return true
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua
new file mode 100644
index 0000000000..a1dcbc638c
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua
@@ -0,0 +1,193 @@
+-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local uci = require("luci.model.uci").cursor()
+local json = require("luci.jsonc")
+local util = require("luci.util")
+local nw = require("luci.model.network").init()
+local fw = require("luci.model.firewall").init()
+local dump = util.ubus("network.interface", "dump", {})
+local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
+local trminput = uci:get("travelmate", "global", "trm_rtfile") or "/tmp/trm_runtime.json"
+local uplink = uci:get("network", trmiface) or ""
+local parse = json.parse(fs.readfile(trminput) or "")
+
+m = Map("travelmate", translate("Travelmate"),
+ translate("Configuration of the travelmate package to to enable travel router functionality. ")
+ .. translatef("For further information "
+ .. "<a href=\"%s\" target=\"_blank\">"
+ .. "see online documentation</a>", "https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md"))
+m:chain("network")
+m:chain("firewall")
+m.apply_on_parse = true
+
+function m.on_apply(self)
+ luci.sys.call("env -i /etc/init.d/travelmate restart >/dev/null 2>&1")
+ luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
+end
+
+-- Interface Wizard
+
+if uplink == "" then
+ ds = m:section(NamedSection, "global", "travelmate", translate("Interface Wizard"))
+ o = ds:option(Value, "trm_iface", translate("Create Uplink interface"),
+ translate("Create a new wireless wan uplink interface, configure it to use dhcp and ")
+ .. translate("add it to the wan zone of the firewall.<br />")
+ .. translate("This step has only to be done once."))
+ o.datatype = "and(uciname,rangelength(3,15))"
+ o.default = trmiface
+ o.rmempty = false
+
+ function o.validate(self, value)
+ if value then
+ local nwnet = nw:get_network(value)
+ local zone = fw:get_zone("wan")
+ local fwnet = fw:get_zone_by_network(value)
+ if not nwnet then
+ nwnet = nw:add_network(value, { proto = "dhcp" })
+ end
+ if zone and not fwnet then
+ fwnet = zone:add_network(value)
+ end
+ end
+ return value
+ end
+ return m
+end
+
+-- Main travelmate options
+
+s = m:section(NamedSection, "global", "travelmate")
+
+o1 = s:option(Flag, "trm_enabled", translate("Enable travelmate"))
+o1.default = o1.disabled
+o1.rmempty = false
+
+o2 = s:option(Flag, "trm_captive", translate("Captive Portal Detection"),
+ translate("Check the internet availability, log captive portal redirections and keep the uplink connection 'alive'."))
+o2.default = o2.enabled
+o2.rmempty = false
+
+o3 = s:option(ListValue, "trm_iface", translate("Uplink / Trigger interface"),
+ translate("Name of the used uplink interface."))
+if dump then
+ local i, v
+ for i, v in ipairs(dump.interface) do
+ if v.interface ~= "loopback" and v.interface ~= "lan" then
+ o3:value(v.interface)
+ end
+ end
+end
+o3.default = trmiface
+o3.rmempty = false
+
+if fs.access("/usr/bin/qrencode") then
+ btn = s:option(Button, "btn", translate("View AP QR-Codes"),
+ translate("Connect your Android or iOS devices to your router's WiFi using the shown QR code."))
+ btn.inputtitle = translate("QR-Codes")
+ btn.inputstyle = "apply"
+ btn.disabled = false
+
+ function btn.write()
+ luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate", "apqr"))
+ end
+end
+
+-- Runtime information
+
+ds = m:section(NamedSection, "global", "travelmate", translate("Runtime Information"))
+
+dv1 = ds:option(DummyValue, "status", translate("Travelmate Status (Quality)"))
+dv1.template = "travelmate/runtime"
+if parse ~= nil then
+ dv1.value = parse.data.travelmate_status or translate("n/a")
+else
+ dv1.value = translate("n/a")
+end
+
+dv2 = ds:option(DummyValue, "travelmate_version", translate("Travelmate Version"))
+dv2.template = "travelmate/runtime"
+if parse ~= nil then
+ dv2.value = parse.data.travelmate_version or translate("n/a")
+else
+ dv2.value = translate("n/a")
+end
+
+dv3 = ds:option(DummyValue, "station_id", translate("Station ID (SSID/BSSID)"))
+dv3.template = "travelmate/runtime"
+if parse ~= nil then
+ dv3.value = parse.data.station_id or translate("n/a")
+else
+ dv3.value = translate("n/a")
+end
+
+dv4 = ds:option(DummyValue, "station_interface", translate("Station Interface"))
+dv4.template = "travelmate/runtime"
+if parse ~= nil then
+ dv4.value = parse.data.station_interface or translate("n/a")
+else
+ dv4.value = translate("n/a")
+end
+
+dv5 = ds:option(DummyValue, "station_radio", translate("Station Radio"))
+dv5.template = "travelmate/runtime"
+if parse ~= nil then
+ dv5.value = parse.data.station_radio or translate("n/a")
+else
+ dv5.value = translate("n/a")
+end
+
+dv6 = ds:option(DummyValue, "last_rundate", translate("Last rundate"))
+dv6.template = "travelmate/runtime"
+if parse ~= nil then
+ dv6.value = parse.data.last_rundate or translate("n/a")
+else
+ dv6.value = translate("n/a")
+end
+
+-- Extra options
+
+e = m:section(NamedSection, "global", "travelmate", translate("Extra options"),
+translate("Options for further tweaking in case the defaults are not suitable for you."))
+
+e1 = e:option(Flag, "trm_debug", translate("Enable verbose debug logging"))
+e1.default = e1.disabled
+e1.rmempty = false
+
+e2 = e:option(Value, "trm_radio", translate("Radio selection"),
+ translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'."))
+e2.datatype = "and(uciname,rangelength(6,6))"
+e2.rmempty = true
+
+e3 = e:option(Value, "trm_triggerdelay", translate("Trigger Delay"),
+ translate("Additional trigger delay in seconds before travelmate processing begins."))
+e3.datatype = "range(1,60)"
+e3.default = 2
+e3.rmempty = false
+
+e4 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
+ translate("Retry limit to connect to an uplink."))
+e4.default = 3
+e4.datatype = "range(1,10)"
+e4.rmempty = false
+
+e5 = e:option(Value, "trm_minquality", translate("Signal Quality Threshold"),
+ translate("Minimum signal quality threshold as percent for conditional uplink (dis-) connections."))
+e5.default = 35
+e5.datatype = "range(20,80)"
+e5.rmempty = false
+
+e6 = e:option(Value, "trm_maxwait", translate("Interface Timeout"),
+ translate("How long should travelmate wait for a successful wlan uplink connection."))
+e6.default = 30
+e6.datatype = "range(20,40)"
+e6.rmempty = false
+
+e7 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
+ translate("Overall retry timeout in seconds."))
+e7.default = 60
+e7.datatype = "range(30,300)"
+e7.rmempty = false
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua
new file mode 100644
index 0000000000..83011e9dd5
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua
@@ -0,0 +1,183 @@
+-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local uci = require("luci.model.uci").cursor()
+local http = require("luci.http")
+local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
+local encr_psk = {"psk", "psk2", "psk-mixed"}
+local encr_wpa = {"wpa", "wpa2", "wpa-mixed"}
+
+m = SimpleForm("add", translate("Add Wireless Uplink Configuration"))
+m.submit = translate("Save")
+m.cancel = translate("Back to overview")
+m.reset = false
+
+function m.on_cancel()
+ http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+end
+
+m.hidden = {
+ device = http.formvalue("device"),
+ ssid = http.formvalue("ssid"),
+ bssid = http.formvalue("bssid"),
+ wep = http.formvalue("wep"),
+ wpa_suites = http.formvalue("wpa_suites"),
+ wpa_version = http.formvalue("wpa_version")
+}
+
+if m.hidden.ssid == "" then
+ wssid = m:field(Value, "ssid", translate("SSID (hidden)"))
+else
+ wssid = m:field(Value, "ssid", translate("SSID"))
+end
+wssid.datatype = "rangelength(1,32)"
+wssid.default = m.hidden.ssid or ""
+
+nobssid = m:field(Flag, "no_bssid", translate("Ignore BSSID"))
+if m.hidden.ssid == "" then
+ nobssid.default = nobssid.disabled
+else
+ nobssid.default = nobssid.enabled
+end
+
+bssid = m:field(Value, "bssid", translate("BSSID"),
+ translatef("The BSSID information '%s' is optional and only required for hidden networks", m.hidden.bssid or ""))
+bssid:depends("no_bssid", 0)
+bssid.datatype = "macaddr"
+bssid.default = m.hidden.bssid or ""
+
+if (tonumber(m.hidden.wep) or 0) == 1 then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("wep", "WEP")
+ encr:value("wep+open", "WEP Open System")
+ encr:value("wep+mixed", "WEP mixed")
+ encr:value("wep+shared", "WEP Shared Key")
+ encr.default = "wep+open"
+
+ wkey = m:field(Value, "key", translate("WEP-Passphrase"))
+ wkey.password = true
+ wkey.datatype = "wepkey"
+elseif (tonumber(m.hidden.wpa_version) or 0) > 0 then
+ if m.hidden.wpa_suites == "PSK" or m.hidden.wpa_suites == "PSK2" then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("psk", "WPA PSK")
+ encr:value("psk-mixed", "WPA/WPA2 mixed")
+ encr:value("psk2", "WPA2 PSK")
+ encr.default = encr_psk[tonumber(m.hidden.wpa_version)] or "psk2"
+
+ ciph = m:field(ListValue, "cipher", translate("Cipher"))
+ ciph:value("auto", translate("Automatic"))
+ ciph:value("ccmp", translate("Force CCMP (AES)"))
+ ciph:value("tkip", translate("Force TKIP"))
+ ciph:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)"))
+ ciph.default = "auto"
+
+ wkey = m:field(Value, "key", translate("WPA-Passphrase"))
+ wkey.password = true
+ wkey.datatype = "wpakey"
+ elseif m.hidden.wpa_suites == "802.1X" then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("wpa", "WPA Enterprise")
+ encr:value("wpa-mixed", "WPA/WPA2 Enterprise mixed")
+ encr:value("wpa2", "WPA2 Enterprise")
+ encr.default = encr_wpa[tonumber(m.hidden.wpa_version)] or "wpa2"
+
+ ciph = m:field(ListValue, "cipher", translate("Cipher"))
+ ciph:value("auto", translate("Automatic"))
+ ciph:value("ccmp", translate("Force CCMP (AES)"))
+ ciph:value("tkip", translate("Force TKIP"))
+ ciph:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)"))
+ ciph.default = "auto"
+
+ eaptype = m:field(ListValue, "eap_type", translate("EAP-Method"))
+ eaptype:value("tls", "TLS")
+ eaptype:value("ttls", "TTLS")
+ eaptype:value("peap", "PEAP")
+ eaptype:value("fast", "FAST")
+ eaptype.default = "peap"
+
+ authentication = m:field(ListValue, "auth", translate("Authentication"))
+ authentication:value("PAP")
+ authentication:value("CHAP")
+ authentication:value("MSCHAP")
+ authentication:value("MSCHAPV2")
+ authentication:value("EAP-GTC")
+ authentication:value("EAP-MD5")
+ authentication:value("EAP-MSCHAPV2")
+ authentication:value("EAP-TLS")
+ authentication:value("auth=PAP")
+ authentication:value("auth=MSCHAPV2")
+ authentication.default = "EAP-MSCHAPV2"
+
+ ident = m:field(Value, "identity", translate("Identity"))
+
+ wkey = m:field(Value, "password", translate("Password"))
+ wkey.password = true
+ wkey.datatype = "wpakey"
+
+ cacert = m:field(Value, "ca_cert", translate("Path to CA-Certificate"))
+ cacert.rmempty = true
+
+ clientcert = m:field(Value, "client_cert", translate("Path to Client-Certificate"))
+ clientcert:depends("eap_type","tls")
+ clientcert.rmempty = true
+
+ privkey = m:field(Value, "priv_key", translate("Path to Private Key"))
+ privkey:depends("eap_type","tls")
+ privkey.rmempty = true
+
+ privkeypwd = m:field(Value, "priv_key_pwd", translate("Password of Private Key"))
+ privkeypwd:depends("eap_type","tls")
+ privkeypwd.datatype = "wpakey"
+ privkeypwd.password = true
+ privkeypwd.rmempty = true
+ end
+end
+
+function wssid.write(self, section, value)
+ newsection = uci:section("wireless", "wifi-iface", nil, {
+ mode = "sta",
+ network = trmiface,
+ device = m.hidden.device,
+ ssid = wssid:formvalue(section),
+ bssid = bssid:formvalue(section),
+ disabled = "1"
+ })
+
+ if (tonumber(m.hidden.wep) or 0) == 1 then
+ uci:set("wireless", newsection, "encryption", encr:formvalue(section))
+ uci:set("wireless", newsection, "key", wkey:formvalue(section) or "")
+ elseif (tonumber(m.hidden.wpa_version) or 0) > 0 then
+ if m.hidden.wpa_suites == "PSK" or m.hidden.wpa_suites == "PSK2" then
+ if ciph:formvalue(section) ~= "auto" then
+ uci:set("wireless", newsection, "encryption", encr:formvalue(section) .. "+" .. ciph:formvalue(section))
+ else
+ uci:set("wireless", newsection, "encryption", encr:formvalue(section))
+ end
+ uci:set("wireless", newsection, "key", wkey:formvalue(section) or "")
+ elseif m.hidden.wpa_suites == "802.1X" then
+ if ciph:formvalue(section) ~= "auto" then
+ uci:set("wireless", newsection, "encryption", encr:formvalue(section) .. "+" .. ciph:formvalue(section))
+ else
+ uci:set("wireless", newsection, "encryption", encr:formvalue(section))
+ end
+ uci:set("wireless", newsection, "eap_type", eaptype:formvalue(section))
+ uci:set("wireless", newsection, "auth", authentication:formvalue(section))
+ uci:set("wireless", newsection, "identity", ident:formvalue(section) or "")
+ uci:set("wireless", newsection, "password", wkey:formvalue(section) or "")
+ uci:set("wireless", newsection, "ca_cert", cacert:formvalue(section) or "")
+ uci:set("wireless", newsection, "client_cert", clientcert:formvalue(section) or "")
+ uci:set("wireless", newsection, "priv_key", privkey:formvalue(section) or "")
+ uci:set("wireless", newsection, "priv_key_pwd", privkeypwd:formvalue(section) or "")
+ end
+ else
+ uci:set("wireless", newsection, "encryption", "none")
+ end
+ uci:save("wireless")
+ uci:commit("wireless")
+ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
+ http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua
new file mode 100644
index 0000000000..0a7678f7ed
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua
@@ -0,0 +1,14 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local uci = require("luci.model.uci").cursor()
+local http = require("luci.http")
+local cfg = http.formvalue("cfg")
+
+if cfg ~= nil then
+ uci:delete("wireless", cfg)
+ uci:save("wireless")
+ uci:commit("wireless")
+ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
+end
+http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua
new file mode 100644
index 0000000000..f3ad762594
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua
@@ -0,0 +1,169 @@
+-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local fs = require("nixio.fs")
+local uci = require("luci.model.uci").cursor()
+local http = require("luci.http")
+
+m = SimpleForm("edit", translate("Edit Wireless Uplink Configuration"))
+m.submit = translate("Save")
+m.cancel = translate("Back to overview")
+m.reset = false
+
+function m.on_cancel()
+ http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+end
+
+m.hidden = {
+ cfg = http.formvalue("cfg")
+}
+
+local s = uci:get_all("wireless", m.hidden.cfg)
+if s ~= nil then
+ wssid = m:field(Value, "ssid", translate("SSID"))
+ wssid.datatype = "rangelength(1,32)"
+ wssid.default = s.ssid or ""
+
+ bssid = m:field(Value, "bssid", translate("BSSID"))
+ bssid.datatype = "macaddr"
+ bssid.default = s.bssid or ""
+
+ s.cipher = "auto"
+ if string.match(s.encryption, '\+') and not string.match(s.encryption, '^wep') then
+ s.pos = string.find(s.encryption, '\+')
+ s.cipher = string.sub(s.encryption, s.pos + 1)
+ s.encryption = string.sub(s.encryption, 0, s.pos - 1)
+ end
+
+ if s.encryption and s.encryption ~= "none" then
+ if string.match(s.encryption, '^wep') then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("wep", "WEP")
+ encr:value("wep+open", "WEP Open System")
+ encr:value("wep+mixed", "WEP mixed")
+ encr:value("wep+shared", "WEP Shared Key")
+ encr.default = s.encryption
+
+ wkey = m:field(Value, "key", translate("Passphrase"))
+ wkey.datatype = "wepkey"
+ elseif string.match(s.encryption, '^psk') then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("psk", "WPA PSK")
+ encr:value("psk-mixed", "WPA/WPA2 mixed")
+ encr:value("psk2", "WPA2 PSK")
+ encr.default = s.encryption
+
+ ciph = m:field(ListValue, "cipher", translate("Cipher"))
+ ciph:value("auto", translate("Automatic"))
+ ciph:value("ccmp", translate("Force CCMP (AES)"))
+ ciph:value("tkip", translate("Force TKIP"))
+ ciph:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)"))
+ ciph.default = s.cipher
+
+ wkey = m:field(Value, "key", translate("Passphrase"))
+ wkey.datatype = "wpakey"
+ elseif string.match(s.encryption, '^wpa') then
+ encr = m:field(ListValue, "encryption", translate("Encryption"))
+ encr:value("wpa", "WPA Enterprise")
+ encr:value("wpa-mixed", "WPA/WPA2 Enterprise mixed")
+ encr:value("wpa2", "WPA2 Enterprise")
+ encr.default = s.encryption
+
+ ciph = m:field(ListValue, "cipher", translate("Cipher"))
+ ciph:value("auto", translate("Automatic"))
+ ciph:value("ccmp", translate("Force CCMP (AES)"))
+ ciph:value("tkip", translate("Force TKIP"))
+ ciph:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)"))
+ ciph.default = s.cipher
+
+ eaptype = m:field(ListValue, "eap_type", translate("EAP-Method"))
+ eaptype:value("tls", "TLS")
+ eaptype:value("ttls", "TTLS")
+ eaptype:value("peap", "PEAP")
+ eaptype:value("fast", "FAST")
+ eaptype.default = s.eap_type or "peap"
+
+ authentication = m:field(ListValue, "auth", translate("Authentication"))
+ authentication:value("PAP")
+ authentication:value("CHAP")
+ authentication:value("MSCHAP")
+ authentication:value("MSCHAPV2")
+ authentication:value("EAP-GTC")
+ authentication:value("EAP-MD5")
+ authentication:value("EAP-MSCHAPV2")
+ authentication:value("EAP-TLS")
+ authentication:value("auth=PAP")
+ authentication:value("auth=MSCHAPV2")
+ authentication.default = s.auth or "EAP-MSCHAPV2"
+
+ ident = m:field(Value, "identity", translate("Identity"))
+ ident.default = s.identity or ""
+
+ wkey = m:field(Value, "password", translate("Passphrase"))
+ wkey.datatype = "wpakey"
+
+ cacert = m:field(Value, "ca_cert", translate("Path to CA-Certificate"))
+ cacert.rmempty = true
+ cacert.default = s.ca_cert or ""
+
+ clientcert = m:field(Value, "client_cert", translate("Path to Client-Certificate"))
+ clientcert:depends("eap_type","tls")
+ clientcert.rmempty = true
+ clientcert.default = s.client_cert or ""
+
+ privkey = m:field(Value, "priv_key", translate("Path to Private Key"))
+ privkey:depends("eap_type","tls")
+ privkey.rmempty = true
+ privkey.default = s.priv_key or ""
+
+ privkeypwd = m:field(Value, "priv_key_pwd", translate("Password of Private Key"))
+ privkeypwd:depends("eap_type","tls")
+ privkeypwd.datatype = "wpakey"
+ privkeypwd.password = true
+ privkeypwd.rmempty = true
+ privkeypwd.default = s.priv_key_pwd or ""
+ end
+ wkey.password = true
+ wkey.default = s.key or s.password
+ end
+else
+ m.on_cancel()
+end
+
+function wssid.write(self, section, value)
+ uci:set("wireless", m.hidden.cfg, "ssid", wssid:formvalue(section))
+ uci:set("wireless", m.hidden.cfg, "bssid", bssid:formvalue(section))
+ if s.encryption and s.encryption ~= "none" then
+ if string.match(s.encryption, '^wep') then
+ uci:set("wireless", m.hidden.cfg, "encryption", encr:formvalue(section))
+ uci:set("wireless", m.hidden.cfg, "key", wkey:formvalue(section) or "")
+ elseif string.match(s.encryption, '^psk') then
+ if ciph:formvalue(section) ~= "auto" then
+ uci:set("wireless", m.hidden.cfg, "encryption", encr:formvalue(section) .. "+" .. ciph:formvalue(section))
+ else
+ uci:set("wireless", m.hidden.cfg, "encryption", encr:formvalue(section))
+ end
+ uci:set("wireless", m.hidden.cfg, "key", wkey:formvalue(section) or "")
+ elseif string.match(s.encryption, '^wpa') then
+ if ciph:formvalue(section) ~= "auto" then
+ uci:set("wireless", m.hidden.cfg, "encryption", encr:formvalue(section) .. "+" .. ciph:formvalue(section))
+ else
+ uci:set("wireless", m.hidden.cfg, "encryption", encr:formvalue(section))
+ end
+ uci:set("wireless", m.hidden.cfg, "eap_type", eaptype:formvalue(section))
+ uci:set("wireless", m.hidden.cfg, "auth", authentication:formvalue(section))
+ uci:set("wireless", m.hidden.cfg, "identity", ident:formvalue(section) or "")
+ uci:set("wireless", m.hidden.cfg, "password", wkey:formvalue(section) or "")
+ uci:set("wireless", m.hidden.cfg, "ca_cert", cacert:formvalue(section) or "")
+ uci:set("wireless", m.hidden.cfg, "client_cert", clientcert:formvalue(section) or "")
+ uci:set("wireless", m.hidden.cfg, "priv_key", privkey:formvalue(section) or "")
+ uci:set("wireless", m.hidden.cfg, "priv_key_pwd", privkeypwd:formvalue(section) or "")
+ end
+ end
+ uci:save("wireless")
+ uci:commit("wireless")
+ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
+ m.on_cancel()
+end
+
+return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua
new file mode 100644
index 0000000000..6eb4c72063
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua
@@ -0,0 +1,36 @@
+-- Copyright 2017 Dirk Brenken (dev@brenken.org)
+-- This is free software, licensed under the Apache License, Version 2.0
+
+local http = require("luci.http")
+local cfg = http.formvalue("cfg")
+local dir = http.formvalue("dir")
+local uci = require("luci.model.uci").cursor()
+local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
+
+if cfg ~= nil then
+ local section = ""
+ local idx = ""
+ local idx_change = ""
+ local changed = ""
+ uci:foreach("wireless", "wifi-iface", function(s)
+ local iface = s.network or ""
+ if iface == trmiface then
+ section = s['.name']
+ if cfg == section then
+ idx = s['.index']
+ else
+ idx_change = s['.index']
+ end
+ if (dir == "up" and idx ~= "" and idx_change ~= "" and idx_change < idx) or
+ (dir == "down" and idx ~= "" and idx_change ~= "" and idx_change > idx) then
+ changed = uci:reorder("wireless", cfg, idx_change)
+ idx = ""
+ end
+ end
+ end)
+ if changed ~= "" then
+ uci:save("wireless")
+ uci:commit("wireless")
+ end
+end
+http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/ap_qr.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/ap_qr.htm
new file mode 100644
index 0000000000..a92dbe1469
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/ap_qr.htm
@@ -0,0 +1,65 @@
+<%#
+Copyright 2018 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+ <div class="cbi-map-descr">
+ <%=translate("Here you'll find the QR codes from all of your configured Access Points. It allows you to connect your Android or iOS devices to your router's WiFi using the QR code shown below.")%>
+ </div>
+<%-
+ local write = io.write
+ local uci = require("luci.model.uci").cursor()
+
+ uci:foreach("wireless", "wifi-iface", function(s)
+ local device = s.device or ""
+ local mode = s.mode or ""
+ local ssid = s.ssid or ""
+ local enc = s.encryption or ""
+ local key = s.key or ""
+ local hidden = s.hidden or "false"
+ local disabled = s.disabled or ""
+ local wep_slots = {s.key1 or "", s.key2 or "", s.key3 or "", s.key4 or ""}
+
+ if device and mode == "ap" and disabled ~= "1" then
+ if string.match(enc, '^psk') then
+ enc = "WPA"
+ elseif string.match(enc, '^wep') then
+ enc = "WEP"
+ if tonumber(key) then
+ key = wep_slots[tonumber(key)]
+ end
+ elseif enc == "none" then
+ enc = "nopass"
+ key = "nokey"
+ else
+ enc = ""
+ end
+ if hidden == "1" then
+ hidden = "true"
+ end
+ if ssid and enc and key then
+ local e_ssid = string.gsub(ssid,"[\"\\';:, ]",[[\\\%1]])
+ local e_key = string.gsub(key,"[\"\\';:, ]",[[\\\%1]])
+ local qrcode = ""
+ qrcode = luci.sys.exec("/usr/bin/qrencode --inline --8bit --type=SVG --output=- 'WIFI:S:\"'" .. e_ssid .. "'\";T:'" .. enc .. "';P:\"'" .. e_key .. "'\";H:'" .. hidden .. "';'")
+-%>
+ <fieldset class="cbi-section">
+ <legend>AP on <%=device%> with SSID "<%=ssid%>"</legend>
+ <h3 name="content"><%=qrcode%></h3>
+ </fieldset>
+<%-
+ end
+ end
+ end)
+%>
+</div>
+<div class="cbi-page-actions right">
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/tab_from_cbi')%>" method="post">
+ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
+ </form>
+</div>
+
+<%+footer%>
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/config_css.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/config_css.htm
new file mode 100644
index 0000000000..2233a15e31
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/config_css.htm
@@ -0,0 +1,13 @@
+<style type="text/css">
+ textarea
+ {
+ border: 1px solid #cccccc;
+ padding: 5px;
+ font-size: 12px;
+ font-family: monospace;
+ resize: none;
+ white-space: pre;
+ overflow-wrap: normal;
+ overflow-x: scroll;
+ }
+</style>
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
new file mode 100644
index 0000000000..c40bdeeb59
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
@@ -0,0 +1,20 @@
+<%#
+Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+header%>
+
+<div class="cbi-map">
+ <div class="cbi-section">
+ <div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for travelmate related messages only.%></div>
+ <textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
+ </div>
+</div>
+
+<script type="text/javascript">
+ var textarea = document.getElementById('logread_id');
+ textarea.scrollTop = textarea.scrollHeight;
+</script>
+
+<%+footer%>
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/runtime.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/runtime.htm
new file mode 100644
index 0000000000..7e93efab91
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/runtime.htm
@@ -0,0 +1,10 @@
+<%#
+Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%+cbi/valueheader%>
+
+<input name="runtime" id="runtime" type="text" class="cbi-input-text" style="outline:none;border:none;box-shadow:none;background:transparent;color:#0069d6;font-weight:bold;line-height:30px;height:30px;width:50em;" value="<%=self:cfgvalue(section)%>" disabled="disabled" />
+
+<%+cbi/valuefooter%>
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
new file mode 100644
index 0000000000..74542a9ca5
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
@@ -0,0 +1,78 @@
+<%#
+Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%-
+ local write = io.write
+ local uci = require("luci.model.uci").cursor()
+ local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
+-%>
+
+<%+header%>
+
+
+<div class="cbi-map">
+<div class="cbi-map-descr">
+ <%=translatef("Provides an overview of all configured uplinks for the travelmate interface (%s). You can edit, delete or re-order existing uplinks or scan for a new one. The currently used uplink is emphasized in blue.", trmiface)%>
+</div>
+
+<div class="cbi-section">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th left"><%:Device%></div>
+ <div class="th left"><%:SSID%></div>
+ <div class="th left"><%:BSSID%></div>
+ <div class="th left"><%:Encryption%></div>
+ <div class="th center">&#160;</div>
+ </div>
+<%
+ uci:foreach("wireless", "wifi-iface", function(s)
+ local iface = s.network or ""
+ if iface == trmiface then
+ local section = s['.name'] or ""
+ local device = s.device or "-"
+ local ssid = s.ssid or "-"
+ local bssid = s.bssid or "-"
+ local encryption = s.encryption or "-"
+ local disabled = s.disabled or ""
+ local style = "text-align:left;color:#000000"
+ if disabled == "0" then
+ style = "text-align:left;color:#0069d6;font-weight:bold"
+ end
+%>
+ <div class="tr cbi-section-table-row cbi-rowstyle-1" style="<%=style%>">
+ <div class="td" style="<%=style%>"><%=device%></div>
+ <div class="td" style="<%=style%>"><%=ssid%></div>
+ <div class="td" style="<%=style%>"><%=bssid%></div>
+ <div class="td" style="<%=style%>"><%=encryption%></div>
+ <div class="td cbi-section-actions">
+ <input class="cbi-button cbi-button-up" type="button" value="<%:Up%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=up'" alt="<%:Move up%>" title="<%:Move up%>"/>
+ <input class="cbi-button cbi-button-down" type="button" value="<%:Down%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=down'" alt="<%:Move down%>" title="<%:Move down%>"/>
+ <input type="button" class="cbi-button cbi-button-edit" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiedit')%>?cfg=<%=section%>'" title="<%:Edit this Uplink%>" value="<%:Edit%>"/>
+ <input type="button" class="cbi-button cbi-button-remove" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifidelete')%>?cfg=<%=section%>'" title="<%:Delete this Uplink%>" value="<%:Delete%>"/>
+ </div>
+ </div>
+<%
+ end
+ end)
+%>
+ </div>
+</div>
+<div class="cbi-page-actions right">
+<%
+ uci:foreach("wireless", "wifi-device", function(s)
+ local device = s[".name"]
+%>
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
+ <input type="hidden" name="device" value="<%=device%>"/>
+ <input type="hidden" name="token" value="<%=token%>"/>
+ <input type="submit" class="cbi-button cbi-button-action important" title="<%:Find and join network on%> <%=device%>" value="<%:Scan%> <%=device%>"/>
+ </form>
+<%
+ end)
+%>
+</div>
+</div>
+
+<%+footer%>
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
new file mode 100644
index 0000000000..8a417d69c2
--- /dev/null
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
@@ -0,0 +1,97 @@
+<%#
+Copyright 2017 Dirk Brenken (dev@brenken.org)
+This is free software, licensed under the Apache License, Version 2.0
+-%>
+
+<%-
+ local sys = require("luci.sys")
+ local utl = require("luci.util")
+ local dev = luci.http.formvalue("device")
+ local iw = luci.sys.wifi.getiwinfo(dev)
+ local wpa_label = {translate("WPA"), translate("WPA2"), translate("WPA/WPA2")}
+
+ if not iw then
+ luci.http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+ end
+
+ function format_wifi_encryption(info)
+ if info.wep == true then
+ return translate("WEP")
+ elseif info.wpa > 0 then
+ return "%s (%s/%s)" %{wpa_label[info.wpa], table.concat(info.auth_suites), table.concat(info.group_ciphers)}
+ elseif info.enabled then
+ return translate("Unknown")
+ else
+ return translate("Open")
+ end
+ end
+
+ function percent_wifi_signal(info)
+ local qc = info.quality or 0
+ local qm = info.quality_max or 0
+ if info.bssid and qc > 0 and qm > 0 then
+ return math.floor((100 / qm) * qc)
+ else
+ return 0
+ end
+ end
+-%>
+
+<%+header%>
+
+
+<div class="cbi-map">
+<h2 name="content"><%:Wireless Scan%></h2>
+ <div class="cbi-section">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th left"><%:Uplink SSID%></div>
+ <div class="th left"><%:Uplink BSSID%></div>
+ <div class="th left"><%:Encryption%></div>
+ <div class="th left"><%:Signal strength%></div>
+ </div>
+ <% for i, net in ipairs(iw.scanlist or { }) do %>
+ <div class="tr cbi-section-table-row cbi-rowstyle-1">
+ <div class="td left">
+ <%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%>
+ </div>
+ <div class="td left">
+ <%=net.bssid and utl.pcdata(net.bssid)%>
+ </div>
+ <div class="td left">
+ <%=format_wifi_encryption(net.encryption)%>
+ </div>
+ <div class="td left">
+ <%=percent_wifi_signal(net)%> %
+ </div>
+ <div class="td cbi-section-actions">
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiadd')%>" method="post">
+ <input type="hidden" name="token" value="<%=token%>"/>
+ <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
+ <input type="hidden" name="ssid" value="<%=utl.pcdata(net.ssid)%>"/>
+ <input type="hidden" name="bssid" value="<%=utl.pcdata(net.bssid)%>"/>
+ <input type="hidden" name="wep" value="<%=net.encryption.wep and 1 or 0%>"/>
+ <% if net.encryption.wpa then %>
+ <input type="hidden" name="wpa_version" value="<%=net.encryption.wpa%>"/>
+ <% for _, v in ipairs(net.encryption.auth_suites) do %><input type="hidden" name="wpa_suites" value="<%=v%>"/><% end %>
+ <% end %>
+ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Add Uplink%>"/>
+ </form>
+ </div>
+ </div>
+ <% end %>
+ </div>
+ </div>
+<div class="cbi-page-actions right">
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/stations')%>" method="get">
+ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
+ </form>
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
+ <input type="hidden" name="token" value="<%=token%>"/>
+ <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
+ <input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>"/>
+ </form>
+</div>
+</div>
+
+<%+footer%>
diff --git a/applications/luci-app-travelmate/po/ja/travelmate.po b/applications/luci-app-travelmate/po/ja/travelmate.po
index de1aceed95..f1d1220b7c 100644
--- a/applications/luci-app-travelmate/po/ja/travelmate.po
+++ b/applications/luci-app-travelmate/po/ja/travelmate.po
@@ -7,85 +7,388 @@ msgstr ""
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.11\n"
+"X-Generator: Poedit 2.0.7\n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
+msgid "Add Uplink"
+msgstr "アップリンクの追加"
+
+msgid "Add Wireless Uplink Configuration"
+msgstr "無線アップリンク追加の設定"
+
msgid ""
-"Brief advice: Create a wwan interface, configure it to use dhcp and add it "
-"to the wan zone in firewall. Create the wifi interfaces to be used ('client' "
-"mode, assigned to wwan network, left as disabled). Travelmate will try to "
-"connect to the known wifi client interfaces in the defined order."
+"Additional trigger delay in seconds before travelmate processing begins."
+msgstr "Travelmate の処理が開始されるまでの、追加の遅延時間(秒)です。"
+
+msgid "Advanced"
+msgstr "詳細設定"
+
+msgid "Authentication"
+msgstr "認証"
+
+msgid "Automatic"
+msgstr "自動"
+
+msgid "BSSID"
+msgstr "BSSID"
+
+msgid "Back to overview"
+msgstr "概要へ戻る"
+
+msgid "Captive Portal Detection"
+msgstr "キャプティブポータル検知"
+
+msgid ""
+"Check the internet availability, log captive portal redirections and keep "
+"the uplink connection 'alive'."
msgstr ""
-"簡単な解説: 予めWWANインターフェースを作成し、DHCPを使用するよう構成してファ"
-"イアウォールのWANゾーンに追加します。また、使用される無線インターフェースを作"
-"成しておきます(\"クライアント\" モード、WWANに割り当て、無効状態)。"
-"Travelmateは、登録されている順序で既知の無線クライアント インターフェースへの"
-"接続を試行します。"
+"インターネットの利用可否を確認し、キャプティブポータル リダイレクトを記録して"
+"アップリンク接続を 'alive' として保持します。"
+
+msgid "Cipher"
+msgstr "暗号化方式"
msgid ""
-"Configuration of the Travelmate package to enable travel router "
+"Configuration of the travelmate package to to enable travel router "
"functionality."
-msgstr "トラベル ルータ機能を有効にする、Travelmate パッケージの設定です。"
+msgstr ""
+"トラベル ルーター機能を有効化するための、 Travelmate パッケージの設定です。"
+
+msgid ""
+"Connect your Android or iOS devices to your router's WiFi using the shown QR "
+"code."
+msgstr ""
+"Android や iOS デバイスを、表示される QR コードを使用して WiFi に接続します。"
+
+msgid "Connection Limit"
+msgstr "接続制限"
+
+msgid "Create Uplink interface"
+msgstr "アップリンク インターフェースの作成"
+
+msgid ""
+"Create a new wireless wan uplink interface, configure it to use dhcp and"
+msgstr ""
+"新規の無線 WAN アップリンク インターフェースを作成し、 DHCP を使用するよう構"
+"成して"
+
+msgid "Delete"
+msgstr "削除"
+
+msgid "Delete this Uplink"
+msgstr "このアップリンクを削除"
+
+msgid "Device"
+msgstr "デバイス"
+
+msgid "Down"
+msgstr ""
+
+msgid "EAP-Method"
+msgstr "EAP メソッド"
+
+msgid "Edit"
+msgstr "編集"
+
+msgid "Edit Firewall Configuration"
+msgstr "ファイアウォール設定の編集"
+
+msgid "Edit Network Configuration"
+msgstr "ネットワーク設定の編集"
-msgid "Debug logging"
-msgstr "デバッグ ログ"
+msgid "Edit Travelmate Configuration"
+msgstr "Travelmate 設定の編集"
-msgid "Default 20, range 10-60"
-msgstr "既定値 20、範囲 10 - 60"
+msgid "Edit Wireless Configuration"
+msgstr "無線設定の編集"
-msgid "Default 3, range 1-10"
-msgstr "既定値 3、範囲 1 - 10"
+msgid "Edit Wireless Uplink Configuration"
+msgstr "無線アップリンク設定の編集"
-msgid "Disable this if you want to use iwinfo instead of iw"
-msgstr "iw の代わりに iwinfo を使用したい場合、この設定を無効にします。"
+msgid "Edit this Uplink"
+msgstr "このアップリンクを編集"
-msgid "Enable Travelmate"
-msgstr "Travelmateの有効化"
+msgid "Enable travelmate"
+msgstr "Travelmate の有効化"
+
+msgid "Enable verbose debug logging"
+msgstr "詳細なデバッグ ログの有効化"
+
+msgid "Encryption"
+msgstr "暗号化"
msgid "Extra options"
msgstr "拡張オプション"
-msgid "Global options"
-msgstr "全般オプション"
+msgid "Find and join network on"
+msgstr "ネットワークの検索と参加:"
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"詳細な情報は <a href=\"%s\" target=\"_blank\">オンライン ドキュメント</a> を"
+"確認してください。"
+
+msgid "Force CCMP (AES)"
+msgstr "CCMP (AES)"
+
+msgid "Force TKIP"
+msgstr "TKIP"
+
+msgid "Force TKIP and CCMP (AES)"
+msgstr "TKIP と CCMP (AES)"
+
+msgid ""
+"Here you'll find the QR codes from all of your configured Access Points. It "
+"allows you to connect your Android or iOS devices to your router's WiFi "
+"using the QR code shown below."
+msgstr ""
+"ここには、構成済みの全アクセスポイントの QR コードを表示しています。以下の "
+"QR コードを使用して、 Android または iOS デバイスをルータの WiFi に接続するこ"
+"とができます。"
+
+msgid ""
+"How long should travelmate wait for a successful wlan uplink connection."
+msgstr "Travelmate が無線アップリンクへの接続成功を待つ時間です。"
+
+msgid "Identity"
+msgstr "ID"
+
+msgid "Ignore BSSID"
+msgstr "BSSID の無視"
+
+msgid "Input file not found, please check your configuration."
+msgstr "入力ファイルが見つかりません。設定を確認してください。"
+
+msgid "Interface Timeout"
+msgstr "インターフェース タイムアウト"
+
+msgid "Interface Wizard"
+msgstr "インターフェース ウィザード"
+
+msgid "Last rundate"
+msgstr "最終実行日時"
+
+msgid ""
+"Minimum signal quality threshold as percent for conditional uplink (dis-) "
+"connections."
+msgstr ""
+"条件付きアップリンク接続(または切断)のための、シグナル品質閾値の下限(%)で"
+"す。"
+
+msgid "Move down"
+msgstr "下へ"
+
+msgid "Move up"
+msgstr "上へ"
+
+msgid "Name of the used uplink interface."
+msgstr "使用されるアップリンク インターフェースの名前です。"
+
+msgid "Open"
+msgstr "オープン"
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr "デフォルトの設定が適切でない場合、さらに設定するためのオプションです。"
+
+msgid "Overall Timeout"
+msgstr "実行間隔"
+
+msgid "Overall retry timeout in seconds."
+msgstr "全体的な再試行タイムアウト(秒)です。"
+
+msgid "Overview"
+msgstr "概要"
+
+msgid "Passphrase"
+msgstr "パスフレーズ"
+
+msgid "Password"
+msgstr "パスワード"
+
+msgid "Password of Private Key"
+msgstr "秘密鍵のパスワード"
+
+msgid "Path to CA-Certificate"
+msgstr "CA 証明書へのパス"
+
+msgid "Path to Client-Certificate"
+msgstr "クライアント証明書へのパス"
+
+msgid "Path to Private Key"
+msgstr "秘密鍵へのパス"
+
+msgid ""
+"Provides an overview of all configured uplinks for the travelmate interface "
+"(%s). You can edit, delete or re-order existing uplinks or scan for a new "
+"one. The currently used uplink is emphasized in blue."
+msgstr ""
+"Travelmate 用インターフェース(%s)に設定済みの全アップリンクの一覧です。既存"
+"のアップリンクの編集や削除、並べ替えを行ったり、スキャンを行って新規アップリ"
+"ンクを追加することができます。現在使用されているアップリンクは、青色で強調さ"
+"れます。"
+
+msgid "QR-Codes"
+msgstr "QR-コード"
+
+msgid "Radio selection"
+msgstr "無線の選択"
+
+msgid "Repeat scan"
+msgstr "再スキャン"
-msgid "Link to detailed advice"
-msgstr "詳細な解説へのリンク"
+msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+msgstr "Travelmate が指定された無線に接続するよう制御します。(例: 'radio0')"
-msgid "Max. number of connection retries to an uplink"
-msgstr "確立までの接続試行回数"
+msgid "Retry limit to connect to an uplink."
+msgstr "アップリンクへの接続を試行する回数です。"
-msgid "Max. timeout in seconds for wlan interface reload"
-msgstr "無線LANインターフェース リロード時の最大待機時間(秒)"
+msgid "Runtime Information"
+msgstr "実行情報"
-msgid "Restrict reload trigger to certain interface(s)"
-msgstr "リロード トリガを特定のインターフェースに限定する"
+msgid "SSID"
+msgstr "SSID"
+
+msgid "SSID (hidden)"
+msgstr "SSID(ステルス)"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Scan"
+msgstr "スキャン:"
+
+msgid "Signal Quality Threshold"
+msgstr "シグナル品質閾値"
+
+msgid "Signal strength"
+msgstr "信号強度"
+
+msgid "Station ID (SSID/BSSID)"
+msgstr "ステーション ID (SSID / BSSID)"
+
+msgid "Station Interface"
+msgstr "ステーション インターフェース"
+
+msgid "Station Radio"
+msgstr "ステーション電波"
+
+msgid ""
+"The BSSID information '%s' is optional and only required for hidden networks"
+msgstr ""
+"BSSID 情報 '%s' はオプションであり、ステルス化されたネットワークにのみ必要で"
+"す。"
+
+msgid ""
+"This form allows you to modify the content of the main firewall "
+"configuration file (/etc/config/firewall)."
+msgstr ""
+"このフォームでは、ファイアウォール 設定ファイル (/etc/config/firewall) の内容"
+"を変更することができます。"
msgid ""
-"Space separated list of wwan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"This form allows you to modify the content of the main network configuration "
+"file (/etc/config/network)."
msgstr ""
-"リロード動作のトリガとなる、スペースで区切られたWWAN インターフェースのリスト"
-"です。リロードのトリガを無効にするには、'false' を設定します。既定値:(空)"
+"このフォームでは、ネットワーク 設定ファイル (/etc/config/network) の内容を変"
+"更することができます。"
+
+msgid ""
+"This form allows you to modify the content of the main travelmate "
+"configuration file (/etc/config/travelmate)."
+msgstr ""
+"このフォームでは、 Travelmate 設定ファイル (/etc/config/travelmate) の内容を"
+"変更することができます。"
+
+msgid ""
+"This form allows you to modify the content of the main wireless "
+"configuration file (/etc/config/wireless)."
+msgstr ""
+"このフォームでは、無線 設定ファイル (/etc/config/wireless) の内容を変更するこ"
+"とができます。"
+
+msgid ""
+"This form shows the syslog output, pre-filtered for travelmate related "
+"messages only."
+msgstr ""
+"このフォームには、システムログ内の Travelmate に関するメッセージのみが表示さ"
+"れます。"
+
+msgid "This step has only to be done once."
+msgstr "この手順は、一度だけ実行される必要があります。"
msgid "Travelmate"
msgstr "Travelmate"
-msgid "Use iw for scanning"
-msgstr "スキャンに iw を使用する"
+msgid "Travelmate Logfile"
+msgstr "Travelmate ログファイル"
+
+msgid "Travelmate Status (Quality)"
+msgstr "Travelmate ステータス(品質)"
+
+msgid "Travelmate Version"
+msgstr "Travelmate バージョン"
+
+msgid "Trigger Delay"
+msgstr "トリガ遅延"
+
+msgid "Unknown"
+msgstr "不明"
+
+msgid "Up"
+msgstr ""
+
+msgid "Uplink / Trigger interface"
+msgstr "アップリンク / トリガー インターフェース"
+
+msgid "Uplink BSSID"
+msgstr "アップリンク BSSID"
+
+msgid "Uplink SSID"
+msgstr "アップリンク SSID"
+
+msgid "View AP QR-Codes"
+msgstr "AP QR-コードを確認"
+
+msgid "View Logfile"
+msgstr "ログファイルの確認"
+
+msgid "WEP"
+msgstr "WEP"
+
+msgid "WEP-Passphrase"
+msgstr "WEP パスフレーズ"
+
+msgid "WPA"
+msgstr "WPA"
+
+msgid "WPA-Passphrase"
+msgstr "WPA パスフレーズ"
+
+msgid "WPA/WPA2"
+msgstr "WPA/WPA2"
+
+msgid "WPA2"
+msgstr "WPA2"
+
+msgid "Wireless Scan"
+msgstr "無線スキャン"
-#~ msgid "Default 3, range 0-10. Set to 0 to allow unlimited retries"
-#~ msgstr "既定値 3、範囲 0 - 10。再試行回数を制限しない場合、0 に設定します。"
+msgid "Wireless Stations"
+msgstr "無線ステーション"
-#~ msgid "Default 30, range 5-60"
-#~ msgstr "既定値 30、範囲 5 - 60"
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr "ファイアウォールの wan ゾーンに追加します。<br />"
-#~ msgid "Default: empty = use all radios."
-#~ msgstr "デフォルト:(空)= 全ての無線を使用"
+msgid "hidden"
+msgstr "(ステルス)"
-#~ msgid "Loop timeout in seconds for wlan monitoring"
-#~ msgstr "無線LAN モニターのループ タイムアウト(秒)"
+msgid "n/a"
+msgstr "利用不可"
-#~ msgid "Use only one radio, e.g. 'radio0'"
-#~ msgstr "単一の無線のみ使用する 例: 'radio0'"
+#~ msgid "Actions"
+#~ msgstr "操作"
diff --git a/applications/luci-app-travelmate/po/pt-br/travelmate.po b/applications/luci-app-travelmate/po/pt-br/travelmate.po
new file mode 100644
index 0000000000..2bed677d35
--- /dev/null
+++ b/applications/luci-app-travelmate/po/pt-br/travelmate.po
@@ -0,0 +1,423 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.11\n"
+"Last-Translator: Luiz Angelo Daros de Luca <luizluca@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: pt_BR\n"
+
+msgid "Add Uplink"
+msgstr ""
+
+msgid "Add Wireless Uplink Configuration"
+msgstr ""
+
+msgid ""
+"Additional trigger delay in seconds before travelmate processing begins."
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Authentication"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "BSSID"
+msgstr ""
+
+msgid "Back to overview"
+msgstr ""
+
+msgid "Captive Portal Detection"
+msgstr ""
+
+msgid ""
+"Check the internet availability, log captive portal redirections and keep "
+"the uplink connection 'alive'."
+msgstr ""
+
+msgid "Cipher"
+msgstr ""
+
+msgid ""
+"Configuration of the travelmate package to to enable travel router "
+"functionality."
+msgstr ""
+
+msgid ""
+"Connect your Android or iOS devices to your router's WiFi using the shown QR "
+"code."
+msgstr ""
+
+msgid "Connection Limit"
+msgstr ""
+
+msgid "Create Uplink interface"
+msgstr ""
+
+msgid ""
+"Create a new wireless wan uplink interface, configure it to use dhcp and"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+msgid "Delete this Uplink"
+msgstr ""
+
+msgid "Device"
+msgstr ""
+
+msgid "Down"
+msgstr ""
+
+msgid "EAP-Method"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Edit Firewall Configuration"
+msgstr ""
+
+msgid "Edit Network Configuration"
+msgstr ""
+
+msgid "Edit Travelmate Configuration"
+msgstr ""
+
+msgid "Edit Wireless Configuration"
+msgstr ""
+
+msgid "Edit Wireless Uplink Configuration"
+msgstr ""
+
+msgid "Edit this Uplink"
+msgstr ""
+
+msgid "Enable travelmate"
+msgstr ""
+
+msgid "Enable verbose debug logging"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "Extra options"
+msgstr "Opções adicionais"
+
+msgid "Find and join network on"
+msgstr ""
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+
+msgid "Force CCMP (AES)"
+msgstr ""
+
+msgid "Force TKIP"
+msgstr ""
+
+msgid "Force TKIP and CCMP (AES)"
+msgstr ""
+
+msgid ""
+"Here you'll find the QR codes from all of your configured Access Points. It "
+"allows you to connect your Android or iOS devices to your router's WiFi "
+"using the QR code shown below."
+msgstr ""
+
+msgid ""
+"How long should travelmate wait for a successful wlan uplink connection."
+msgstr ""
+
+msgid "Identity"
+msgstr ""
+
+msgid "Ignore BSSID"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+
+msgid "Interface Timeout"
+msgstr ""
+
+msgid "Interface Wizard"
+msgstr ""
+
+msgid "Last rundate"
+msgstr ""
+
+msgid ""
+"Minimum signal quality threshold as percent for conditional uplink (dis-) "
+"connections."
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Name of the used uplink interface."
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr ""
+
+msgid "Overall Timeout"
+msgstr ""
+
+msgid "Overall retry timeout in seconds."
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "Passphrase"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Password of Private Key"
+msgstr ""
+
+msgid "Path to CA-Certificate"
+msgstr ""
+
+msgid "Path to Client-Certificate"
+msgstr ""
+
+msgid "Path to Private Key"
+msgstr ""
+
+msgid ""
+"Provides an overview of all configured uplinks for the travelmate interface "
+"(%s). You can edit, delete or re-order existing uplinks or scan for a new "
+"one. The currently used uplink is emphasized in blue."
+msgstr ""
+
+msgid "QR-Codes"
+msgstr ""
+
+msgid "Radio selection"
+msgstr ""
+
+msgid "Repeat scan"
+msgstr ""
+
+msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+msgstr ""
+
+msgid "Retry limit to connect to an uplink."
+msgstr ""
+
+msgid "Runtime Information"
+msgstr ""
+
+msgid "SSID"
+msgstr ""
+
+msgid "SSID (hidden)"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Scan"
+msgstr ""
+
+msgid "Signal Quality Threshold"
+msgstr ""
+
+msgid "Signal strength"
+msgstr ""
+
+msgid "Station ID (SSID/BSSID)"
+msgstr ""
+
+msgid "Station Interface"
+msgstr ""
+
+msgid "Station Radio"
+msgstr ""
+
+msgid ""
+"The BSSID information '%s' is optional and only required for hidden networks"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main firewall "
+"configuration file (/etc/config/firewall)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main network configuration "
+"file (/etc/config/network)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main travelmate "
+"configuration file (/etc/config/travelmate)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main wireless "
+"configuration file (/etc/config/wireless)."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for travelmate related "
+"messages only."
+msgstr ""
+
+msgid "This step has only to be done once."
+msgstr ""
+
+msgid "Travelmate"
+msgstr "Travelmate"
+
+msgid "Travelmate Logfile"
+msgstr ""
+
+msgid "Travelmate Status (Quality)"
+msgstr ""
+
+msgid "Travelmate Version"
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Up"
+msgstr ""
+
+msgid "Uplink / Trigger interface"
+msgstr ""
+
+msgid "Uplink BSSID"
+msgstr ""
+
+msgid "Uplink SSID"
+msgstr ""
+
+msgid "View AP QR-Codes"
+msgstr ""
+
+msgid "View Logfile"
+msgstr ""
+
+msgid "WEP"
+msgstr ""
+
+msgid "WEP-Passphrase"
+msgstr ""
+
+msgid "WPA"
+msgstr ""
+
+msgid "WPA-Passphrase"
+msgstr ""
+
+msgid "WPA/WPA2"
+msgstr ""
+
+msgid "WPA2"
+msgstr ""
+
+msgid "Wireless Scan"
+msgstr ""
+
+msgid "Wireless Stations"
+msgstr ""
+
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr ""
+
+msgid "hidden"
+msgstr ""
+
+msgid "n/a"
+msgstr ""
+
+#~ msgid ""
+#~ "Brief advice: Create a wwan interface, configure it to use dhcp and add "
+#~ "it to the wan zone in firewall. Create the wifi interfaces to be used "
+#~ "('client' mode, assigned to wwan network, left as disabled). Travelmate "
+#~ "will try to connect to the known wifi client interfaces in the defined "
+#~ "order."
+#~ msgstr ""
+#~ "Breve conselho: Crie uma interface wwan, configure-a para usar DHCP e "
+#~ "adicione-a à zona wan no firewall. Crie as interfaces wifi a serem usadas "
+#~ "(modo 'cliente', atribuído à rede wwan, deixado como desativado). O "
+#~ "Travelmate tentará se conectar às interfaces de cliente wifi conhecidas "
+#~ "na ordem definida."
+
+#~ msgid ""
+#~ "Configuration of the Travelmate package to enable travel router "
+#~ "functionality."
+#~ msgstr ""
+#~ "Configuração do pacote Travelmate para permitir a funcionalidade de "
+#~ "roteador de viagem."
+
+#~ msgid "Debug logging"
+#~ msgstr "Registros(log) para depuração"
+
+#~ msgid "Default 20, range 10-60"
+#~ msgstr "Padrão 20, faixa 10-60"
+
+#~ msgid "Default 3, range 1-10"
+#~ msgstr "Padrão 3, faixa 1-10"
+
+#~ msgid "Disable this if you want to use iwinfo instead of iw"
+#~ msgstr "Desabilite isto se você quer usar o iwinfo ao invés do iw"
+
+#~ msgid "Enable Travelmate"
+#~ msgstr "Habilitar o Travelmate"
+
+#~ msgid "Global options"
+#~ msgstr "Opções Globais"
+
+#~ msgid "Link to detailed advice"
+#~ msgstr "Endereço para conselhos detalhados"
+
+#~ msgid "Max. number of connection retries to an uplink"
+#~ msgstr "Máximo número de tentativas de conexão para um enlace"
+
+#~ msgid "Max. timeout in seconds for wlan interface reload"
+#~ msgstr "Tempo limite máximo em segundos para recarregar a interface wlan"
+
+#~ msgid "Restrict reload trigger to certain interface(s)"
+#~ msgstr "Restringir o gatilho de recarga para somente alguma(s) interface(s)"
+
+#~ msgid ""
+#~ "Space separated list of wwan interfaces that trigger reload action. To "
+#~ "disable reload trigger set it to 'false'. Default: empty"
+#~ msgstr ""
+#~ "Lista separada por espaços de interfaces wwan que acionam a ação de "
+#~ "recarga. Para desabilitar o gatilho de recarga, defina-o como 'false'. "
+#~ "Padrão: vazio"
+
+#~ msgid "Use iw for scanning"
+#~ msgstr "Use o iw para escaneamento"
diff --git a/applications/luci-app-travelmate/po/ru/travelmate.po b/applications/luci-app-travelmate/po/ru/travelmate.po
new file mode 100644
index 0000000000..d3dbd24752
--- /dev/null
+++ b/applications/luci-app-travelmate/po/ru/travelmate.po
@@ -0,0 +1,461 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: LuCI: travelmate\n"
+"POT-Creation-Date: 2017-12-07 21:00+0300\n"
+"PO-Revision-Date: 2018-01-26 18:04+0300\n"
+"Language-Team: http://cyber-place.ru\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Last-Translator: Vladimir aka sunny <picfun@ya.ru>\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Language: ru\n"
+"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
+"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
+
+msgid "Add Uplink"
+msgstr "Подключение к сети"
+
+msgid "Add Wireless Uplink Configuration"
+msgstr "Добавить настройку внешней беспроводной сети"
+
+msgid ""
+"Additional trigger delay in seconds before travelmate processing begins."
+msgstr "Дополнительная задержка в секундах до запуска TravelMate."
+
+msgid "Advanced"
+msgstr "Дополнительно"
+
+msgid "Authentication"
+msgstr "Аутентификация"
+
+msgid "Automatic"
+msgstr "Автоматически"
+
+msgid "BSSID"
+msgstr "BSSID"
+
+msgid "Back to overview"
+msgstr "Назад в меню"
+
+msgid "Captive Portal Detection"
+msgstr ""
+
+msgid ""
+"Check the internet availability, log captive portal redirections and keep "
+"the uplink connection 'alive'."
+msgstr ""
+
+msgid "Cipher"
+msgstr "Алгоритм шифрования"
+
+msgid ""
+"Configuration of the travelmate package to to enable travel router "
+"functionality."
+msgstr "Настройка утилиты TravelMate - помощника путешественника. "
+
+msgid ""
+"Connect your Android or iOS devices to your router's WiFi using the shown QR "
+"code."
+msgstr ""
+
+msgid "Connection Limit"
+msgstr "Ограничение соединений"
+
+msgid "Create Uplink interface"
+msgstr ""
+
+msgid ""
+"Create a new wireless wan uplink interface, configure it to use dhcp and"
+msgstr ""
+"Создать новый wwan интерфейс внешней беспроводной сети, настроить его на "
+"использование с DHCP<br />и "
+
+msgid "Delete"
+msgstr "Удалить"
+
+msgid "Delete this Uplink"
+msgstr "Удалить сеть"
+
+msgid "Device"
+msgstr "Устройство"
+
+msgid "Down"
+msgstr ""
+
+msgid "EAP-Method"
+msgstr "Метод EAP"
+
+msgid "Edit"
+msgstr "Изменить"
+
+msgid "Edit Firewall Configuration"
+msgstr "Настройка config файла firewall"
+
+msgid "Edit Network Configuration"
+msgstr "Настройка config файла network"
+
+msgid "Edit Travelmate Configuration"
+msgstr "Настройка config файла Travelmate"
+
+msgid "Edit Wireless Configuration"
+msgstr "Настройка config файл wireless"
+
+msgid "Edit Wireless Uplink Configuration"
+msgstr "Редактировать настройки беспроводной сети"
+
+msgid "Edit this Uplink"
+msgstr "Редактировать настройки сети"
+
+msgid "Enable travelmate"
+msgstr "Включить Travelmate"
+
+msgid "Enable verbose debug logging"
+msgstr "Включить подробное ведение журнала отладки"
+
+msgid "Encryption"
+msgstr "Шифрование"
+
+msgid "Extra options"
+msgstr "Дополнительные настройки"
+
+msgid "Find and join network on"
+msgstr "Найти сеть для подключения используя"
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+"Для получения дополнительной информации <a href=\"%s\" target=\"_blank\"> "
+"смотрите онлайн документацию</a>."
+
+msgid "Force CCMP (AES)"
+msgstr "Назначить CCMP (AES)"
+
+msgid "Force TKIP"
+msgstr "Назначить TKIP"
+
+msgid "Force TKIP and CCMP (AES)"
+msgstr "Назначить TKIP и CCMP (AES)"
+
+msgid ""
+"Here you'll find the QR codes from all of your configured Access Points. It "
+"allows you to connect your Android or iOS devices to your router's WiFi "
+"using the QR code shown below."
+msgstr ""
+
+msgid ""
+"How long should travelmate wait for a successful wlan uplink connection."
+msgstr ""
+
+msgid "Identity"
+msgstr "Идентификация EAP"
+
+msgid "Ignore BSSID"
+msgstr "Игнорировать BSSID"
+
+msgid "Input file not found, please check your configuration."
+msgstr "Config файл не найден, настройте config файл."
+
+msgid "Interface Timeout"
+msgstr "Временная задержка интерфейса"
+
+msgid "Interface Wizard"
+msgstr "Помощник настройки интерфейса"
+
+msgid "Last rundate"
+msgstr "Дата последнего запуска"
+
+msgid ""
+"Minimum signal quality threshold as percent for conditional uplink (dis-) "
+"connections."
+msgstr ""
+
+msgid "Move down"
+msgstr "Переместить вниз"
+
+msgid "Move up"
+msgstr "Переместить вверх"
+
+msgid "Name of the used uplink interface."
+msgstr "Имя используемого интерфейса внешней сети."
+
+msgid "Open"
+msgstr "Открыть"
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr ""
+"Возможные варианты детальной настройки, если значения по умолчанию не "
+"подходят для вас."
+
+msgid "Overall Timeout"
+msgstr "Общее время ожидания"
+
+msgid "Overall retry timeout in seconds."
+msgstr ""
+
+msgid "Overview"
+msgstr "Главное меню"
+
+msgid "Passphrase"
+msgstr "Парольная фраза"
+
+msgid "Password"
+msgstr "Пароль"
+
+msgid "Password of Private Key"
+msgstr "Пароль к Приватному ключу"
+
+msgid "Path to CA-Certificate"
+msgstr "Путь к CA-Сертификату"
+
+msgid "Path to Client-Certificate"
+msgstr "Путь к Client-Сертификату"
+
+msgid "Path to Private Key"
+msgstr "Путь к Приватному ключу"
+
+msgid ""
+"Provides an overview of all configured uplinks for the travelmate interface "
+"(%s). You can edit, delete or re-order existing uplinks or scan for a new "
+"one. The currently used uplink is emphasized in blue."
+msgstr ""
+"Общие сведения обо всех настроенных внешних сетевых соединениях интерфейса "
+"TravelMate (%s).<br />Вы можете редактировать, удалять или пере "
+"упорядочивать существующий список внешних сетей или выполнять их поиск.<br /"
+">Используемое сетевое соединение выделено синим цветом."
+
+msgid "QR-Codes"
+msgstr ""
+
+msgid "Radio selection"
+msgstr "Выбор Wi-Fi устройства"
+
+msgid "Repeat scan"
+msgstr "Повторить поиск"
+
+msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+msgstr "Выделить TravelMate-у конкретное Wi-Fi устройство, например 'radio0'."
+
+msgid "Retry limit to connect to an uplink."
+msgstr ""
+
+msgid "Runtime Information"
+msgstr "Информация о состоянии"
+
+msgid "SSID"
+msgstr "SSID"
+
+msgid "SSID (hidden)"
+msgstr "SSID (скрытый)"
+
+msgid "Save"
+msgstr "Сохранить"
+
+msgid "Scan"
+msgstr "Поиск"
+
+msgid "Signal Quality Threshold"
+msgstr ""
+
+msgid "Signal strength"
+msgstr "Мощность сигнала"
+
+msgid "Station ID (SSID/BSSID)"
+msgstr "ID (SSID/BSSID) клиента"
+
+msgid "Station Interface"
+msgstr "Интерфейс клиента"
+
+msgid "Station Radio"
+msgstr "Wi-Fi устройство клиента"
+
+msgid ""
+"The BSSID information '%s' is optional and only required for hidden networks"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main firewall "
+"configuration file (/etc/config/firewall)."
+msgstr ""
+"Страница настройки межсетевого экрана, изменение содержимого config файла "
+"firewall настройки межсетевого экрана (/etc/config/firewall)."
+
+msgid ""
+"This form allows you to modify the content of the main network configuration "
+"file (/etc/config/network)."
+msgstr ""
+"Страница настройки сети, изменение содержимого config файла network "
+"настройки сети (/etc/config/network)."
+
+msgid ""
+"This form allows you to modify the content of the main travelmate "
+"configuration file (/etc/config/travelmate)."
+msgstr ""
+"Страница настройки Travelmate, изменение содержимого config файла travelmate "
+"настройки Travelmate (/etc/config/travelmate)."
+
+msgid ""
+"This form allows you to modify the content of the main wireless "
+"configuration file (/etc/config/wireless)."
+msgstr ""
+"Страница настройки беспроводных соединений, изменение содержимого config "
+"файла wireless настройки беспроводных сетей (/etc/config/wireless)."
+
+msgid ""
+"This form shows the syslog output, pre-filtered for travelmate related "
+"messages only."
+msgstr ""
+"Страница просмотра системного журнала, показаны только события связанные с "
+"работой утилиты TravelMate."
+
+msgid "This step has only to be done once."
+msgstr ""
+
+msgid "Travelmate"
+msgstr "TravelMate"
+
+msgid "Travelmate Logfile"
+msgstr "Системный журнал TravelMate"
+
+msgid "Travelmate Status (Quality)"
+msgstr ""
+
+msgid "Travelmate Version"
+msgstr "Версия TravelMate"
+
+msgid "Trigger Delay"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Неизвестно"
+
+msgid "Up"
+msgstr ""
+
+msgid "Uplink / Trigger interface"
+msgstr "Включить интерфейс<br />внешней сети"
+
+msgid "Uplink BSSID"
+msgstr "BSSID внешней сети"
+
+msgid "Uplink SSID"
+msgstr "SSID внешней сети"
+
+msgid "View AP QR-Codes"
+msgstr ""
+
+msgid "View Logfile"
+msgstr "Показать системный журнал"
+
+msgid "WEP"
+msgstr "WEP"
+
+msgid "WEP-Passphrase"
+msgstr "Пароль WEP"
+
+msgid "WPA"
+msgstr "WPA"
+
+msgid "WPA-Passphrase"
+msgstr "Пароль WPA"
+
+msgid "WPA/WPA2"
+msgstr "WPA/WPA2"
+
+msgid "WPA2"
+msgstr "WPA2"
+
+msgid "Wireless Scan"
+msgstr "Найденные точки доступа Wi-Fi"
+
+msgid "Wireless Stations"
+msgstr "Клиенты беспроводной сети"
+
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr ""
+
+msgid "hidden"
+msgstr "скрытый"
+
+msgid "n/a"
+msgstr "нет данных"
+
+#~ msgid "Actions"
+#~ msgstr "Действия"
+
+#~ msgid "Add Interface"
+#~ msgstr "Добавить интерфейс"
+
+#~ msgid "Create Uplink Interface"
+#~ msgstr "Создать интерфейс сети"
+
+#~ msgid "Uplink interface"
+#~ msgstr "Интерфейс внешней сети"
+
+#~ msgid ""
+#~ "add it to the wan zone of the firewall. This step has only to be done "
+#~ "once."
+#~ msgstr ""
+#~ "добавить в wan зону межсетевого экрана. Можно сделать только один раз."
+
+#~ msgid "Enable 'automatic' mode"
+#~ msgstr "Включить режим 'автоматически'"
+
+#~ msgid "Force a manual uplink rescan / reconnect in 'trigger' mode."
+#~ msgstr ""
+#~ "Принудительно выполнить повторное сканирование/повторное подключение "
+#~ "внешних сетей в режиме 'ручной'."
+
+#~ msgid ""
+#~ "Keep travelmate in an active state. Check every n seconds the connection "
+#~ "status, i.e. the uplink availability."
+#~ msgstr ""
+#~ "Поддержка TravelMate в активном состоянии.<br />Проверка состояния "
+#~ "соединения каждые n секунд, т.е. доступность внешней сети."
+
+#~ msgid "Manual Rescan"
+#~ msgstr "Поиск сети вручную"
+
+#~ msgid "Rescan"
+#~ msgstr "Пересканировать"
+
+#~ msgid "Timeout in seconds between retries in 'automatic' mode."
+#~ msgstr ""
+#~ "Время ожидания в секундах между повторными попытками соединения в режиме "
+#~ "'автоматически'."
+
+#~ msgid ""
+#~ "How long should travelmate wait for a successful wlan interface reload."
+#~ msgstr ""
+#~ "Временная задержка необходима TravelMate для полной перезагрузки wlan "
+#~ "интерфейса."
+
+#~ msgid "How many times should travelmate try to connect to an Uplink."
+#~ msgstr "Сколько раз TravelMate должен пытаться подключиться к сети. "
+
+#~ msgid "To disable this feature set it to '0' which means unlimited retries."
+#~ msgstr ""
+#~ "<br />Чтобы отключить эту функцию, установите значение '0', что означает "
+#~ "неограниченное количество попыток."
+
+#~ msgid "Travelmate Status"
+#~ msgstr "Состояние Travelmate"
+
+#~ msgid "Trigger delay"
+#~ msgstr "Задержка запуска"
+
+#~ msgid "connected"
+#~ msgstr "подключен"
+
+#~ msgid "error"
+#~ msgstr "ошибка"
+
+#~ msgid "not connected"
+#~ msgstr "не подключено"
+
+#~ msgid "running"
+#~ msgstr "работает"
diff --git a/applications/luci-app-travelmate/po/templates/travelmate.pot b/applications/luci-app-travelmate/po/templates/travelmate.pot
index 20628196b6..b3e80e3c96 100644
--- a/applications/luci-app-travelmate/po/templates/travelmate.pot
+++ b/applications/luci-app-travelmate/po/templates/travelmate.pot
@@ -1,58 +1,351 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
+msgid "Add Uplink"
+msgstr ""
+
+msgid "Add Wireless Uplink Configuration"
+msgstr ""
+
msgid ""
-"Brief advice: Create a wwan interface, configure it to use dhcp and add it "
-"to the wan zone in firewall. Create the wifi interfaces to be used ('client' "
-"mode, assigned to wwan network, left as disabled). Travelmate will try to "
-"connect to the known wifi client interfaces in the defined order."
+"Additional trigger delay in seconds before travelmate processing begins."
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Authentication"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "BSSID"
+msgstr ""
+
+msgid "Back to overview"
+msgstr ""
+
+msgid "Captive Portal Detection"
+msgstr ""
+
+msgid ""
+"Check the internet availability, log captive portal redirections and keep "
+"the uplink connection 'alive'."
+msgstr ""
+
+msgid "Cipher"
msgstr ""
msgid ""
-"Configuration of the Travelmate package to enable travel router "
+"Configuration of the travelmate package to to enable travel router "
"functionality."
msgstr ""
-msgid "Debug logging"
+msgid ""
+"Connect your Android or iOS devices to your router's WiFi using the shown QR "
+"code."
+msgstr ""
+
+msgid "Connection Limit"
+msgstr ""
+
+msgid "Create Uplink interface"
+msgstr ""
+
+msgid ""
+"Create a new wireless wan uplink interface, configure it to use dhcp and"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+msgid "Delete this Uplink"
+msgstr ""
+
+msgid "Device"
+msgstr ""
+
+msgid "Down"
+msgstr ""
+
+msgid "EAP-Method"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Edit Firewall Configuration"
+msgstr ""
+
+msgid "Edit Network Configuration"
+msgstr ""
+
+msgid "Edit Travelmate Configuration"
+msgstr ""
+
+msgid "Edit Wireless Configuration"
msgstr ""
-msgid "Default 20, range 10-60"
+msgid "Edit Wireless Uplink Configuration"
msgstr ""
-msgid "Default 3, range 1-10"
+msgid "Edit this Uplink"
msgstr ""
-msgid "Disable this if you want to use iwinfo instead of iw"
+msgid "Enable travelmate"
msgstr ""
-msgid "Enable Travelmate"
+msgid "Enable verbose debug logging"
+msgstr ""
+
+msgid "Encryption"
msgstr ""
msgid "Extra options"
msgstr ""
-msgid "Global options"
+msgid "Find and join network on"
+msgstr ""
+
+msgid ""
+"For further information <a href=\"%s\" target=\"_blank\">see online "
+"documentation</a>"
+msgstr ""
+
+msgid "Force CCMP (AES)"
+msgstr ""
+
+msgid "Force TKIP"
+msgstr ""
+
+msgid "Force TKIP and CCMP (AES)"
+msgstr ""
+
+msgid ""
+"Here you'll find the QR codes from all of your configured Access Points. It "
+"allows you to connect your Android or iOS devices to your router's WiFi "
+"using the QR code shown below."
+msgstr ""
+
+msgid ""
+"How long should travelmate wait for a successful wlan uplink connection."
+msgstr ""
+
+msgid "Identity"
+msgstr ""
+
+msgid "Ignore BSSID"
+msgstr ""
+
+msgid "Input file not found, please check your configuration."
+msgstr ""
+
+msgid "Interface Timeout"
+msgstr ""
+
+msgid "Interface Wizard"
+msgstr ""
+
+msgid "Last rundate"
+msgstr ""
+
+msgid ""
+"Minimum signal quality threshold as percent for conditional uplink (dis-) "
+"connections."
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Name of the used uplink interface."
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
+msgid ""
+"Options for further tweaking in case the defaults are not suitable for you."
+msgstr ""
+
+msgid "Overall Timeout"
+msgstr ""
+
+msgid "Overall retry timeout in seconds."
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "Passphrase"
msgstr ""
-msgid "Link to detailed advice"
+msgid "Password"
msgstr ""
-msgid "Max. number of connection retries to an uplink"
+msgid "Password of Private Key"
msgstr ""
-msgid "Max. timeout in seconds for wlan interface reload"
+msgid "Path to CA-Certificate"
msgstr ""
-msgid "Restrict reload trigger to certain interface(s)"
+msgid "Path to Client-Certificate"
+msgstr ""
+
+msgid "Path to Private Key"
msgstr ""
msgid ""
-"Space separated list of wwan interfaces that trigger reload action. To "
-"disable reload trigger set it to 'false'. Default: empty"
+"Provides an overview of all configured uplinks for the travelmate interface "
+"(%s). You can edit, delete or re-order existing uplinks or scan for a new "
+"one. The currently used uplink is emphasized in blue."
+msgstr ""
+
+msgid "QR-Codes"
+msgstr ""
+
+msgid "Radio selection"
+msgstr ""
+
+msgid "Repeat scan"
+msgstr ""
+
+msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+msgstr ""
+
+msgid "Retry limit to connect to an uplink."
+msgstr ""
+
+msgid "Runtime Information"
+msgstr ""
+
+msgid "SSID"
+msgstr ""
+
+msgid "SSID (hidden)"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Scan"
+msgstr ""
+
+msgid "Signal Quality Threshold"
+msgstr ""
+
+msgid "Signal strength"
+msgstr ""
+
+msgid "Station ID (SSID/BSSID)"
+msgstr ""
+
+msgid "Station Interface"
+msgstr ""
+
+msgid "Station Radio"
+msgstr ""
+
+msgid ""
+"The BSSID information '%s' is optional and only required for hidden networks"
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main firewall "
+"configuration file (/etc/config/firewall)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main network configuration "
+"file (/etc/config/network)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main travelmate "
+"configuration file (/etc/config/travelmate)."
+msgstr ""
+
+msgid ""
+"This form allows you to modify the content of the main wireless "
+"configuration file (/etc/config/wireless)."
+msgstr ""
+
+msgid ""
+"This form shows the syslog output, pre-filtered for travelmate related "
+"messages only."
+msgstr ""
+
+msgid "This step has only to be done once."
msgstr ""
msgid "Travelmate"
msgstr ""
-msgid "Use iw for scanning"
+msgid "Travelmate Logfile"
+msgstr ""
+
+msgid "Travelmate Status (Quality)"
+msgstr ""
+
+msgid "Travelmate Version"
+msgstr ""
+
+msgid "Trigger Delay"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Up"
+msgstr ""
+
+msgid "Uplink / Trigger interface"
+msgstr ""
+
+msgid "Uplink BSSID"
+msgstr ""
+
+msgid "Uplink SSID"
+msgstr ""
+
+msgid "View AP QR-Codes"
+msgstr ""
+
+msgid "View Logfile"
+msgstr ""
+
+msgid "WEP"
+msgstr ""
+
+msgid "WEP-Passphrase"
+msgstr ""
+
+msgid "WPA"
+msgstr ""
+
+msgid "WPA-Passphrase"
+msgstr ""
+
+msgid "WPA/WPA2"
+msgstr ""
+
+msgid "WPA2"
+msgstr ""
+
+msgid "Wireless Scan"
+msgstr ""
+
+msgid "Wireless Stations"
+msgstr ""
+
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr ""
+
+msgid "hidden"
+msgstr ""
+
+msgid "n/a"
msgstr ""