示例#1
0
def superLink(vrfcidr, supercidr):
    """Link a vrfcidr to a Supernet"""

    time = nglib.get_time()

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (sn:Supernet {cidr:{supercidr}})' +
        '<-[e:SUPER]-(n:Network {vrfcidr:{vrfcidr}}) RETURN e',
        vrfcidr=vrfcidr,
        supercidr=supercidr)

    # Make a new Supernet Link
    if len(results) == 0:
        logger.info("New: Creating %s -[SUPER]-> %s Link", vrfcidr, supercidr)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (sn:Supernet {cidr:{supercidr}}), (n:Network {vrfcidr:{vrfcidr}}) '
            + 'CREATE (sn)<-[e:SUPER {time:{time}}]-(n) RETURN e',
            vrfcidr=vrfcidr,
            supercidr=supercidr,
            time=time)
    else:
        logger.debug("Super Exists: %s -[SUPER]-> %s Link", vrfcidr, supercidr)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (sn:Supernet {cidr:{supercidr}})<-[e:SUPER]-' +
            '(n:Network {vrfcidr:{vrfcidr}}) SET e.time={time} RETURN e',
            vrfcidr=vrfcidr,
            supercidr=supercidr,
            time=time)
示例#2
0
def import_supernet(snet):
    """Import a Supernet Entry"""

    time = nglib.get_time()

    cidr = snet['cidr']
    desc = snet['description']
    role = snet['role']
    secure = snet['secure']


    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Supernet {cidr:{cidr}}) RETURN n', cidr=cidr)

    # Insert new supernet
    if len(results) == 0:
        logger.info("New: Inserting Supernet: " + cidr)

        results = nglib.py2neo_ses.cypher.execute(
            'CREATE (n:Supernet {cidr:{cidr}, name:{cidr}, desc:{desc}, role:{role}, '
            + 'secure:{secure}, time:{time}}) RETURN n',
            cidr=cidr, role=role, desc=desc, secure=secure, time=time)
    # Update existing Supernet
    else:
        logger.debug("Supernet Exists, updating: " + cidr)
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Supernet {cidr:{cidr}}) '
            + 'SET n += {desc:{desc}, role:{role}, secure:{secure}, time:{time}} RETURN n',
            cidr=cidr, role=role, desc=desc, secure=secure, time=time)
示例#3
0
def link_router_to_vrf(router, vrf):
    """Create a link from a router to a VRF (called from net_update now)"""

    time = nglib.get_time()

    result = nglib.py2neo_ses.cypher.execute(
        'MATCH( s:Switch:Router {name:{router}})<-[r:VRF_ON]-'
        + '(v:VRF {name:{vrf}}) RETURN r',
        router=router, vrf=vrf)

    if len(result) == 0:
        logger.info("New: Creating VRF_ON Relationship %s to %s", router, vrf)

        nglib.py2neo_ses.cypher.execute(
            'MATCH (r:Switch:Router {name:{router}}), (v:VRF {name:{vrf}}) '
            + 'CREATE (r)<-[e:VRF_ON {time:{time}}]-(v)',
            router=router, vrf=vrf, time=time)
    else:
        logger.debug("Debug: %s already linked to VRF %s, updating timestamp",
                     router, vrf)

        result = nglib.py2neo_ses.cypher.execute(
            'MATCH( s:Switch:Router {name:{router}})<-[r:VRF_ON]-(v:VRF {name:{vrf}}) ' +
            'SET r += {time:{time}} RETURN r',
            router=router, vrf=vrf, time=time)
示例#4
0
def clear_edges(hours):
    """
    Clear Expired Edges

    Notes: nglib.verbose returns edges to delete but does not delete
    """

    logger.info("Clearing Edges older than " + str(hours) + " hours")

    # Time shifted datetime
    age = nglib.get_time(hours=hours)

    edges = nglib.py2neo_ses.cypher.execute(
        'MATCH ()-[e]->() WHERE e.time < {age} RETURN e', age=age)

    if len(edges) > 0:
        for e in edges:
            neighbors = getRelationship(e.e)
            logger.info("Expired Edge: " + neighbors)

        count = nglib.py2neo_ses.cypher.execute(
            'MATCH ()-[e]->() WHERE e.time < {age} RETURN count(e) as count',
            age=age)

        if nglib.verbose:
            logger.info("Expired Edges: " + str(count[0].count))
        else:
            logger.info("Deleting Edges: " + str(count[0].count))
            nglib.py2neo_ses.cypher.execute(
                'MATCH ()-[e]->() WHERE e.time < {age} DELETE e', age=age)
