luci-app-vpn-policy-routing: better service control & buttons styling 3823/head
authorStan Grishin <stangri@melmac.net>
Fri, 3 Apr 2020 12:29:53 +0000 (12:29 +0000)
committerStan Grishin <stangri@melmac.net>
Fri, 3 Apr 2020 12:29:53 +0000 (12:29 +0000)
Signed-off-by: Stan Grishin <stangri@melmac.net>
applications/luci-app-vpn-policy-routing/Makefile
applications/luci-app-vpn-policy-routing/luasrc/controller/vpn-policy-routing.lua
applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua
applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm
applications/luci-app-vpn-policy-routing/po/templates/vpn-policy-routing.pot
applications/luci-app-vpn-policy-routing/root/etc/uci-defaults/40_luci-vpn-policy-routing [new file with mode: 0644]

index c2af86cf2c3222014953c4bb087b7d814f0b0cea..5b51fcc143ccb5c1f3a430d06649e7f45eee36ea 100644 (file)
@@ -10,7 +10,7 @@ LUCI_TITLE:=VPN Policy-Based Routing Service Web UI
 LUCI_DESCRIPTION:=Provides Web UI for vpn-policy-routing service.
 LUCI_DEPENDS:=+luci-compat +luci-mod-admin-full +vpn-policy-routing
 LUCI_PKGARCH:=all
 LUCI_DESCRIPTION:=Provides Web UI for vpn-policy-routing service.
 LUCI_DEPENDS:=+luci-compat +luci-mod-admin-full +vpn-policy-routing
 LUCI_PKGARCH:=all
-PKG_RELEASE:=69
+PKG_RELEASE:=70
 
 include ../../luci.mk
 
 
 include ../../luci.mk
 
index 0c8c31e7b725cf2320eec737ca46d762526851f8..f4af659aad41d4bd3910f6e50abb5c12f23e4f96 100644 (file)
@@ -12,7 +12,7 @@ function vpn_policy_routing_action(name)
        if name == "start" then
                luci.sys.init.start(packageName)
        elseif name == "action" then
        if name == "start" then
                luci.sys.init.start(packageName)
        elseif name == "action" then
-               luci.util.exec("/etc/init.d/" .. packageName .. " reload >/dev/null 2>&1")
+               luci.util.exec("/etc/init.d/" .. packageName .. " restart >/dev/null 2>&1")
        elseif name == "stop" then
                luci.sys.init.stop(packageName)
        elseif name == "enable" then
        elseif name == "stop" then
                luci.sys.init.stop(packageName)
        elseif name == "enable" then
index 95d42945eb37a9a2792e4381b4a2ad3af7a7f552..6259e8291566da10815e9f87a8261a06542bd0ac 100644 (file)
@@ -20,30 +20,36 @@ if ubusStatus and ubusStatus[packageName] and
         ubusStatus[packageName]["instances"]["main"]["data"] and
         ubusStatus[packageName]["instances"]["main"]["data"]["status"] and 
         ubusStatus[packageName]["instances"]["main"]["data"]["status"][1] then
         ubusStatus[packageName]["instances"]["main"]["data"] and
         ubusStatus[packageName]["instances"]["main"]["data"]["status"] and 
         ubusStatus[packageName]["instances"]["main"]["data"]["status"][1] then
