-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate_config_quagga.py
executable file
·81 lines (68 loc) · 2.84 KB
/
generate_config_quagga.py
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
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ipaddr
import yaml
import sys
import os
import glob
from jinja2 import Environment, FileSystemLoader
from termcolor import colored
def parse_peers(peer_file):
"""parse_peers: Just a simple function for peers parsing
:peer_file: The YAML peer file to parse
:returns: Just a return code if the file is correctly parsed or not
"""
peering_flat = open(peer_file).read()
ixp = os.path.splitext(os.path.basename(peer_file))[0]
try:
peerings = yaml.safe_load(peering_flat)
except:
print colored('ERROR', 'red') + ": the peers.yaml file could not be parsed.. please check \
your syntax"
sys.exit(2)
for asn in peerings:
for keyword in ['export', 'import', 'description']:
if keyword not in peerings[asn]:
print colored('ERROR', 'red') + ": missing %s statement in stanza %s" % (keyword, asn)
sys.exit(2)
acceptable_exports = ['AS-GITOYEN', 'NOT ANY', 'ANY']
if not peerings[asn]['export'] in acceptable_exports:
print colored('ERROR', 'red') + ": export must be one of the following: %s" \
% " ".join(acceptable_exports)
sys.exit(2)
for peer in peerings[asn]['peerings']:
try:
peer_ip = ipaddr.IPAddress(peer)
if type(ipaddr.IPAddress(peer_ip)) is ipaddr.IPv4Address:
neighbor_ipv4 = peer_ip
if ixp == 'sfinx':
ix4_group = 'SFINX'
else:
ix4_group = 'AMS-IX-PEERS'
elif type(ipaddr.IPAddress(peer_ip)) is ipaddr.IPv6Address:
neighbor_ipv6 = peer_ip
if ixp == 'sfinx':
ix6_group = 'SFINXV6'
else:
ix6_group = 'AMS-IX6-PEERS'
except ValueError:
print colored('ERROR', 'red') + ": %s in %s is not a valid IP" % (peer, asn)
sys.exit(2)
try:
limit_ipv4 = peerings[asn]['limit_ipv4']
except:
limit_ipv4 = False
try:
limit_ipv6 = peerings[asn]['limit_ipv6']
except:
limit_ipv6 = False
env = Environment(loader=FileSystemLoader('./'))
tpl = env.get_template('templates/quagga.j2')
print tpl.render(neighbor_as = asn, description =
peerings[asn]['description'], export_as = peerings[asn]['export'],
import_as = peerings[asn]['import'], neighbor_ipv4 =
neighbor_ipv4, neighbor_ipv6 = neighbor_ipv6, ix4_name =
ix4_group, ix6_name = ix6_group, limit_ipv4 = limit_ipv4,
limit_ipv6 = limit_ipv6)
for peer_files in ('peers/sfinx.yml','peers/amsix.yml'):
parse_peers(peer_files)