示例#5
0
def clear_nodes(hours):
    """
    Clear Expired Nodes

    Notes: verbose returns nodes to delete but does not delete
    """

    logger.info("Finding Nodes to Clear older than " + str(hours) + " hours")

    # Time shifted datetime
    age = nglib.get_time(hours=hours)

    nodes = nglib.py2neo_ses.cypher.execute(
        'MATCH (n) WHERE n.time < {age} RETURN n', age=age)

    if len(nodes) > 0:

        for r in nodes:
            label = getLabel(r.n)
            pj = getJSONProperties(r.n)
            logger.info("Expired Node: " + label + pj['name'])

        count = nglib.py2neo_ses.cypher.execute(
            'MATCH (n) WHERE n.time < {age} RETURN count(n) as count', age=age)

        logger.info("Expired Nodes: " + str(count[0].count))

        if not nglib.verbose:
            logger.info("Deleting Nodes: " + str(count[0].count))

            nglib.py2neo_ses.cypher.execute(
                'MATCH (n)-[e]-() WHERE n.time < {age} DELETE e', age=age)

            nglib.py2neo_ses.cypher.execute(
                'MATCH (n) WHERE n.time < {age} DELETE n', age=age)
示例#6
0
def link_vlan_switch(en):
    """Link a VLAN to a Switch (Bolt Driver)"""

    time = nglib.get_time()

    vname = en['MGMT'] + "-" + en['VID']
    desc = en['VName']
    switch = en['Switch']
    stp = en['STP']

    results = nglib.bolt_ses.run(
        'MATCH (n:VLAN {name:{vname}})-[e:Switched]->(s:Switch {name:{switch}}) '
        + 'RETURN n.name AS name',
        {"vname": vname, "switch": switch})

    # Check for Results FIXME
    try:
        name = next(iter(results))
        logger.debug("Updating: VLAN (%s)-[:Switched]->(%s) Relationship", vname, switch)

    except:
        logger.info("New: VLAN (%s)-[:Switched]->(%s) Relationship", vname, switch)

    nglib.bolt_ses.run(
        'MATCH (v:VLAN {name:{vname}}), (s:Switch {name:{switch}}) ' +
        'MERGE (v)-[e:Switched]->(s) SET e += {desc:{desc}, stp:{stp}, time:{time}} RETURN e',
        {"vname": vname, "switch": switch, "desc": desc, "stp": stp, "time": time})
示例#7
0
def update_bridge(pmgmt, cmgmt, vlan, pswitch, cswitch):
    """Insert or Update a VLAN BRIDGE"""

    if nglib.verbose > 2:
        print("Bridge: ", pmgmt, cmgmt, vlan, pswitch, cswitch)

    pvlan = pmgmt + "-" + vlan
    cvlan = cmgmt + "-" + vlan
    time = nglib.get_time()

    # See if a Bridge Exists
    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (pv:VLAN {name:{pvlan}})-[e:BRIDGE]-(cv:VLAN {name:{cvlan}}) RETURN e',
        pvlan=pvlan, cvlan=cvlan)

    if len(results) == 0:
        logger.info("New: Bridge (%s)-[:BRIDGE]->(%s) Relationship", pvlan, cvlan)

        nglib.py2neo_ses.cypher.execute(
            'MATCH (pv:VLAN {name:{pvlan}}), (cv:VLAN {name:{cvlan}}) '
            + 'CREATE (pv)-[e:BRIDGE {pswitch:{pswitch}, cswitch:{cswitch}, time:{time}}]'
            + '->(cv) RETURN e',
            pvlan=pvlan, cvlan=cvlan, pswitch=pswitch, cswitch=cswitch, time=time)

    else:
        logger.debug("Updating VLAN %s-[:BRIDGE]-%s Relationship", pvlan, cvlan)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (pv:VLAN {name:{pvlan}})-[e:BRIDGE]-(cv:VLAN {name:{cvlan}}) '
            + 'SET e += {time:{time}} RETURN e',
            pvlan=pvlan, cvlan=cvlan, pswitch=pswitch, cswitch=cswitch, time=time)
示例#8
0
def link_vlan_to_root(vname, stp, rootSwitch):
    """Create a VLAN -[ROOT]-> Switch Relationship"""

    root = nglib.py2neo_ses.cypher.execute(
        'MATCH (v:VLAN {name:{vname}})-[e:ROOT]-(s:Switch {name:{rootSwitch}}) RETURN e',
        vname=vname, rootSwitch=rootSwitch)

    time = nglib.get_time()

    # Create New Root Relationship
    if len(root) == 0:
        logger.info("New: Root for VLAN (%s)-[:ROOT]->(%s)", vname, rootSwitch)

        nglib.py2neo_ses.cypher.execute(
            'MATCH (v:VLAN {name:{vname}}),(s:Switch {name:{rootSwitch}}) '
            + 'CREATE (v)-[e:ROOT {stp:{stp}, time:{time}}]->(s) RETURN e',
            vname=vname, rootSwitch=rootSwitch, stp=stp, time=time)

    # Update existing
    else:
        logger.debug("Updating Root for VLAN (%s)-[:ROOT]->(%s)", vname, rootSwitch)

        nglib.py2neo_ses.cypher.execute(
            'MATCH (v:VLAN {name:{vname}})-[e:ROOT]->(s:Switch {name:{rootSwitch}}) '
            + 'SET e += {stp:{stp}, time:{time}} RETURN e',
            vname=vname, rootSwitch=rootSwitch, stp=stp, time=time)
