[Scripts] On rajoute un champ rid qui fait le lien avec les plages d'ip, et on rend le mid strictement croissant.
Ignore-this: 199e9ff5f09e1fe600c1066179f4e47b Ce patch est un test, il ne restera en prod que si ça fonctionne. L'idée est qu'on souhaiterait conserver les vieilles machines comme les vieux adhérents, sauf demande explicite de suppression, par ailleurs, l'association mid <=> ip est très utile pour pas mal de choses. Pour la conserver, on crée un identifiant rid, qui supplante le mid, qui est lui choisi comme l'aid ou le fid, en incrémentant. Ce patch vise à implémenter cela. S'il génère des bugs, il subira un rollback. darcs-hash:20130123021650-b6762-347428d75f066f7f4821ca067d8c9bb6a4396bf5.gz
This commit is contained in:
parent
70f5ff906a
commit
2a7dd72069
9 changed files with 150 additions and 138 deletions
|
@ -1,150 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# MIDTOOLS.PY -- Gestion de la conversion mid <-> IP
|
||||
#
|
||||
# Copyright (C) 2010 Olivier Iffrig
|
||||
# (c) 2010 Nicolas Dandrimont
|
||||
# Authors: Olivier Iffrig <iffrig@crans.org>
|
||||
# Nicolas Dandrimont <olasd@crans.org>
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
import netaddr
|
||||
|
||||
import config
|
||||
|
||||
class Mid(object):
|
||||
"""
|
||||
Permet de décortiquer un mid et d'obtenir les IP correspondantes
|
||||
|
||||
Variables d'instance :
|
||||
- mid : le mid
|
||||
- type : type de mid (cf. config.mid et [1])
|
||||
- reste : le "reste" du mid (permettant de calculer l'IP par exemple)
|
||||
- ipv4_dispo : une IPv4 existe pour ce mid
|
||||
- priv : cette machine ne doit pas être accessible de l'extérieur
|
||||
|
||||
[1] http://wiki.crans.org/CransTechnique/PlanAdressage#Machines
|
||||
"""
|
||||
|
||||
def __init__(self, mid=None, ipv4=None):
|
||||
self.mid = None
|
||||
self.reste = False
|
||||
self.type = None
|
||||
self.ipv4_dispo = False
|
||||
self.priv = False
|
||||
|
||||
if mid is not None:
|
||||
self.__parse(mid)
|
||||
elif ipv4 is not None:
|
||||
self.__from_ipv4(ipv4)
|
||||
else:
|
||||
raise ValueError("Un des champs mid et ipv4 doit être défini")
|
||||
|
||||
def __parse(self, mid):
|
||||
"""Peuple les champs de l'instance par rapport au mid"""
|
||||
self.mid = mid
|
||||
|
||||
for tp, (start, end) in config.mid.iteritems():
|
||||
if start <= mid <= end:
|
||||
self.type = tp
|
||||
break
|
||||
else:
|
||||
raise ValueError("mid inconnu : %d" % mid)
|
||||
|
||||
self.ipv4_dispo = (mid & (1 << 15)) == 0 and self.type != 'special' or self.mid in config.mid_machines_speciales
|
||||
|
||||
self.priv = (mid & (1 << 14)) != 0
|
||||
|
||||
if self.type == 'personnel-ens':
|
||||
self.reste = mid & 0xff
|
||||
else:
|
||||
self.reste = mid & 0x7ff
|
||||
|
||||
def __from_ipv4(self, ip):
|
||||
"""Peuple les champs à partir de l'ipv4 donnée"""
|
||||
if not isinstance(ip, netaddr.IPAddress):
|
||||
ip = netaddr.IPAddress(ip)
|
||||
try:
|
||||
ip.ipv4()
|
||||
except netaddr.AddrConversionError:
|
||||
raise ValueError("Ceci n'est pas une IPv4... %s" % ip)
|
||||
|
||||
self.ipv4_dispo = True
|
||||
self.priv = ip.is_private()
|
||||
|
||||
for tp in ['fil', 'wifi', 'adm', 'gratuit', 'personnel-ens']:
|
||||
for net in config.NETs[tp]:
|
||||
if ip in netaddr.IPNetwork(net):
|
||||
self.type = tp
|
||||
break
|
||||
if self.type:
|
||||
break
|
||||
else:
|
||||
for mid, ip_speciale in config.mid_machines_speciales.items():
|
||||
if ip == netaddr.IPAddress(ip_speciale):
|
||||
self.mid = mid
|
||||
self.type = "special"
|
||||
break
|
||||
else:
|
||||
raise ValueError("%s dans aucun des réseaux gérés par le Cr@ns..." % ip)
|
||||
|
||||
if not self.mid:
|
||||
self.mid = config.mid[self.type][0] + ip.value - netaddr.IPNetwork(config.NETs[self.type][0]).value
|
||||
|
||||
if self.mid > config.mid[self.type][1]:
|
||||
raise ValueError("%s trop élevée pour le réseau '%s'" % (ip, self.type))
|
||||
|
||||
if self.type == 'personnel-ens':
|
||||
self.reste = self.mid & 0xff
|
||||
else:
|
||||
self.reste = self.mid & 0x7ff
|
||||
return self.mid
|
||||
|
||||
def 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 %r" % self)
|
||||
|
||||
if not hasattr(self, '__ipv4'):
|
||||
if self.type != "special":
|
||||
net = netaddr.IPNetwork(config.NETs[self.type][0])
|
||||
self.__ipv4 = netaddr.IPAddress(net.first + self.reste)
|
||||
else:
|
||||
self.__ipv4 = netaddr.IPAddress(config.mid_machines_speciales[self.mid])
|
||||
|
||||
return self.__ipv4
|
||||
|
||||
def ipv6_network(self):
|
||||
"""
|
||||
Génère le réseau /64 IPv6 associé à la machine
|
||||
"""
|
||||
if self.priv:
|
||||
raise ValueError("Pas de prefix ipv6 disponible pour cette machine")
|
||||
|
||||
global_net = netaddr.IPNetwork(config.prefix["subnet"][0])
|
||||
global_net.prefixlen = 64
|
||||
return global_net.next(self.mid)
|
||||
|
||||
def __repr__(self):
|
||||
if self.ipv4_dispo:
|
||||
return "<Mid(mid=%s, ipv4='%s')>" % (self.mid, self.ipv4())
|
||||
else:
|
||||
return "<Mid(%s)>" % self.mid
|
||||
|
||||
def __int__(self):
|
||||
return self.mid
|
Loading…
Add table
Add a link
Reference in a new issue