diff --git a/gestion/config.py b/gestion/config.py index fc253504..41d3e713 100644 --- a/gestion/config.py +++ b/gestion/config.py @@ -522,32 +522,32 @@ NETs = { 'serveurs' : [ '138.231.136.0/24' ], 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 # ci-dessus... -mid = { - # Mid pour les machines fixes +rid = { + # Rid pour les machines fixes 'fil' : (256, 2047), - # Mid pour les machines fixes ipv6-only + # Rid pour les machines fixes ipv6-only 'fil-v6' : (32768, 34815), - # Mid pour les machines wifi + # Rid pour les machines wifi 'wifi' : (2048, 4095), - # Mid pour les machines du vlan adm + # Rid pour les machines du vlan adm 'adm' : (51200, 53247), - # Mid pour les machines des personnels ens + # Rid pour les machines des personnels ens 'personnel-ens' : (55296, 55551), - # Mid pour machines spéciales + # Rid pour machines spéciales 'special' : (4096, 6143), - # Mid pour les filaires v6-only + # Rid pour les filaires v6-only 'fil-v6' : (16384, 24575), - # Mid pour les wifi v6-only + # Rid pour les wifi v6-only 'wifi-v6' : (24576, 32767), - # Mid pour les servers crans + # Rid pour les servers crans 'serveurs' : (0, 255), } -# mid pour les machines spéciales (classe 'special' ci-dessus) -mid_machines_speciales = { +# rid pour les machines spéciales (classe 'special' ci-dessus) +rid_machines_speciales = { # freebox.crans.org 4096: '82.225.39.54', # ovh.crans.org diff --git a/gestion/gen_confs/firewall6.py b/gestion/gen_confs/firewall6.py index 978767f6..bbfeb8ab 100755 --- a/gestion/gen_confs/firewall6.py +++ b/gestion/gen_confs/firewall6.py @@ -25,7 +25,7 @@ import sys, re, os, pwd sys.path.append('/usr/scripts/gestion') 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 udp_torrent_tracker from ipt import * @@ -47,8 +47,8 @@ def ports(dev_ip6, dev_crans): ''' Ouvre les ports ''' for machine in machines : for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6']: - if int(machine.id()) in range(mid[type_machine][0], - mid[type_machine][1]): + if int(machine.rid()) in range(rid[type_machine][0], + rid[type_machine][1]): ports_io(ip6tables, machine, type_machine, dev_ip6, dev_crans) #Protection contre les attaques brute-force diff --git a/gestion/gen_confs/generate.py b/gestion/gen_confs/generate.py index 4ee75935..0a82bc45 100644 --- a/gestion/gen_confs/generate.py +++ b/gestion/gen_confs/generate.py @@ -22,7 +22,7 @@ from lock import * from affich_tools import anim, cprint, OK from time import localtime, strftime, time, sleep import config -import midtools +import ridtools from inspect import getargspec from syslog import * import platform diff --git a/gestion/ipt.py b/gestion/ipt.py index 63ab1c51..676b7213 100755 --- a/gestion/ipt.py +++ b/gestion/ipt.py @@ -24,10 +24,10 @@ import os, re, syslog, cPickle, socket from ldap_crans import crans_ldap, hostname 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 iptools import AddrInNet -from midtools import Mid +from ridtools import Rid import subprocess import netaddr @@ -157,8 +157,8 @@ ACCEPT' % (dev, proto, ip, port)) vers et à partir de la machine considérée ''' ident = int(machine.id()) ip = "" - for type_m in mid.keys(): - if ident in range(mid[type_m][0], mid[type_m][1]): + for type_m in rid.keys(): + if ident in range(rid[type_m][0], rid[type_m][1]): ip = ipv6_addr(machine.mac(), type_m) mac=machine.mac() break @@ -179,9 +179,9 @@ icmp6-adm-prohibited' % ip) class Update(object): ''' Cette classe comprend toutes les méthodes nécessaires à 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. - 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) ipt_p = open_pickle(ip_proto) dev_crans = iface6('fil') @@ -190,22 +190,22 @@ class Update(object): elif ip_proto == 6: dev_ext = iface6('sixxs2') net = "" - for m in mids: - for type_m in mid.keys(): - if int(m) in range(mid[type_m][0], mid[type_m][1]): + for r in rids: + for type_m in rid.keys(): + if int(r) in range(rid[type_m][0], rid[type_m][1]): net = type_m 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: - raise MismatchMidIpProto(m, ip_proto, net) - machine = db.search('mid=%i' % m)['machine'] + raise MismatchRidIpProto(r, ip_proto, net) + machine = db.search('rid=%i' % r)['machine'] if len(machine) != 1: - msg = "Il y a %i machines associée(s) au mid %i" % ( - len(machine), m) - raise MidError(msg) + msg = "Il y a %i machines associée(s) au rid %i" % ( + len(machine), r) + raise RidError(msg) else: if ip_proto == 4: - ip = Mid(int(m)).to_ipv4() + ip = Rid(int(m)).to_ipv4() elif ip_proto == 6: ip = ipv6_addr(machine[0].mac(), net) # 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): return "%s: %s %s" % ( self.cmd, self.code, self.msg) -class MidError(Exception): - ''' Exception invoquée lorsqu'il y a un soucis avec un mid fourni ''' +class RidError(Exception): + ''' Exception invoquée lorsqu'il y a un soucis avec un rid fourni ''' def __init__(self, msg): self.msg = msg syslog.syslog(syslog.LOG_ERR,"%s" % self.msg) def __str__(self): return "%s" % self.msg -class MismatchMidIpProto(Exception): - ''' Exception invoquée lorsqu'il y a un défaut d'appariement entre le mid +class MismatchRidIpProto(Exception): + ''' Exception invoquée lorsqu'il y a un défaut d'appariement entre le rid et le protocole ip concerné''' - def __init__(self, mmid, ip_proto, net): - self.mmid = mmid + def __init__(self, mrid, ip_proto, net): + self.mrid = mrid self.ip_proto = ip_proto self.net = net - self.msg = "Défaut d'appariement entre le mid %i (%s) \ -et le protocole ip %i" % (self.mmid, self.net, self.ip_proto) + self.msg = "Défaut d'appariement entre le rid %i (%s) \ +et le protocole ip %i" % (self.mrid, self.net, self.ip_proto) syslog.syslog(syslog.LOG_ERR, self.msg) def __str__(self): return self.msg @@ -747,7 +747,7 @@ def macips(ipt, machines, types_machines): ''' Construit la chaîne MAC ''' for machine in 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) break for type_m in types_machines: diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index d535d13c..0c70cd02 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -22,7 +22,7 @@ from email_tools import send_email from syslog import openlog, closelog, syslog from numeros_disponibles import lister_ip_dispo from unicodedata import normalize -import midtools +import ridtools date_format = '%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] @@ -366,7 +366,7 @@ class CransLdap: non_auto_search_machines_champs = \ ['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist', 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias', - 'sshFingerprint'] + 'sshFingerprint', 'rid'] non_auto_search_champs = { \ 'adherent': \ @@ -481,7 +481,7 @@ class CransLdap: peuvent être : aid $ chbre $ mail $ mailAlias $ canonicalAlias $ - mid $ macAddress $ host $ hostAlias $ ipHostNumber $ + mid $ rid $ macAddress $ host $ hostAlias $ ipHostNumber $ gpgFingerprint Retourne le dn du lock @@ -1275,49 +1275,41 @@ class BaseClasseCrans(CransLdap): if not self._init_data: ### Nouvel enregistrement - # Forcage de mid correspondant à l'ip. - if self.idn == 'mid': - my_mid = midtools.Mid(ipv4=self._data["ipHostNumber"][0]) - self.dn = '%s=%d,%s' % (self.idn, my_mid, self.dn) - self._data[self.idn] = [ '%d' % my_mid ] - modlist = ldap.modlist.addModlist(self._data) - self.conn.add_s(self.dn, modlist) - else: - # L'enregistrement peut échouer en cas de choix de dn concurrents - # (il n'y a pas de lock sur les dn) - for i in range(0, 5): # 5 tentatives - # Génération du dn - res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn) - vidn = 1 - vidns = [] - # Liste des dn pris - for r in res: - # r = ( dn, {} ) - r = r[0].split(',')[0] - if r[:4] != '%s=' % self.idn: continue - 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 + # L'enregistrement peut échouer en cas de choix de dn concurrents + # (il n'y a pas de lock sur les dn) + for i in range(0, 5): # 5 tentatives + # Génération du dn + res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn) + vidn = 1 + vidns = [] + # Liste des dn pris + for r in res: + # r = ( dn, {} ) + r = r[0].split(',')[0] + if r[:4] != '%s=' % self.idn: continue + vidns.append(int(r[4:])) + if self.idn == 'fid' or self.idn == 'aid' or self.idn == 'mid': + # 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._data[self.idn] = [ '%d' % vidn ] + self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn) + self._data[self.idn] = [ '%d' % vidn ] - try: - # Ecriture - modlist = ldap.modlist.addModlist(self._data) - self.conn.add_s(self.dn, modlist) - break - except Exception, e: - # On logge - syslog("ldap_crans: exception: %s" % e) + try: + # Ecriture + modlist = ldap.modlist.addModlist(self._data) + self.conn.add_s(self.dn, modlist) + break + except Exception, e: + # On logge + syslog("ldap_crans: exception: %s" % e) + raise + if i == 4: raise - if i == 4: - raise else: ### Modification entrée @@ -1330,16 +1322,14 @@ class BaseClasseCrans(CransLdap): champ = c.args[0]['info'].split(':')[0] 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: try: - mid = midtools.Mid(ipv4 = self._data["ipHostNumber"][0]) + rid = ridtools.Rid(ipv4 = self._data["ipHostNumber"][0]) except ValueError: pass else: - self.conn.rename_s(self.dn, "%s=%d" % (self.idn, mid)) - self.dn = "%s=%d,%s" % (self.idn, mid, self.dn.split(',', 1)[1]) - self._data[self.idn] = [ '%d' % mid ] + self.rid('%d' % rid) ### 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): raise ValueError(u'IP déjà prise.') + my_rid = ridtools.Rid(ipv4=self._data["ipHostNumber"][0]) + # Lock ip self.lock('ipHostNumber', ip) - self._set('ipHostNumber', [ip]) + + self.rid("%d" % my_rid) 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): """ Liste des réseaux vers lesquels on ne compte pas l'upload diff --git a/gestion/restore.py b/gestion/restore.py index 96d5cced..39205926 100644 --- a/gestion/restore.py +++ b/gestion/restore.py @@ -6,6 +6,8 @@ Restauration d'un objet précédement détruit dans la base. Copyright (C) Frédéric Pauget Licence : GPLv2 + +Attention, ce fichier est osbolète """ import cPickle, sys diff --git a/gestion/midtools.py b/gestion/ridtools.py similarity index 67% rename from gestion/midtools.py rename to gestion/ridtools.py index ed7bfc31..30013906 100755 --- a/gestion/midtools.py +++ b/gestion/ridtools.py @@ -1,12 +1,13 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # -# MIDTOOLS.PY -- Gestion de la conversion mid <-> IP +# RIDTOOLS.PY -- Gestion de la conversion rid <-> IP # # Copyright (C) 2010 Olivier Iffrig # (c) 2010 Nicolas Dandrimont # Authors: Olivier Iffrig # Nicolas Dandrimont +# 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 # it under the terms of the GNU General Public License as published by @@ -25,53 +26,53 @@ import netaddr 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 : - - 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 + - rid : le rid + - type : type de rid (cf. config.rid et [1]) + - reste : le "reste" du rid (permettant de calculer l'IP par exemple) + - ipv4_dispo : une IPv4 existe pour ce rid - 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 + def __init__(self, rid=None, ipv4=None): + self.rid = None self.reste = False self.type = None self.ipv4_dispo = False self.priv = False - if mid is not None: - self.__parse(mid) + if rid is not None: + self.__parse(rid) elif ipv4 is not None: self.__from_ipv4(ipv4) 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): - """Peuple les champs de l'instance par rapport au mid""" - self.mid = mid + def __parse(self, rid): + """Peuple les champs de l'instance par rapport au rid""" + self.rid = rid - for tp, (start, end) in config.mid.iteritems(): - if start <= mid <= end: + for tp, (start, end) in config.rid.iteritems(): + if start <= rid <= end: self.type = tp break 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': - self.reste = mid & 0xff + self.reste = rid & 0xff else: - self.reste = mid & 0x7ff + self.reste = rid & 0x7ff def __from_ipv4(self, ip): """Peuple les champs à partir de l'ipv4 donnée""" @@ -93,25 +94,25 @@ class Mid(object): if self.type: break 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): - self.mid = mid + self.rid = rid 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 not self.rid: + 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)) if self.type == 'personnel-ens': - self.reste = self.mid & 0xff + self.reste = self.rid & 0xff else: - self.reste = self.mid & 0x7ff - return self.mid + self.reste = self.rid & 0x7ff + return self.rid def ipv4(self): """ @@ -125,7 +126,7 @@ class Mid(object): 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]) + self.__ipv4 = netaddr.IPAddress(config.rid_machines_speciales[self.rid]) return self.__ipv4 @@ -138,13 +139,13 @@ class Mid(object): global_net = netaddr.IPNetwork(config.prefix["subnet"][0]) global_net.prefixlen = 64 - return global_net.next(self.mid) + return global_net.next(self.rid) def __repr__(self): if self.ipv4_dispo: - return "" % (self.mid, self.ipv4()) + return "" % (self.rid, self.ipv4()) else: - return "" % self.mid + return "" % self.rid def __int__(self): - return self.mid + return self.rid diff --git a/gestion/whos.py b/gestion/whos.py index 1bcb8bdd..58668706 100644 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -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 ou --limit-blacklist= : limitation du nombre de lignes 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: diff --git a/utils/check_mid.py b/utils/check_rid.py similarity index 73% rename from utils/check_mid.py rename to utils/check_rid.py index 9c27276c..e13b46a6 100755 --- a/utils/check_mid.py +++ b/utils/check_rid.py @@ -1,10 +1,11 @@ #!/usr/bin/env python # -*- 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 # Authors: Nicolas Dandrimont +# 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 # it under the terms of the GNU General Public License as published by @@ -22,13 +23,13 @@ import sys sys.path.append('/usr/scripts/gestion') -from midtools import Mid +from ridtools import Rid from ldap_crans import crans_ldap from optparse import OptionParser -def check_mid(normalize): - """Vérifie que les mid correspondent bien aux IP. +def check_rid(normalize): + """Vérifie que les rid correspondent bien aux IP. Si normalize = True, modifie la base pour que la correspondance soit bien vérifiée""" @@ -38,24 +39,24 @@ def check_mid(normalize): s = cl.search("ipHostNumber=*") for m in s["machine"]: counter += 1 - mid = int(m.id()) + rid = int(m.rid()) ip = m.ip() try: - mid_t = Mid(ipv4=ip) + rid_t = Rid(ipv4=ip) except ValueError, e: print e else: - if mid != int(mid_t): - print "%s: %s!=%s" % (m.Nom(), mid, int(mid_t)) + if rid != int(rid_t): + print "%s: %s!=%s" % (m.Nom(), rid, int(rid_t)) if normalize: - m.conn.rename_s(m.dn, "%s=%d" % (m.idn, mid_t)) + m.rid(int(rid_t)) print counter if __name__ == "__main__": parser = OptionParser() 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() - check_mid(options.normalize) + check_rid(options.normalize)