summaryrefslogtreecommitdiff
path: root/lib_autopeer.py
blob: cf3b66ef356322687bcb25835cd5ed858e3d2037 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
__all__ = 'Peerdata _get_peer_info _get_my_info _bird_config _wg_config'.split()

from config import *

from collections import namedtuple
Peerdata = namedtuple('Peerdata', 'asn ipll endpoint port pubkey privkey', defaults=(None,))


def _get_peer_info(name, asn):
	pass #TODO
	curs = DB.execute('SELECT asn, ipll, endpoint, port, pubkey FROM peers WHERE name=:name AND asn=:asn', dict(name=name, asn=asn))
	row = curs.fetchone()
	if row is not None:
		return Peerdata(*row)
	else:
		raise Exception(f'{asn}-{name} not found in database')
def _get_my_info(asn):
	return Peerdata(
		asn=MY_ASN,
		# TODO: better port logic
		port=((int(asn) % 100000)),
		ipll=MY_IPLL,
		endpoint=MY_ENDPOINT,
		pubkey=MY_PUBKEY,
		privkey=MY_PRIVKEY
	)

def _bird_config(name, far_side, local_side):
	if local_side.asn == MY_ASN:
		filter = '9,25,34'
	else:
		filter = '<REPLACE ME>'
	return f'''
protocol bgp as{far_side.asn}{name} from dnpeers {{
	enable extended messages on;
	neighbor {far_side.ipll} as {far_side.asn};
	ipv4 {{
		extended next hop on;
		import where dn42_import_filter({filter});
		export where dn42_export_filter({filter});
	}};
	ipv6 {{
		import where dn42_import_filter({filter});
		export where dn42_export_filter({filter});
	}};
	interface "wg{far_side.asn%10000:04}{name}";
}};
	'''

def _wg_config(name, far_side, local_side):
	if local_side.privkey is not None:
		privkey = local_side.privkey
	else:
		privkey = '<REPLACE ME>'

	return f'''
[Interface]
Address = {local_side.ipll}/128
Table = off
PostUp = /sbin/ip addr replace dev %i {local_side.ipll}/128 peer {far_side.ipll}/128
ListenPort = {local_side.port}
PrivateKey = {privkey}

[Peer]
PublicKey = {far_side.pubkey}
AllowedIPs = fd00::/8, 172.20.0.0/14, fe80::/64, 10.0.0.0/8, 172.31.0.0/16
Endpoint = {far_side.endpoint}:{far_side.port}
	'''