<%+header%>
<h2 name="content"><%:Attended Sysupgrade%></h2>
-<div class="container">
- <div style="display: none" id="update_info" class="alert-message info">
- </div>
- <div style="display: none" id="update_error" class="alert-message danger">
- </div>
+<div class="container">
+ <div style="display: none" id="update_info" class="alert-message info"></div>
+ <div style="display: none" id="update_error" class="alert-message danger"></div>
</div>
<input class="cbi-button" value="search for updates" onclick="update_request()" type="button" id="update_button">
+<div style="display: none" id="packages" class="alert-message success"></div>
<script type="text/javascript">
request_dict.distro = data.release.distribution;
request_dict.target = data.release.target.split("\/")[0];
request_dict.subtarget = data.release.target.split("\/")[1];
- request_dict.packages = data.packagelist;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/json");
// requests ubus via rpcd
function ubus_request(command, argument, params, callback) {
- // perform login if ubus_rpc_session is empty
var request_data = '{ "jsonrpc": "2.0", "id": ' + ubus_counter + ', "method": "call", "params": [ "'+ data["ubus_rpc_session"] +'", "' + command + '", "' + argument + '", ' + params + ' ] }'
ubus_counter++
var xmlhttp = new XMLHttpRequest();
console.log("update_request")
request_dict = {}
request_dict.version = data.release.version;
+ request_dict.packages = data.packagelist;
server_request(request_dict, "update-request", update_request_callback)
}
function update_request_200(response_content) {
info_output = ""
if(response_content.version != undefined) {
- info_output += "new update available. from " + data.release.version + " to " + response_content.version
+ info_output += "<h3>new update available</h3>"
+ info_output += data.release.version + " to " + response_content.version
latest_version = response_content.version;
}
- if(response_content.packages != undefined) {
- info_output += "package updates available"
+ if(response_content.updates != undefined) {
+ info_output += "<h3>package updates available</h3>"
+ for (update in response_content.updates) {
+ info_output += "<b>" + update + "</b>: " + response_content.updates[update][1] + " to " + response_content.updates[update][0] + "</br>"
+ }
+ data.packages = response_content.packages
}
update_info(info_output)
document.getElementById("update_button").value = "request image";
request_dict = {}
request_dict.version = latest_version;
request_dict.board = data.board_name
+ request_dict.packages = data.packages;
server_request(request_dict, "image-request", image_request_handler)
}
// ready to download
response_content = JSON.parse(response.responseText)
update_info("image created")
- document.getElementById("update_button").value = "download and flash"
+ document.getElementById("update_button").value = "sysupgrade"
document.getElementById("update_button").onclick = function() {download_image(response_content.url); }
}
}
entry({"admin", "network", "mwan", "configuration"},
alias("admin", "network", "mwan", "configuration", "interface"),
_("Configuration"), 20)
+ entry({"admin", "network", "mwan", "configuration", "globals"},
+ cbi("mwan/globalsconfig"),_("Globals"), 5).leaf = true
entry({"admin", "network", "mwan", "configuration", "interface"},
arcombine(cbi("mwan/interface"), cbi("mwan/interfaceconfig")),
_("Interfaces"), 10).leaf = true
--- /dev/null
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2017 Florian Eckert <fe@dev.tdt.de>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local net = require "luci.model.network".init()
+
+m = Map("mwan3")
+
+s = m:section(NamedSection, "globals", "globals", translate("Globals mwan3 options"))
+n = s:option(ListValue, "local_source",
+ translate("Local source interface"),
+ translate("Use the IP address of this interface as source IP address for traffic initiated by the router itself"))
+n:value("none")
+n.default = "none"
+for _, net in ipairs(net:get_networks()) do
+ if net:name() ~= "loopback" then
+ n:value(net:name())
+ end
+end
+n.rmempty = false
+
+return m
enabled:value("1", translate("Yes"))
enabled:value("0", translate("No"))
+initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
+ translate("Expect interface state on up event"))
+ initial_state.default = "online"
+ initial_state:value("online", translate("Online"))
+ initial_state:value("offline", translate("Offline"))
+
family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
family.default = "ipv4"
family:value("ipv4", translate("IPv4"))
failure:value("1800", translatef("%d minutes", 30))
failure:value("3600", translatef("%d hour", 1))
+keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
+ translate("Keep ping failure interval during failure state"))
+ keep_failure.default = keep_failure.disabled
+
recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
translate("Ping interval during failure recovering"))
recovery.default = "5"
msgid "Errors"
msgstr "エラー"
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr "障害検出 インターバル"
msgid "Flush global firewall conntrack table on interface events"
msgstr ""
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr "ホットプラグ スクリプト"
msgid "IPv6"
msgstr "IPv6"
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr "インターフェース"
msgid "Internet Protocol"
msgstr "インターネット プロトコル"
+msgid "Keep failure interval"
+msgstr ""
+
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
msgstr "直近の MWAN システムログ(50行)です。一番上が最新の行です:"
msgid "Loading"
msgstr "読込中"
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr "MWAN 設定"
msgid "Offline"
msgstr "オフライン"
+msgid "Online"
+msgstr ""
+
msgid "Online (tracking active)"
msgstr "オンライン(追跡実行中)"
msgid "Troubleshooting Data"
msgstr "トラブルシューティング データ"
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr "プロトコルの説明については、 /etc/protocols の内容を確認してください。"
msgid "Errors"
msgstr ""
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr ""
msgid "Flush global firewall conntrack table on interface events"
msgstr ""
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr ""
msgid "IPv6"
msgstr ""
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr ""
msgid "Internet Protocol"
msgstr ""
+msgid "Keep failure interval"
+msgstr ""
+
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
msgstr ""
msgid "Loading"
msgstr ""
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr ""
msgid "Offline"
msgstr ""
+msgid "Online"
+msgstr ""
+
msgid "Online (tracking active)"
msgstr ""
msgid "Troubleshooting Data"
msgstr ""
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr ""
msgid "Errors"
msgstr "错误"
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr "故障检测间隔"
msgid "Flush global firewall conntrack table on interface events"
msgstr "在接口事件触发时刷新全局防火墙连接跟踪表"
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr "Hotplug 脚本"
msgid "IPv6"
msgstr "IPv6"
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr "接口"
msgid "Internet Protocol"
msgstr "互联网协议"
+msgid "Keep failure interval"
+msgstr ""
+
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
msgstr "最近 50 条 MWAN 系统日志,最新条目排在顶部:"
msgid "Loading"
msgstr "载入中"
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr "MWAN 配置文件"
msgid "Offline"
msgstr "离线"
+msgid "Online"
+msgstr ""
+
msgid "Online (tracking active)"
msgstr "在线(追踪启用中)"
msgid "Troubleshooting Data"
msgstr "故障排除数据"
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr "请查看 /etc/protocols 获取可选协议详情"
commit ucitrack
EOF
+uci -q get mwan3.globals >/dev/null || {
+ uci -q add mwan3 globals >/dev/null
+ uci -q rename mwan3.@globals[-1]="globals" >/dev/null
+ uci -q set mwan3.globals.initial_source="none" >/dev/null
+ uci commit mwan3
+}
+
# remove LuCI cache
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
for _, n in ipairs(names) do
local v = sdata[n]
if v ~= nil then
+ if n == "key" or n == "password" then
+ v = translate("<hidden>")
+ end
local fv = "<var>%s</var>" % ut.pcdata(v)
if sdata[".type"] ~= "ss_server" and n == "server" then
fv = '<a class="label" href="%s">%s</a>' % {
local fs = require("nixio.fs")
local uci = require("luci.model.uci").cursor()
local json = require("luci.jsonc")
-local nw = require("luci.model.network").init()
-local fw = require("luci.model.firewall").init()
+local nw = require("luci.model.network").init()
+local fw = require("luci.model.firewall").init()
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 ""
.. "see online documentation</a>", "https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md"))
function m.on_after_commit(self)
- luci.sys.call("/etc/init.d/travelmate restart >/dev/null 2>&1")
+ 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
- dv = s:option(DummyValue, "nil", translate("Interface Wizard"))
+ dv = s:option(DummyValue, "", translate("Interface Wizard"))
dv.template = "cbi/nullsection"
- o = s:option(Value, "trm_iface", translate("Uplink interface"))
+ o = s:option(Value, "", translate("Uplink interface"))
o.datatype = "and(uciname,rangelength(3,15))"
- o.default = "trm_wwan"
+ o.default = trmiface
o.rmempty = false
- btn = s:option(Button, "", translate("Create Uplink Interface"),
+ btn = s:option(Button, "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. This step has only to be done once."))
btn.inputtitle = translate("Add Interface")
btn.inputstyle = "apply"
btn.disabled = false
function btn.write(self, section, value)
- iface = o:formvalue(section)
- uci:set("travelmate", section, "trm_iface", iface)
- uci:save("travelmate")
- uci:commit("travelmate")
- local net = nw:add_network(iface, { proto = "dhcp" })
- if net then
- nw:save("network")
- nw:commit("network")
- local zone = fw:get_zone_by_network("wan")
- if zone then
- zone:add_network(iface)
- fw:save("firewall")
- fw:commit("firewall")
- luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
+ local iface = o:formvalue(section)
+ if iface then
+ uci:set("travelmate", section, "trm_iface", iface)
+ uci:save("travelmate")
+ uci:commit("travelmate")
+ local net = nw:add_network(iface, { proto = "dhcp" })
+ if net then
+ nw:save("network")
+ nw:commit("network")
+ local zone = fw:get_zone_by_network("wan")
+ if zone then
+ zone:add_network(iface)
+ fw:save("firewall")
+ fw:commit("firewall")
+ end
end
+ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
end
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
end
btn.inputstyle = "find"
btn.disabled = false
function btn.write()
- luci.sys.call("/etc/init.d/travelmate start >/dev/null 2>&1")
+ luci.sys.call("env -i /etc/init.d/travelmate start >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
end
e1 = e:option(Value, "trm_radio", translate("Radio selection"),
translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'"))
+e1.datatype = "and(uciname,rangelength(6,6))"
e1.rmempty = true
e2 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
e4 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
translate("Timeout in seconds between retries in 'automatic' mode"))
e4.default = 60
-e4.datatype = "range(5,300)"
+e4.datatype = "range(60,300)"
e4.rmempty = false
return m
if s ~= nil then
wssid = m:field(Value, "ssid", translate("SSID"))
wssid.default = s.ssid
+ wssid.datatype = "rangelength(1,32)"
if s.encryption and s.key then
wkey = m:field(Value, "key", translatef("Passphrase (%s)", s.encryption))
+ elseif s.encryption and s.password then
+ wkey = m:field(Value, "password", translatef("Passphrase (%s)", s.encryption))
+ end
+ if s.encryption and (s.key or s.password) then
wkey.password = true
- wkey.default = s.key
+ wkey.default = s.key or s.password
if s.encryption == "wep" then
wkey.datatype = "wepkey"
else
uci:set("wireless", m.hidden.cfg, "ssid", wssid:formvalue(section))
if s.encryption and s.key then
uci:set("wireless", m.hidden.cfg, "key", wkey:formvalue(section))
+ elseif s.encryption and s.password then
+ uci:set("wireless", m.hidden.cfg, "password", wkey:formvalue(section))
end
uci:save("wireless")
uci:commit("wireless")
local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
if cfg ~= nil then
- local iface = ""
local section = ""
local idx = ""
local idx_change = ""
local changed = ""
uci:foreach("wireless", "wifi-iface", function(s)
- iface = s.network
+ local iface = s.network or ""
if iface == trmiface then
section = s['.name']
if cfg == section then
<%-
local write = io.write
- local uci = require "luci.model.uci".cursor()
+ local uci = require("luci.model.uci").cursor()
local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
-%>
uci:foreach("wireless", "wifi-iface", function(s)
local iface = s.network or ""
if iface == trmiface then
- local section = s['.name']
+ local section = s['.name'] or ""
local device = s.device or ""
- local mode = s.mode or ""
local ssid = s.ssid or ""
local encryption = s.encryption or ""
local disabled = s.disabled or ""
-%>
<%-
- local sys = require "luci.sys"
- local utl = require "luci.util"
+ local sys = require("luci.sys")
+ local utl = require("luci.util")
local dev = luci.http.formvalue("device")
local iw = luci.sys.wifi.getiwinfo(dev)
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
+ if info.ssid and qc > 0 and qm > 0 then
return math.floor((100 / qm) * qc)
else
return 0
<th class="cbi-section-table-cell" style="text-align:left"><%:Encryption%></th>
<th class="cbi-section-table-cell" style="text-align:left" colspan="2"><%:Signal strength%></th>
</tr>
- <% for i, net in ipairs(iw.scanlist or { }) do%>
+ <% for i, net in ipairs(iw.scanlist or { }) do %>
<tr class="cbi-section-table-row cbi-rowstyle-1">
<td class="cbi-value-field" style="text-align:left">
<strong><%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%></strong>
ieee80211r:depends({mode="ap", encryption="psk"})
ieee80211r:depends({mode="ap", encryption="psk2"})
ieee80211r:depends({mode="ap", encryption="psk-mixed"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk2"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk-mixed"})
end
ieee80211r.rmempty = true