diff --git a/gestion/gen_confs/wifi.py b/gestion/gen_confs/wifi.py new file mode 100755 index 00000000..7bc5a66d --- /dev/null +++ b/gestion/gen_confs/wifi.py @@ -0,0 +1,440 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- + +import time, commands +from gen_confs import gen_config, ERREUR, OK, anim + +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 + """ + ######################################PARTIE DE CONFIGURATION + + # Fichiers à écrire + # Répertoire d'écriture des fichiers de zone + ISAKMPD_CONF='/tmp/isakmpd.conf' + + # Config générale + general=""" +[General] +Listen-on= 138.231.148.1 +Retransmits= 5 +Exchange-max-time= 29 +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= %(HOST)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 __str__(self) : + return 'wifi' + + def _gen(self) : + phase1 = self.phase1_debut + phase2 = self.phase2_debut + blocs='' + + for machine in self.base.search('ipsec=*&paiement=%s' % self.ann_scol)['machine'] : + self.anim.cycle() + if 'bloq' in machine.blacklist_actif() : continue + data = { 'HOST' : machine.nom().split('.')[0] , + 'IP' : machine.ip() , + 'KEY' : machine.ipsec() } + + # 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 + + # Ecriture du fichier + 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() + + + +class bornes_wifi(gen_config) : + """ Reconfiguration bornes wifi + Si nom de borne fourni à l'initialisation restart uniquement celle-ci + """ + + clef = '/etc/wifi/ssh/wifi' # Fichier clef ssh + + # Fichier + AUTOEXEC = '/tmp/autoexec.sh' + + autoexec = """#! /bin/sh +#*********************************************************** +# Ce fichier est généré dans wifi.py +# Les données proviennent de la base LDAP et de la conf +# présente au début du script. +# +# Génération : %(date)s +# Fichier : %(AUTOEXEC)s +# +# NE PAS EDITER +# +#*********************************************************** + +## On configure la nvram de la borne selon son adresse MAC (celle inscrite sur la borne) +## Modifier bornes.cf et non ce fichier qui sera modifié selon le contenu de bornes.cf +cat < /tmp/params +%(BORNES)s +EOF +( + +NECTARIS=138.231.148.1 + +echo -n "Mise en place de syslog..." + +killall syslogd 2> /dev/null +killall klogd 2> /dev/null +/sbin/syslogd -R $NECTARIS +/sbin/klogd + +echo " ok" + +read mac ip canal puissance nom < /tmp/params +echo "Mac : $mac" +echo "IP : $ip" +echo "Canal : $canal" +echo "Puiss : $puissance mW" +echo "Nom : $nom" + +if [ "$mac" = "" ]; then + echo "Borne inconnue" + ping -c 1 138.231.148.1 + sleep 120 + reboot +fi + +change=0 + +echo -n IP... +if [ "$(nvram get lan_ipaddr)" != "$ip" ]; then + ifconfig br0 $ip netmask 255.255.252.0 + nvram set lan_ipaddr=$ip + change=1 +fi +echo " ok" + +echo -n Canal... +if [ "$(nvram get wl_channel)" != "$canal" ]; then + nvram set wl_channel=$canal + change=1 +fi +echo " ok" + +echo -n Puissance... +if [ "$(nvram get txpwr)" != "$puissance" ]; then + nvram set txpwr=$puissance + change=1 +fi +echo " ok" + +echo -n Nom... +if [ "$(nvram get wan_hostname)" != "$nom" ]; then + nvram set wan_hostname=$nom + change=1 +fi +echo " ok" + +echo -n Désactivation de cron... +if [ "$(nvram get cron_enable)" != "0" ]; then + nvram set cron_enable=0 + change=1 +fi +echo " ok" + +echo -n Commit des changements... +if [ $change -eq 1 ]; then + nvram commit + sleep 1 + # On se casse pas la tete + reboot +fi +echo " ok" + +# On place un prompt pour la machine +cd /tmp + +cat < .profile +export PS1="$nom ($ip) # " +echo " +---------------------------------- + + WIFI @ CRANS + + Nom: $nom + IP: $ip + Puissance: $puissance + Canal: $canal + +---------------------------------" +EOF + + + +echo -n Démarrage du firewall... +## Firewall + +DHCP=138.231.148.253 +WEB=138.231.136.6 +FTP=138.231.136.10 +WIFI=138.231.148.0/22 +flt="iptables -A FORWARD -i br0" + +iptables -F FORWARD + +$flt --destination 224.0.0.0/4 -j DROP +$flt -m state --state ESTABLISHED,RELATED -j ACCEPT + +# DHCP +$flt -p udp --sport bootpc --dport bootps --source 0.0.0.0 --destination 255.255.255.255 -j ACCEPT +$flt -p udp --sport bootpc --dport bootps --source 0.0.0.0 --destination $DHCP -j ACCEPT +$flt -p udp --sport bootpc --dport bootps --source $WIFI --destination 255.255.255.255 -j ACCEPT +$flt -p udp --sport bootps --dport bootpc --source $DHCP --destination $WIFI -j ACCEPT +$flt -p udp --sport bootps --dport bootpc --source $DHCP --destination 255.255.255.255 -j ACCEPT +# Pour compter ce qui ne passe pas (et penser un jour à utiliser tcpdump pour voir ce que c'est) +#$flt -p udp --sport bootpc --dport bootps -j LOG # Devrait être 0 +#$flt -p udp --sport bootps --dport bootpc -j LOG # Devrait être 0 +#$flt -p udp --sport bootpc --dport bootps -j ACCEPT # Devrait être 0 +#$flt -p udp --sport bootps --dport bootpc -j ACCEPT # Devrait être 0 + +# ISAKMP +$flt -p udp --source $WIFI --destination $NECTARIS --dport 500 --sport 500 -j ACCEPT +#$flt -p udp --destination $WIFI --source $NECTARIS --dport 500 --sport 500 -j LOG # Doit être 0 +#$flt -p udp --destination $WIFI --source $NECTARIS --dport 500 --sport 500 -j ACCEPT # Doit être 0 + +# DNS + Web vers Zamok + FTP sila +$flt -p udp --source $WIFI --destination $NECTARIS --dport 53 --sport 1024: -j ACCEPT +$flt -p tcp --source $WIFI --destination $WEB --syn --dport 443 --sport 1024: -j ACCEPT +$flt -p tcp --source $WIFI --destination $WEB --syn --dport 80 --sport 1024: -j ACCEPT +$flt -p tcp --source $WIFI --destination $FTP --syn --dport 21 --sport 1024: -j ACCEPT + +# ESP +$flt -p ESP --source $WIFI --destination $NECTARIS -j ACCEPT # A 0, mais a priori, rien n'empêche d'utiliser cette ligne +$flt -p ESP --destination $WIFI --source $NECTARIS -j ACCEPT + +iptables -P FORWARD DROP + +echo " ok" + +echo -n "Mise en place du resolv.conf..." + +cat > /tmp/myresolv.conf < /dev/null + +mkdir /tmp/cron.d 2> /dev/null +mkdir /var/spool 2> /dev/null +mkdir /var/spool/cron 2> /dev/null +chmod 700 /tmp/cron.d /var/spool /var/spool/cron + +cat > /tmp/cron.updatedns < /tmp/cron.ping < /dev/null +sleep 61 # Idem +exit 0 +EOF +chmod +x /tmp/cron.ping + +cat > /tmp/cron.uptime < /tmp/cron.klogd < /etc/cron.d/dns < /etc/cron.d/services < /etc/cron.d/ping <> /tmp/autoexec.log 2>> /tmp/autoexec.log +# Pas sûr que cela reste ordonné + + +# On donne le tout à syslog +echo "Fin du boot" >> /tmp/autoexec.log +cat /tmp/autoexec.log | busybox logger -t "Statut" + + +""" + + "#" # Ligne ici juste pour avoir un comportement correct de mon éditeur...... + + def __str__(self) : + return 'bornes wifi' + + def __init__(self,borne='') : + self.borne = borne + + def _gen(self) : + date = time.strftime('%A %d %B %Y %H:%M') + BORNES = '## Liste des bornes -- source : base LDAP\n' + BORNES = '## MAC - IP - Canal - Puissance - Nom\n' + for b in self.base.search('puissance=*')['machine'] : + self.anim.cycle() + BORNES += '%s %s %s %s %s\n' % ( b.mac(), b.ip(), b.canal(), b.puissance(), b.nom() ) + + BORNES += '## Fin liste des bornes' + + AUTOEXEC = self.AUTOEXEC + fd = self._open_conf(self.AUTOEXEC) + fd.write( self.autoexec % vars() ) + fd.close() + + def restart(self) : + self.lock() + if self.borne : + bornes = [ self.borne ] + else : + bornes = [] + for b in self.base.search('puissance=*')['machine'] : + bornes.append( b.nom() ) + + for borne in bornes : + anim('\treboot de %s' % borne) + status, output = commands.getstatusoutput('ssh -i %s -o StrictHostKeyChecking=no root@%s reboot' % ( self.clef, borne ) ) + if status : + print ERREUR + if self.debug : + print output + else : + print OK + + self.unlock()