示例#9
0
def superLink(vrfcidr, supercidr):
    """Link a vrfcidr to a Supernet"""

    time = nglib.get_time()

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (sn:Supernet {cidr:{supercidr}})'
        + '<-[e:SUPER]-(n:Network {vrfcidr:{vrfcidr}}) RETURN e',
        vrfcidr=vrfcidr, supercidr=supercidr)

    # Make a new Supernet Link
    if len(results) == 0:
        logger.info("New: Creating %s -[SUPER]-> %s Link", vrfcidr, supercidr)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (sn:Supernet {cidr:{supercidr}}), (n:Network {vrfcidr:{vrfcidr}}) '
            + 'CREATE (sn)<-[e:SUPER {time:{time}}]-(n) RETURN e',
            vrfcidr=vrfcidr, supercidr=supercidr, time=time)
    else:
        logger.debug("Super Exists: %s -[SUPER]-> %s Link", vrfcidr, supercidr)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (sn:Supernet {cidr:{supercidr}})<-[e:SUPER]-'
            + '(n:Network {vrfcidr:{vrfcidr}}) SET e.time={time} RETURN e',
            vrfcidr=vrfcidr, supercidr=supercidr, time=time)
示例#10
0
def clear_edges(hours):
    """
    Clear Expired Edges

    Notes: nglib.verbose returns edges to delete but does not delete
    """

    logger.info("Clearing Edges older than " + str(hours) + " hours")

    # Time shifted datetime
    age = nglib.get_time(hours=hours)

    edges = nglib.py2neo_ses.cypher.execute(
        'MATCH ()-[e]->() WHERE e.time < {age} RETURN e',
        age=age)

    if len(edges) > 0:
        for e in edges:
            neighbors = getRelationship(e.e)
            logger.info("Expired Edge: " + neighbors)

        count = nglib.py2neo_ses.cypher.execute(
            'MATCH ()-[e]->() WHERE e.time < {age} RETURN count(e) as count',
            age=age)

        if nglib.verbose:
            logger.info("Expired Edges: " + str(count[0].count))
        else:
            logger.info("Deleting Edges: " + str(count[0].count))
            nglib.py2neo_ses.cypher.execute(
                'MATCH ()-[e]->() WHERE e.time < {age} DELETE e',
                age=age)
示例#11
0
def import_mgmt_vlan(vdb, ignore_new):
    """Collate all MGMT-VID pairs, insert nodes and link to MgmtGroup"""

    vuniq = dict()

    time = nglib.get_time()

    for en in vdb:
        vname = en['MGMT'] + "-" + en['VID']
        vuniq[vname] = 1

    for en in vuniq.keys():
        vname = en
        (mgmt, vid) = vname.split('-')
        vid = str(vid)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:VLAN {name:{vname}}) RETURN n', vname=vname)

        # Add new VLAN
        if len(results) == 0:
            logger.info("New: Inserting VLAN %s", en)

            results = nglib.py2neo_ses.cypher.execute(
                'CREATE (v:VLAN {name:{vname}, vid:{vid}, mgmt:{mgmt}, time:{time}}) RETURN v',
                vname=vname,
                vid=vid,
                mgmt=mgmt,
                time=time)

            # Record New Network Unless Ignoring initial run
            if not ignore_new:
                # Store a NewVLAN Object for alerting
                nglib.py2neo_ses.cypher.execute(
                    'CREATE (v:NewVLAN {name:{vname}, time:{time}}) RETURN v',
                    vname=vname,
                    time=time)

        # Else update record
        else:
            logger.debug("Updating VLAN %s", vname)
            nglib.py2neo_ses.cypher.execute(
                'MATCH (v:VLAN {name:{vname}}) SET v += ' +
                '{vid:{vid}, mgmt:{mgmt}, time:{time}} RETURN v',
                vname=vname,
                vid=vid,
                mgmt=mgmt,
                time=time)
示例#12
0
def import_mgmt_vlan(vdb, ignore_new):
    """Collate all MGMT-VID pairs, insert nodes and link to MgmtGroup"""


    vuniq = dict()

    time = nglib.get_time()

    for en in vdb:
        vname = en['MGMT'] + "-" + en['VID']
        vuniq[vname] = 1

    for en in vuniq.keys():
        vname = en
        (mgmt, vid) = vname.split('-')
        vid = str(vid)

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:VLAN {name:{vname}}) RETURN n',
            vname=vname)

        # Add new VLAN
        if len(results) == 0:
            logger.info("New: Inserting VLAN %s", en)

            results = nglib.py2neo_ses.cypher.execute(
                'CREATE (v:VLAN {name:{vname}, vid:{vid}, mgmt:{mgmt}, time:{time}}) RETURN v',
                vname=vname, vid=vid, mgmt=mgmt, time=time)

            # Record New Network Unless Ignoring initial run
            if not ignore_new:
                # Store a NewVLAN Object for alerting
                nglib.py2neo_ses.cypher.execute(
                    'CREATE (v:NewVLAN {name:{vname}, time:{time}}) RETURN v',
                    vname=vname, time=time)

        # Else update record
        else:
            logger.debug("Updating VLAN %s", vname)
            nglib.py2neo_ses.cypher.execute(
                'MATCH (v:VLAN {name:{vname}}) SET v += '
                + '{vid:{vid}, mgmt:{mgmt}, time:{time}} RETURN v',
                vname=vname, vid=vid, mgmt=mgmt, time=time)
