#!/usr/bin/env python # -*- coding: utf-8 -*- # # MIDTOOLS.PY -- Gestion de la conversion mid <-> IP # # Copyright (C) 2010 Olivier Iffrig # Authors: Olivier Iffrig # # This program 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 3 of the License, or # (at your option) any later version. # # This program 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, see . from config import mid, prefix, NETs import iptools class Mid(object): """ Permet de décortiquer un mid et d'obtenir les IP correspondantes """ def __init__(self, mid): self.mid = mid self.type = None for tp in mid: if mid <= tp[1] and mid >= tp[0]: self.type = tp if self.type is None: raise ValueError("mid inconnu : %d" % mid) self.ipv4_dispo = False if (mid & (1 << 15)) == 0 and self.type != 'special': self.ipv4_dispo = True self.priv = True if (mid & (1 << 14)) == 0: self.priv = False self.reste = mid & 0x7ff # if self.type == 'ens': # Inutile pour l'instant # self.reste &= 0xff def to_ipv4(self): """ Génère l'IPv4 associée à la machine """ if not self.ipv4_dispo: raise ValueError("Pas d'adresse ipv4 disponible pour la machine") ip = iptools.param(NETs[self.type], True)['network'] ip += self.reste return iptools.DecToQuad(ip) def to_ipv6_vlan(self): """ Génère le VLAN IPv6 associé à la machine """ if priv: raise ValueError("Pas d'adresse ipv6 disponible pour la machine") tp = {'fil': 'fil', 'fil-v6': 'fil', 'wifi': 'wifi', 'wifi-v6': 'wifi', 'adm': 'adm'}[self.type] ip = prefix[tp][0].split(":/")[0] ip += hex(self.mid)[2:] ip += "::/64"