Exemplo n.º 1
0
    def __parse_info(self):
        """
        Parser for the device details (called when attributes are requested)
        """
        details = {}
        try:
            out = filter(lambda x: x!='', check_output(
                ['networksetup','-getinfo',self.name]
            ).split('\n'))
        except CalledProcessError:
            return details

        for l in out:
            if l == 'Manual Configuration':
                details['ipv4_mode'] = 'manual'
                continue
            if l == 'DHCP Configuration':
                details['ipv4_mode'] = 'dhcp'
                continue

            try:
                (key,value) = [x.strip() for x in l.split(':',1)]
            except ValueError:
                raise ValueError('Error parsing line: %s' % l)

            if value == 'none':
                value = None
            if key in ['Subnet mask','IP address','Router']:
                value = IPv4Address(value)
            if key == 'Ethernet Address':
                value = EthernetMACAddress(value)

            details[key] = value

        return details
Exemplo n.º 2
0
    def match(self, address):
        if not isinstance(address, EthernetMACAddress):
            address = EthernetMACAddress(address)

        parts = address.address.upper().split(':')
        while parts:
            key = ':'.join(parts)
            if key in self:
                return self[key]
            parts.pop()

        return None
Exemplo n.º 3
0
def parse_ipv4_route_target(value):
    if value == 'default':
        return IPv4Address('0.0.0.0/0')

    elif value[:5] == 'link#':
        return value

    else:
        try:
            return EthernetMACAddress(value)
        except ValueError:
            pass

    return IPv4Address(value)
Exemplo n.º 4
0
 def __init__(self,
              address,
              ethernet,
              interface,
              expires=None,
              ifscope=None):
     self.address = IPv4Address(address)
     try:
         self.ethernet = EthernetMACAddress(ethernet)
     except ValueError:
         self.ethernet = None
     self.interface = interface
     self.expires = expires
     self.ifscope = ifscope.strip('[]')
Exemplo n.º 5
0
    def parse(self, line):
        """
        Parse a configuration line for interface
        """

        for inet_re in RE_INET_LINE:
            m = inet_re.match(line)
            if m:
                data = m.groupdict()
                data['addr_type'] = 'IPv4'
                data['address'] = IPv4Address(data['address'])
                data['netmask'] = IPv4Address(data['netmask'])
                if 'broadcast' in data:
                    data['broadcast'] = IPv4Address(data['broadcast'])
                else:
                    data['broadcast'] = None

                self['addresses'].append(data)
                return

        for inet6_re in RE_INET6_LINE:
            m = inet6_re.match(line)
            if m:
                data = m.groupdict()
                data['addr_type'] = 'IPv6'
                data['address'] = IPv6Address(data['address'])
                if 'prefix' in data:
                    data['prefix'] = int(data['prefix'])

                self['addresses'].append(data)
                return

        try:
            key, value = line.strip().split(None, 1)
            if key == 'ether':
                value = EthernetMACAddress(value)

        except ValueError:
            try:
                key, value = line.strip().split('=', 1)
            except ValueError:
                raise ValueError('Error splitting line {0}'.format(line))

        self[key] = value
Exemplo n.º 6
0
class IPRoutingTable(object):
    def __init__(self):
        self.ipv4 = []
        self.ipv6 = []

        try:
            output = check_output(['netstat', '-rn'])
        except CalledProcessError, emsg:
            raise RoutingTableError('Error checking netstat -rn output: %s' % emsg)

        for l in [x.strip() for x in output.split('\n') if x!='']:

            fields = l.split()
            if fields[0] == 'default':
                address = 'default'
            else:
                address = self.__parse_address__(fields[0])
                if address is None:
                    continue

            gateway = self.__parse_address__(fields[1])
            if gateway is not None:
                gateway_type = 'route'
            else:
                if fields[1][:4]=='link':
                    gateway = fields[1][4:].strip('#')
                    gateway_type = 'link'
                else:
                    try:
                        gateway = EthernetMACAddress(fields[1])
                        gateway_type = 'host'
                    except ValueError, emsg:
                        raise RoutingTableError('Error parsing gateway %s: %s' % (fields[1], emsg))

            if isinstance(address, IPv4Address) or isinstance(gateway, IPv4Address):
                if isinstance(address, basestring) and address=='default':
                    address = IPv4Address('default')
                self.ipv4.append(IPv4Route(address, gateway, gateway_type, *fields[2:]))

            if isinstance(address, IPv6Address) or isinstance(gateway, IPv6Address):
                if isinstance(address, basestring) and address=='default':
                    address = IPv6Address('default')
                self.ipv6.append(IPv6Route(address, gateway, gateway_type, *fields[2:]))
