gluon-mesh-vpn-fastd: extend site configuration to allow multiple and nested peer groups
This commit is contained in:
parent
531520032c
commit
00c47f2912
@ -90,6 +90,7 @@
|
||||
-- List of crypto-methods to use.
|
||||
methods = {'salsa2012+umac'},
|
||||
mtu = 1426,
|
||||
groups = {
|
||||
backbone = {
|
||||
-- Limit number of connected peers to reduce bandwidth.
|
||||
limit = 2,
|
||||
@ -108,6 +109,19 @@
|
||||
remotes = {'"xxx.somehost2.invalid" port xxxxx'},
|
||||
},
|
||||
},
|
||||
|
||||
-- Optional: nested peer groups
|
||||
-- groups = {
|
||||
-- backbone_sub = {
|
||||
-- ...
|
||||
-- },
|
||||
-- ...
|
||||
-- },
|
||||
},
|
||||
-- Optional: additional peer groups, possibly with other limits
|
||||
-- backbone2 = {
|
||||
-- ...
|
||||
-- },
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -103,6 +103,7 @@ fastd_mesh_vpn
|
||||
fastd_mesh_vpn = {
|
||||
methods = {'salsa2012+umac'},
|
||||
mtu = 1426,
|
||||
groups = {
|
||||
backbone = {
|
||||
limit = 2,
|
||||
peers = {
|
||||
@ -113,6 +114,7 @@ fastd_mesh_vpn
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mesh_on_wan : optional
|
||||
Enables the mesh on the WAN port (``true`` or ``false``).
|
||||
|
@ -1,14 +1,25 @@
|
||||
need_string_array 'fastd_mesh_vpn.methods'
|
||||
need_number 'fastd_mesh_vpn.mtu'
|
||||
need_number 'fastd_mesh_vpn.backbone.limit'
|
||||
need_string_array('fastd_mesh_vpn.methods')
|
||||
need_number('fastd_mesh_vpn.mtu')
|
||||
need_boolean('fastd_mesh_vpn.enabled', false)
|
||||
|
||||
|
||||
local function check_peer(k, _)
|
||||
local prefix = string.format('fastd_mesh_vpn.backbone.peers[%q].', k)
|
||||
local function check_peer(prefix)
|
||||
return function(k, _)
|
||||
local table = string.format('%s[%q].', prefix, k)
|
||||
|
||||
need_string(prefix .. 'key')
|
||||
need_string_array(prefix .. 'remotes')
|
||||
need_string(table .. 'key')
|
||||
need_string_array(table .. 'remotes')
|
||||
end
|
||||
end
|
||||
|
||||
need_table('fastd_mesh_vpn.backbone.peers', check_peer)
|
||||
need_boolean('fastd_mesh_vpn.enabled', false)
|
||||
local function check_group(prefix)
|
||||
return function(k, _)
|
||||
local table = string.format('%s[%q].', prefix, k)
|
||||
|
||||
need_number(table .. 'limit', false)
|
||||
need_table(table .. 'peers', check_peer(table .. 'peers'), false)
|
||||
need_table(table .. 'groups', check_group(table .. 'groups'), false)
|
||||
end
|
||||
end
|
||||
|
||||
need_table('fastd_mesh_vpn.groups', check_group('fastd_mesh_vpn.groups'))
|
||||
|
@ -1,32 +1,71 @@
|
||||
local nixio = require('nixio')
|
||||
local ltn12 = require('luci.ltn12')
|
||||
local json = require('luci.json')
|
||||
local json = require 'luci.json'
|
||||
local ltn12 = require 'luci.ltn12'
|
||||
local nixio = require 'nixio'
|
||||
local site = require 'gluon.site_config'
|
||||
local uci = require('luci.model.uci').cursor()
|
||||
|
||||
local socket_path = uci:get('fastd', 'mesh_vpn', 'status_socket')
|
||||
local fastd_sock = nixio.socket('unix', 'stream')
|
||||
local socket_path = uci:get('fastd', 'mesh_vpn', 'status_socket')
|
||||
|
||||
if not fastd_sock:connect(socket_path) then
|
||||
return nil
|
||||
end
|
||||
|
||||
decoder = json.Decoder()
|
||||
local decoder = json.Decoder()
|
||||
ltn12.pump.all(ltn12.source.file(fastd_sock), decoder:sink())
|
||||
|
||||
local status = decoder:get()
|
||||
|
||||
local output = {}
|
||||
|
||||
for key, peer in pairs(status.peers) do
|
||||
local name, valid = peer.name:gsub('^mesh_vpn_backbone_peer_', '')
|
||||
if valid == 1 then
|
||||
local peer_groups
|
||||
|
||||
local function peer_connection(config)
|
||||
local peer = status.peers[config.key]
|
||||
if peer then
|
||||
if peer.connection then
|
||||
output[name] = {}
|
||||
output[name].established = peer.connection.established/1000
|
||||
return {
|
||||
established = peer.connection.established/1000
|
||||
}
|
||||
else
|
||||
output[name] = json.null
|
||||
return json.null
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return output
|
||||
local function peer_group(config)
|
||||
local ret = {}
|
||||
|
||||
if config.peers then
|
||||
local peers = {}
|
||||
|
||||
for peername, peerconfig in pairs(config.peers) do
|
||||
peers[peername] = peer_connection(peerconfig)
|
||||
end
|
||||
|
||||
if next(peers) then
|
||||
ret.peers = peers
|
||||
end
|
||||
end
|
||||
|
||||
ret.groups = peer_groups(config.groups)
|
||||
|
||||
if next(ret) then
|
||||
return ret
|
||||
end
|
||||
end
|
||||
|
||||
function peer_groups(groups)
|
||||
if groups then
|
||||
local ret = {}
|
||||
|
||||
for name, group in pairs(groups) do
|
||||
ret[name] = peer_group(group)
|
||||
end
|
||||
|
||||
if next(ret) then
|
||||
return ret
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return peer_group(site.fastd_mesh_vpn)
|
||||
|
@ -36,33 +36,60 @@ uci:section('fastd', 'fastd', 'mesh_vpn',
|
||||
)
|
||||
uci:delete('fastd', 'mesh_vpn', 'user')
|
||||
|
||||
uci:delete('fastd', 'mesh_vpn_backbone')
|
||||
uci:section('fastd', 'peer_group', 'mesh_vpn_backbone',
|
||||
|
||||
local add_groups
|
||||
|
||||
local function add_peer(group, name, config)
|
||||
uci:section('fastd', 'peer', group .. '_peer_' .. name,
|
||||
{
|
||||
enabled = 1,
|
||||
net = 'mesh_vpn',
|
||||
peer_limit = site.fastd_mesh_vpn.backbone.limit,
|
||||
}
|
||||
)
|
||||
|
||||
uci:delete_all('fastd', 'peer',
|
||||
function(peer)
|
||||
return peer.net == 'mesh_vpn' and peer.group == 'mesh_vpn_backbone'
|
||||
end
|
||||
)
|
||||
|
||||
for name, config in pairs(site.fastd_mesh_vpn.backbone.peers) do
|
||||
uci:section('fastd', 'peer', 'mesh_vpn_backbone_peer_' .. name,
|
||||
{
|
||||
enabled = 1,
|
||||
net = 'mesh_vpn',
|
||||
group = 'mesh_vpn_backbone',
|
||||
group = group,
|
||||
key = config.key,
|
||||
remote = config.remotes,
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
local function add_group(name, config, parent)
|
||||
uci:delete('fastd', name)
|
||||
uci:delete_all('fastd', 'peer',
|
||||
function(peer)
|
||||
return (peer.net == 'mesh_vpn' and peer.group == name)
|
||||
end
|
||||
)
|
||||
|
||||
|
||||
uci:section('fastd', 'peer_group', name,
|
||||
{
|
||||
enabled = 1,
|
||||
net = 'mesh_vpn',
|
||||
parent = parent,
|
||||
peer_limit = config.limit,
|
||||
}
|
||||
)
|
||||
|
||||
if config.peers then
|
||||
for peername, peerconfig in pairs(config.peers) do
|
||||
add_peer(name, peername, peerconfig)
|
||||
end
|
||||
end
|
||||
|
||||
add_groups(name, config.groups, name)
|
||||
end
|
||||
|
||||
-- declared local above
|
||||
function add_groups(prefix, groups, parent)
|
||||
if groups then
|
||||
for name, group in pairs(groups) do
|
||||
add_group(prefix .. '_' .. name, group, parent)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
add_groups('mesh_vpn', site.fastd_mesh_vpn.groups)
|
||||
|
||||
|
||||
uci:save('fastd')
|
||||
uci:commit('fastd')
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user