Ejemplo n.º 1
0
    def __init__(self, svr, instance, instance_com):
        self.server = svr
        self.instance = instance
        self.instance_com = instance_com
        self.iroutes = {}
        self.iroutes_thread = {}
        self.iroutes_lock = threading.RLock()
        self.iroutes_index = collections.defaultdict(set)
        self.call_queue = callqueue.CallQueue(self.instance.is_sock_interrupt,
                                              512)
        self.clients_call_queue = callqueue.CallQueue(
            self.instance.is_sock_interrupt)
        self.obj_cache = objcache.ObjCache()
        self.client_routes = set()

        self.clients = docdb.DocDb(
            'user_id',
            'mac_addr',
            'virt_address',
        )
        self.clients_queue = collections.deque()

        self.ip_pool = []
        self.ip_network = ipaddress.IPv4Network(self.server.network)
        for ip_addr in self.ip_network.iterhosts():
            self.ip_pool.append(ip_addr)
Ejemplo n.º 2
0
    def assign_ip_addr(self, org_id, user_id):
        network_hash = self.server.network_hash
        server_id = self.server.id

        response = self.collection.update({
            'network': network_hash,
            'server_id': server_id,
            'user_id': {'$exists': False},
        }, {'$set': {
            'org_id': org_id,
            'user_id': user_id,
        }})
        if response['updatedExisting']:
            return

        network = ipaddress.IPv4Network(self.server.network)
        if self.server.network_start:
            network_start = ipaddress.IPv4Address(self.server.network_start)
        else:
            network_start = None
        if self.server.network_end:
            network_end = ipaddress.IPv4Address(self.server.network_end)
        else:
            network_end = None

        ip_pool = self.get_ip_pool(network, network_start)
        if not ip_pool:
            return

        try:
            doc = self.collection.find({
                'network': network_hash,
                'server_id': server_id,
            }).sort('_id', pymongo.DESCENDING)[0]
            if doc:
                last_addr = doc['_id']
                for remote_ip_addr in ip_pool:
                    if int(remote_ip_addr) == last_addr:
                        break
        except IndexError:
            pass

        for remote_ip_addr in ip_pool:
            if network_end and remote_ip_addr > network_end:
                break

            try:
                self.collection.insert({
                    '_id': int(remote_ip_addr),
                    'network': network_hash,
                    'server_id': server_id,
                    'org_id': org_id,
                    'user_id': user_id,
                    'address': '%s/%s' % (remote_ip_addr, network.prefixlen),
                })
                return True
            except pymongo.errors.DuplicateKeyError:
                pass

        return False
Ejemplo n.º 3
0
    def assign_ip_pool(self, network, network_start,
            network_end, network_hash):
        server_id = self.server.id
        pool_end = False

        network = ipaddress.IPv4Network(network)
        if network_start:
            network_start = ipaddress.IPv4Address(network_start)
        if network_end:
            network_end = ipaddress.IPv4Address(network_end)

        ip_pool = self.get_ip_pool(network, network_start)
        if not ip_pool:
            return

        bulk = self.collection.initialize_unordered_bulk_op()
        bulk_empty = True

        for org in self.server.iter_orgs():
            org_id = org.id

            for user in org.iter_users(include_pool=True):
                try:
                    remote_ip_addr = next(ip_pool)
                    if network_end and remote_ip_addr > network_end:
                        raise StopIteration()
                except StopIteration:
                    pool_end = True
                    break
                doc_id = int(remote_ip_addr)

                spec = {
                    '_id': doc_id,
                }
                doc = {'$set': {
                    '_id': doc_id,
                    'network': network_hash,
                    'server_id': server_id,
                    'org_id': org_id,
                    'user_id': user.id,
                    'address': '%s/%s' % (remote_ip_addr, network.prefixlen),
                }}

                if bulk:
                    bulk.find(spec).upsert().update(doc)
                    bulk_empty = False
                else:
                    self.collection.update(spec, doc, upsert=True)

            if pool_end:
                logger.warning('Failed to assign ip addresses ' +
                    'to server, ip pool empty', 'server',
                    server_id=server_id,
                    org_id=org_id,
                )
                break

        if not bulk_empty:
            bulk.execute()
Ejemplo n.º 4
0
    def assign_ip_addr(self, org_id, user_id):
        network = self.server.network
        server_id = self.server.id

        response = self.collection.update(
            {
                'network': network,
                'server_id': server_id,
                'user_id': {
                    '$exists': False
                },
            }, {'$set': {
                'org_id': org_id,
                'user_id': user_id,
            }})
        if response['updatedExisting']:
            return

        ip_network = ipaddress.IPv4Network(network)
        ip_pool = ip_network.iterhosts()
        ip_pool.next()

        try:
            doc = self.collection.find({
                'network': network,
                'server_id': server_id,
            }).sort('_id', pymongo.DESCENDING)[0]
            if doc:
                last_addr = doc['_id']
                for remote_ip_addr in ip_pool:
                    if int(remote_ip_addr) == last_addr:
                        break
        except IndexError:
            pass

        for remote_ip_addr in ip_pool:
            try:
                self.collection.insert({
                    '_id':
                    int(remote_ip_addr),
                    'network':
                    network,
                    'server_id':
                    server_id,
                    'org_id':
                    org_id,
                    'user_id':
                    user_id,
                    'address':
                    '%s/%s' % (remote_ip_addr, ip_network.prefixlen),
                })
                return True
            except pymongo.errors.DuplicateKeyError:
                pass

        return False
