add bundle:bird
This commit is contained in:
parent
fe44417b14
commit
30d4d989fc
3 changed files with 134 additions and 0 deletions
41
bundles/bird/files/bird.conf
Normal file
41
bundles/bird/files/bird.conf
Normal file
|
@ -0,0 +1,41 @@
|
|||
log syslog all;
|
||||
router id ${node.metadata.get('bird/my_ip')};
|
||||
debug protocols all;
|
||||
|
||||
ipv4 table master4;
|
||||
|
||||
protocol device {
|
||||
}
|
||||
|
||||
protocol kernel {
|
||||
scan time 30;
|
||||
ipv4 {
|
||||
export where source != RTS_STATIC;
|
||||
};
|
||||
}
|
||||
% if node.metadata.get('bird/static_routes', set()):
|
||||
|
||||
protocol static {
|
||||
ipv4;
|
||||
|
||||
% for route in sorted(node.metadata.get('bird/static_routes', set())):
|
||||
route ${route} via ${node.metadata.get('bird/my_ip')};
|
||||
% endfor
|
||||
}
|
||||
% endif
|
||||
% for name, config in sorted(node.metadata.get('bird/bgp_neighbors', {}).items()):
|
||||
|
||||
protocol bgp '${name}' {
|
||||
local ${config['local_ip']} as ${config['local_as']};
|
||||
neighbor ${config['neighbor_ip']} as ${config['neighbor_as']};
|
||||
hold time ${config.get('hold_time', 15)};
|
||||
error wait time 5, 10;
|
||||
direct;
|
||||
|
||||
ipv4 {
|
||||
next hop self;
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
}
|
||||
% endfor
|
17
bundles/bird/items.py
Normal file
17
bundles/bird/items.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
files = {
|
||||
'/etc/bird/bird.conf': {
|
||||
'content_type': 'mako',
|
||||
'triggers': {
|
||||
'svc_systemd:bird:reload',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
svc_systemd = {
|
||||
'bird': {
|
||||
'needs': {
|
||||
'file:/etc/bird/bird.conf',
|
||||
'pkg_apt:bird2',
|
||||
},
|
||||
},
|
||||
}
|
76
bundles/bird/metadata.py
Normal file
76
bundles/bird/metadata.py
Normal file
|
@ -0,0 +1,76 @@
|
|||
from ipaddress import ip_network
|
||||
from bundlewrap.exceptions import NoSuchNode
|
||||
from bundlewrap.metadata import atomic
|
||||
|
||||
defaults = {
|
||||
'apt': {
|
||||
'packages': {
|
||||
'bird2': {},
|
||||
},
|
||||
},
|
||||
'sysctl': {
|
||||
'options': {
|
||||
'net.ipv4.ip_forward': '1',
|
||||
'net.ipv6.conf.all.forwarding': '1',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@metadata_reactor.provides(
|
||||
'bird/bgp_neighbors',
|
||||
)
|
||||
def neighbor_info_from_wireguard(metadata):
|
||||
neighbors = {}
|
||||
my_as = repo.libs.s2s.AS_NUMBERS[metadata.get('location')]
|
||||
|
||||
for name, config in metadata.get('wireguard/peers', {}).items():
|
||||
try:
|
||||
rnode = repo.get_node(name)
|
||||
except NoSuchNode:
|
||||
continue
|
||||
|
||||
neighbors[name] = {
|
||||
'local_ip': config['my_ip'],
|
||||
'local_as': my_as,
|
||||
'neighbor_ip': config['their_ip'],
|
||||
'neighbor_as': repo.libs.s2s.AS_NUMBERS[rnode.metadata.get('location')],
|
||||
}
|
||||
|
||||
return {
|
||||
'bird': {
|
||||
'bgp_neighbors': neighbors,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@metadata_reactor.provides(
|
||||
'bird/my_ip',
|
||||
)
|
||||
def my_ip(metadata):
|
||||
if node.has_bundle('wireguard'):
|
||||
my_ip = sorted(metadata.get('interfaces/wg0/ips'))[0].split('/')[0]
|
||||
else:
|
||||
my_ip = str(sorted(repo.libs.tools.resolve_identifier(repo, node.name))[0])
|
||||
|
||||
return {
|
||||
'bird': {
|
||||
'my_ip': my_ip,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@metadata_reactor.provides(
|
||||
'firewall/port_rules',
|
||||
)
|
||||
def firewall(metadata):
|
||||
sources = set()
|
||||
for config in metadata.get('bird/bgp_neighbors', {}).values():
|
||||
sources.add(config['neighbor_ip'])
|
||||
|
||||
return {
|
||||
'firewall': {
|
||||
'port_rules': {
|
||||
'179': atomic(sources),
|
||||
},
|
||||
},
|
||||
}
|
Loading…
Reference in a new issue