示例#13
0
def import_neighbors(fileName):
    """Find if neighbors are adjacent, if so, links them"""

    logger.info("Importing Neighbors from " + fileName)

    f = open(fileName)
    ndb = csv.DictReader(f)
    time = nglib.get_time()

    for en in ndb:

        localName = en['LocalName']
        localPort = en['LocalPort']
        remoteName = en['RemoteName']
        remotePort = en['RemotePort']

        # Exclude Management Ports
        exPorts = '(mgmt|FastEthernet)'
        if re.search(exPorts, localPort) or re.search(exPorts, remotePort):
            logger.debug("Skipping NEI: " + remoteName)
        else:
            if nglib.verbose > 2:
                print("Debug importNeighbors", localName, localPort, remoteName,
                      remotePort)

            checkLocal = nglib.py2neo_ses.cypher.execute(
                'MATCH (s:Switch {name:{name}}) RETURN '
                + 's.distance AS distance, s.seed AS seed',
                name=localName)

            checkRemote = nglib.py2neo_ses.cypher.execute(
                'MATCH (s:Switch {name:{name}}) RETURN s.distance AS distance, s.seed AS seed',
                name=remoteName)

            # Found two neighbors, import
            if len(checkLocal) and len(checkRemote):

                # Get Distances
                localD = checkLocal.records[0].distance
                remoteD = checkRemote.records[0].distance

                import_adjacent_neighbors(en, localD, remoteD, time)
示例#14
0
def clear_nodes(hours):
    """
    Clear Expired Nodes

    Notes: verbose returns nodes to delete but does not delete
    """

    logger.info("Finding Nodes to Clear older than " + str(hours) + " hours")

    # Time shifted datetime
    age = nglib.get_time(hours=hours)

    nodes = nglib.py2neo_ses.cypher.execute(
        'MATCH (n) WHERE n.time < {age} RETURN n',
        age=age)

    if len(nodes) > 0:

        for r in nodes:
            label = getLabel(r.n)
            pj = getJSONProperties(r.n)
            logger.info("Expired Node: " + label + pj['name'])

        count = nglib.py2neo_ses.cypher.execute(
            'MATCH (n) WHERE n.time < {age} RETURN count(n) as count',
            age=age)

        logger.info("Expired Nodes: " + str(count[0].count))

        if not nglib.verbose:
            logger.info("Deleting Nodes: " + str(count[0].count))

            nglib.py2neo_ses.cypher.execute(
                'MATCH (n)-[e]-() WHERE n.time < {age} DELETE e',
                age=age)

            nglib.py2neo_ses.cypher.execute(
                'MATCH (n) WHERE n.time < {age} DELETE n',
                age=age)
示例#15
0
def import_single_vrf(vrf, seczone=0, desc=None):
    """Import a single VRF in to the database"""

    time = nglib.get_time()
    result = nglib.py2neo_ses.cypher.execute(
        'MATCH (v:VRF {name:{vrf}}) RETURN v',
        vrf=vrf)

    # Insert new VRF
    if len(result) == 0:
        logger.info("Creating new VRF: " + vrf)

        nglib.py2neo_ses.cypher.execute(
            'CREATE (v:VRF {name:{vrf}, seczone:{seczone}, time:{time}, desc:{desc}})',
            vrf=vrf, seczone=seczone, time=time, desc=desc)

    else:
        logger.debug("Updating Existing VRF: " + vrf)

        nglib.py2neo_ses.cypher.execute(
            'MATCH (v:VRF {name:{vrf}}) '
            + 'SET v.seczone={seczone}, v.time={time}, v.desc={desc}',
            vrf=vrf, seczone=seczone, time=time, desc=desc)
示例#16
0
def import_supernet(snet):
    """Import a Supernet Entry"""

    time = nglib.get_time()

    cidr = snet['cidr']
    desc = snet['description']
    role = snet['role']
    secure = snet['secure']

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Supernet {cidr:{cidr}}) RETURN n', cidr=cidr)

    # Insert new supernet
    if len(results) == 0:
        logger.info("New: Inserting Supernet: " + cidr)

        results = nglib.py2neo_ses.cypher.execute(
            'CREATE (n:Supernet {cidr:{cidr}, name:{cidr}, desc:{desc}, role:{role}, '
            + 'secure:{secure}, time:{time}}) RETURN n',
            cidr=cidr,
            role=role,
            desc=desc,
            secure=secure,
            time=time)
    # Update existing Supernet
    else:
        logger.debug("Supernet Exists, updating: " + cidr)
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Supernet {cidr:{cidr}}) ' +
            'SET n += {desc:{desc}, role:{role}, secure:{secure}, time:{time}} RETURN n',
            cidr=cidr,
            role=role,
            desc=desc,
            secure=secure,
            time=time)