-       pkgGateways = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["gateway"]
-       pkgGateways = pkgGateways and pkgGateways:gsub('\\n', '\n')
-       pkgGateways = pkgGateways and pkgGateways:gsub('\\033%[0;32m%[\\xe2\\x9c\\x93%]\\033%[0m', '✓')
-       pkgErrors = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["error"]
-       pkgErrors = pkgErrors and pkgErrors:gsub('\\n', '\n')
-       pkgErrors = pkgErrors and pkgErrors:gsub('\\033%[0;31mERROR\\033%[0m: ', '')
-       pkgWarnings = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["warning"]
-       pkgWarnings = pkgWarnings and pkgWarnings:gsub('\\n', '\n')
-       pkgWarnings = pkgWarnings and pkgWarnings:gsub('\\033%[0;33mWARNING\\033%[0m: ', '')
-       pkgMode = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["mode"]
+       serviceGateways = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["gateway"]
+       serviceGateways = serviceGateways and serviceGateways:gsub('\\n', '\n')
+       serviceGateways = serviceGateways and serviceGateways:gsub('\\033%[0;32m%[\\xe2\\x9c\\x93%]\\033%[0m', '✓')
+       serviceErrors = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["error"]
+       serviceErrors = serviceErrors and serviceErrors:gsub('\\n', '\n')
+       serviceErrors = serviceErrors and serviceErrors:gsub('\\033%[0;31mERROR\\033%[0m: ', '')
+       serviceWarnings = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["warning"]
+       serviceWarnings = serviceWarnings and serviceWarnings:gsub('\\n', '\n')
+       serviceWarnings = serviceWarnings and serviceWarnings:gsub('\\033%[0;33mWARNING\\033%[0m: ', '')
+       serviceMode = ubusStatus[packageName]["instances"]["main"]["data"]["status"][1]["mode"]
 end
 
 end
 
-local pkgVersion = tostring(util.trim(sys.exec("opkg list-installed " .. packageName .. " | awk '{print $3}'")))
-if not pkgVersion or pkgVersion == "" then
-       pkgVersion = ""
-       pkgStatus, pkgStatusLabel = "NotFound", packageName .. " " .. translate("is not installed or not found")
+local serviceRunning, statusText = false, nil
+local packageVersion = tostring(util.trim(sys.exec("opkg list-installed " .. packageName .. " | awk '{print $3}'")))
+if not packageVersion or packageVersion == "" then
+       packageVersion = ""
+       statusText = packageName .. " " .. translate("is not installed or not found")
 else  
 else  
-       pkgVersion = " [" .. packageName .. " " .. pkgVersion .. "]"
-end
-local pkgStatus, pkgStatusLabel = "Stopped", translate("Stopped")
+       packageVersion = " [" .. packageName .. " " .. packageVersion .. "]"
+end 
 if sys.call("iptables -t mangle -L | grep -q VPR_PREROUTING") == 0 then
 if sys.call("iptables -t mangle -L | grep -q VPR_PREROUTING") == 0 then
-       pkgStatus, pkgStatusLabel = "Running", translate("Running")
-       if pkgMode and pkgMode == "strict" then
-               pkgStatusLabel = pkgStatusLabel .. " " .. translate("(strict mode)")
+       serviceRunning = true
+       statusText = translate("Running")
+       if serviceMode and serviceMode == "strict" then
+               statusText = statusText .. " (" .. translate("strict mode") .. ")"
+       end
+else
+       statusText = translate("Stopped")
+       if uci:get(packageName, "config", "enabled") ~= "1" then
+               statusText = statusText .. " (" .. translate("disabled") .. ")"
        end
 end
 
        end
 end
 
@@ -74,8 +80,8 @@ if (type(lanIPAddr) == "table") then
                                                                lanIPAddr = lanIPAddr[i]
                                                                break
                                end
                                                                lanIPAddr = lanIPAddr[i]
                                                                break
                                end
-                               lanIPAddr = string.match(lanIPAddr,"[0-9.]+")
-end          
+                               lanIPAddr = lanIPAddr:match("[0-9.]+")
+end
 if lanIPAddr and lanNetmask then
        laPlaceholder = ip.new(lanIPAddr .. "/" .. lanNetmask )
 end
 if lanIPAddr and lanNetmask then
        laPlaceholder = ip.new(lanIPAddr .. "/" .. lanNetmask )
 end
@@ -114,27 +120,29 @@ end
 
 m = Map("vpn-policy-routing", translate("VPN and WAN Policy-Based Routing"))
 
 
 m = Map("vpn-policy-routing", translate("VPN and WAN Policy-Based Routing"))
 
-h = m:section(NamedSection, "config", packageName, translate("Service Status") .. pkgVersion)
+h = m:section(NamedSection, "config", packageName, translate("Service Status") .. packageVersion)
 status = h:option(DummyValue, "_dummy", translate("Service Status"))
 status.template = "vpn-policy-routing/status"
 status = h:option(DummyValue, "_dummy", translate("Service Status"))
 status.template = "vpn-policy-routing/status"
