diff options
Diffstat (limited to 'applications/luci-app-multiwan/luasrc')
5 files changed, 354 insertions, 0 deletions
diff --git a/applications/luci-app-multiwan/luasrc/controller/multiwan.lua b/applications/luci-app-multiwan/luasrc/controller/multiwan.lua new file mode 100644 index 0000000000..b596ef7e34 --- /dev/null +++ b/applications/luci-app-multiwan/luasrc/controller/multiwan.lua @@ -0,0 +1,60 @@ +module("luci.controller.multiwan", package.seeall) + +function index() + local fs = luci.fs or nixio.fs + if not fs.access("/etc/config/multiwan") then + return + end + + local page + + page = entry({"admin", "network", "multiwan"}, cbi("multiwan/multiwan"), _("Multi-WAN")) + page.dependent = true + + entry({"admin", "network", "multiwan", "status"}, call("multiwan_status")) + + page = entry({"mini", "network", "multiwan"}, cbi("multiwan/multiwanmini", {autoapply=true}), _("Multi-WAN")) + page.dependent = true +end +function multiwan_status() + local nfs = require "nixio.fs" + local cachefile = "/tmp/.mwan/cache" + + local rv = { } + + cachefile = nfs.readfile(cachefile) + if cachefile then + local ntm = require "luci.model.network".init() + _, _, wan_if_map = string.find(cachefile, "wan_if_map=\"([^\"]*)\"") + _, _, wan_fail_map = string.find(cachefile, "wan_fail_map=\"([^\"]*)\"") + _, _, wan_recovery_map = string.find(cachefile, "wan_recovery_map=\"([^\"]*)\"") + + rv.wans = { } + wansid = {} + + for wanname, wanifname in string.gfind(wan_if_map, "([^%[]+)%[([^%]]+)%]") do + local wanlink = ntm:get_interface(wanifname) + wanlink = wanlink and wanlink:get_network() + wanlink = wanlink and wanlink:adminlink() or "#" + wansid[wanname] = #rv.wans + 1 + rv.wans[wansid[wanname]] = { name = wanname, link = wanlink, ifname = wanifname, status = "ok", count = 0 } + end + + for wanname, failcount in string.gfind(wan_fail_map, "([^%[]+)%[([^%]]+)%]") do + if failcount == "x" then + rv.wans[wansid[wanname]].status = "ko" + else + rv.wans[wansid[wanname]].status = "failing" + rv.wans[wansid[wanname]].count = failcount + end + end + + for wanname, recoverycount in string.gfind(wan_recovery_map, "([^%[]+)%[([^%]]+)%]") do + rv.wans[wansid[wanname]].status = "recovering" + rv.wans[wansid[wanname]].count = recoverycount + end + end + + luci.http.prepare_content("application/json") + luci.http.write_json(rv) +end diff --git a/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua b/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua new file mode 100644 index 0000000000..586b6307de --- /dev/null +++ b/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua @@ -0,0 +1,155 @@ +require("luci.tools.webadmin") + +m = Map("multiwan", translate("Multi-WAN"), + translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover.")) + +s = m:section(NamedSection, "config", "multiwan", "") + +e = s:option(Flag, "enabled", translate("Enable")) +e.rmempty = false +e.default = e.enabled + +function e.write(self, section, value) + if value == "0" then + os.execute("/etc/init.d/multiwan stop") + else + os.execute("/etc/init.d/multiwan enable") + end + Flag.write(self, section, value) +end + +s = m:section(TypedSection, "interface", translate("WAN Interfaces"), + translate("Health Monitor detects and corrects network changes and failed connections.")) +s.addremove = true + +weight = s:option(ListValue, "weight", translate("Load Balancer Distribution")) +weight:value("10", "10") +weight:value("9", "9") +weight:value("8", "8") +weight:value("7", "7") +weight:value("6", "6") +weight:value("5", "5") +weight:value("4", "4") +weight:value("3", "3") +weight:value("2", "2") +weight:value("1", "1") +weight:value("disable", translate("None")) +weight.default = "10" +weight.optional = false +weight.rmempty = false + +interval = s:option(ListValue, "health_interval", translate("Health Monitor Interval")) +interval:value("disable", translate("Disable")) +interval:value("5", "5 sec.") +interval:value("10", "10 sec.") +interval:value("20", "20 sec.") +interval:value("30", "30 sec.") +interval:value("60", "60 sec.") +interval:value("120", "120 sec.") +interval.default = "10" +interval.optional = false +interval.rmempty = false + +icmp_hosts = s:option(Value, "icmp_hosts", translate("Health Monitor ICMP Host(s)")) +icmp_hosts:value("disable", translate("Disable")) +icmp_hosts:value("dns", "DNS Server(s)") +icmp_hosts:value("gateway", "WAN Gateway") +icmp_hosts.default = "dns" +icmp_hosts.optional = false +icmp_hosts.rmempty = false + +timeout = s:option(ListValue, "timeout", translate("Health Monitor ICMP Timeout")) +timeout:value("1", "1 sec.") +timeout:value("2", "2 sec.") +timeout:value("3", "3 sec.") +timeout:value("4", "4 sec.") +timeout:value("5", "5 sec.") +timeout:value("10", "10 sec.") +timeout.default = "3" +timeout.optional = false +timeout.rmempty = false + +fail = s:option(ListValue, "health_fail_retries", translate("Attempts Before WAN Failover")) +fail:value("1", "1") +fail:value("3", "3") +fail:value("5", "5") +fail:value("10", "10") +fail:value("15", "15") +fail:value("20", "20") +fail.default = "3" +fail.optional = false +fail.rmempty = false + +recovery = s:option(ListValue, "health_recovery_retries", translate("Attempts Before WAN Recovery")) +recovery:value("1", "1") +recovery:value("3", "3") +recovery:value("5", "5") +recovery:value("10", "10") +recovery:value("15", "15") +recovery:value("20", "20") +recovery.default = "5" +recovery.optional = false +recovery.rmempty = false + +failover_to = s:option(ListValue, "failover_to", translate("Failover Traffic Destination")) +failover_to:value("disable", translate("None")) +luci.tools.webadmin.cbi_add_networks(failover_to) +failover_to:value("fastbalancer", translate("Load Balancer(Performance)")) +failover_to:value("balancer", translate("Load Balancer(Compatibility)")) +failover_to.default = "balancer" +failover_to.optional = false +failover_to.rmempty = false + +dns = s:option(Value, "dns", translate("DNS Server(s)")) +dns:value("auto", translate("Auto")) +dns.default = "auto" +dns.optional = false +dns.rmempty = true + +s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"), + translate("Configure rules for directing outbound traffic through specified WAN Uplinks.")) +s.template = "cbi/tblsection" +s.anonymous = true +s.addremove = true + +src = s:option(Value, "src", translate("Source Address")) +src.rmempty = true +src:value("", translate("all")) +luci.tools.webadmin.cbi_add_knownips(src) + +dst = s:option(Value, "dst", translate("Destination Address")) +dst.rmempty = true +dst:value("", translate("all")) +luci.tools.webadmin.cbi_add_knownips(dst) + +proto = s:option(Value, "proto", translate("Protocol")) +proto:value("", translate("all")) +proto:value("tcp", "TCP") +proto:value("udp", "UDP") +proto:value("icmp", "ICMP") +proto.rmempty = true + +ports = s:option(Value, "ports", translate("Ports")) +ports.rmempty = true +ports:value("", translate("all", translate("all"))) + +wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink")) +luci.tools.webadmin.cbi_add_networks(wanrule) +wanrule:value("fastbalancer", translate("Load Balancer(Performance)")) +wanrule:value("balancer", translate("Load Balancer(Compatibility)")) +wanrule.default = "fastbalancer" +wanrule.optional = false +wanrule.rmempty = false + +s = m:section(NamedSection, "config", "", "") +s.addremove = false + +default_route = s:option(ListValue, "default_route", translate("Default Route")) +luci.tools.webadmin.cbi_add_networks(default_route) +default_route:value("fastbalancer", translate("Load Balancer(Performance)")) +default_route:value("balancer", translate("Load Balancer(Compatibility)")) +default_route.default = "balancer" +default_route.optional = false +default_route.rmempty = false + +return m diff --git a/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua b/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua new file mode 100644 index 0000000000..d38974549c --- /dev/null +++ b/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua @@ -0,0 +1,67 @@ +require("luci.tools.webadmin") + +m = Map("multiwan", translate("Multi-WAN"), + translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover.")) + +s = m:section(NamedSection, "config", "multiwan", "") + +e = s:option(Flag, "enabled", translate("Enable")) +e.rmempty = false +e.default = "1" + +function e.write(self, section, value) + if value == "0" then + os.execute("/etc/init.d/multiwan stop") + else + os.execute("/etc/init.d/multiwan enable") + end + Flag.write(self, section, value) +end + +s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"), + translate("Configure rules for directing outbound traffic through specified WAN Uplinks.")) +s.template = "cbi/tblsection" +s.anonymous = true +s.addremove = true + +src = s:option(Value, "src", translate("Source Address")) +src.rmempty = true +src:value("", translate("all")) +luci.tools.webadmin.cbi_add_knownips(src) + +dst = s:option(Value, "dst", translate("Destination Address")) +dst.rmempty = true +dst:value("", translate("all")) +luci.tools.webadmin.cbi_add_knownips(dst) + +proto = s:option(Value, "proto", translate("Protocol")) +proto:value("", translate("all")) +proto:value("tcp", "TCP") +proto:value("udp", "UDP") +proto:value("icmp", "ICMP") +proto.rmempty = true + +ports = s:option(Value, "ports", translate("Ports")) +ports.rmempty = true +ports:value("", translate("all", translate("all"))) + +wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink")) +luci.tools.webadmin.cbi_add_networks(wanrule) +wanrule:value("fastbalancer", translate("Load Balancer(Performance)")) +wanrule:value("balancer", translate("Load Balancer(Compatibility)")) +wanrule.default = "fastbalancer" +wanrule.optional = false +wanrule.rmempty = false + +s = m:section(NamedSection, "config", "", "") +s.addremove = false + +default_route = s:option(ListValue, "default_route", translate("Default Route")) +luci.tools.webadmin.cbi_add_networks(default_route) +default_route:value("fastbalancer", translate("Load Balancer(Performance)")) +default_route:value("balancer", translate("Load Balancer(Compatibility)")) +default_route.default = "balancer" +default_route.optional = false +default_route.rmempty = false + +return m diff --git a/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm b/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm new file mode 100644 index 0000000000..79c04539ff --- /dev/null +++ b/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm @@ -0,0 +1 @@ +<%+multiwan_status%> diff --git a/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm b/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm new file mode 100644 index 0000000000..8c4127b237 --- /dev/null +++ b/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm @@ -0,0 +1,71 @@ +<script type="text/javascript">//<![CDATA[ + XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "multiwan", "status")%>', null, + function(x, st) + { + var tx = document.getElementById('multiwan_status_text'); + if (tx) + { + if (st && st.wans) + { + var temp = ''; + + for( var i = 0; i < st.wans.length; i++ ) + { + var stat = '<%:Unknown%>'; + var cssc = ''; + + switch (st.wans[i].status) + { + case 'ok': + stat = '<%:OK%>'; + cssc = 'wanok'; + break; + + case 'ko': + stat = '<%:KO%>'; + cssc = 'wanko'; + break; + + case 'recovering': + stat = String.format('<%:Recovering%>(%d)', st.wans[i].count); + cssc = 'wanrecov'; + break; + + case 'failing': + stat = String.format('<%:Failing%>(%d)', st.wans[i].count); + cssc = 'wanfail'; + break; + } + + temp += String.format( + '<span class="%s"><strong>%s (<a href="%q">%s</a>) :</strong> %s</span>', + cssc, st.wans[i].name, st.wans[i].link, st.wans[i].ifname, stat + ); + } + + tx.innerHTML = temp; + } + else + { + tx.innerHTML = ''; + } + } + } + ); +//]]></script> + +<style type="text/css"> + .wanok { background-color: rgb(144, 240, 144); } + .wanko { background-color: rgb(240, 144, 144); } + .wanrecov { background-color: rgb(240, 240, 0); } + .wanfail { background-color: rgb(255, 165, 0); } + .wanko, .wanok, .wanrecov, .wanfail { + padding: 0.4em; + margin: 0.4em; + } +</style> + +<fieldset class="cbi-section"> + <legend><%:Multi-WAN Status%></legend> + <div id="multiwan_status_text" style="text-align:center;"><em><%:Collecting data...%></em></div> +</fieldset> |