示例#17
0
def import_fw_ints(fwdb):
    """Import Firewall Interfaces from FW File"""

    time = nglib.get_time()

    # Iterate through all firewall ints
    for fwint in fwdb:

        # DB Values
        name = fwint['Name']
        hostname = fwint['Hostname']
        #IP = fwint['IP']
        vlanInt = fwint['Interface']
        desc = fwint['Description']
        seclevel = fwint['Security-Level']
        logIndex = fwint['Log-Index']

        #print(name, vlanInt, desc, seclevel, IP, hostname, logIndex)

        vlan = vlanInt.replace('Vlan', '')

        # Search for existing Firewall
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (fw:Switch:Router:FW {name:{name}}) RETURN fw',
            name=name)

        # Insert new Firewall
        if len(results) == 0:
            logger.info("Creating New Firewall: " + name)

            results = nglib.py2neo_ses.cypher.execute(
                'CREATE (fw:Switch:Router:FW {name:{name}, hostname:{hostname}, '
                + 'logIndex:{logIndex}, time:{time}}) RETURN fw',
                name=name, hostname=hostname, logIndex=logIndex, time=time)

        # Update FW
        else:
            logger.debug("Updating Firewall: " + name)

            nglib.py2neo_ses.cypher.execute(
                'MATCH (fw:Switch:Router:FW {name:{name}}) SET fw += '
                + '{hostname:{hostname}, logIndex:{logIndex}, time:{time}} RETURN fw',
                name=name, hostname=hostname, logIndex=logIndex, time=time)

        # Search for existing Vlan
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vid:{vlan}})-[e:ROUTED_FW]->'
            + '(fw:Switch:Router:FW {name:{name}}) '
            + 'RETURN e',
            vlan=vlan, name=name)

        if len(results) == 0:
            logger.info("Creating New ROUTED_FW Link: %s --> %s", vlan, name)

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vid:{vlan}}), (fw:Switch:Router:FW {name:{name}})'
                + 'CREATE (n)-[e:ROUTED_FW '
                + '{desc:{desc}, seclevel:{seclevel}, time:{time}}]->(fw)',
                vlan=vlan, name=name, desc=desc, seclevel=seclevel, time=time)

        # Update Firewall Interface
        else:
            logger.debug("Updating ROUTED_FW: %s --> %s", vlan, name)

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vid:{vlan}})-[e:ROUTED_FW]->'
                + '(fw:Switch:Router:FW {name:{name}})'
                + 'SET e += {desc:{desc}, seclevel:{seclevel}, time:{time}} '
                + 'RETURN e',
                vlan=vlan, name=name, desc=desc, seclevel=seclevel, time=time)
示例#18
0
def import_devicelist(fileName, infoFile):
    """Import Devices from Devices.csv"""

    logger.info("Importing Devices from %s, %s", fileName, infoFile)
    time = nglib.get_time()

    # Get Seed devices for CDP Direction
    seed = dict()
    seeds = nglib.dev_seeds.split(',')

    for s in seeds:
        seed[s] = True

    f = open(fileName)
    devdb = csv.DictReader(f)

    # Import Location Info
    df = open(infoFile)
    devcsv = csv.DictReader(df)
    devinfodb = dict()

    for en in devcsv:
        devinfodb[en['Device']] = dict()
        devinfodb[en['Device']]['Location'] = 'Unknown'
        devinfodb[en['Device']]['Model'] = 'Unknown'
        devinfodb[en['Device']]['Version'] = 'Unknown'
        devinfodb[en['Device']]['FQDN'] = en['Device']
        devinfodb[en['Device']]['Platform'] = 'Unknown'
        if 'Location' in en:
            devinfodb[en['Device']]['Location'] = en['Location']
        if 'Model' in en:
            devinfodb[en['Device']]['Model'] = en['Model']
        if 'Version' in en:
            devinfodb[en['Device']]['Version'] = en['Version']
        if 'FQDN' in en:
            devinfodb[en['Device']]['FQDN'] = en['FQDN']
        if 'Platform' in en:
            devinfodb[en['Device']]['Platform'] = en['Platform']

    for en in devdb:

        device = en['Device']
        group = en['MgmtGroup']
        if group == "None":
            group = None
        rType = en['Type']

        if device not in devinfodb:
            devinfodb[device] = {"Location": "Unknown", "Model": "Unknown", \
                                 "Version": "Unknown", "FQDN": device,
                                 "Platform": "Unknown"}

        if 'Platform' in en and devinfodb[device]['Platform'] == 'Unknown':
            devinfodb[device]['Platform'] = en['Platform']

        if rType == "Primary":
            if nglib.verbose > 3:
                print("R: " + device)
            import_router(device, group, time, seed, rType, devinfodb[device])

        elif rType == "Standby":
            if nglib.verbose > 3:
                print("Rs: " + device)
            import_router(device, group, time, seed, rType, devinfodb[device])
        else:
            if nglib.verbose > 3:
                print("S: " + device)
            import_switch(device, group, time, seed, devinfodb[device])
