#! /usr/bin/env python # -*- coding: iso-8859-15 -*- import time, commands from gen_confs import gen_config, ERREUR, OK, anim import sys, os sys.path.append('/usr/scripts/gestion') from ldap_crans import crans_ldap, invite class conf_wifi(gen_config) : """ Génération de la configuration de isakmpd dans ISAKMPD_CONF Le fichier est constitué en 5 parties : 1) Configuration générale insérée telle quelle 2) Phase 1 : une ligne par host suivant template 3) Phase 2 : une entrée par machine 4) Bloc par machine suivant template 5) Ajout de net_crans Génération également de la fonction get_clients en shell dans /etc/wifi/wifi-update/shared/config/get_clients qui permet d'avoir l' ensemble des clients wifi. """ ######################################PARTIE DE CONFIGURATION # Fichiers à écrire # Répertoire d'écriture des fichiers de zone ISAKMPD_CONF='/etc/isakmpd/isakmpd.conf' GET_CLIENTS='/etc/wifi/wifi-update/shared/config/get_clients' # Config générale general=""" [General] Listen-on= 138.231.148.1 Retransmits= 5 Exchange-max-time= 40 Logverbose= 1 Loglevel= A=90 Check-interval= 60 Default-phase-1-lifetime= 1200,90:86400 Default-phase-2-lifetime= 1800,120:86400 [Default-main-mode] DOI= IPSEC EXCHANGE_TYPE= ID_PROT Transforms= 3DES-SHA,3DES-MD5 [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-AES-SHA-SUITE, QM-ESP-AES-MD5-SUITE, \\ QM-ESP-BLF-SHA-SUITE, QM-ESP-BLF-MD5-SUITE, \\ QM-ESP-3DES-SHA-SUITE, QM-ESP-3DES-MD5-SUITE, \\ QM-ESP-AES-SHA-PFS-SUITE, QM-ESP-AES-MD5-PFS-SUITE, \\ QM-ESP-BLF-SHA-PFS-SUITE, QM-ESP-BLF-MD5-PFS-SUITE, \\ QM-ESP-3DES-SHA-PFS-SUITE, QM-ESP-3DES-MD5-PFS-SUITE """ # Phase 1 phase1_debut="[Phase 1]\n" phase1_template="%(IP)s= ISAKMP-peer-%(HOST)s\n" # Phase 2 phase2_debut="[Phase 2]\nPassive-connections= " phase2_template="IPsec-%(HOST)s" phase2_sep=', \\\n ' #Lignes necessaires pour chaque machine host_template=""" [ISAKMP-peer-%(HOST)s] Phase= 1 Transport= udp Address= %(IP)s Configuration= Default-main-mode Authentication=%(KEY)s [IPsec-%(HOST)s] Phase= 2 ISAKMP-peer= ISAKMP-peer-%(HOST)s Configuration= Default-quick-mode Local-ID= Net-crans Remote-ID= Net-%(HOST)s [Net-%(HOST)s] ID-type= IPV4_ADDR Address= %(IP)s """ # Dernière partie du fichier net_crans=""" [Net-crans] ID-type= IPV4_ADDR_SUBNET Network= 0.0.0.0 Netmask= 0.0.0.0 """ restart_cmd = 'kill -HUP $(cat /var/run/isakmpd.pid 2>/dev/null )' ######################################FIN PARTIE DE CONFIGURATION def __init__(self) : self.db = crans_ldap() def lockname(self): # On change le nom du lock pour avoir un nom unique pour tout ce qui # concerne le wifi # return ".".join(str(self.__class__).split(".")[0:-1]) return "gen_confs.wifi" def __str__(self) : return 'wifi' def _gen(self): # Pour isakmpd.conf phase1 = self.phase1_debut phase2 = self.phase2_debut blocs='' # Pour get_clients clients = '' for machine in self.db.search('host=*.wifi.crans.org&paiement=ok')['machine'] + invite().machines() : self.anim.cycle() if 'bloq' in machine.blacklist_actif() : continue data = { 'HOST' : machine.nom().split('.')[0] , 'IP' : machine.ip() , 'KEY' : machine.ipsec() , 'MAC' : machine.mac().lower() } # Pour isakmpd.conf # Phase 1 phase1 += self.phase1_template % data # Phase 2 if blocs != '' : # Ce n'est pas la première machine, il faut insérer un séparateur phase2 += self.phase2_sep phase2 += self.phase2_template % data # Blocs machine blocs += self.host_template % data # Pour get_clients clients += "echo %(HOST)s %(IP)s %(MAC)s\n" % data # Dans les clients, on rajoute les bornes bornes = self.db.search('host=*.wifi.crans.org&ipsec!=*')['machine'] for machine in bornes: self.anim.cycle() data = { 'HOST' : machine.nom().split('.')[0] , 'IP' : machine.ip() , 'MAC' : machine.mac().lower() } clients += "echo %(HOST)s %(IP)s %(MAC)s\n" % data # Ecriture du fichier isakmpd.conf fd = self._open_conf(self.ISAKMPD_CONF,'#') fd.write(self.general) fd.write(phase1) fd.write('\n') fd.write(phase2) fd.write('\n') fd.write(blocs) fd.write(self.net_crans) fd.close() # Ecriture du fichier get_clients fd = self._open_conf(self.GET_CLIENTS, '#') fd.write("get_clients () {\n\n") fd.write(clients) fd.write("\n}\n") fd.close() class bornes_wifi(gen_config) : """ Reconfiguration bornes wifi Si noms de borne fourni à l'initialisation restart uniquement celle-ci """ # Fichier WIFI_UPDATE='/etc/wifi/wifi-update' GET_CONFIG='%s/shared/config/get_config' % WIFI_UPDATE def __str__(self) : return 'bornes wifi' def lockname(self): # On change le nom du lock pour avoir un nom unique pour tout ce qui # concerne le wifi # return ".".join(str(self.__class__).split(".")[0:-1]) return "gen_confs.wifi" def __init__(self,bornes=[]) : self.db = crans_ldap() self.bornes = bornes def _gen(self) : bornes = self.db.search('host=*.wifi.crans.org&puissance=*')['machine'] if not self.bornes: # Si on n'a pas spécifié de bornes, on va les redémarrer toute ! self.bornes = [b.nom() for b in bornes] # Liste des bornes BORNES = u'## Liste des bornes -- source : base LDAP\n' BORNES += u'## MAC - IP - Canal - Puissance - Nom - Radio on/off\n' for b in bornes : self.anim.cycle() BORNES += u'%s %s %s %d %s' % ( b.mac(), b.ip(), b.canal(), abs(int(b.puissance())), b.nom().split(".")[0] ) # Doit-on activer la partie radio ? if int(b.puissance()) < 0: BORNES += u' off\n' else: BORNES += u' on\n' BORNES += u'## Fin liste des bornes' # Nouveau systeme fd = self._open_conf(self.GET_CONFIG, '#') fd.write(""" get_config () { grep -i $(nvram get et0macaddr) <