Beispiel #1
0
    def __init__(self, cidr, _test=False, **kwargs):

        if not _test:
            self._json_file = File('_ipnetwork')

        self._ipnetwork = IPNetwork(cidr)
        self._cidr = self._ipnetwork.cidr.__str__()
        self._prefixlen = self._ipnetwork.prefixlen
        if cidr != self._cidr:
            raise AnsibleError(
                "Invalid IP network: %s is an IP address belong to %s" %
                (cidr, self._cidr))
        elif self._prefixlen > 30:
            raise AnsibleError(
                "Network prefix length > 30 is not supported: %s" % self._cidr)

        self._ipset = IPSet(self._ipnetwork)
        self._existing_ipset = self._global_existing_ipset[self._cidr]
        self._overlaps = None

        try:
            self._attrs = self._json_file[self._cidr]
        except KeyError:
            self._attrs = {
                'description': None,
                'parent': None,
                'is_parent': False,
                'state': None,
                **kwargs
            }

            self._json_file[self._cidr] = self._attrs

        for _cidr, _attrs in self._json_file.items():
            _ipnetwork = IPNetwork(_cidr)

            if self._cidr != _cidr:
                if self._ipnetwork.__contains__(_ipnetwork):
                    if _attrs['state'] == 'allocated':
                        self._overlaps = cidr
                        break
                    self._existing_ipset.add(_ipnetwork)
                    # warning('A*** ', self._cidr, ',', _cidr, _attrs, '\n')
                elif _ipnetwork.__contains__(self._ipnetwork):
                    self._attrs['parent'] = _cidr
                    self._global_existing_ipset[_cidr].add(self._ipnetwork)
	def scanIPclosed(self,result):
		if result[0]:
			# scan subnet outside ipv4.address/24
			if result[1] == "address":
				print "[Networkbrowser] got IP:",result[0]
				self.setStatus('update')
				net = IPNetwork('%s/24' % result[0])
				localnet = IPNetwork('%s/%s' % (self._ipv4.address, self._ipv4.netmask))
				if localnet.__contains__(net):
					self._startScan(self.iface, net.cidr)
				else:
					for host in net.iter_hosts():
						self._nrthreads += 1
						reactor.callInThread(self.getNetworkIPs, str(host))
			# add offline host
			elif result[1] == "nfs":
				self.networklist.append(NetworkItemHost(result[0], result[0], ['nfs']))
				write_cache(self.cache_file, self.networklist)
				self.updateNetworkList()
 def scanIPclosed(self, result):
     if result[0]:
         # scan subnet outside ipv4.address/24
         if result[1] == "address":
             print "[Networkbrowser] got IP:", result[0]
             self.setStatus('update')
             net = IPNetwork('%s/24' % result[0])
             localnet = IPNetwork('%s/%s' %
                                  (self._ipv4.address, self._ipv4.netmask))
             if localnet.__contains__(net):
                 self._startScan(self.iface, net.cidr)
             else:
                 for host in net.iter_hosts():
                     self._nrthreads += 1
                     reactor.callInThread(self.getNetworkIPs, str(host))
         # add offline host
         elif result[1] == "nfs":
             self.networklist.append(
                 NetworkItemHost(result[0], result[0], ['nfs']))
             write_cache(self.cache_file, self.networklist)
             self.updateNetworkList()