-status.value = pkgStatusLabel
-if pkgStatus:match("Running") and pkgGateways and pkgGateways ~= "" then
+status.value = statusText
+if serviceRunning and serviceGateways and serviceGateways ~= "" then
        gateways = h:option(DummyValue, "_dummy", translate("Service Gateways"))
        gateways.template = packageName .. "/status-gateways"
        gateways = h:option(DummyValue, "_dummy", translate("Service Gateways"))
        gateways.template = packageName .. "/status-gateways"
-       gateways.value = pkgGateways
+       gateways.value = serviceGateways
 end
 end
-if pkgErrors and pkgErrors ~= "" then
+if serviceErrors and serviceErrors ~= "" then
        errors = h:option(DummyValue, "_dummy", translate("Service Errors"))
        errors.template = packageName .. "/status-textarea"
        errors = h:option(DummyValue, "_dummy", translate("Service Errors"))
        errors.template = packageName .. "/status-textarea"
-       errors.value = pkgErrors
+       errors.value = serviceErrors
 end
 end
-if pkgWarnings and pkgWarnings ~= "" then
+if serviceWarnings and serviceWarnings ~= "" then
        warnings = h:option(DummyValue, "_dummy", translate("Service Warnings"))
        warnings.template = packageName .. "/status-textarea"
        warnings = h:option(DummyValue, "_dummy", translate("Service Warnings"))
        warnings.template = packageName .. "/status-textarea"
-       warnings.value = pkgWarnings
+       warnings.value = serviceWarnings
+end
+if packageVersion ~= "" then
+       buttons = h:option(DummyValue, "_dummy")
+       buttons.template = packageName .. "/buttons"
 end
 end
-buttons = h:option(DummyValue, "_dummy")
-buttons.template = packageName .. "/buttons"
 
 -- General Options
 config = m:section(NamedSection, "config", "vpn-policy-routing", translate("Configuration"))
 
 -- General Options
 config = m:section(NamedSection, "config", "vpn-policy-routing", translate("Configuration"))
@@ -208,7 +216,7 @@ icmp:value("", translate("No Change"))
 icmp:value("wan", translate("WAN"))
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
 icmp:value("wan", translate("WAN"))
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
-       if is_supported_interface(s) then icmp:value(name, string.upper(name)) end
+       if is_supported_interface(s) then icmp:value(name, name:upper()) end
 end)
 icmp.rmempty = true
 
 end)
 icmp.rmempty = true
 
@@ -338,10 +346,10 @@ gw.rmempty = false
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
        if is_wan(name) then
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
        if is_wan(name) then
-               gw:value(name, string.upper(name))
+               gw:value(name, name:upper())
                if not gw.default then gw.default = name end
        elseif is_supported_interface(s) then 
                if not gw.default then gw.default = name end
        elseif is_supported_interface(s) then 
-               gw:value(name, string.upper(name)) 
+               gw:value(name, name:upper()) 
        end
 end)
 
        end
 end)
 
