-- PrivateRouter Easy Mesh
local m , s , o
local sys = require " luci.sys "
local uci = require " luci.model.uci " . cursor ( )
m = Map ( " easymesh " ,
translate ( " Easy Mesh WiFi Setup " ) ,
translate ( " Powered by Batman-adv (Better Approach To Mobile Adhoc Networking - Advanced). First setup your Mesh Gateway Server then setup the nodes. When configuring a Mesh Node, first activate your mesh WiFi on the radio device and establish a connection. Then enable it as a DHCP node. The default settings are typically adequate for most Mesh WiFi configurations. " )
.. " <br/> " .. translate ( " Official website: " ) .. ' <a href="https://www.open-mesh.org/projects/batman-adv/wiki" target="_blank">https://www.open-mesh.org/projects/batman-adv/wiki</a> '
)
function detect_Node ( )
local data = { }
local lps = luci.util . execi ( " batctl n 2>/dev/null | tail +2 | sed 's/^[ ][ ]*//g' | sed 's/[ ][ ]*/ /g' | sed 's/$/ /g' " )
for value in lps do
local row = { }
local pos = string.find ( value , " " )
local IFA = string.sub ( value , 1 , pos - 1 )
local value = string.sub ( value , pos + 1 , string.len ( value ) )
pos = string.find ( value , " " )
local pos = string.find ( value , " " )
local Neighbora = string.sub ( value , 1 , pos - 1 )
local value = string.sub ( value , pos + 1 , string.len ( value ) )
pos = string.find ( value , " " )
local pos = string.find ( value , " " )
local lastseena = string.sub ( value , 1 , pos - 1 )
local value = string.sub ( value , pos + 1 , string.len ( value ) )
pos = string.find ( value , " " )
row [ " IF " ] = IFA
row [ " Neighbor " ] = Neighbora
row [ " lastseen " ] = lastseena
table.insert ( data , row )
end
return data
end
local Nodes = luci.sys . exec ( " batctl n 2>/dev/null| tail +3 | wc -l " )
local Node = detect_Node ( )
v = m : section ( Table , Node , " " , " <b> " .. translate ( " Active node " ) .. " " .. Nodes .. " </b> " )
v : option ( DummyValue , " IF " , translate ( " IF " ) )
v : option ( DummyValue , " Neighbor " , translate ( " Neighbor " ) )
v : option ( DummyValue , " lastseen " , translate ( " lastseen " ) )
-- Basic
s = m : section ( TypedSection , " easymesh " , translate ( " Mesh Gateway & Node WiFi Settings " ) , translate ( " Choose Mesh Gateway or Mesh Node WiFi Settings: Begin by completing this section on your mesh server and nodes. Ensure each radio's WiFi network name is consistent. For example: easymesh_AC, easymesh_N. " ) )
s.anonymous = true
---- Eanble
o = s : option ( Flag , " enabled " , translate ( " Enable " ) , translate ( " Enable or disable Easy Mesh " ) )
o.default = 0
o.rmempty = false
-- 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
o = s : option ( ListValue , " role " , translate ( " Mesh Device Type " ) )
o : value ( " off " , translate ( " Mesh Node " ) )
o : value ( " server " , translate ( " Mesh Server " ) )
o : value ( " client " , translate ( " Mesh Client " ) )
o.rmempty = false
apRadio = s : option ( ListValue , " apRadio " , translate ( " Mesh Radio device " ) , translate ( " The WiFi radio device Mesh will use " ) )
uci : foreach ( " wireless " , " wifi-device " ,
function ( s )
apRadio : value ( s [ ' .name ' ] )
end )
apRadio : value ( " all " , translate ( " ALL " ) )
o.default = " radio0 "
o.rmempty = false
---- mesh
o = s : option ( Value , " mesh_id " , translate ( " Mesh ID " ) )
o.default = " easymesh_AC "
o.description = translate ( " Mesh ID " )
enable = s : option ( Flag , " encryption " , translate ( " Encryption " ) , translate ( " " ) )
enable.default = 0
enable.rmempty = false
o = s : option ( Value , " key " , translate ( " Key " ) )
o.default = " easymesh "
o : depends ( " encryption " , 1 )
---- kvr
enable = s : option ( Flag , " kvr " , translate ( " K/V/R " ) , translate ( " " ) )
enable.default = 1
enable.rmempty = false
o = s : option ( Value , " mobility_domain " , translate ( " Mobility Domain " ) , translate ( " 4-character hexadecimal ID " ) )
o.default = " 4f57 "
o.datatype = " and(hexstring,rangelength(4,4)) "
o : depends ( " kvr " , 1 )
o = s : option ( Value , " rssi_val " , translate ( " Threshold for an good RSSI " ) )
o.default = " -60 "
o.atatype = " range(-1,-120) "
o : depends ( " kvr " , 1 )
o = s : option ( Value , " low_rssi_val " , translate ( " Threshold for an bad RSSI " ) )
o.default = " -88 "
o.atatype = " range(-1,-120) "
o : depends ( " kvr " , 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
enable = s : option ( Flag , " ap_mode " , translate ( " Enable as DHCP Mesh Node " ) , translate ( " Important: Setup your mesh WiFi network before enabling. " ) )
enable.default = 0
enable.rmempty = false
---- ip address
--o = s:option(Value, "ipaddr", translate("Static IP Address"))
--o.default = "192.168.8.2"
--o.datatype = "ip4addr"
--o:depends("ap_mode", 1)
o = s : option ( Value , " dns " , translate ( " Mesh Gateway IP Address " ) )
o.default = " 192.168.8.1 "
o.datatype = " ip4addr "
o : depends ( " ap_mode " , 1 )
so = s : option ( Value , " netmask " , translate ( " IPv4 netmask " ) )
o.default = " 255.255.255.0 "
o.datatype = " ip4addr "
o : depends ( " ap_mode " , 1 )
o = s : option ( Value , " gateway " , translate ( " Set Hostname for this Mesh Node " ) )
o.default = " node2 "
o : value ( " node2 " , " node2 " )
o : value ( " node3 " , " node3 " )
o : value ( " node4 " , " node4 " )
o : value ( " node5 " , " node5 " )
o : value ( " node6 " , " node6 " )
o : value ( " node7 " , " node7 " )
o : value ( " node8 " , " node8 " )
o : value ( " node9 " , " node9 " )
o.datatype = " string "
o : depends ( " ap_mode " , 1 )
-- MESH Node Control: apply mesh settings
ctrl = m : section ( TypedSection , " easymesh " , " Click Save Then Enable or Disable Your Mesh WiFi settings " )
ctrl.anonymous = true
ctrl.addremove = false
btnStart = ctrl : option ( Button , " _btn_start " , translate ( " Enable Easy Mesh " ) )
function btnStart . write ( )
io.popen ( " /root/easymesh/easymesh.sh " )
end
btnStop = ctrl : option ( Button , " _btn_stop " , translate ( " Disable Easy Mesh " ) )
function btnStop . write ( )
io.popen ( " /root/easymesh/easymesh.sh " )
end
function o . write ( self , section , value )
Flag.write ( self , section , value )
-- Run init start
-- luci.sys.call("uci commit")
-- luci.sys.call("/etc/init.d/easymesh start &")
end
return m