Ejemplo n.º 1
0
def getNodes(node):
    as_nums = []          # AS numbers
    as_nodes = []         # Corresponding AS nodes
    ann_nodes = []        # announced nodes
    ann_id_list = []      # announced node IDs
    pref_nodes = getNodesRecursive(node, as_nums, ann_nodes, ann_id_list) 
    
    # Create asnodes for all as numbers 
    for AS in as_nums:
        as_nodes.append(asnode(AS))
    #as_nodes = as_nums
    
    return pref_nodes, as_nodes, ann_nodes, ann_id_list
Ejemplo n.º 2
0
def addFileToNeo(filename):
    #Create Database
    db = DB()

    ########## Create binary tree in memory#########
    # Set global lists of modified nodes
    print "building tree from file"
    tree = make_tree(filename)
    pref_nodes, as_nodes, announced_nodes, announced_id = getNodes(tree)
    #print "Nr of announced nodes:", len(announced_nodes)

    #Delete tree to save memory, not needed any more
    tree = None
    print "Reading existing prefixes from database"
    db_pref_dict = db.getNodes('prefix')
    print "Redaing announced prefixes from database"
    db_announced_pref = db.getAnnouncedNodes()
    print "Reading existing AS nodes from database"
    db_as_dict = db.getNodes('as_number')

    ##### Compare db and dump prefix nodes##########
    new_nodes = []
    updated_nodes = []

    #print pref_nodes[0]
    for n in pref_nodes:                              # Check all nodes 
        if n.id_hash in db_pref_dict:                 # Exists in DB
            if n.hashval != db_pref_dict[n.id_hash]:  # Modified
                updated_nodes.append(n)               # Update node
        else:                                         # New node
            new_nodes.append(n)			      # List of new nodes

    # Create new nodes
    created_nodes = []
    for n in new_nodes:
        res = db.createIndexed(n)
        created_nodes.append(res)
    print "Writing new prefixes to database..."
    db.finnish('node')

    ####Update modified nodes
    # Get references to originals
    print "Reading obsolete nodes..."
    for n in updated_nodes:
        db.getIndexed('prefix',n.id_hash)
    refs = db.finnish('read')
    # Add changes
    for i in range(0, len(updated_nodes)):
        db.update(updated_nodes[i], refs[i][0])
    # Write changes to DB
    print "Writing updated nodes to database..."
    db.finnish('node')


    unannounced_node_id = []
    #print db_announced_pref
    for n in db_announced_pref:
        if not n in announced_id:
            db.getIndexed('prefix', n)
            unannounced_node_id.append(n)
    print "Reading unannounced node references..."
    refs = db.finnish('read')

    for i in range(len(refs) -1):
        db.updateUnannounced(unannounced_node_id[i], refs[i][0])
    # Write changes to DB
    print "Writing unannounced node updates to database..."
    db.finnish('node')
    



    # Create child relations
    for i in range(0, len(new_nodes)):
        if new_nodes[i].mask != 0:
            db.getIndexed('prefix', new_nodes[i].id_hash)
            db.getIndexed('prefix', new_nodes[i].getParentID())
    print "Reading relation referenes for created nodes..."
    refs = db.finnish('read')          

    #  Write relations to database
    for i in range(0,len(new_nodes) - 1):
        db.createRel(refs[2*i + 1][0], "child", refs[2*i][0])
    print "Writing relations for created nodes..."
    db.finnish('rel')



    ##### Create AS nodes and relations##############################
    new_nodes = []         # REUSED, pref nodes no longer needed
    #updated_nodes = []     # REUSED, pref nodes no longer needed

    # Classify nodes
    for n in as_nodes:
        if not n.id_hash in db_as_dict:                   # Exists in DB
	    new_nodes.append(n)			      # List of new nodes

    # Create new nodes
    created_nodes = []
    for n in new_nodes:
        res = db.createIndexed(n)
        created_nodes.append(res)
    print "Writing new AS nodes to database..."
    db.finnish('node')

    ##### Update modified nodes
    # AS NODES DO NOT GET MODIFIED, no update required
    # Delete all old announce relations
    # Consider optimizing this to just removing unused announcements
    db.delAllRels('announce')

    ###### Create announced relations
    #rel_hashes = db.getRelations('announce')
    #print "RELATION HASHES",rel_hashes
    ctr = 1
    for i in range(len(announced_nodes)):
        for AS in announced_nodes[i].origin:
	    db.getIndexed('prefix', announced_nodes[i].id_hash)
	    db.getIndexed('as_number', asnode(AS).id_hash)
            ctr += 1
        
    print "Reading relation referenes for announced nodes..."
    refs = db.finnish('read')        

    #local_announce_rels = []    
    # Write relations to database
    for i in range(0,len(announced_nodes) - 1):
        if db.relHash(refs[2*i + 1][0], "announce", refs[2*i][0]) not in rel_hashes:
	    db.createRel(refs[2*i + 1][0], "announce", refs[2*i][0])
    print "Writing relations for created nodes..."
    db.finnish('rel')

    db.setMOAS()

        #h = db.relHash(refs[2*i + 1][0], "announce", refs[2*i][0])
        #if h not in rel_hashes:
	#db.createRel(refs[2*i + 1][0], "announce", refs[2*i][0])
        #else: 
        #   local_announce_rels.append(h) 
    print "Writing announce relations..."
    db.finnish('rel')
    db.setMOAS()

    print "...exiting..."