@@ -351,7 +359,7 @@ dscp = m:section(NamedSection, "config", "vpn-policy-routing", translate("DSCP T
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
        if is_supported_interface(s) then 
 uci:foreach("network", "interface", function(s)
        local name=s['.name']
        if is_supported_interface(s) then 
-               local x = dscp:option(Value, name .. "_dscp", string.upper(name) .. " " .. translate("DSCP Tag"))
+               local x = dscp:option(Value, name .. "_dscp", name:upper() .. " " .. translate("DSCP Tag"))
                x.rmempty = true
                x.datatype = "range(1,63)"
        end
                x.rmempty = true
                x.datatype = "range(1,63)"
        end
index a9c473c75136a11968278f706499e60c7f0745ad..37a0b9a414295875c77c895a7dbaadb6e2ceea84 100644 (file)
@@ -1,55 +1,77 @@
-<%#
-       Copyright 2019 Stan Grishin <stangri@melmac.net>
--%>
+<%# Copyright 2020 Stan Grishin <stangri@melmac.net> -%>
+
+<%+vpn-policy-routing/css%>
+<%+vpn-policy-routing/js%>
 
 <%-
        local packageName = "vpn-policy-routing"
 
 <%-
        local packageName = "vpn-policy-routing"
-       local enabledFlag = luci.model.uci.cursor():get(packageName, "config", "enabled")
-       if nixio.fs.access("/var/run/" .. packageName .. ".json") then
-               tmpfs = luci.jsonc.parse(luci.util.trim(luci.sys.exec("cat /var/run/" .. packageName .. ".json")))
-       end
-       local pkgStatus, pkgStatusLabel = "Stopped", translate("Stopped")
+       local serviceRunning, serviceEnabled = false, false;
        if luci.sys.call("iptables -t mangle -L | grep -q VPR_PREROUTING") == 0 then
        if luci.sys.call("iptables -t mangle -L | grep -q VPR_PREROUTING") == 0 then
-               pkgStatus, pkgStatusLabel = "Running", translate("Running")
+               serviceRunning = true
+       end
+       if luci.model.uci.cursor():get(packageName, "config", "enabled") == "1" then
+               serviceEnabled = true
        end
        end
-       if pkgStatus == "Stopped" then
-               btn_start_style = "cbi-button cbi-button-apply important"
-               btn_action_style = "cbi-button cbi-button-apply important"
-               btn_stop_style = "cbi-button cbi-button-reset -disabled"
+
+       if serviceEnabled then
+               btn_start_status = true
+               btn_action_status = true
+               btn_stop_status = true
+               btn_enable_status = false
+               btn_disable_status = true
        else
        else
-               btn_start_style = "cbi-button cbi-button-apply -disabled"
-               btn_action_style = "cbi-button cbi-button-apply important"
-               btn_stop_style = "cbi-button cbi-button-reset important"
+               btn_start_status = false
+               btn_action_status = false
+               btn_stop_status = false
+               btn_enable_status = true
+               btn_disable_status = false
        end
        end
-       if enabledFlag ~= "1" then
-               btn_start_style = "cbi-button cbi-button-apply -disabled"
-               btn_action_style = "cbi-button cbi-button-apply -disabled"
-               btn_enable_style = "cbi-button cbi-button-apply important"
-               btn_disable_style = "cbi-button cbi-button-reset -disabled"
+       if serviceRunning then
+               btn_start_status = false
+               btn_action_status = true
+               btn_stop_status = true
        else
        else
-               btn_enable_style = "cbi-button cbi-button-apply -disabled"
-               btn_disable_style = "cbi-button cbi-button-reset important"
+               btn_action_status = false
+               btn_stop_status = false
        end
 -%>
 
        end
 -%>
 
-<%+vpn-policy-routing/css%>
-<%+vpn-policy-routing/js%>
-
 <div class="cbi-value"><label class="cbi-value-title">Service Control</label>
        <div class="cbi-value-field">
 <div class="cbi-value"><label class="cbi-value-title">Service Control</label>
        <div class="cbi-value-field">
-               <input type="button" class="<%=btn_start_style%>" id="btn_start" name="start" value="<%:Start%>" onclick="button_action(this)" />
+               <input type="button" class="cbi-button cbi-button-apply" id="btn_start" name="start" value="<%:Start%>"
+                       onclick="button_action(this)" />
                <span id="btn_start_spinner" class="btn_spinner"></span>
                <span id="btn_start_spinner" class="btn_spinner"></span>
-               <input type="button" class="<%=btn_action_style%>" id="btn_action" name="action" value="<%:Reload%>" onclick="button_action(this)" />
+               <input type="button" class="cbi-button cbi-button-apply" id="btn_action" name="action" value="<%:Restart%>"
+                       onclick="button_action(this)" />
                <span id="btn_action_spinner" class="btn_spinner"></span>
                <span id="btn_action_spinner" class="btn_spinner"></span>
-               <input type="button" class="<%=btn_stop_style%>" id="btn_stop" name="stop" value="<%:Stop%>" onclick="button_action(this)"  />
+               <input type="button" class="cbi-button cbi-button-reset" id="btn_stop" name="stop" value="<%:Stop%>"
+                       onclick="button_action(this)" />
                <span id="btn_stop_spinner" class="btn_spinner"></span>
                &nbsp;
                &nbsp;
                &nbsp;
                &nbsp;
                <span id="btn_stop_spinner" class="btn_spinner"></span>
                &nbsp;
                &nbsp;
                &nbsp;
                &nbsp;
-               <input type="button" class="<%=btn_enable_style%>" id="btn_enable" name="enable" value="<%:Enable%>" onclick="button_action(this)"  />
+               <input type="button" class="cbi-button cbi-button-apply" id="btn_enable" name="enable" value="<%:Enable%>"
+                       onclick="button_action(this)" />
                <span id="btn_enable_spinner" class="btn_spinner"></span>
                <span id="btn_enable_spinner" class="btn_spinner"></span>
-               <input type="button" class="<%=btn_disable_style%>" id="btn_disable" name="disable" value="<%:Disable%>" onclick="button_action(this)"  />
+               <input type="button" class="cbi-button cbi-button-reset" id="btn_disable" name="disable" value="<%:Disable%>"
+                       onclick="button_action(this)" />
                <span id="btn_disable_spinner" class="btn_spinner"></span>
        </div>
 </div>
                <span id="btn_disable_spinner" class="btn_spinner"></span>
        </div>
 </div>
+
+<%-if not btn_start_status then%>
+<script type="text/javascript">document.getElementById("btn_start").disabled = true;</script>
+<%-end%>
+<%-if not btn_action_status then%>
+<script type="text/javascript">document.getElementById("btn_action").disabled = true;</script>
+<%-end%>
+<%-if not btn_stop_status then%>
+<script type="text/javascript">document.getElementById("btn_stop").disabled = true;</script>
+<%-end%>
+<%-if not btn_enable_status then%>
+<script type="text/javascript">document.getElementById("btn_enable").disabled = true;</script>
+<%-end%>
+<%-if not btn_disable_status then%>
+<script type="text/javascript">document.getElementById("btn_disable").disabled = true;</script>
+<%-end%>
index 27660193ce3825ebb8b31b1801c958d08d3eb350..09812ab6d4725ef778ee02138ea99b552dd654b8 100644 (file)
@@ -1,55 +1,51 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:46
-msgid "(strict mode)"
-msgstr ""
-
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:202
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:210
 msgid ""
 "Add an ip rule, not an iptables entry for policies with just the local "
 "address. Use with caution to manipulte policies priorities."
 msgstr ""
 
 msgid ""
 "Add an ip rule, not an iptables entry for policies with just the local "
 "address. Use with caution to manipulte policies priorities."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:182
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:190
 msgid "Advanced Configuration"
 msgstr ""
 
 msgid "Advanced Configuration"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:187
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:195
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be "
 "explicitly supported by the service. Can be useful if your OpenVPN tunnels "
 "have dev option other than tun* or tap*."
 msgstr ""
 
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be "
 "explicitly supported by the service. Can be useful if your OpenVPN tunnels "
 "have dev option other than tun* or tap*."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:190
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:198
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be ignored "
 "by the service. Can be useful if running both VPN server and VPN client on "
 "the router."
 msgstr ""
 
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be ignored "
 "by the service. Can be useful if running both VPN server and VPN client on "
 "the router."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:198
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:206
 msgid "Append"
 msgstr ""
 
 msgid "Append"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:215
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:223
 msgid "Append local IP Tables rules"
 msgstr ""
 
 msgid "Append local IP Tables rules"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:218
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:226
 msgid "Append remote IP Tables rules"
 msgstr ""
 
 msgid "Append remote IP Tables rules"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:145
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:153
 msgid "Basic Configuration"
 msgstr ""
 
 msgid "Basic Configuration"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:193
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:201
 msgid "Boot Time-out"
 msgstr ""
 
 msgid "Boot Time-out"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:326
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:334
 msgid "Chain"
 msgstr ""
 
 msgid "Chain"
 msgstr ""
 
@@ -57,11 +53,11 @@ msgstr ""
 msgid "Checkmark represents the default gateway. See the"
 msgstr ""
 
 msgid "Checkmark represents the default gateway. See the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:277
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:285
 msgid "Comment"
 msgstr ""
 
 msgid "Comment"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:260
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:268
 msgid ""
 "Comment, interface and at least one other field are required. Multiple local "
 "and remote addresses/devices/domains and ports can be space separated. "
 msgid ""
 "Comment, interface and at least one other field are required. Multiple local "
 "and remote addresses/devices/domains and ports can be space separated. "
@@ -69,103 +65,103 @@ msgid ""
 "fields are left blank."
 msgstr ""
 
 "fields are left blank."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:149
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:157
 msgid "Condensed output"
 msgstr ""
 
 msgid "Condensed output"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:140
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:148
 msgid "Configuration"
 msgstr ""
 
 msgid "Configuration"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:147
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:155
 msgid "Controls both system log and console output verbosity."
 msgstr ""
 
 msgid "Controls both system log and console output verbosity."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:361
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:369
 msgid "Custom User File Includes"
 msgstr ""
 
 msgid "Custom User File Includes"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:354
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:362
 msgid "DSCP Tag"
 msgstr ""
 
 msgid "DSCP Tag"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:348
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:356
 msgid "DSCP Tagging"
 msgstr ""
 
 msgid "DSCP Tagging"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:206
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214
 msgid "Default ICMP Interface"
 msgstr ""
 
 msgid "Default ICMP Interface"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:52
+#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:57
 msgid "Disable"
 msgstr ""
 
 msgid "Disable"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:164
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:174
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:178
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:203
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:239
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:243
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:250
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:254
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:172
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:182
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:186
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:211
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:247
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:251
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:258
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:262
 msgid "Disabled"
 msgstr ""
 
 msgid "Disabled"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:246
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:254
 msgid "Display these protocols in protocol column in Web UI."
 msgstr ""
 
 msgid "Display these protocols in protocol column in Web UI."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:156
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:164
 msgid "Do not enforce policies when their gateway is down"
 msgstr ""
 
 msgid "Do not enforce policies when their gateway is down"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:50
+#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:54
 msgid "Enable"
 msgstr ""
 
 msgid "Enable"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:179
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:204
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:240
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:244
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:251
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:255
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:271
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:369
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:187
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:212
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:248
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:252
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:259
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:263
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:279
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:377
 msgid "Enabled"
 msgstr ""
 
 msgid "Enabled"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:231
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:239
 msgid ""
 "FW Mask used by the service. High mask is used to avoid conflict with SQM/"
 "QoS. Change with caution together with"
 msgstr ""
 
 msgid ""
 "FW Mask used by the service. High mask is used to avoid conflict with SQM/"
 "QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:206
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214
 msgid "Force the ICMP protocol interface."
 msgstr ""
 
 msgid "Force the ICMP protocol interface."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:202
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:210
 msgid "IP Rules Support"
 msgstr ""
 
 msgid "IP Rules Support"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:197
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:205
 msgid "IPTables rule option"
 msgstr ""
 
 msgid "IPTables rule option"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:177
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:185
 msgid "IPv6 Support"
 msgstr ""
 
 msgid "IPv6 Support"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:190
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:198
 msgid "Ignored Interfaces"
 msgstr ""
 
 msgid "Ignored Interfaces"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:199
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:207
 msgid "Insert"
 msgstr ""
 
 msgid "Insert"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:335
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:343
 msgid "Interface"
 msgstr ""
 
 msgid "Interface"
 msgstr ""
 
@@ -173,226 +169,224 @@ msgstr ""
 msgid "Loading"
 msgstr ""
 
 msgid "Loading"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:282
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:290
 msgid "Local addresses / devices"
 msgstr ""
 
 msgid "Local addresses / devices"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:289
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:297
 msgid "Local ports"
 msgstr ""
 
 msgid "Local ports"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:279
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:287
 msgid "Name"
 msgstr ""
 
 msgid "Name"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:207
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:215
 msgid "No Change"
 msgstr ""
 
 msgid "No Change"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:147
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:155
 msgid "Output verbosity"
 msgstr ""
 
 msgid "Output verbosity"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:372
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:380
 msgid "Path"
 msgstr ""
 
 msgid "Path"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:161
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:171
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:169
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:179
 msgid "Please check the"
 msgstr ""
 
 msgid "Please check the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:183
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:191
 msgid "Please make sure to check the"
 msgstr ""
 
 msgid "Please make sure to check the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:260
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:268
 msgid "Policies"
 msgstr ""
 
 msgid "Policies"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:306
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:314
 msgid "Protocol"
 msgstr ""
 
 msgid "Protocol"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:155
 #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:163
 #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:163
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:173
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:184
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:350
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:363
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:171
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:181
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:192
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:358
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:371
 #: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:17
 msgid "README"
 msgstr ""
 
 #: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:17
 msgid "README"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:42
-msgid "Reload"
-msgstr ""
-
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:294
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:302
 msgid "Remote addresses / domains"
 msgstr ""
 
 msgid "Remote addresses / domains"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:299
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:307
 msgid "Remote ports"
 msgstr ""
 
 msgid "Remote ports"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:361
+#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:44
+msgid "Restart"
+msgstr ""
+
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:369
 msgid ""
 "Run the following user files after setting up but before restarting DNSMASQ. "
 "See the"
 msgstr ""
 
 msgid ""
 "Run the following user files after setting up but before restarting DNSMASQ. "
 "See the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:44
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:13
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:45
 msgid "Running"
 msgstr ""
 
 msgid "Running"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:153
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:161
 msgid "See the"
 msgstr ""
 
 msgid "See the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:197
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:205
 msgid "Select Append for -A and Insert for -I."
 msgstr ""
 
 msgid "Select Append for -A and Insert for -I."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:127
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:133
 msgid "Service Errors"
 msgstr ""
 
 msgid "Service Errors"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:226
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:231
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:234
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:239
 msgid "Service FW Mask"
 msgstr ""
 
 msgid "Service FW Mask"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:122
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:128
 msgid "Service Gateways"
 msgstr ""
 
 msgid "Service Gateways"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:117
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:118
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:123
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:124
 msgid "Service Status"
 msgstr ""
 
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:132
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:138
 msgid "Service Warnings"
 msgstr ""
 
 msgid "Service Warnings"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:348
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:356
 msgid ""
 "Set DSCP tags (in range between 1 and 63) for specific interfaces. See the"
 msgstr ""
 
 msgid ""
 "Set DSCP tags (in range between 1 and 63) for specific interfaces. See the"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:249
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:257
 msgid "Show Chain Column"
 msgstr ""
 
 msgid "Show Chain Column"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:238
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:246
 msgid "Show Enable Column"
 msgstr ""
 
 msgid "Show Enable Column"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:242
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:250
 msgid "Show Protocol Column"
 msgstr ""
 
 msgid "Show Protocol Column"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:253
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:261
 msgid "Show Up/Down Buttons"
 msgstr ""
 
 msgid "Show Up/Down Buttons"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:253
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:261
 msgid ""
 "Shows the Up/Down buttons for policies, allowing you to move a policy up or "
 "down in the list."
 msgstr ""
 
 msgid ""
 "Shows the Up/Down buttons for policies, allowing you to move a policy up or "
 "down in the list."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:249
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:257
 msgid ""
 "Shows the chain column for policies, allowing you to assign a PREROUTING, "
 "FORWARD, INPUT or OUTPUT chain to a policy."
 msgstr ""
 
 msgid ""
 "Shows the chain column for policies, allowing you to assign a PREROUTING, "
 "FORWARD, INPUT or OUTPUT chain to a policy."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:238
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:246
 msgid ""
 "Shows the enable checkbox column for policies, allowing you to quickly "
 "enable/disable specific policy without deleting it."
 msgstr ""
 
 msgid ""
 "Shows the enable checkbox column for policies, allowing you to quickly "
 "enable/disable specific policy without deleting it."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:242
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:250
 msgid ""
 "Shows the protocol column for policies, allowing you to assign a specific "
 "protocol to a policy."
 msgstr ""
 
 msgid ""
 "Shows the protocol column for policies, allowing you to assign a specific "
 "protocol to a policy."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:215
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:223
 msgid ""
 "Special instructions to append iptables rules for local IPs/netmasks/devices."
 msgstr ""
 
 msgid ""
 "Special instructions to append iptables rules for local IPs/netmasks/devices."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:218
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:226
 msgid "Special instructions to append iptables rules for remote IPs/netmasks."
 msgstr ""
 
 msgid "Special instructions to append iptables rules for remote IPs/netmasks."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:40
+#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:41
 msgid "Start"
 msgstr ""
 
 msgid "Start"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:226
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:234
 msgid ""
 "Starting (WAN) FW Mark for marks used by the service. High starting mark is "
 "used to avoid conflict with SQM/QoS. Change with caution together with"
 msgstr ""
 
 msgid ""
 "Starting (WAN) FW Mark for marks used by the service. High starting mark is "
 "used to avoid conflict with SQM/QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:221
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:229
 msgid "Starting (WAN) Table ID number for tables created by the service."
 msgstr ""
 
 msgid "Starting (WAN) Table ID number for tables created by the service."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:44
+#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:47
 msgid "Stop"
 msgstr ""
 
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:42
-#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/buttons.htm:11
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:50
 msgid "Stopped"
 msgstr ""
 
 msgid "Stopped"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:153
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:161
 msgid "Strict enforcement"
 msgstr ""
 
 msgid "Strict enforcement"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:157
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:165
 msgid "Strictly enforce policies when their gateway is down"
 msgstr ""
 
 msgid "Strictly enforce policies when their gateway is down"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:187
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:195
 msgid "Supported Interfaces"
 msgstr ""
 
 msgid "Supported Interfaces"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:246
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:254
 msgid "Supported Protocols"
 msgstr ""
 
 msgid "Supported Protocols"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:148
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:156
 msgid "Suppress/No output"
 msgstr ""
 
 msgid "Suppress/No output"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:170
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:178
 msgid "The ipset option for local policies"
 msgstr ""
 
 msgid "The ipset option for local policies"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:160
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:168
 msgid "The ipset option for remote policies"
 msgstr ""
 
 msgid "The ipset option for remote policies"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:193
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:201
 msgid ""
 "Time (in seconds) for service to wait for WAN gateway discovery on boot."
 msgstr ""
 
 msgid ""
 "Time (in seconds) for service to wait for WAN gateway discovery on boot."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:166
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:174
 msgid "Use DNSMASQ ipset"
 msgstr ""
 
 msgid "Use DNSMASQ ipset"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:165
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:175
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:173
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:183
 msgid "Use ipset command"
 msgstr ""
 
 msgid "Use ipset command"
 msgstr ""
 
@@ -404,53 +398,61 @@ msgstr ""
 msgid "VPN Policy Routing"
 msgstr ""
 
 msgid "VPN Policy Routing"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:115
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:121
 msgid "VPN and WAN Policy-Based Routing"
 msgstr ""
 
 msgid "VPN and WAN Policy-Based Routing"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:150
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:158
 msgid "Verbose output"
 msgstr ""
 
 msgid "Verbose output"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:208
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:216
 msgid "WAN"
 msgstr ""
 
 msgid "WAN"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:226
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:231
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:234
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:239
 msgid "WAN Table FW Mark"
 msgstr ""
 
 msgid "WAN Table FW Mark"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:221
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:229
 msgid "WAN Table ID"
 msgstr ""
 
 msgid "WAN Table ID"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:183
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:191
 msgid "WARNING:"
 msgstr ""
 
 msgid "WARNING:"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:236
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:244
 msgid "Web UI Configuration"
 msgstr ""
 
 msgid "Web UI Configuration"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:185
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:193
 msgid ""
 "before changing anything in this section! Change any of the settings below "
 "with extreme caution!"
 msgstr ""
 
 msgid ""
 "before changing anything in this section! Change any of the settings below "
 "with extreme caution!"
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:163
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:173
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:171
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:181
 msgid "before changing this option."
 msgstr ""
 
 msgid "before changing this option."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:155
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:350
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:363
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:52
+msgid "disabled"
+msgstr ""
+
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:163
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:358
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:371
 #: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:17
 msgid "for details."
 msgstr ""
 
 #: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:17
 msgid "for details."
 msgstr ""
 
-#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:38
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:39
 msgid "is not installed or not found"
 msgstr ""
 msgid "is not installed or not found"
 msgstr ""
+
+#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:47
+msgid "strict mode"
+msgstr ""
diff --git a/applications/luci-app-vpn-policy-routing/root/etc/uci-defaults/40_luci-vpn-policy-routing b/applications/luci-app-vpn-policy-routing/root/etc/uci-defaults/40_luci-vpn-policy-routing
new file mode 100644 (file)
index 0000000..a1ecfce
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+rm -rf /var/luci-modulecache/; rm -f /var/luci-indexcache;
+exit 0