Blame pynslcd/ether.py

Packit 6bd9ab
Packit 6bd9ab
# ether.py - lookup functions for ethernet addresses
Packit 6bd9ab
#
Packit 6bd9ab
# Copyright (C) 2010-2017 Arthur de Jong
Packit 6bd9ab
#
Packit 6bd9ab
# This library is free software; you can redistribute it and/or
Packit 6bd9ab
# modify it under the terms of the GNU Lesser General Public
Packit 6bd9ab
# License as published by the Free Software Foundation; either
Packit 6bd9ab
# version 2.1 of the License, or (at your option) any later version.
Packit 6bd9ab
#
Packit 6bd9ab
# This library is distributed in the hope that it will be useful,
Packit 6bd9ab
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6bd9ab
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6bd9ab
# Lesser General Public License for more details.
Packit 6bd9ab
#
Packit 6bd9ab
# You should have received a copy of the GNU Lesser General Public
Packit 6bd9ab
# License along with this library; if not, write to the Free Software
Packit 6bd9ab
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6bd9ab
# 02110-1301 USA
Packit 6bd9ab
Packit 6bd9ab
import struct
Packit 6bd9ab
Packit 6bd9ab
import cache
Packit 6bd9ab
import common
Packit 6bd9ab
import constants
Packit 6bd9ab
import search
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def ether_aton(ether):
Packit 6bd9ab
    """Converst an ethernet address to binary form in network byte order."""
Packit 6bd9ab
    return struct.pack('BBBBBB', *(int(x, 16) for x in ether.split(':')))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def ether_ntoa(ether, compact=True):
Packit 6bd9ab
    """Conversts an ethernet address in network byte order to the string
Packit 6bd9ab
    representation."""
Packit 6bd9ab
    fmt = '%x' if compact else '%02x'
Packit 6bd9ab
    return ':'.join(fmt % x for x in struct.unpack('6B', ether))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
attmap = common.Attributes(cn='cn', macAddress='macAddress')
Packit 6bd9ab
filter = '(objectClass=ieee802Device)'
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class Search(search.LDAPSearch):
Packit 6bd9ab
Packit 6bd9ab
    case_insensitive = ('cn', )
Packit 6bd9ab
    limit_attributes = ('cn', 'macAddress')
Packit 6bd9ab
    required = ('cn', 'macAddress')
Packit 6bd9ab
Packit 6bd9ab
    def mk_filter(self):
Packit 6bd9ab
        # we need a custom mk_filter because this is an | query
Packit 6bd9ab
        if 'macAddress' in self.parameters:
Packit 6bd9ab
            ether = self.parameters['macAddress']
Packit 6bd9ab
            alt_ether = ether_ntoa(ether_aton(ether), compact=False)
Packit 6bd9ab
            return '(&%s(|(%s=%s)(%s=%s)))' % (self.filter,
Packit 6bd9ab
                      attmap['macAddress'], ether,
Packit 6bd9ab
                      attmap['macAddress'], alt_ether)
Packit 6bd9ab
        return super(Search, self).mk_filter()
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class Cache(cache.Cache):
Packit 6bd9ab
Packit 6bd9ab
    create_sql = '''
Packit 6bd9ab
        CREATE TABLE IF NOT EXISTS `ether_cache`
Packit 6bd9ab
          ( `cn` TEXT NOT NULL COLLATE NOCASE,
Packit 6bd9ab
            `macAddress` TEXT NOT NULL COLLATE NOCASE,
Packit 6bd9ab
            `mtime` TIMESTAMP NOT NULL,
Packit 6bd9ab
            UNIQUE (`cn`, `macAddress`) );
Packit 6bd9ab
    '''
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class EtherRequest(common.Request):
Packit 6bd9ab
Packit 6bd9ab
    def write(self, name, ether):
Packit 6bd9ab
        self.fp.write_string(name)
Packit 6bd9ab
        self.fp.write(ether_aton(ether))
Packit 6bd9ab
Packit 6bd9ab
    def convert(self, dn, attributes, parameters):
Packit 6bd9ab
        for name in attributes['cn']:
Packit 6bd9ab
            for ether in attributes['macAddress']:
Packit 6bd9ab
                yield (name, ether)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class EtherByNameRequest(EtherRequest):
Packit 6bd9ab
Packit 6bd9ab
    action = constants.NSLCD_ACTION_ETHER_BYNAME
Packit 6bd9ab
Packit 6bd9ab
    def read_parameters(self, fp):
Packit 6bd9ab
        return dict(cn=fp.read_string())
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class EtherByEtherRequest(EtherRequest):
Packit 6bd9ab
Packit 6bd9ab
    action = constants.NSLCD_ACTION_ETHER_BYETHER
Packit 6bd9ab
Packit 6bd9ab
    def read_parameters(self, fp):
Packit 6bd9ab
        return dict(macAddress=ether_ntoa(fp.read(6)))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
class EtherAllRequest(EtherRequest):
Packit 6bd9ab
Packit 6bd9ab
    action = constants.NSLCD_ACTION_ETHER_ALL