Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
log.info("Webserver not yet supported, please run as seperate module")
if options.file:
with open(options.file, "r") as fh:
input_string = fh.read()
timestamp = os.stat(options.file).st_mtime
elif options.stdin:
input_string = sys.stdin
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S_%f")
elif options.grid:
input_string = ""
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S_%f")
else:
log.info("No input file specified. Exiting")
return None
try:
dst_folder = workflow.manage_network(input_string, timestamp,
grid=options.grid, **build_options)
log.debug("Generated network configurations: %s" % dst_folder)
except Exception, err:
log.error("Error generating network configurations: %s" % err)
log.debug("Error generating network configurations", exc_info=True)
if settings['General']['stack_trace']:
print traceback.print_exc()
# sys.exit("Unable to build configurations.")
# TODO: work out why build_options is being clobbered for monitor mode
build_options['monitor'] = options.monitor or settings['General'][
'monitor']
if address_family == "None":
log.info("IP addressing disabled, skipping IPv4")
anm.add_overlay("ipv4") # create empty so rest of code follows
g_phy.update(g_phy, use_ipv4=False)
elif address_family in ("v4", "dual_stack"):
build_ipv4(anm, infrastructure=True)
g_phy.update(g_phy, use_ipv4=True)
elif address_family == "v6":
# Allocate v4 loopbacks for router ids
build_ipv4(anm, infrastructure=False)
g_phy.update(g_phy, use_ipv4=False)
# TODO: Create collision domain overlay for ip addressing - l2 overlay?
if address_family == "None":
log.info("IP addressing disabled, not allocating IPv6")
anm.add_overlay("ipv6") # create empty so rest of code follows
g_phy.update(g_phy, use_ipv6=False)
elif address_family in ("v6", "dual_stack"):
build_ipv6(anm)
g_phy.update(g_phy, use_ipv6=True)
else:
anm.add_overlay("ipv6") # placeholder for compiler logic
default_igp = g_in.data.igp or "ospf"
ank_utils.set_node_default(g_in, igp=default_igp)
ank_utils.copy_attr_from(g_in, g_phy, "igp")
ank_utils.copy_attr_from(g_in, g_phy, "include_csr")
try:
from autonetkit_cisco import build_network as cisco_build_network
cidr_string = '%s/%s' % (ip_address, prefixlen)
interface.subnet = netaddr.IPNetwork(cidr_string)
broadcast_domains = [d for d in g_ipv6 if d.broadcast_domain]
# TODO: allow this to work with specified ip_address/subnet as well as
# ip_address/prefixlen
global_infra_block = None
try:
# Note this is only pickling up if explictly set in g_in
infra_subnet = g_in.data.ipv6_infra_subnet
infra_prefix = g_in.data.ipv6_infra_prefix
global_infra_block = sn_preflen_to_network(infra_subnet, infra_prefix)
except Exception, e:
log.info("Unable to parse specified ipv4 infra subnets %s/%s")
from netaddr import IPNetwork
mismatched_interfaces = []
for coll_dom in broadcast_domains:
connected_interfaces = [edge.dst_int for edge in
coll_dom.edges()]
cd_subnets = [IPNetwork('%s/%s' % (i.subnet.network,
i.prefixlen)) for i in connected_interfaces]
if global_infra_block is not None:
mismatched_interfaces += [i for i in connected_interfaces
if i.ip_address not in global_infra_block]
if len(cd_subnets) == 0:
log.warning("Collision domain %s is not connected to any nodes",
def extract(
host,
username,
tar_file,
cd_dir,
timeout=45,
key_filename=None,
verbosity=0,
parallel_count=5,
):
"""Extract and start lab"""
log.debug('Extracting and starting lab on %s' % host)
log.info('Extracting and starting Netkit lab')
from Exscript import Account
from Exscript.util.start import start
from Exscript.util.match import first_match
from Exscript import PrivateKey
from Exscript.protocols.Exception import InvalidCommandException
messaging = ank_messaging
def starting_host(protocol, index, data):
log.info('Starting %s' % data.group(1))
def lab_started(protocol, index, data):
log.info('Lab started on %s' % host)
def make_not_found(protocol, index, data):
log.warning('Make not installed on remote host %s. Please install make and retry.'
# TODO: add more detailed logging
for n in g_bgp:
# Tag with label to make logic clearer
if n.ibgp_role is None:
n.ibgp_role = "Peer"
# TODO: if top-level, then don't mark as RRC
ibgp_nodes = [n for n in g_bgp if not n.ibgp_role is "Disabled"]
# Notify user of non-ibgp nodes
non_ibgp_nodes = [n for n in g_bgp if n.ibgp_role is "Disabled"]
if 0 < len(non_ibgp_nodes) < 10:
log.info("Skipping iBGP for iBGP disabled nodes: %s", non_ibgp_nodes)
elif len(non_ibgp_nodes) >= 10:
log.info("Skipping iBGP for more than 10 iBGP disabled nodes:"
"refer to visualization for resulting topology.")
# warn for any nodes that have RR set but no rr_cluster, or HRR set and no
# hrr_cluster
rr_mismatch = [
n for n in ibgp_nodes if n.ibgp_role == "RR" and n.rr_cluster is None]
if len(rr_mismatch):
log.warning("Some routers are set as RR but have no rr_cluster: %s. Please specify an rr_cluster for peering."
% ", ".join(str(n) for n in rr_mismatch))
hrr_mismatch = [
n for n in ibgp_nodes if n.ibgp_role == "HRR" and n.hrr_cluster is None]
if len(hrr_mismatch):
log.warning("Some routers are set as HRR but have no hrr_cluster: %s. Please specify an hrr_cluster for peering."
def publish_http_post(self, exchange, routing_key, body):
params = urllib.urlencode({
'body': body
})
try:
data = urllib.urlopen(self.http_url, params).read()
except IOError, e:
log.info("Unable to connect to HTTP Server %s" % self.http_url)
from autonetkit.design.mpls import build_vrf
build_vrf(anm) # do before to add loopbacks before ip allocations
from autonetkit.design.ip import build_ip, build_ipv4, build_ipv6
# TODO: replace this with layer2 overlay topology creation
# log.info("Allocating IP addresses")
build_ip(anm) # ip infrastructure topology
address_family = g_in.data.address_family or "v4" # default is v4
# TODO: can remove the infrastructure now create g_ip seperately
if address_family == "None":
log.info("IP addressing disabled, disabling routing protocol ",
"configuration")
anm['phy'].data.enable_routing = False
if address_family == "None":
log.info("IP addressing disabled, skipping IPv4")
anm.add_overlay("ipv4") # create empty so rest of code follows
g_phy.update(g_phy, use_ipv4=False)
elif address_family in ("v4", "dual_stack"):
build_ipv4(anm, infrastructure=True)
g_phy.update(g_phy, use_ipv4=True)
elif address_family == "v6":
# Allocate v4 loopbacks for router ids
build_ipv4(anm, infrastructure=False)
g_phy.update(g_phy, use_ipv4=False)
# TODO: Create collision domain overlay for ip addressing - l2 overlay?
if address_family == "None":
log.info("IP addressing disabled, not allocating IPv6")
anm.add_overlay("ipv6") # create empty so rest of code follows
g_phy.update(g_phy, use_ipv6=False)
elif address_family in ("v6", "dual_stack"):
'monitor']
if build_options['monitor']:
try:
log.info("Monitoring for updates...")
input_filemonitor = workflow.file_monitor(options.file)
#build_filemonitor = file_monitor("autonetkit/build_network.py")
while True:
time.sleep(1)
rebuild = False
if input_filemonitor.next():
rebuild = True
if rebuild:
try:
log.info("Input graph updated, recompiling network")
with open(options.file, "r") as fh:
input_string = fh.read() # read updates
workflow.manage_network(input_string,
timestamp, build_options)
log.info("Monitoring for updates...")
except Exception, e:
log.warning("Unable to build network %s" % e)
traceback.print_exc()
except KeyboardInterrupt:
log.info("Exiting")
# vrf_loopback_block
(infra_block, loopback_block, secondary_loopback_block) = \
extract_ipv6_blocks(anm)
if any(i for n in g_ip.nodes() for i in
n.loopback_interfaces() if not i.is_loopback_zero):
block_message = "IPv6 Secondary Loopbacks: %s" % secondary_loopback_block
log.info(block_message)
# TODO: replace this with direct allocation to interfaces in ip alloc
# plugin
allocated = sorted([n for n in g_ip if n['input'].loopback_v6])
if len(allocated) == len(g_ip.l3devices()):
# all allocated
# TODO: need to infer subnetomanual_ipv6_loopback_allocation
log.info("Using user-specified IPv6 loopback addresses")
manual_ipv6_loopback_allocation(anm)
else:
log.info("Allocating from IPv6 loopback block: %s" % loopback_block)
if len(allocated):
log.warning(
"Using automatic IPv6 loopback allocation. IPv6 loopback addresses specified on nodes %s will be ignored." % allocated)
else:
log.info("Automatically assigning IPv6 loopback addresses")
ipv6.allocate_loopbacks(g_ipv6, loopback_block)
l3_devices = [d for d in g_in if d.device_type in ('router', 'server')]
manual_alloc_devices = set()
for device in l3_devices:
physical_interfaces = list(device.physical_interfaces())