Merge branch 'main' into ben_main

main
Jason Hawks 10 months ago
commit 9912670259

@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for easymesh LUCI_TITLE:=LuCI Support for easymesh
LUCI_DEPENDS:= +kmod-cfg80211 +batctl-default +kmod-batman-adv +dawn +bash LUCI_DEPENDS:= +kmod-cfg80211 +batctl-default +kmod-batman-adv +dawn +bash
PKG_VERSION:=2.8.9 PKG_VERSION:=2.8.10
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk

@ -31,89 +31,52 @@ function detect_Node()
end end
function get_verbose_hw_info(iface) local function get_verbose_hw_info(iface)
local type = iwinfo.type(iface) local type = iwinfo.type(iface)
if not type then if not type then return "Generic" end
return "Generic"
end
local driver = iwinfo[type] local driver = iwinfo[type]
if not driver then if not driver then return "Driver not supported" end
return "Driver not supported"
end
local hw_name = driver.hardware_name and driver.hardware_name(iface) local hw_name = driver.hardware_name and driver.hardware_name(iface) or "Unknown hardware"
if not hw_name or hw_name == "" then local hw_modes = driver.hwmodelist and driver.hwmodelist(iface) or {}
hw_name = "Unknown hardware"
end
local hw_modes = driver.hwmodelist and driver.hwmodelist(iface)
local supported_modes = {} local supported_modes = {}
if hw_modes then
for mode, supported in pairs(hw_modes) do for mode, supported in pairs(hw_modes) do
if supported then if supported then
table.insert(supported_modes, mode) supported_modes[#supported_modes + 1] = mode
end
end end
end end
if #supported_modes == 0 then return hw_name .. " (" .. (#supported_modes > 0 and table.concat(supported_modes, "/") or "No mode information") .. ")"
supported_modes_str = "No mode information"
else
supported_modes_str = table.concat(supported_modes, "/")
end
local verbose_info = hw_name .. " (" .. supported_modes_str .. ")"
return verbose_info
end end
local Nodes = luci.sys.exec("batctl n 2>/dev/null| tail +3 | wc -l") local Nodes = luci.sys.exec("batctl n 2>/dev/null| tail +3 | wc -l")
local Node = detect_Node() local Node = detect_Node()
v = m:section(Table, Node, translate("Active Nodes") ,"<b>" .. translate("Number of Active Nodes: ") .. Nodes .. "</b>") v = m:section(Table, Node, translate("Mesh Status") ,"<b>" .. translate("Number of Active Nodes: ") .. Nodes .. "</b>")
v:option(DummyValue, "IF", translate("Interface")) v:option(DummyValue, "IF", translate("Interface"))
v:option(DummyValue, "Neighbor", translate("Neighbor Nodes")) v:option(DummyValue, "Neighbor", translate("Neighbor Nodes"))
v:option(DummyValue, "lastseen", translate("Last Seen Timestamp")) v:option(DummyValue, "lastseen", translate("Last Seen Timestamp"))
-- Basic
s = m:section(TypedSection, "easymesh", translate("Mesh Settings")) s = m:section(TypedSection, "easymesh", translate("Mesh Settings"))
s.anonymous = true s.anonymous = true
-- Connection Type Dropdown
--o = s:option(ListValue, "backbone", translate("Connection Type"), translate("Choose if Node or Gateway is connected to internet by LAN or WiFi"))
--o:value("lan", translate("LAN"))
--o:value("wifi", translate("WiFi"))
--o.default = "lan"
--o.rmempty = false
-- AP Name
--apn = s:option(Value, "apname", translate("AP Name"), translate("Enter the client WiFi AP name"))
--apn:depends("backbone", "wifi")
--apn.placeholder = "easymesh_AC"
--apn.rmempty = true
-- AP Password
--app = s:option(Value, "appass", translate("AP Password"), translate("Enter the client WiFi AP password"))
--app:depends("backbone", "wifi")
--app.password = true
--app.placeholder = "easymesh"
--app.rmempty = true
s:tab("setup", translate("Basic Setup")) s:tab("setup", translate("Basic Setup"))
s:tab("apmode", translate("AP Mode")) s:tab("apmode", translate("AP Mode"))
s:tab("advanced", translate("Advanced Settings")) s:tab("advanced", translate("Advanced Settings"))
---- Eanble ---- Eanble
o = s:taboption("setup", Flag, "enabled", translate("Enable Mesh Network"), translate("Toggle this switch to activate or deactivate the Mesh Network on this device according to the settings specified in this configuration. Make sure to configure all necessary settings before enabling the Mesh Network. Changes will apply when you click Save and Apply")) o = s:taboption("setup", Flag, "enabled", translate("Enable Mesh Networking"), translate('<p style="text-align: justify; padding: 0;">Toggle this switch to activate or deactivate the Mesh Network on this device according to the settings specified in this configuration. Make sure to configure all necessary settings before enabling the Mesh Network. </p><p style="text-align: justify; padding: 0;"><strong>Changes will apply when you click Save and Apply</strong></p>'))
o.default = 0 o.default = 0
-- Move basic settings under the "Setup" tab -- Move basic settings under the "Setup" tab
o = s:taboption("setup", ListValue, "role", translate("Mesh Mode"), translate('<p style="text-align: justify; padding: 0;"><strong>Choose the role this device will play in your mesh network. There are two options available:</strong></p> <p style="text-align: justify; padding: 0;"><strong>1. Server:</strong> If you select this option, this device will act as the Mesh Gateway Server. The server manages the routing of data in the network and handles connections to the internet. It is the central point of your mesh network.</p> <p style="text-align: justify; padding: 0;"><strong>2. Node:</strong> The device functions as a Mesh Node if this option is selected. Nodes connect to the Mesh Gateway Server and other nodes to extend the range of the network. Nodes can also route traffic between each other to increase network efficiency.</p> <p style="text-align: justify; padding: 0;"><strong>Remember to set up the Mesh Gateway Server first before setting up the nodes.</strong></p>')) o = s:taboption("setup", ListValue, "role", translate("Mesh Mode"), translate('<p style="text-align: justify; padding: 0;"><strong>Choose the role this device will play in your mesh network. There are two options available:</strong></p> <p style="text-align: justify; padding: 0;"><strong>1. Server:</strong> If you select this option, this device will act as the Mesh Gateway Server. The server manages the routing of data in the network and handles connections to the internet. It is the central point of your mesh network.</p> <p style="text-align: justify; padding: 0;"><strong>2. Node:</strong> The device functions as a Mesh Node if this option is selected. Nodes connect to the Mesh Gateway Server and other nodes to extend the range of the network. Nodes can also route traffic between each other to increase network efficiency.</p> <p style="text-align: justify; padding: 0;"><strong>Remember to set up the Mesh Gateway Server first before setting up the nodes.</strong></p>'))
o:value("server", translate("Server")) o:value("server", translate("Server"))
o:value("off", translate("Node")) o:value("off", translate("Node"))
o:value("client", translate("Client"))
o.default = "server" o.default = "server"
--o:value("client", translate("Client (advanced)"))
apRadio = s:taboption("setup", MultiValue, "apRadio", translate("Mesh Radio(s)"), translate('<p style="text-align: justify; padding: 0;">Select one or multiple radio interfaces to be used for the mesh network. Each selected radio interface will be configured to participate in the mesh network, extending its range and improving its resilience. By using multiple radios, your mesh network can balance the network load and handle a larger number of connected devices.</p>')) apRadio = s:taboption("setup", MultiValue, "apRadio", translate("Mesh Radio(s)"), translate('<p style="text-align: justify; padding: 0;">Select one or multiple radio interfaces to be used for the mesh network. Each selected radio interface will be configured to participate in the mesh network, extending its range and improving its resilience. By using multiple radios, your mesh network can balance the network load and handle a larger number of connected devices.</p><strong><p style="text-align: justify; padding: 0;">Ensure the radios you select support mesh networking</p></strong>'))
uci:foreach("wireless", "wifi-device", uci:foreach("wireless", "wifi-device",
function(s) function(s)
@ -125,54 +88,37 @@ uci:foreach("wireless", "wifi-device",
apRadio.default = "radio0" apRadio.default = "radio0"
apRadio.widget = "select" apRadio.widget = "select"
o = s:taboption("setup", Value, "mesh_id", translate("Mesh SSID")) o = s:taboption("setup", Value, "mesh_id", translate("Mesh Network SSID"), translate('<p style="text-align: justify; padding: 0;"><strong>Ensure that the SSID is the same across all the servers/nodes in your mesh network.</strong></p>'))
o.default = "easymesh_AC" o.default = "easymesh_AC"
encryption = s:taboption("setup", Flag, "encryption", translate("Enable Password"), translate("")) encryption = s:taboption("setup", Flag, "encryption", translate("Password Protection"), translate('<p style="text-align: justify; padding: 0;"><strong>Enable this switch to require a password to join your Mesh Network.</strong></p>'))
encryption.default = 0 encryption.default = 0
o = s:taboption("setup", Value, "key", translate("Mesh Password")) o = s:taboption("setup", Value, "key", translate("Mesh Password"))
o.default = "easymesh" o.default = "easymesh"
o:depends("encryption", 1) o:depends("encryption", 1)
o.password = true o.password = true
o.datatype = "minlength(8)"
enable_kvr = s:taboption("advanced", Flag, "kvr", translate("K/V/R"), translate("Enable Key Value Roaming")) btnReapply = s:taboption("setup", Button, "_btn_reapply", translate("Reapply EasyMesh Settings"), translate('<p style="text-align: justify; padding: 0;"><strong>Use this button to apply/reapply EasyMesh configuration after you Save & Apply.</p></strong>'))
function btnReapply.write()
io.popen("/easymesh/easymesh.sh &")
end
enable_kvr = s:taboption("advanced", Flag, "kvr", translate("K/V/R"), translate('<p style="text-align: justify; padding: 0;"><strong>Leave these settings as default unless you know what you\'re doing</p></strong>'))
enable_kvr.default = 1 enable_kvr.default = 1
mobility_domain = s:taboption("advanced", Value, "mobility_domain", translate("Mobility Domain"), translate("4-character hexadecimal ID")) mobility_domain = s:taboption("advanced", Value, "mobility_domain", translate("Mobility Domain"))
mobility_domain.default = "4f57" mobility_domain.default = "4f57"
--mobility_domain.datatype = "and(hexstring,rangelength(4,4))" mobility_domain.datatype = "and(hexstring,rangelength(4,4))"
rssi_val = s:taboption("advanced", Value, "rssi_val", translate("Threshold for a good RSSI")) rssi_val = s:taboption("advanced", Value, "rssi_val", translate("Good RSSI Threshold"))
rssi_val.default = "-60" rssi_val.default = "-60"
--rssi_val.datatype = "range(-1,-120)" rssi_val.datatype = "range(-120,-1)"
low_rssi_val = s:taboption("advanced", Value, "low_rssi_val", translate("Bad RSSI Threshold"))
low_rssi_val = s:taboption("advanced", Value, "low_rssi_val", translate("Threshold for a bad RSSI"))
low_rssi_val.default = "-88" low_rssi_val.default = "-88"
--low_rssi_val.datatype = "range(-1,-120)" low_rssi_val.datatype = "range(-120,-1)"
---- Apply MESH settings
--ctrl = m:section(TypedSection, "easymesh", "Apply Mesh WiFi Settings to Server or Node")
--ctrl.anonymous = true
--ctrl.addremove = false
----btnStop = ctrl:option(Button, "_btn_start", translate("Apply Mesh WiFi Settings"))
--function btnStop.write()
-- io.popen("/etc/init.d/easymesh start")
--end
---- 802.11F
--enable = s:option(Flag, "iapp", translate("inter-access point protocol"), translate("Wireless Access Points (APs) running on different vendors can communicate with each other"))
--enable.default = 0
--enable.rmempty = false
-- NodeMode
-- s = m:section(TypedSection, "easymesh", translate("Enable Router as DHCP Mesh Node"), translate("Set up Easy Mesh WiFi on your server and nodes first. All mesh nodes will utilize your mesh server for DHCP. "))
-- s.anonymous = true
---- ap_mode ---- ap_mode
o = s:taboption("apmode", Value, "hostname", translate("Node Hostname")) o = s:taboption("apmode", Value, "hostname", translate("Node Hostname"))
@ -186,7 +132,7 @@ o:value("node7", "node7")
o:value("node8", "node8") o:value("node8", "node8")
o:value("node9", "node9") o:value("node9", "node9")
o.datatype = "string" o.datatype = "string"
o:depends("role", "off") o:depends({role="off",role="client"})
-- IP Mode (DHCP or Static) -- IP Mode (DHCP or Static)
ipmode = s:taboption("apmode", ListValue, "ipmode", translate("IP Mode"), translate("Choose if the node uses DHCP or a Static IP")) ipmode = s:taboption("apmode", ListValue, "ipmode", translate("IP Mode"), translate("Choose if the node uses DHCP or a Static IP"))
@ -225,13 +171,4 @@ function btnAPMode.write()
end end
btnAPMode:depends("role", "off") btnAPMode:depends("role", "off")
m.on_before_apply = function(self)
local enabled = m:formvalue("cbid.easymesh.config.enabled")
if enabled and enabled == "1" then
luci.sys.call("/easymesh/easymesh.sh enable &")
else
luci.sys.call("/easymesh/easymesh.sh disable &")
end
end
return m return m

@ -23,7 +23,7 @@ set_apmode() {
fi fi
done done
if [ $(uci -q get easymesh.config.ipmode) == "static" ]; then if [ "$(uci -q get easymesh.config.ipmode)" == "static" ]; then
# Set static IP # Set static IP
uci set network.lan.proto='static' uci set network.lan.proto='static'
uci set network.lan.ipaddr=$(uci -q get easymesh.config.ipaddr) uci set network.lan.ipaddr=$(uci -q get easymesh.config.ipaddr)
@ -492,19 +492,18 @@ disable_easymesh() {
uci del easymesh.config.running uci del easymesh.config.running
} }
if [ "$1" = "enable" ]; then if [ "$1" = "dumbap" ]; then
enable_easymesh
exit 0
elif [ "$1" = "disable" ]; then
disable_easymesh
exit 0
elif [ "$1" = "dumbap" ]; then
set_apmode set_apmode
exit 0 exit 0
elif [ "$1" = "undumb" ]; then elif [ "$1" = "undumb" ]; then
disable_apmode disable_apmode
exit 0 exit 0
# If no params passed, we disable or enable easymesh based on config
else else
echo "Invalid argument. Please use 'start', 'stop' or 'dumbap'" # Check if easymesh is enabled
exit 1 if [ "$(uci -q get easymesh.config.enabled)" = 1 ]; then
enable_easymesh
else
disable_easymesh
fi
fi fi

Loading…
Cancel
Save