Esempio n. 1
0
def choose_routers(service_name):
    """
    this func return the current most available routers
    return an array of the objects.
    """
    
    routers = db.get_data(ONION_ROUTERS_DB_DIR, '''SELECT router_name, ip, port, load, public_key_dir, last_seen from onion_routers''')
    
    routers = keep_alive_handler.check_avaiable_routers(routers)

    service_details = db.get_data(SERVICES_DB_DIR, '''SELECT ren_name, serial_number from services WHERE service_name = \'%s\''''%service_name)[0]
    
    ren_name = service_details[0]
    serial_number = service_details[1]

    clients_routers = {'3' : filter(lambda details: details[0] == ren_name, routers)[0]}
    routers.remove(clients_routers['3'])

    most_availables_routers = sorted(routers, key = lambda details: details[3])
    clients_routers['1'] = most_availables_routers[0]
    clients_routers['2'] = most_availables_routers[1]

    for key in clients_routers.keys():
        clients_routers[key] = {
                                    "router_name" : clients_routers[key][0].encode('utf-8'),
                                    "router_ip" : clients_routers[key][1].encode('utf-8'),
                                    "router_port" : clients_routers[key][2],
                                    "router_public_key" : onion_encryption_decryption.get_public_key(clients_routers[key][4].encode('utf-8'))
                                }
    return clients_routers, serial_number
Esempio n. 2
0
 def __is_router_exist(router_name):
     """
     return true if the router is written in the routers database and false if not
     """
     #print '[Checking if %s in the routers database]'%(router_name,)
     routers = db.get_data(onion_router.db_dir,
                           '''SELECT * from onion_routers''')
     for router in routers:
         if router[1] == router_name:
             return True
     return False
Esempio n. 3
0
def choose_ren_point():
    """
    returns the ren point to the new service
    """

    online_routers = (db.get_data(
        ONION_ROUTERS_DB_DIR,
        "SELECT router_name, ip, load from onion_routers WHERE is_available = 1"
    ))
    online_routers = sorted(online_routers, key=lambda details: details[2])

    chosen_ren = online_routers[0]
    return {"ren_name": chosen_ren[0], "ren_ip": chosen_ren[1]}
Esempio n. 4
0
def get_service(service_name):
    """
    returns the service details(ip) and the relavent routers
    """
    try:
        service_details = db.get_data(SERVICES_DB_DIR, '''SELECT ren_ip, ren_name, special_key, public_key_dir, serial_number from services WHERE service_name = \'%s\''''%service_name)[0]
        #service_data = {'serial_number':service_details[4]}
        service_data = {}
        service_public_key = onion_encryption_decryption.get_public_key(service_details[3])
        service_data["service_public_key"] = service_public_key.encode('utf-8')
        service_data["communication_type"] = 0
        service_data["routers"], service_data["serial_number"] = choose_routers(service_name)#service_details[1]) 
        VB.print_data("Sent Details About %s"%(service_name,), VB.CLIENTS)
        print service_data
        return CLIENT_REQ, STATE_SUCCEED, service_data
    except:
        return CLIENT_REQ, STATE_FAILED, None
Esempio n. 5
0
def disconnect_service(details_dict):
    if not db.check_if_value_exist(SERVICES_DB_DIR, 'services', 'service_name',
                                   details_dict["service_name"]):
        return SERVICE_DISCONNECT, STATE_FAILED, None
    print details_dict
    service_name = details_dict["service_name"]
    service_obj = SERVICES[service_name]
    real_special_key = db.get_data(SERVICES_DB_DIR,
                                   'SELECT special_key from services')[0][0]
    print real_special_key
    if real_special_key == details_dict["special_key"]:
        VB.print_data('[Disconnecting Service:%s]' % (service_name, ),
                      VB.REGISTER)
        ren_details = service_obj.get_ren_name()
        SERVICES_UPDATES[ren_details] = (SERVICE_DISCONNECT, service_obj)
        return SERVICE_DISCONNECT, STATE_SUCCEED, None
    else:
        return SERVICE_DISCONNECT, STATE_FAILED, None
Esempio n. 6
0
 def __init__(self, router_details):
     #services <---> array of (name , ip,port, communication_type) - the router is the ren point of the services
     self.router_name = router_details["router_name"]
     self.ip = router_details["ip"]
     self.load = 0
     self.is_available = True
     self.port = router_details["port"]
     self.last_seen = time.time()
     self.public_key_dir = router_details["public_key_dir"]
     self.is_exist_in_database = False
     if self.is_exist_in_database:
         self.services = (db.get_data(
             onion_router.db_dir,
             "SELECT service_str from onion_routers WHERE router_name = %s"
             % (self.router_name, )))
         #print 'updating data for %s router'%(self.router_name,)
         VB.print_data(
             db.set_data(
                 onion_router.db_dir,
                 '''UPDATE onion_routers SET ip = \'%s\', port = \'%s\', is_available = \'%s\', last_seen = \'%s\', service_str =  \'%s\'\
                                     WHERE router_name = \'%s\'''' %
                 (self.ip, self.port, int(self.is_available),
                  self.last_seen, self.router_name, (self.services))),
             VB.GENERAL_DATA)
     else:
         #print 'new router added to the database'
         self.services = "None"
         VB.print_data(
             db.set_data(
                 onion_router.db_dir,
                 '''INSERT INTO onion_routers(router_name, ip, port, load, is_available,last_seen,public_key_dir, service_str)\
                                 VALUES(?,?,?,?,?,?,?,?)''',
                 args=(self.router_name, self.ip, self.port, self.load,
                       int(self.is_available), str(self.last_seen),
                       self.public_key_dir, (self.services))),
             VB.GENERAL_DATA)