#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
"""Contient les outils pour manipuler des adresses MAC
dans le module hptools"""

import binascii
import netaddr

def bin_to_mac(raw):
    """Convertit une OctetString en une MAC"""
    return format_mac(binascii.hexlify(raw))

def format_mac(raw):
    """Formatte la mac en aa:bb:cc:dd:ee:ff"""

    return str(netaddr.EUI(raw)).replace('-', ':').lower()

class MACFactory(object):
    """Factory stockant les macs"""

    __macs = {}

    @classmethod
    def register_mac(cls, mac, parent=None):
        """Enregistre une mac dans la factory et
        retourne une instance de MACAddress si besoin."""

        if cls.__macs.get(mac, None) is None:
            cls.__macs[mac] = MACAddress(mac, parent)
        else:
            cls.__macs[mac].append_parent(parent)
        return cls.__macs[mac]

    @classmethod
    def get_mac(cls, mac):
        """Récupère une mac dans la factory"""

        return cls.__macs.get(mac, None)

    @classmethod
    def get_macs(cls):
        """Récupère l'ensemble des MACS de la factory"""

        return cls.__macs

class MACAddress(object):
    """Classe représentant une adresse MAC"""

    def __init__(self, value, parent=None):
        """Stocke l'adresse mac quelque part et le parent"""

        self.__value = value
        if parent is not None:
            self.__parents = {parent.name() : parent}

    @property
    def value(self):
        """Property pour lire la valeur d'une MAC"""
        return self.__value

    @property
    def parents(self):
        """Retourne les parents"""
        return self.__parents

    def append_parent(self, parent):
        """Ajoute un parent à la MAC si parent n'est pas None"""

        if parent is not None:
            if self.__parents.get(parent.name(), None) is None:
                self.__parents[parent.name()] = parent

    def remove_parent(self, parent):
        """Retire le parent référencé à la MAC"""

        if parent is not None:
            if self.__parents.get(parent.name(), None) is not None:
                _ = self.__parents.pop(parent.name())

