[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:
Pierre-Elliott Bécue 2013-01-23 03:16:50 +01:00
parent 70f5ff906a
commit 2a7dd72069
9 changed files with 150 additions and 138 deletions

View file

@ -522,32 +522,32 @@ NETs = { 'serveurs' : [ '138.231.136.0/24' ],
NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' } NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' }
# Classes de mid # Classes de rid
# Merci d'essayer de les faire correspondre avec les réseaux # Merci d'essayer de les faire correspondre avec les réseaux
# ci-dessus... # ci-dessus...
mid = { rid = {
# Mid pour les machines fixes # Rid pour les machines fixes
'fil' : (256, 2047), 'fil' : (256, 2047),
# Mid pour les machines fixes ipv6-only # Rid pour les machines fixes ipv6-only
'fil-v6' : (32768, 34815), 'fil-v6' : (32768, 34815),
# Mid pour les machines wifi # Rid pour les machines wifi
'wifi' : (2048, 4095), 'wifi' : (2048, 4095),
# Mid pour les machines du vlan adm # Rid pour les machines du vlan adm
'adm' : (51200, 53247), 'adm' : (51200, 53247),
# Mid pour les machines des personnels ens # Rid pour les machines des personnels ens
'personnel-ens' : (55296, 55551), 'personnel-ens' : (55296, 55551),
# Mid pour machines spéciales # Rid pour machines spéciales
'special' : (4096, 6143), 'special' : (4096, 6143),
# Mid pour les filaires v6-only # Rid pour les filaires v6-only
'fil-v6' : (16384, 24575), 'fil-v6' : (16384, 24575),
# Mid pour les wifi v6-only # Rid pour les wifi v6-only
'wifi-v6' : (24576, 32767), 'wifi-v6' : (24576, 32767),
# Mid pour les servers crans # Rid pour les servers crans
'serveurs' : (0, 255), 'serveurs' : (0, 255),
} }
# mid pour les machines spéciales (classe 'special' ci-dessus) # rid pour les machines spéciales (classe 'special' ci-dessus)
mid_machines_speciales = { rid_machines_speciales = {
# freebox.crans.org # freebox.crans.org
4096: '82.225.39.54', 4096: '82.225.39.54',
# ovh.crans.org # ovh.crans.org

View file

@ -25,7 +25,7 @@ import sys, re, os, pwd
sys.path.append('/usr/scripts/gestion') sys.path.append('/usr/scripts/gestion')
from ldap_crans import hostname from ldap_crans import hostname
from config import conf_fw, mid, prefix, role, file_pickle, open_ports from config import conf_fw, rid, prefix, role, file_pickle, open_ports
from config import authorized_icmpv6, mac_wifi, adm_only, adm_users from config import authorized_icmpv6, mac_wifi, adm_only, adm_users
from config import udp_torrent_tracker from config import udp_torrent_tracker
from ipt import * from ipt import *
@ -47,8 +47,8 @@ def ports(dev_ip6, dev_crans):
''' Ouvre les ports ''' ''' Ouvre les ports '''
for machine in machines : for machine in machines :
for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6']: for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6']:
if int(machine.id()) in range(mid[type_machine][0], if int(machine.rid()) in range(rid[type_machine][0],
mid[type_machine][1]): rid[type_machine][1]):
ports_io(ip6tables, machine, type_machine, dev_ip6, dev_crans) ports_io(ip6tables, machine, type_machine, dev_ip6, dev_crans)
#Protection contre les attaques brute-force #Protection contre les attaques brute-force

View file

@ -22,7 +22,7 @@ from lock import *
from affich_tools import anim, cprint, OK from affich_tools import anim, cprint, OK
from time import localtime, strftime, time, sleep from time import localtime, strftime, time, sleep
import config import config
import midtools import ridtools
from inspect import getargspec from inspect import getargspec
from syslog import * from syslog import *
import platform import platform

View file

@ -24,10 +24,10 @@ import os, re, syslog, cPickle, socket
from ldap_crans import crans_ldap, hostname from ldap_crans import crans_ldap, hostname
from commands import getstatusoutput from commands import getstatusoutput
from config import NETs, role, prefix, mid, output_file, filter_policy from config import NETs, role, prefix, rid, output_file, filter_policy
from config import blacklist_sanctions, blacklist_sanctions_soft, file_pickle, ann_scol, periode_transitoire from config import blacklist_sanctions, blacklist_sanctions_soft, file_pickle, ann_scol, periode_transitoire
from iptools import AddrInNet from iptools import AddrInNet
from midtools import Mid from ridtools import Rid
import subprocess import subprocess
import netaddr import netaddr
@ -157,8 +157,8 @@ ACCEPT' % (dev, proto, ip, port))
vers et à partir de la machine considérée ''' vers et à partir de la machine considérée '''
ident = int(machine.id()) ident = int(machine.id())
ip = "" ip = ""
for type_m in mid.keys(): for type_m in rid.keys():
if ident in range(mid[type_m][0], mid[type_m][1]): if ident in range(rid[type_m][0], rid[type_m][1]):
ip = ipv6_addr(machine.mac(), type_m) ip = ipv6_addr(machine.mac(), type_m)
mac=machine.mac() mac=machine.mac()
break break
@ -179,9 +179,9 @@ icmp6-adm-prohibited' % ip)
class Update(object): class Update(object):
''' Cette classe comprend toutes les méthodes nécessaires ''' Cette classe comprend toutes les méthodes nécessaires
à une mise-à-jour ou un régénération partielle du firewall''' à une mise-à-jour ou un régénération partielle du firewall'''
def ports(self, mids, ip_proto = 4): def ports(self, rids, ip_proto = 4):
''' Met à jour les autorisations par machine sur l'ouverture des ports. ''' Met à jour les autorisations par machine sur l'ouverture des ports.
Prend en argument une liste de mid (entier(s)) de machines à changer''' Prend en argument une liste de rid (entier(s)) de machines à changer'''
check_ip_proto(ip_proto) check_ip_proto(ip_proto)
ipt_p = open_pickle(ip_proto) ipt_p = open_pickle(ip_proto)
dev_crans = iface6('fil') dev_crans = iface6('fil')
@ -190,22 +190,22 @@ class Update(object):
elif ip_proto == 6: elif ip_proto == 6:
dev_ext = iface6('sixxs2') dev_ext = iface6('sixxs2')
net = "" net = ""
for m in mids: for r in rids:
for type_m in mid.keys(): for type_m in rid.keys():
if int(m) in range(mid[type_m][0], mid[type_m][1]): if int(r) in range(rid[type_m][0], rid[type_m][1]):
net = type_m net = type_m
if net == "": if net == "":
raise MidError("Il n'y a pas de réseau associé au mid %i" % m) raise RidError("Il n'y a pas de réseau associé au rid %i" % m)
if '-v6' in net and ip_proto == 4: if '-v6' in net and ip_proto == 4:
raise MismatchMidIpProto(m, ip_proto, net) raise MismatchRidIpProto(r, ip_proto, net)
machine = db.search('mid=%i' % m)['machine'] machine = db.search('rid=%i' % r)['machine']
if len(machine) != 1: if len(machine) != 1:
msg = "Il y a %i machines associée(s) au mid %i" % ( msg = "Il y a %i machines associée(s) au rid %i" % (
len(machine), m) len(machine), r)
raise MidError(msg) raise RidError(msg)
else: else:
if ip_proto == 4: if ip_proto == 4:
ip = Mid(int(m)).to_ipv4() ip = Rid(int(m)).to_ipv4()
elif ip_proto == 6: elif ip_proto == 6:
ip = ipv6_addr(machine[0].mac(), net) ip = ipv6_addr(machine[0].mac(), net)
# On vérifie si la machine a déjà des entrées dans les chaînes # On vérifie si la machine a déjà des entrées dans les chaînes
@ -370,23 +370,23 @@ class Ip6tablesError(Exception):
def __str__(self): def __str__(self):
return "%s: %s %s" % ( self.cmd, self.code, self.msg) return "%s: %s %s" % ( self.cmd, self.code, self.msg)
class MidError(Exception): class RidError(Exception):
''' Exception invoquée lorsqu'il y a un soucis avec un mid fourni ''' ''' Exception invoquée lorsqu'il y a un soucis avec un rid fourni '''
def __init__(self, msg): def __init__(self, msg):
self.msg = msg self.msg = msg
syslog.syslog(syslog.LOG_ERR,"%s" % self.msg) syslog.syslog(syslog.LOG_ERR,"%s" % self.msg)
def __str__(self): def __str__(self):
return "%s" % self.msg return "%s" % self.msg
class MismatchMidIpProto(Exception): class MismatchRidIpProto(Exception):
''' Exception invoquée lorsqu'il y a un défaut d'appariement entre le mid ''' Exception invoquée lorsqu'il y a un défaut d'appariement entre le rid
et le protocole ip concerné''' et le protocole ip concerné'''
def __init__(self, mmid, ip_proto, net): def __init__(self, mrid, ip_proto, net):
self.mmid = mmid self.mrid = mrid
self.ip_proto = ip_proto self.ip_proto = ip_proto
self.net = net self.net = net
self.msg = "Défaut d'appariement entre le mid %i (%s) \ self.msg = "Défaut d'appariement entre le rid %i (%s) \
et le protocole ip %i" % (self.mmid, self.net, self.ip_proto) et le protocole ip %i" % (self.mrid, self.net, self.ip_proto)
syslog.syslog(syslog.LOG_ERR, self.msg) syslog.syslog(syslog.LOG_ERR, self.msg)
def __str__(self): def __str__(self):
return self.msg return self.msg
@ -747,7 +747,7 @@ def macips(ipt, machines, types_machines):
''' Construit la chaîne MAC ''' ''' Construit la chaîne MAC '''
for machine in machines: for machine in machines:
for type_m in types_machines: for type_m in types_machines:
if int(machine.id()) in range(mid[type_m][0], mid[type_m][1]): if int(machine.rid()) in range(rid[type_m][0], rid[type_m][1]):
ipt.macip(machine.mac(), type_m) ipt.macip(machine.mac(), type_m)
break break
for type_m in types_machines: for type_m in types_machines:

View file

@ -22,7 +22,7 @@ from email_tools import send_email
from syslog import openlog, closelog, syslog from syslog import openlog, closelog, syslog
from numeros_disponibles import lister_ip_dispo from numeros_disponibles import lister_ip_dispo
from unicodedata import normalize from unicodedata import normalize
import midtools import ridtools
date_format = '%d/%m/%Y %H:%M' date_format = '%d/%m/%Y %H:%M'
hostname = gethostname().split(".")[0] hostname = gethostname().split(".")[0]
@ -366,7 +366,7 @@ class CransLdap:
non_auto_search_machines_champs = \ non_auto_search_machines_champs = \
['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist', ['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist',
'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias', 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias',
'sshFingerprint'] 'sshFingerprint', 'rid']
non_auto_search_champs = { \ non_auto_search_champs = { \
'adherent': \ 'adherent': \
@ -481,7 +481,7 @@ class CransLdap:
peuvent être : peuvent être :
aid $ chbre $ mail $ mailAlias $ canonicalAlias $ aid $ chbre $ mail $ mailAlias $ canonicalAlias $
mid $ macAddress $ host $ hostAlias $ ipHostNumber $ mid $ rid $ macAddress $ host $ hostAlias $ ipHostNumber $
gpgFingerprint gpgFingerprint
Retourne le dn du lock Retourne le dn du lock
@ -1275,49 +1275,41 @@ class BaseClasseCrans(CransLdap):
if not self._init_data: if not self._init_data:
### Nouvel enregistrement ### Nouvel enregistrement
# Forcage de mid correspondant à l'ip. # L'enregistrement peut échouer en cas de choix de dn concurrents
if self.idn == 'mid': # (il n'y a pas de lock sur les dn)
my_mid = midtools.Mid(ipv4=self._data["ipHostNumber"][0]) for i in range(0, 5): # 5 tentatives
self.dn = '%s=%d,%s' % (self.idn, my_mid, self.dn) # Génération du dn
self._data[self.idn] = [ '%d' % my_mid ] res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn)
modlist = ldap.modlist.addModlist(self._data) vidn = 1
self.conn.add_s(self.dn, modlist) vidns = []
else: # Liste des dn pris
# L'enregistrement peut échouer en cas de choix de dn concurrents for r in res:
# (il n'y a pas de lock sur les dn) # r = ( dn, {} )
for i in range(0, 5): # 5 tentatives r = r[0].split(',')[0]
# Génération du dn if r[:4] != '%s=' % self.idn: continue
res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn) vidns.append(int(r[4:]))
vidn = 1 if self.idn == 'fid' or self.idn == 'aid' or self.idn == 'mid':
vidns = [] # Pour une facture on prend un nouveau numéro
# Liste des dn pris vidn = max([0] + vidns) + 1
for r in res: else:
# r = ( dn, {} ) # Sinon on prend le premier libre
r = r[0].split(',')[0] while vidn in vidns:
if r[:4] != '%s=' % self.idn: continue vidn += 1
vidns.append(int(r[4:]))
if self.idn == 'fid' or self.idn == 'aid':
# Pour une facture on prend un nouveau numéro
vidn = max([0] + vidns) + 1
else:
# Sinon on prend le premier libre
while vidn in vidns:
vidn += 1
self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn) self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn)
self._data[self.idn] = [ '%d' % vidn ] self._data[self.idn] = [ '%d' % vidn ]
try: try:
# Ecriture # Ecriture
modlist = ldap.modlist.addModlist(self._data) modlist = ldap.modlist.addModlist(self._data)
self.conn.add_s(self.dn, modlist) self.conn.add_s(self.dn, modlist)
break break
except Exception, e: except Exception, e:
# On logge # On logge
syslog("ldap_crans: exception: %s" % e) syslog("ldap_crans: exception: %s" % e)
raise
if i == 4:
raise raise
if i == 4:
raise
else: else:
### Modification entrée ### Modification entrée
@ -1330,16 +1322,14 @@ class BaseClasseCrans(CransLdap):
champ = c.args[0]['info'].split(':')[0] champ = c.args[0]['info'].split(':')[0]
raise RuntimeError(u'Entrée en double dans le champ %s' % champ) raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
# l'ip change, le mid aussi... # l'ip change, le rid aussi...
if 'ipHostNumber' in self.modifs: if 'ipHostNumber' in self.modifs:
try: try:
mid = midtools.Mid(ipv4 = self._data["ipHostNumber"][0]) rid = ridtools.Rid(ipv4 = self._data["ipHostNumber"][0])
except ValueError: except ValueError:
pass pass
else: else:
self.conn.rename_s(self.dn, "%s=%d" % (self.idn, mid)) self.rid('%d' % rid)
self.dn = "%s=%d,%s" % (self.idn, mid, self.dn.split(',', 1)[1])
self._data[self.idn] = [ '%d' % mid ]
### Génération de la liste de services à redémarrer ### Génération de la liste de services à redémarrer
@ -3106,12 +3096,30 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
if self.exist('ipHostNumber=%s' % ip): if self.exist('ipHostNumber=%s' % ip):
raise ValueError(u'IP déjà prise.') raise ValueError(u'IP déjà prise.')
my_rid = ridtools.Rid(ipv4=self._data["ipHostNumber"][0])
# Lock ip # Lock ip
self.lock('ipHostNumber', ip) self.lock('ipHostNumber', ip)
self._set('ipHostNumber', [ip]) self._set('ipHostNumber', [ip])
self.rid("%d" % my_rid)
return ip return ip
def rid(self, rid=None):
"""
Retourne le rid si rid == None, l'affecte sinon.
"""
if rid == None:
return self._data.get('rid', [''])[0]
rid_t = ridtools.Rid(ipv4=self.ip())
if int(rid_t) != int(rid):
raise ValueError('L\'ip et le rid doivent correspondre.')
self.lock('rid', '%s' % rid)
self._set('rid', ['%s' % rid])
def exempt(self, new=None): def exempt(self, new=None):
""" """
Liste des réseaux vers lesquels on ne compte pas l'upload Liste des réseaux vers lesquels on ne compte pas l'upload

