gluon/package/gluon-mesh-olsrd/luasrc/lib/gluon/upgrade/360-gluon-mesh-olsrd-setup-intf
2023-01-20 03:01:24 +01:00

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')