network.py 1.98 KB
#!/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'eduardo'
from iptools.ipv4 import netmask2prefix
from netaddr import IPNetwork, IPSet
from ..model import Base
from sqlalchemy.schema import Column
from sqlalchemy.types import String, Integer


class Network(Base):
    """
    Rede onde a busca será realizada
    """
    __tablename__ = 'network'
    ip_network = Column(String(16), nullable=False, primary_key=True)
    network_file = Column(String)
    netmask = Column(String(16))
    prefixlen = Column(Integer)
    name = Column(String)

    def __init__(self,
                 network_ip,
                 network_file=None,
                 netmask=None,
                 prefixlen=None,
                 name=None
                 ):
        """
        :param network_ip: Ip da rede
        :param netmask: Máscara da rede
        :param cidr: CIDR para calcular a máscara da rede
        :param name: Nome da rede
        """
        self.network_ip = network_ip
        self.netmask = netmask
        self.prefixlen = prefixlen
        self.name = name
        self.network_file = network_file
        if self.netmask is None:
            self.netmask = self.network_ip.netmask
        if self.prefixlen is None:
            self.prefixlen = self.network_ip.prefixlen

        # SQLAlchemy attribute
        self.ip_network = str(self.network_ip.ip)

    @property
    def network_ip(self):
        return self._network_ip

    @network_ip.setter
    def network_ip(self, value):
        self._network_ip = IPNetwork(value)
        if self._network_ip.prefixlen == 32:
            if self.netmask is not None:
                prefixlen = netmask2prefix(self.netmask)
                self._network_ip = IPNetwork(str(self._network_ip.ip) + "/" + str(prefixlen))
                self.prefixlen = prefixlen

    def ip_list(self):
        """
        Método que encontra a lista de IP's da subrede
        :return: Conjunto de IP's para realizar a interação
        """
        return IPSet(self.network_ip)