import json
from ipaddr import IPAddress
from string import Template
def mod(num, base):
return int(num) % int(base)
def get_ip_from_number(n):
ip = IPAddress(2130706432 + n)
return str(ip)
def lower_version(ver1, ver2):
v1 = int(ver1[-1:])
v2 = int(ver2[-1:])
if v1 <= v2:
return ver1
else:
return ver2
def parse_connections(input):
data = json.loads(input)
connections = data['output']['connections']
output = []
for list in connections.values():
output = output + list
return output
def find_connection(input, version, mode, ip, port, state):
for connection in parse_connections(input):
if (connection['peer-address'] == ip and connection['tcp-port'] == int(port) and connection['mode'] == mode and
connection['version'] == version):
if state == 'none':
return True
elif connection['state'] == state:
return True
return False
def parse_prefix_groups(input, source_):
data = json.loads(input)
bindings = data['sxp-node:master-database']
output = []
for binding in bindings.values():
for binding_source in binding:
if binding_source['binding-source'] == source_:
for prefix_group in binding_source['prefix-group']:
output.append(prefix_group)
return output
def find_binding(input, sgt, prefix, source_, action):
found = False
for prefixgroup in parse_prefix_groups(input, source_):
if prefixgroup['sgt'] == int(sgt):
for binding in prefixgroup['binding']:
if binding['ip-prefix'] == prefix and binding['action'] == action:
found = True
return found
def find_binding_with_peer_sequence(input, sgt, prefix, source_, action, node_id, peer_seq):
correct_sequence = False
found_source = False
for prefixgroup in parse_prefix_groups(input, source_):
if prefixgroup['sgt'] == int(sgt):
for binding in prefixgroup['binding']:
if binding['ip-prefix'] == prefix and binding['action'] == action:
for peer in binding['peer-sequence']['peer']:
if peer['seq'] == int(peer_seq) and peer['node-id'] == node_id:
correct_sequence = True
for peer_source in binding['sources']['source']:
if peer_source == node_id:
found_source = True
return found_source and correct_sequence
def add_entry_xml(sgt, prefix, ip):
templ = Template('''
$ip
$sgt
$prefix
''')
data = templ.substitute({'sgt': sgt, 'prefix': prefix, 'ip': ip})
return data
def add_connection_xml(version, mode, ip, port, ip_, password_):
templ = Template('''
$ip_
$ip
$port
$password_
$mode
$version
Connection to ISR-G2
45
30
120
''')
data = templ.substitute(
{'ip': ip, 'port': port, 'mode': mode, 'version': version, 'ip_': ip_, 'password_': password_})
return data
def delete_connections_xml(address, port, node):
templ = Template('''
$node
$address
$port
''')
data = templ.substitute({'address': address, 'port': port, 'node': node})
return data
def update_binding_xml(sgt0, prefix0, sgt1, prefix1, ip):
templ = Template('''
$ip
$sgt0
$prefix0
$sgt1
$prefix1
''')
data = templ.substitute(
{'sgt0': sgt0, 'sgt1': sgt1, 'prefix0': prefix0, 'prefix1': prefix1, 'ip': ip})
return data
def delete_binding_xml(sgt, prefix, ip):
templ = Template('''
$ip
$sgt
$prefix
''')
data = templ.substitute({'sgt': sgt, 'prefix': prefix, 'ip': ip})
return data
def get_connections_from_node_xml(ip):
templ = Template('''
$ip
''')
data = templ.substitute({'ip': ip})
return data
def get_bindings_from_node_xml(ip):
templ = Template('''
$ip
''')
data = templ.substitute({'ip': ip})
return data