164 lines
3.7 KiB
Lua
Executable File
164 lines
3.7 KiB
Lua
Executable File
#!/usr/bin/lua
|
|
|
|
local uci = require('simple-uci').cursor()
|
|
local site = require 'gluon.site'
|
|
local util = require 'gluon.util'
|
|
local wireless = require 'gluon.wireless'
|
|
local mesh_interfaces = util.get_role_interfaces(uci, 'mesh')
|
|
local uplink_interfaces = util.get_role_interfaces(uci, 'uplink')
|
|
local client_interfaces = util.get_role_interfaces(uci, 'client')
|
|
|
|
local mesh_interfaces_uplink = {}
|
|
local mesh_interfaces_client = {}
|
|
local mesh_interfaces_other = {}
|
|
for _, iface in ipairs(mesh_interfaces) do
|
|
if util.contains(uplink_interfaces, iface) then
|
|
table.insert(mesh_interfaces_uplink, iface)
|
|
elseif util.contains(client_interfaces, iface) then
|
|
table.insert(mesh_interfaces_client, iface)
|
|
else
|
|
table.insert(mesh_interfaces_other, iface)
|
|
end
|
|
end
|
|
|
|
local intf = {
|
|
wired_mesh = {},
|
|
vpn_mesh = {},
|
|
radio_mesh = {},
|
|
}
|
|
|
|
intf.all_intfs = {}
|
|
|
|
for _, l in ipairs({ intf.wired_mesh, intf.vpn_mesh, intf.radio_mesh }) do
|
|
for _, n in ipairs(l) do
|
|
table.insert(intf.all_intfs, n)
|
|
end
|
|
end
|
|
|
|
-- get all mesh radios and mesh lans and then add them to olsrd
|
|
wireless.foreach_radio(uci, function(radio, _, _)
|
|
local radio_name = radio['.name']
|
|
table.insert(intf.radio_mesh, 'mesh_' .. radio_name)
|
|
end)
|
|
|
|
if pcall(function() require 'gluon.mesh-vpn' end) then
|
|
local vpn_core = require 'gluon.mesh-vpn'
|
|
|
|
if vpn_core.enabled() then
|
|
-- mesh_vpn is a interface that has the right ifname
|
|
-- we can't use mesh-vpn (dash instead of underscore) since it's not a uci interface
|
|
table.insert(intf.vpn_mesh, 'mesh_vpn')
|
|
end
|
|
end
|
|
|
|
table.insert(intf.wired_mesh, 'loopback')
|
|
|
|
local has_uplink_mesh = false
|
|
local has_other_mesh = false
|
|
|
|
for _,i in pairs(mesh_interfaces) do
|
|
if util.contains(uplink_interfaces, i) then
|
|
has_uplink_mesh = true
|
|
else
|
|
has_other_mesh = true
|
|
end
|
|
end
|
|
|
|
if has_uplink_mesh then
|
|
table.insert(intf.wired_mesh, 'mesh_uplink')
|
|
end
|
|
|
|
if has_other_mesh then
|
|
table.insert(intf.wired_mesh, 'mesh_other')
|
|
end
|
|
|
|
uci:delete_all('olsrd2', 'interface')
|
|
|
|
if site.mesh.olsrd.v2.enable(true) then
|
|
os.execute('/etc/init.d/olsrd2 enable')
|
|
|
|
local addrs = { }
|
|
local lan = { }
|
|
local cfg = site.mesh.olsrd.v2
|
|
local config = uci:get_first("olsrd2", "olsrv2")
|
|
|
|
-- set global config
|
|
local olsr2Config = {
|
|
failfast = 'no',
|
|
pidfile = '/var/run/olsrd2.pid',
|
|
lockfile = '/var/lock/olsrd2'
|
|
}
|
|
|
|
local extraConf = cfg.config()
|
|
if extraConf then
|
|
for k, _ in pairs(extraConf) do
|
|
olsr2Config[k] = extraConf[k]
|
|
end
|
|
end
|
|
|
|
uci:delete_all('olsrd2', 'global')
|
|
uci:section('olsrd2', 'global', 'global', olsr2Config)
|
|
|
|
uci:delete_all('olsrd2', 'telnet')
|
|
uci:section('olsrd2', 'telnet', 'telnet', {
|
|
|
|
})
|
|
|
|
uci:delete_all('olsrd2', 'http')
|
|
uci:section('olsrd2', 'http', 'http', {
|
|
|
|
})
|
|
|
|
if cfg.lan() then
|
|
lan = cfg.lan()
|
|
end
|
|
|
|
table.insert(addrs, '-127.0.0.1/8')
|
|
table.insert(addrs, '-::1/128')
|
|
|
|
table.insert(addrs, 'default_accept')
|
|
|
|
uci:set("olsrd2", config, "originator", addrs)
|
|
uci:set("olsrd2", config, "lan", lan)
|
|
|
|
if #intf.wired_mesh then
|
|
uci:section('olsrd2', 'interface', 'wired_mesh', {
|
|
ifname = intf.wired_mesh,
|
|
bindto = addrs,
|
|
})
|
|
end
|
|
|
|
if #intf.vpn_mesh then
|
|
uci:section('olsrd2', 'interface', 'vpn_mesh', {
|
|
ifname = intf.vpn_mesh,
|
|
bindto = addrs,
|
|
})
|
|
end
|
|
|
|
if #intf.radio_mesh then
|
|
uci:section('olsrd2', 'interface', 'radio_mesh', {
|
|
ifname = intf.radio_mesh,
|
|
bindto = addrs,
|
|
})
|
|
end
|
|
|
|
uci:section('olsrd2', 'interface', 'loopback', {
|
|
ifname = { 'loopback' },
|
|
bindto = addrs,
|
|
})
|
|
|
|
uci:section('firewall', 'rule', 'allow_olsr2_mesh', {
|
|
src = 'mesh',
|
|
dest_port = '269',
|
|
proto = 'udp',
|
|
target = 'ACCEPT',
|
|
})
|
|
else
|
|
-- site.mesh.olsrd.v2.enable false
|
|
os.execute('/etc/init.d/olsrd2 disable')
|
|
uci:delete('firewall', 'allow_olsr2_mesh')
|
|
end
|
|
uci:save('olsrd2')
|
|
uci:save('firewall')
|
|
uci:save('network')
|