Exemplo n.º 7
0
def parse_ipv6_route_target(value):
    if value == 'default':
        return IPv6Address('0::/0')

    elif value[:5] == 'link#':
        return value

    else:
        try:
            return EthernetMACAddress(value)
        except ValueError:
            pass

    for fmt in IPV6_ROUTE_ADDRESS_FORMATS:
        m = fmt.match(value)
        if m:
            return IPv6Address('%s/%s' % (
                m.groupdict()['address'],
                m.groupdict().get('bitmask', 128),
            ))
            break

    raise ValueError('Error parsing address from %s' % value)
Exemplo n.º 8
0
class Route(object):
    def __init__(self, address, gateway, gateway_type, interface=None,
                       expire=None, flags=None, refs=None, used=None):
        self.address = address
        self.gateway = gateway
        self.gateway_type = gateway_type
        self.interface = interface
        self.expire = expire
        self.flags = flags is not None and flags or []
        self.refs = refs is not None and refs or 0
        self.used = refs is not None and refs or 0

    def match(self, address):
        if isinstance(address, basestring):
            try:
                address = type(self.address)(address)
            except ValueError:
                return False
        return self.address.addressInNetwork(address)

    @property
    def gateway_mac_address(self):
        if self.gateway_type not in ['route', 'host']:
            return None
        try:
            output = check_output(['arp', '-an'])
        except CalledProcessError, emsg:
            raise RoutingTableError('Error checking arp -rn output: %s' % emsg)
        for l in output.split('\n'):
            try:
                name, addr, at, mac, rest = l.split(None, 4)
                addr = addr.strip('()')
            except ValueError, emsg:
                continue
            if addr==self.gateway:
                return EthernetMACAddress(mac)
Exemplo n.º 9
0
    def parse(self, line):
        line = line.lstrip()
        fields = line.split()

        if fields[0] == 'inet':
            self.ipv4_addresses.append(
                BSDNetworkAddress('inet', fields[1], fields[2:]))

        elif fields[0] == 'inet6':
            self.ipv6_addresses.append(
                BSDNetworkAddress('inet6', fields[1], fields[2:]))

        elif fields[0] == 'ether':
            self.media = EthernetMACAddress(fields[1])

        elif fields[0] == 'lladdr':
            self.media = FirewireLocalLinkAddress(fields[1])

        elif fields[0] == 'status:':
            self.__parse_status__(fields[1:])

        elif fields[0] == 'media:':
            self.__parse_media__(fields[1:])

        elif fields[0][:8] == 'options=':
            self.__parse_options__(fields[0][8:])

        elif fields[0] == 'nd6':
            self.__parse_nd6_options__(fields[1])

        elif self.name[:6] == 'bridge':
            self.parse_bridge_configuration(fields)

        elif fields[0] == 'vlan:':
            self.vlan_id = fields[1]
            self.vlan_device = fields[4]
Exemplo n.º 10
0
NETWORK_OIDS_MAP = {
    'index': {
        'oid': '.1.3.6.1.2.1.2.2.1.1',
        'decode': lambda oid, x: (oid, int(x)),
    },
    'mtu': {
        'oid': '.1.3.6.1.2.1.2.2.1.4',
        'decode': lambda oid, x: (oid, int(x)),
    },
    'speed': {
        'oid': '.1.3.6.1.2.1.2.2.1.5',
        'decode': lambda oid, x: (oid, int(x)),
    },
    'phys_address': {
        'oid': '.1.3.6.1.2.1.2.2.1.6',
        'decode': lambda oid, x: (oid, EthernetMACAddress(x)),
    },
    'description': {
        'oid': '.1.3.6.1.2.1.2.2.1.2',
        'decode': lambda oid, x: (oid, str(x)),
    },
    'oper_status': {
        'oid': '.1.3.6.1.2.1.2.2.1.8',
        'decode': lambda oid, x: (oid, IF_STATUS_CODES[int(x)]),
    },
    'admin_status': {
        'oid': '.1.3.6.1.2.1.2.2.1.7',
        'decode': lambda oid, x: (oid, IF_STATUS_CODES[int(x)]),
    },
    'in_octets': {
        'oid': '.1.3.6.1.2.1.2.2.1.10',