示例#19
0
def import_single_net(net, ignore_new, vrfmap):
    """Import a CIDR Entry in to NetGrph"""

    time = nglib.get_time()

    router = net['Router']
    gateway = net['Gateway']
    cidr = net['Subnet']
    desc = net['Description']
    vrf = net['VRF']
    vlan = net['VLAN']
    p2p = net['P2P']
    standby = net['Standby']
    rip = net['Gateway_Physical']
    vpriority = net['Virtual_Priority']
    vgroup = net['Virtual_Group']
    vproto = net['Virtual_Protocol']
    vver = net['Virtual_Version']
    secondary = False
    if 'Secondary' in net and net['Secondary'] == '1':
        print('secondary', cidr)
        secondary = True

    # Check VRF Mapping to remap defaults
    if vrf == 'default' and router in vrfmap:
        vrf = vrfmap[router]
        #print("VRF", vrf)

    # Process P2P and Standby Router bools
    if p2p == "True":
        p2p = True
    else:
        p2p = False

    if standby == "True":
        standby = True
    else:
        standby = False

    vrfcidr = '{0}-{1}'.format(vrf, cidr) #unique key

    # Check the Router VRF Cache only once to add new relationship to routers
    check_vrf_cache(router, vrf)

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Network {vrfcidr:{vrfcidr}}) RETURN n',
        vrfcidr=vrfcidr)

    # Add new network
    if len(results) == 0:
        logger.info("New: Inserting CIDR %s", vrfcidr)

        results = nglib.py2neo_ses.cypher.execute(
            'CREATE (n:Network {cidr:{cidr}, vrfcidr:{vrfcidr}, name:{vrfcidr}, '
            + 'vrf:{vrf}, desc:{desc}, vid:{vlan}, virtual_proto:{vproto}, virtual_version:{vver}, '
            + 'virtual_group:{vgroup}, gateway:{gateway}, secondary:{sec}, time:{time}}) RETURN n',
            cidr=cidr, vrfcidr=vrfcidr, vrf=vrf, vlan=vlan, desc=desc, gateway=gateway,
            vproto=vproto, vver=vver, vgroup=vgroup, sec=secondary, time=time)

        # Record New Network Unless Ignoring initial run
        if not ignore_new:
            # Store a NewNetwork Object for alerting
            results = nglib.py2neo_ses.cypher.execute(
                'CREATE (n:NewNetwork {cidr:{cidr}, vrfcidr:{vrfcidr}, name:{vrfcidr}, '
                + 'vrf:{vrf}, desc:{desc}, vid:{vlan}, gateway:{gateway}, virtual_proto:{vproto}, '
                + 'virtual_version:{vver}, time:{time}}) RETURN n',
                cidr=cidr, vrfcidr=vrfcidr, vrf=vrf, vlan=vlan, desc=desc,
                vproto=vproto, vver=vver, gateway=gateway, time=time)

    # Else update record
    else:
        logger.debug("Updating CIDR in Network %s", vrfcidr)
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}}) SET n += {desc:{desc}, vid:{vlan}, '
            + 'virtual_group:{vgroup}, gateway:{gateway}, virtual_proto:{vproto}, '
            + 'virtual_version:{vver}, secondary:{sec}, time:{time}} RETURN n',
            vrfcidr=vrfcidr, desc=desc, vlan=vlan, gateway=gateway, vproto=vproto,
            vver=vver, vgroup=vgroup, sec=secondary, time=time)


    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:VRF_IN]->() RETURN e',
        vrfcidr=vrfcidr)

    # Member of VRF Edge
    if len(results) == 0:
        logger.info("New: Creating VRF Relationship %s -> %s ", net['Subnet'], net['VRF'])

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}}), (v:VRF {name:{vrf}}) '
            + 'CREATE (n)-[e:VRF_IN]->(v) RETURN e',
            vrfcidr=vrfcidr, vrf=vrf)

    else:
        logger.debug("Found existing VRF Relationship %s -> %s ", net['Subnet'], net['VRF'])

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:VRF_IN]->(v:VRF {name:{vrf}}) '
            + 'SET e.time={time} RETURN e',
            vrfcidr=vrfcidr, vrf=vrf, time=time)

    # Make sure Routed By Primary and not p2p link
    if not standby and not p2p:

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_BY]->'
            + '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr, router=router)

        # New router for network
        if len(results) == 0:
            logger.info("New: Creating Router Relationship "
                        + "{0} -> {1} ".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                + 'CREATE (n)-[e:ROUTED_BY {vrf:{vrf}, ipv4:{rip}, '
                + 'v_prio:{vpriority}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr, vrf=vrf, time=time, router=router, rip=rip, vpriority=vpriority)

            if len(results) == 0:
                logger.warning("Failed to Create Router Relationship "
                               + "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug("Updating Existing Router Relationship: "
                         + "{0} -> {1}".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_BY]->'
                + '(r:Switch:Router {name:{router}}) '
                + 'SET e += {vrf:{vrf}, ipv4:{rip}, v_prio:{vpriority}, time:{time}} RETURN n',
                vrfcidr=vrfcidr, vrf=vrf, router=router, time=time, rip=rip, vpriority=vpriority)

    # Standby Router for Network
    elif standby and not p2p:
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_STANDBY]->'
            + '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr, router=router)

        # New router for network
        if len(results) == 0:
            logger.info("New: Creating Standby Router Relationship "
                        + "{0} -> {1} ".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                + 'CREATE (n)-[e:ROUTED_STANDBY {vrf:{vrf}, ipv4:{rip}, '
                + 'v_prio:{vpriority}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr, vrf=vrf, time=time, router=router, rip=rip, vpriority=vpriority)

            if len(results) == 0:
                logger.warning("Failed to Create Router Relationship "
                               + "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug("Updating Existing Standby Router Relationship: "
                         + "{0} -> {1}".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_STANDBY]->'
                + '(r:Switch:Router {name:{router}}) SET e += {vrf:{vrf}, ipv4:{rip}, '
                + 'v_prio:{vpriority}, time:{time}} RETURN n',
                vrfcidr=vrfcidr, vrf=vrf, router=router, time=time, rip=rip, vpriority=vpriority)

    # P2P Routed Network. Use Special ROUTED Label for each VRF
    elif p2p:

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED {vrf:{vrf}}]->'
            + '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr, vrf=vrf, router=router)

        # New P2P Relationship for network
        if len(results) == 0:
            logger.info("New: Creating P2P Router Relationship "
                        + "{0} -> {1} ({2})".format(net['Subnet'], net['Router'], vrf))


            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                + 'CREATE (n)-[e:ROUTED {vrf:{vrf}, gateway:{gateway}, ipv4:{rip}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr, vrf=vrf, time=time, gateway=gateway, router=router, rip=rip)

            if len(results) == 0:
                logger.warning("Failed to Create Router Relationship "
                               + "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug("Updating Existing P2P Router Relationship: "
                         + "{0} -> {1} ({2})".format(net['Subnet'], net['Router'], vrf))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED]->'
                + '(r:Switch:Router {name:{router}}) '
                + 'SET e += {vrf:{vrf}, gateway:{gateway}, ipv4:{rip}, time:{time}} RETURN n',
                vrfcidr=vrfcidr, vrf=vrf, router=router, gateway=gateway, rip=rip, time=time)

    # Link up L2 to L3 info
    link_l3_to_l2(vrfcidr, vlan, router, time)