View file

@ -6,6 +6,8 @@ Restauration d'un objet précédement détruit dans la base.
Copyright (C) Frédéric Pauget Copyright (C) Frédéric Pauget
Licence : GPLv2 Licence : GPLv2
Attention, ce fichier est osbolète
""" """
import cPickle, sys import cPickle, sys

View file

@ -1,12 +1,13 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# MIDTOOLS.PY -- Gestion de la conversion mid <-> IP # RIDTOOLS.PY -- Gestion de la conversion rid <-> IP
# #
# Copyright (C) 2010 Olivier Iffrig # Copyright (C) 2010 Olivier Iffrig
# (c) 2010 Nicolas Dandrimont # (c) 2010 Nicolas Dandrimont
# Authors: Olivier Iffrig <iffrig@crans.org> # Authors: Olivier Iffrig <iffrig@crans.org>
# Nicolas Dandrimont <olasd@crans.org> # Nicolas Dandrimont <olasd@crans.org>
# Adapté par Pierre-Elliott Bécue pour cause de changement de schéma.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -25,53 +26,53 @@ import netaddr
import config import config
class Mid(object): class Rid(object):
""" """
Permet de décortiquer un mid et d'obtenir les IP correspondantes Permet de décortiquer un rid et d'obtenir les IP correspondantes
Variables d'instance : Variables d'instance :
- mid : le mid - rid : le rid
- type : type de mid (cf. config.mid et [1]) - type : type de rid (cf. config.rid et [1])
- reste : le "reste" du mid (permettant de calculer l'IP par exemple) - reste : le "reste" du rid (permettant de calculer l'IP par exemple)
- ipv4_dispo : une IPv4 existe pour ce mid - ipv4_dispo : une IPv4 existe pour ce rid
- priv : cette machine ne doit pas être accessible de l'extérieur - priv : cette machine ne doit pas être accessible de l'extérieur
[1] http://wiki.crans.org/CransTechnique/PlanAdressage#Machines [1] http://wiki.crans.org/CransTechnique/PlanAdressage#Machines
""" """
def __init__(self, mid=None, ipv4=None): def __init__(self, rid=None, ipv4=None):
self.mid = None self.rid = None
self.reste = False self.reste = False
self.type = None self.type = None
self.ipv4_dispo = False self.ipv4_dispo = False
self.priv = False self.priv = False
if mid is not None: if rid is not None:
self.__parse(mid) self.__parse(rid)
elif ipv4 is not None: elif ipv4 is not None:
self.__from_ipv4(ipv4) self.__from_ipv4(ipv4)
else: else:
raise ValueError("Un des champs mid et ipv4 doit être défini") raise ValueError("Un des champs rid et ipv4 doit être défini")
def __parse(self, mid): def __parse(self, rid):
"""Peuple les champs de l'instance par rapport au mid""" """Peuple les champs de l'instance par rapport au rid"""
self.mid = mid self.rid = rid
for tp, (start, end) in config.mid.iteritems(): for tp, (start, end) in config.rid.iteritems():
if start <= mid <= end: if start <= rid <= end:
self.type = tp self.type = tp
break break
else: else:
raise ValueError("mid inconnu : %d" % mid) raise ValueError("rid inconnu : %d" % rid)
self.ipv4_dispo = (mid & (1 << 15)) == 0 and self.type != 'special' or self.mid in config.mid_machines_speciales self.ipv4_dispo = (rid & (1 << 15)) == 0 and self.type != 'special' or self.rid in config.rid_machines_speciales
self.priv = (mid & (1 << 14)) != 0 self.priv = (rid & (1 << 14)) != 0
if self.type == 'personnel-ens': if self.type == 'personnel-ens':
self.reste = mid & 0xff self.reste = rid & 0xff
else: else:
self.reste = mid & 0x7ff self.reste = rid & 0x7ff
def __from_ipv4(self, ip): def __from_ipv4(self, ip):
"""Peuple les champs à partir de l'ipv4 donnée""" """Peuple les champs à partir de l'ipv4 donnée"""
@ -93,25 +94,25 @@ class Mid(object):
if self.type: if self.type:
break break
else: else:
for mid, ip_speciale in config.mid_machines_speciales.items(): for rid, ip_speciale in config.rid_machines_speciales.items():
if ip == netaddr.IPAddress(ip_speciale): if ip == netaddr.IPAddress(ip_speciale):
self.mid = mid self.rid = rid
self.type = "special" self.type = "special"
break break
else: else:
raise ValueError("%s dans aucun des réseaux gérés par le Cr@ns..." % ip) raise ValueError("%s dans aucun des réseaux gérés par le Cr@ns..." % ip)
if not self.mid: if not self.rid:
self.mid = config.mid[self.type][0] + ip.value - netaddr.IPNetwork(config.NETs[self.type][0]).value self.rid = config.rid[self.type][0] + ip.value - netaddr.IPNetwork(config.NETs[self.type][0]).value
if self.mid > config.mid[self.type][1]: if self.rid > config.rid[self.type][1]:
raise ValueError("%s trop élevée pour le réseau '%s'" % (ip, self.type)) raise ValueError("%s trop élevée pour le réseau '%s'" % (ip, self.type))
if self.type == 'personnel-ens': if self.type == 'personnel-ens':
self.reste = self.mid & 0xff self.reste = self.rid & 0xff
else: else:
self.reste = self.mid & 0x7ff self.reste = self.rid & 0x7ff
return self.mid return self.rid
def ipv4(self): def ipv4(self):
""" """
@ -125,7 +126,7 @@ class Mid(object):
net = netaddr.IPNetwork(config.NETs[self.type][0]) net = netaddr.IPNetwork(config.NETs[self.type][0])
self.__ipv4 = netaddr.IPAddress(net.first + self.reste) self.__ipv4 = netaddr.IPAddress(net.first + self.reste)
else: else:
self.__ipv4 = netaddr.IPAddress(config.mid_machines_speciales[self.mid]) self.__ipv4 = netaddr.IPAddress(config.rid_machines_speciales[self.rid])
return self.__ipv4 return self.__ipv4
@ -138,13 +139,13 @@ class Mid(object):
global_net = netaddr.IPNetwork(config.prefix["subnet"][0]) global_net = netaddr.IPNetwork(config.prefix["subnet"][0])
global_net.prefixlen = 64 global_net.prefixlen = 64
return global_net.next(self.mid) return global_net.next(self.rid)
def __repr__(self): def __repr__(self):
if self.ipv4_dispo: if self.ipv4_dispo:
return "<Mid(mid=%s, ipv4='%s')>" % (self.mid, self.ipv4()) return "<Rid(rid=%s, ipv4='%s')>" % (self.rid, self.ipv4())
else: else:
return "<Mid(%s)>" % self.mid return "<Rid(%s)>" % self.rid
def __int__(self): def __int__(self):
return self.mid return self.rid