Beispiel #4
0
class Network:

    _json_file = File('ipnetworks')
    _temp = _defaultdict()
    _global_existing_ipset = collections.defaultdict(IPSet)

    def __init__(self, cidr, _test=False, **kwargs):

        if not _test:
            self._json_file = File('_ipnetwork')

        self._ipnetwork = IPNetwork(cidr)
        self._cidr = self._ipnetwork.cidr.__str__()
        self._prefixlen = self._ipnetwork.prefixlen
        if cidr != self._cidr:
            raise AnsibleError(
                "Invalid IP network: %s is an IP address belong to %s" %
                (cidr, self._cidr))
        elif self._prefixlen > 30:
            raise AnsibleError(
                "Network prefix length > 30 is not supported: %s" % self._cidr)

        self._ipset = IPSet(self._ipnetwork)
        self._existing_ipset = self._global_existing_ipset[self._cidr]
        self._overlaps = None

        try:
            self._attrs = self._json_file[self._cidr]
        except KeyError:
            self._attrs = {
                'description': None,
                'parent': None,
                'is_parent': False,
                'state': None,
                **kwargs
            }

            self._json_file[self._cidr] = self._attrs

        for _cidr, _attrs in self._json_file.items():
            _ipnetwork = IPNetwork(_cidr)

            if self._cidr != _cidr:
                if self._ipnetwork.__contains__(_ipnetwork):
                    if _attrs['state'] == 'allocated':
                        self._overlaps = cidr
                        break
                    self._existing_ipset.add(_ipnetwork)
                    # warning('A*** ', self._cidr, ',', _cidr, _attrs, '\n')
                elif _ipnetwork.__contains__(self._ipnetwork):
                    self._attrs['parent'] = _cidr
                    self._global_existing_ipset[_cidr].add(self._ipnetwork)
                    # warning('B*** ', _cidr, ',', self._cidr, self._attrs, '\n')

    @property
    def _size(self):
        return self._ipnetwork.size - 2

    @property
    def _usable_ip(self):
        return self._size - 2

    @property
    def _iprange(self):
        return '{}-{}'.format(self._ipnetwork.network,
                              self._ipnetwork.broadcast)

    @property
    def _netmask(self):
        return str(self._ipnetwork.netmask)

    @property
    def _wildmask(self):
        return str(self._ipnetwork.hostmask)

    def _check_overlaps(self):
        if self._overlaps:
            raise AnsibleError('Network %s overlap with existing network %s' %
                               (self._cidr, self._overlaps))

    def iter_subnets(self, prefixlen, random=True):

        if self._attrs['state'] == 'allocated':
            raise AnsibleError('Network %s has already assign hosts' %
                               self._cidr)
        self._check_overlaps()

        cidrs = (self._ipset - self._existing_ipset).iter_cidrs()
        subnets = [s for c in cidrs for s in c.subnet(prefixlen)]

        if random:
            shuffle(subnets)

        for subnet in subnets:
            self._existing_ipset.add(subnet)
            yield str(subnet)

    def iter_ipaddrs(self, random=True, reverse=False):

        if len(self._existing_ipset) > 0:
            raise AnsibleError("Network %s is already subnetted" % self._cidr)
        self._check_overlaps()

        try:
            self._existing_ipset.update(
                IPSet([i for i in self._json_file[self._cidr]['ipaddresses']]))
        except KeyError:
            pass

        ipaddrs = [
            i
            for i in IPSet(self._ipnetwork.iter_hosts()) - self._existing_ipset
        ]

        if random:
            shuffle(ipaddrs)
        elif reverse:
            reversed(ipaddrs)

        self._attrs.update({'state': 'allocated', 'ipaddresses': []})

        self._temp[self._cidr].update(self._attrs)

        for ipaddr in ipaddrs:
            self._temp[self._cidr]['ipaddresses'].append(str(ipaddr))
            self._existing_ipset.add(ipaddr)
            yield self._get_addrs(ipaddr)

    def _get_addrs(self, ipaddr):
        ip = str(ipaddr)
        prefix = '%s/%s' % (ip, self._prefixlen)
        host = '%s/32' % ip
        netmask = (ip, self._netmask)
        wildmask = (ip, self._wildmask)

        return ip, prefix, host

    def last_ip(self, incl_prefix=False):
        return self._get_addrs(IPAddress(self._ipnetwork.last - 1))

    def first_ip(self, incl_prefix=False):
        return self._get_addrs(IPAddress(self._ipnetwork.first + 1))

    def remove_subnet(self, subnet):
        for k, v in self._json_file.copy().items():
            if k == subnet and v['parent'] == self._cidr:
                del self._json_file[k]
        # del self._json_file[self._cidr]

    def _host_addr(self, addr):
        return re.sub(r'/\d+', '/32', addr)

    def remove_ipaddr(self, ipaddr):
        try:
            del self._attrs['ipaddresses'][ipaddr]
        except KeyError:
            pass

    def save(self):

        self._json_file.update(self._temp)
        self._json_file.save()