gluon-mesh-vpn-fastd: clean up peers and groups on update
The 'preserve' flag can be used to mark a peer so it is not removed or modified on upgrades. In addition, groups containing preserved peers are not removed. Fixes: #557
This commit is contained in:
		
							parent
							
								
									b019c703c9
								
							
						
					
					
						commit
						3ccf7fdd96
					
				| @ -302,6 +302,12 @@ mesh_vpn | ||||
| 
 | ||||
|     You can set syslog_level from verbose (default) to warn to reduce syslog output. | ||||
| 
 | ||||
|     fastd allows to configure a tree of peer groups and peers. By default, the | ||||
|     list of groups and peers configured in the *fastd* UCI config is completely | ||||
|     replaced by the list from site.conf on upgrades. To allow custom modifications | ||||
|     to the peer list, removal and modification of peers can be prevented by | ||||
|     setting the *preserve* option of a peer to ``1`` in UCI. | ||||
| 
 | ||||
|     The `tunneldigger` section is used to define the *tunneldigger* broker list. | ||||
| 
 | ||||
|     **Note:** It doesn't make sense to include both `fastd` and `tunneldigger` | ||||
|  | ||||
| @ -48,10 +48,43 @@ uci:section('fastd', 'fastd', 'mesh_vpn', { | ||||
| uci:delete('fastd', 'mesh_vpn', 'user') | ||||
| 
 | ||||
| 
 | ||||
| -- Collect list of groups that have peers with 'preserve' flag | ||||
| local preserve_groups = {} | ||||
| 
 | ||||
| local function preserve_group(name) | ||||
| 	if not name or preserve_groups[name] then | ||||
| 		return | ||||
| 	end | ||||
| 	preserve_groups[name] = true | ||||
| 
 | ||||
| 	local parent = uci:get('fastd', name, 'group') | ||||
| 	preserve_group(parent) | ||||
| end | ||||
| 
 | ||||
| uci:foreach('fastd', 'peer', function(peer) | ||||
| 	if peer.net == 'mesh_vpn' and peer.preserve == '1' then | ||||
| 		preserve_group(peer.group) | ||||
| 	end | ||||
| end) | ||||
| 
 | ||||
| 
 | ||||
| -- Clean up previous configuration | ||||
| uci:delete_all('fastd', 'peer', function(peer) | ||||
| 	return (peer.net == 'mesh_vpn' and peer.preserve ~= '1') | ||||
| end) | ||||
| uci:delete_all('fastd', 'peer_group', function(group) | ||||
| 	return (group.net == 'mesh_vpn' and not preserve_groups[group['.name']]) | ||||
| end) | ||||
| 
 | ||||
| 
 | ||||
| local add_groups | ||||
| 
 | ||||
| local function add_peer(group, name, config) | ||||
| 	uci:section('fastd', 'peer', group .. '_peer_' .. name, { | ||||
| 	local uci_name = group .. '_peer_' .. name | ||||
| 	if uci:get_bool('fastd', uci_name, 'preserve') then | ||||
| 		return | ||||
| 	end | ||||
| 	uci:section('fastd', 'peer', uci_name, { | ||||
| 		enabled = true, | ||||
| 		net = 'mesh_vpn', | ||||
| 		group = group, | ||||
| @ -61,12 +94,6 @@ local function add_peer(group, name, config) | ||||
| 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 = true, | ||||
| 		net = 'mesh_vpn', | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user