View file

@ -37,7 +37,7 @@ le mode d'affichage condensé au lieu du mode détaillé (défaut %(limit_aff_de
d'historique affichées (défaut %(limit_aff_historique)i) d'historique affichées (défaut %(limit_aff_historique)i)
-d <num> ou --limit-blacklist=<num> : limitation du nombre de lignes -d <num> ou --limit-blacklist=<num> : limitation du nombre de lignes
d'historique des déconnexions affichées (défaut %(limit_aff_blacklist)i) d'historique des déconnexions affichées (défaut %(limit_aff_blacklist)i)
-s ou --ssh : affiche les fingerpring ssh des machines -s ou --ssh : affiche les fingerprint ssh des machines
""" """
try: try:

View file

@ -1,10 +1,11 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# #
# CHECK_MID.PY -- Vérification et application de la correspondance mid <-> IP # CHECK_RID.PY -- Vérification et application de la correspondance rid <-> IP
# #
# Copyright (c) 2010 Nicolas Dandrimont # Copyright (c) 2010 Nicolas Dandrimont
# Authors: Nicolas Dandrimont <olasd@crans.org> # Authors: Nicolas Dandrimont <olasd@crans.org>
# Adapté par Pierre-Elliott Bécue pour cause de changement de schéma.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -22,13 +23,13 @@
import sys import sys
sys.path.append('/usr/scripts/gestion') sys.path.append('/usr/scripts/gestion')
from midtools import Mid from ridtools import Rid
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
from optparse import OptionParser from optparse import OptionParser
def check_mid(normalize): def check_rid(normalize):
"""Vérifie que les mid correspondent bien aux IP. """Vérifie que les rid correspondent bien aux IP.
Si normalize = True, modifie la base pour que la correspondance Si normalize = True, modifie la base pour que la correspondance
soit bien vérifiée""" soit bien vérifiée"""
@ -38,24 +39,24 @@ def check_mid(normalize):
s = cl.search("ipHostNumber=*") s = cl.search("ipHostNumber=*")
for m in s["machine"]: for m in s["machine"]:
counter += 1 counter += 1
mid = int(m.id()) rid = int(m.rid())
ip = m.ip() ip = m.ip()
try: try:
mid_t = Mid(ipv4=ip) rid_t = Rid(ipv4=ip)
except ValueError, e: except ValueError, e:
print e print e
else: else:
if mid != int(mid_t): if rid != int(rid_t):
print "%s: %s!=%s" % (m.Nom(), mid, int(mid_t)) print "%s: %s!=%s" % (m.Nom(), rid, int(rid_t))
if normalize: if normalize:
m.conn.rename_s(m.dn, "%s=%d" % (m.idn, mid_t)) m.rid(int(rid_t))
print counter print counter
if __name__ == "__main__": if __name__ == "__main__":
parser = OptionParser() parser = OptionParser()
parser.set_defaults(normalize=False) parser.set_defaults(normalize=False)
parser.add_option("-n", "--normalize", action="store_true", help="Modifie les mid pour les faire conformer au schema") parser.add_option("-n", "--normalize", action="store_true", help="Modifie les rid pour les faire conformer au schema")
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
check_mid(options.normalize) check_rid(options.normalize)