Ejemplo n.º 5
0
    def assign_ip_pool(self, network):
        server_id = self.server.id
        pool_end = False

        ip_network = ipaddress.IPv4Network(network)
        ip_pool = ip_network.iterhosts()
        ip_pool.next()

        if mongo.has_bulk:
            bulk = self.collection.initialize_unordered_bulk_op()
            bulk_empty = True
        else:
            bulk = None
            bulk_empty = None

        for org in self.server.iter_orgs():
            org_id = org.id

            for user in org.iter_users(include_pool=True):
                try:
                    remote_ip_addr = ip_pool.next()
                except StopIteration:
                    pool_end = True
                    break
                doc_id = int(remote_ip_addr)

                spec = {
                    '_id': doc_id,
                }
                doc = {'$set': {
                    '_id': doc_id,
                    'network': network,
                    'server_id': server_id,
                    'org_id': org_id,
                    'user_id': user.id,
                    'address': '%s/%s' % (remote_ip_addr,
                        ip_network.prefixlen),
                }}

                if bulk:
                    bulk.find(spec).upsert().update(doc)
                    bulk_empty = False
                else:
                    self.collection.update(spec, doc, upsert=True)

            if pool_end:
                logger.warning('Failed to assign ip addresses ' +
                    'to server, ip pool empty', 'server',
                    server_id=server_id,
                    org_id=org_id,
                )
                break

        if bulk and not bulk_empty:
            bulk.execute()
Ejemplo n.º 6
0
    def __init__(self, server, instance, instance_com):
        self.server = server
        self.instance = instance
        self.instance_com = instance_com

        self.clients = collections.deque()
        self.ips = {}
        self.dyn_ips = set()
        self.devices = collections.defaultdict(dict)

        self.ip_pool = []
        self.ip_network = ipaddress.IPv4Network(self.server.network)
        for ip_addr in self.ip_network.iterhosts():
            self.ip_pool.append(ip_addr)
Ejemplo n.º 7
0
    def __init__(self, server, instance, instance_com):
        self.server = server
        self.instance = instance
        self.instance_com = instance_com

        self.clients = docdb.DocDb(
            'user_id',
            'device_id',
            'virt_address',
        )
        self.clients_queue = collections.deque()

        self.ip_pool = []
        self.ip_network = ipaddress.IPv4Network(self.server.network)
        for ip_addr in self.ip_network.iterhosts():
            self.ip_pool.append(ip_addr)
Ejemplo n.º 8
0
 def __init__(self, server, instance):
     self.server = server
     self.instance = instance
     self.sock = None
     self.socket_path = instance.management_socket_path
     self.bytes_lock = threading.Lock()
     self.bytes_recv = 0
     self.bytes_sent = 0
     self.client = None
     self.clients = []
     self.clients_active = 0
     self.client_count = 0
     self.client_bytes = {}
     self.client_devices = collections.defaultdict(list)
     self.client_ips = set()
     self.client_dyn_ips = set()
     self.cur_timestamp = utils.now()
     self.ip_network = ipaddress.IPv4Network(self.server.network)
     self.ip_pool = []
     self.bandwidth_rate = settings.vpn.bandwidth_update_rate
     for ip_addr in self.ip_network.iterhosts():
         self.ip_pool.append(ip_addr)
Ejemplo n.º 9
0
    def assign_ip_pool_org(self, org_id):
        org = organization.get_by_id(org_id)
        network_hash = self.server.network_hash
        server_id = self.server.id
        org_id = org.id
        ip_pool_avial = True
        pool_end = False

        network = ipaddress.IPv4Network(self.server.network)
        network_start = self.server.network_start
        network_end = self.server.network_end
        if network_start:
            network_start = ipaddress.IPv4Address(network_start)
        if network_end:
            network_end = ipaddress.IPv4Address(network_end)

        ip_pool = self.get_ip_pool(network, network_start)
        if not ip_pool:
            return

        try:
            doc = self.collection.find({
                'network': network_hash,
                'server_id': server_id,
            }).sort('_id', pymongo.DESCENDING)[0]
            if doc:
                last_addr = doc['_id']

                for remote_ip_addr in ip_pool:
                    if int(remote_ip_addr) == last_addr:
                        break
                    if network_end and remote_ip_addr > network_end:
                        break
        except IndexError:
            pass

        if mongo.has_bulk:
            bulk = self.collection.initialize_unordered_bulk_op()
            bulk_empty = True
        else:
            bulk = None
            bulk_empty = None

        for user in org.iter_users(include_pool=True):
            if ip_pool_avial:
                response = self.collection.update(
                    {
                        'network': network_hash,
                        'server_id': server_id,
                        'user_id': {
                            '$exists': False
                        },
                    }, {'$set': {
                        'org_id': org_id,
                        'user_id': user.id,
                    }})
                if response['updatedExisting']:
                    continue
                ip_pool_avial = False

            try:
                remote_ip_addr = ip_pool.next()
                if network_end and remote_ip_addr > network_end:
                    raise StopIteration()
            except StopIteration:
                pool_end = True
                break
            doc_id = int(remote_ip_addr)

            spec = {
                '_id': doc_id,
            }
            doc = {
                '$set': {
                    '_id': doc_id,
                    'network': network_hash,
                    'server_id': server_id,
                    'org_id': org_id,
                    'user_id': user.id,
                    'address': '%s/%s' % (remote_ip_addr, network.prefixlen),
                }
            }

            if bulk:
                bulk.find(spec).upsert().update(doc)
                bulk_empty = False
            else:
                self.collection.update(spec, doc, upsert=True)

        if bulk and not bulk_empty:
            bulk.execute()

        if pool_end:
            logger.warning(
                'Failed to assign ip addresses ' + 'to org, ip pool empty',
                'server',
                org_id=org_id,
            )