示例#20
0
def import_single_net(net, ignore_new, vrfmap):
    """Import a CIDR Entry in to NetGrph"""

    time = nglib.get_time()

    router = net['Router']
    gateway = net['Gateway']
    cidr = net['Subnet']
    desc = net['Description']
    vrf = net['VRF']
    vlan = net['VLAN']
    p2p = net['P2P']
    standby = net['Standby']

    # Check VRF Mapping to remap defaults
    if vrf == 'default' and router in vrfmap:
        vrf = vrfmap[router]
        #print("VRF", vrf)

    # Process P2P and Standby Router bools
    if p2p == "True":
        p2p = True
    else:
        p2p = False

    if standby == "True":
        standby = True
    else:
        standby = False

    vrfcidr = '{0}-{1}'.format(vrf, cidr)  #unique key

    # Check the Router VRF Cache only once to add new relationship to routers
    check_vrf_cache(router, vrf)

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Network {vrfcidr:{vrfcidr}}) RETURN n', vrfcidr=vrfcidr)

    # Add new network
    if len(results) == 0:
        logger.info("New: Inserting CIDR %s", vrfcidr)

        results = nglib.py2neo_ses.cypher.execute(
            'CREATE (n:Network {cidr:{cidr}, vrfcidr:{vrfcidr}, name:{vrfcidr}, '
            + 'vrf:{vrf}, desc:{desc}, vid:{vlan}, ' +
            'gateway:{gateway}, time:{time}}) RETURN n',
            cidr=cidr,
            vrfcidr=vrfcidr,
            vrf=vrf,
            vlan=vlan,
            desc=desc,
            gateway=gateway,
            time=time)

        # Record New Network Unless Ignoring initial run
        if not ignore_new:
            # Store a NewNetwork Object for alerting
            results = nglib.py2neo_ses.cypher.execute(
                'CREATE (n:NewNetwork {cidr:{cidr}, vrfcidr:{vrfcidr}, name:{vrfcidr}, '
                +
                'vrf:{vrf}, desc:{desc}, vid:{vlan}, gateway:{gateway}, time:{time}}) RETURN n',
                cidr=cidr,
                vrfcidr=vrfcidr,
                vrf=vrf,
                vlan=vlan,
                desc=desc,
                gateway=gateway,
                time=time)

    # Else update record
    else:
        logger.debug("Updating CIDR in Network %s", vrfcidr)
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}}) SET n += {desc:{desc}, vid:{vlan}, '
            + 'gateway:{gateway}, time:{time}} RETURN n',
            vrfcidr=vrfcidr,
            desc=desc,
            vlan=vlan,
            gateway=gateway,
            time=time)

    results = nglib.py2neo_ses.cypher.execute(
        'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:VRF_IN]->() RETURN e',
        vrfcidr=vrfcidr)

    # Member of VRF Edge
    if len(results) == 0:
        logger.info("New: Creating VRF Relationship %s -> %s ", net['Subnet'],
                    net['VRF'])

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}}), (v:VRF {name:{vrf}}) ' +
            'CREATE (n)-[e:VRF_IN]->(v) RETURN e',
            vrfcidr=vrfcidr,
            vrf=vrf)

    else:
        logger.debug("Found existing VRF Relationship %s -> %s ",
                     net['Subnet'], net['VRF'])

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:VRF_IN]->(v:VRF {name:{vrf}}) '
            + 'SET e.time={time} RETURN e',
            vrfcidr=vrfcidr,
            vrf=vrf,
            time=time)

    # Make sure Routed By Primary and not p2p link
    if not standby and not p2p:

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_BY]->' +
            '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr,
            router=router)

        # New router for network
        if len(results) == 0:
            logger.info("New: Creating Router Relationship " +
                        "{0} -> {1} ".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                +
                'CREATE (n)-[e:ROUTED_BY {vrf:{vrf}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr,
                vrf=vrf,
                time=time,
                router=router)

            if len(results) == 0:
                logger.warning(
                    "Failed to Create Router Relationship " +
                    "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug("Updating Existing Router Relationship: " +
                         "{0} -> {1}".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_BY]->' +
                '(r:Switch:Router {name:{router}}) ' +
                'SET e += {vrf:{vrf}, time:{time}} RETURN n',
                vrfcidr=vrfcidr,
                vrf=vrf,
                router=router,
                time=time)

    # Standby Router for Network
    elif standby and not p2p:
        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_STANDBY]->' +
            '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr,
            router=router)

        # New router for network
        if len(results) == 0:
            logger.info("New: Creating Standby Router Relationship " +
                        "{0} -> {1} ".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                +
                'CREATE (n)-[e:ROUTED_STANDBY {vrf:{vrf}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr,
                vrf=vrf,
                time=time,
                router=router)

            if len(results) == 0:
                logger.warning(
                    "Failed to Create Router Relationship " +
                    "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug("Updating Existing Standby Router Relationship: " +
                         "{0} -> {1}".format(net['Subnet'], net['Router']))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED_STANDBY]->' +
                '(r:Switch:Router {name:{router}}) SET e += {vrf:{vrf}, time:{time}} RETURN n',
                vrfcidr=vrfcidr,
                vrf=vrf,
                router=router,
                time=time)

    # P2P Routed Network. Use Special ROUTED Label for each VRF
    elif p2p:

        results = nglib.py2neo_ses.cypher.execute(
            'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED {vrf:{vrf}}]->' +
            '(r:Switch:Router {name:{router}}) RETURN e',
            vrfcidr=vrfcidr,
            vrf=vrf,
            router=router)

        # New P2P Relationship for network
        if len(results) == 0:
            logger.info(
                "New: Creating P2P Router Relationship " +
                "{0} -> {1} ({2})".format(net['Subnet'], net['Router'], vrf))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}}), (r:Switch:Router {name:{router}}) '
                +
                'CREATE (n)-[e:ROUTED {vrf:{vrf}, gateway:{gateway}, time:{time}}]->(r) RETURN e',
                vrfcidr=vrfcidr,
                vrf=vrf,
                time=time,
                gateway=gateway,
                router=router)

            if len(results) == 0:
                logger.warning(
                    "Failed to Create Router Relationship " +
                    "{0} -> {1} ".format(net['Subnet'], net['Router']))

        # Update relationship timestamp
        else:
            logger.debug(
                "Updating Existing P2P Router Relationship: " +
                "{0} -> {1} ({2})".format(net['Subnet'], net['Router'], vrf))

            results = nglib.py2neo_ses.cypher.execute(
                'MATCH (n:Network {vrfcidr:{vrfcidr}})-[e:ROUTED]->' +
                '(r:Switch:Router {name:{router}}) ' +
                'SET e += {vrf:{vrf}, gateway:{gateway}, time:{time}} RETURN n',
                vrfcidr=vrfcidr,
                vrf=vrf,
                router=router,
                gateway=gateway,
                time=time)

    # Link up L2 to L3 info
    link_l3_to_l2(vrfcidr, vlan, router, time)