From 2ce185720e174bc5b73000edc1ab80a5d0d24c23 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Tue, 26 Mar 2013 16:24:31 +0100 Subject: [PATCH] =?UTF-8?q?=C3=89clatement=20de=20config.py=20en=20plusieu?= =?UTF-8?q?rs=20sous-module=20de=20config.=20L'API=20reste=20=C3=A0=20peu?= =?UTF-8?q?=20pr=C3=A8s=20la=20m=C3=AAme,=20il=20faut=20juste=20penser=20?= =?UTF-8?q?=C3=A0=20import=20config.submodule=20avant=20d'utilisr=20config?= =?UTF-8?q?.submodule=20(confid.dns,=20config.upload=20par=20exemple)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tous les autres fichiers modifiés le sont pour compatibilité avec ce changement. Ce commit implique des commits du même genre dans l'intranet2, lc_ldap et bcfg2. --- .gitignore | 3 +- admin/controle_chartes_MA.py | 3 +- archive/impression_old/impression_laserjet.py | 2 +- gestion/chambres_vides.py | 6 +- gestion/config.py | 890 ------------------ gestion/config_srv.py | 9 - gestion/extractionbcfg2.py | 67 -- gestion/gen_confs/adherents.py | 9 +- gestion/gen_confs/bind.py | 1 + gestion/gen_confs/firewall.py | 2 +- gestion/gen_confs/firewall6.py | 5 +- gestion/gen_confs/firewall_new.py | 4 +- gestion/gen_confs/generate.py | 1 - gestion/gen_confs/ipset.py | 1 - gestion/ip6tools.py | 2 - gestion/ldap_crans.py | 2 +- impression/cout.py | 3 +- surveillance/deconnexion.py | 160 +--- surveillance/statistiques.py | 2 +- 19 files changed, 30 insertions(+), 1142 deletions(-) delete mode 100644 gestion/config.py delete mode 100644 gestion/config_srv.py delete mode 100755 gestion/extractionbcfg2.py diff --git a/.gitignore b/.gitignore index d9ec3b7b..2a4d88c3 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,6 @@ archive gestion/logreader/ lc_ldap/ wifi_new/ - -# Devrait être remplacé par l'intranet2 intranet/ # rebuts @@ -64,6 +62,7 @@ var/ monit squid/errors/ surveillance/mac_prises/output/ +doc/build/ # etat_* de la connexion de secours secours/etat_* diff --git a/admin/controle_chartes_MA.py b/admin/controle_chartes_MA.py index 71445390..4fde7a22 100755 --- a/admin/controle_chartes_MA.py +++ b/admin/controle_chartes_MA.py @@ -23,6 +23,7 @@ Les commandes sont : import sys, os, re sys.path.append('/usr/scripts/gestion') import config +import config.mails from email_tools import send_email, parse_mail_template # Fonctions d'affichage @@ -142,7 +143,7 @@ def spammer(): to = adh.email() print to if not debug: - data = config.txt_charte_MA % {'From' : u"ca@crans.org", 'To' : to} + data = config.mails.txt_charte_MA % {'From' : u"ca@crans.org", 'To' : to} connexion.sendmail("ca@crans.org",to,data.encode('iso-8859-15')) def __usage(message=None): diff --git a/archive/impression_old/impression_laserjet.py b/archive/impression_old/impression_laserjet.py index bcb1214b..a3283bb0 100644 --- a/archive/impression_old/impression_laserjet.py +++ b/archive/impression_old/impression_laserjet.py @@ -32,7 +32,7 @@ __version__ = '1' import sys, syslog, os.path sys.path.append('/usr/scripts/gestion') -import config +import config.impression import cout from crans.utils import QuoteForPOSIX as escapeForShell import crans.utils.logs diff --git a/gestion/chambres_vides.py b/gestion/chambres_vides.py index fca65d68..f3a6eeda 100755 --- a/gestion/chambres_vides.py +++ b/gestion/chambres_vides.py @@ -19,7 +19,9 @@ import os import config year = config.ann_scol -delai = config.upload.demenagement_delai +delai = config.demenagement_delai + +import config.mails.demenagement # On récupère ceux qui n'ont pas payé cette année bad_boys_e_s = conn.search('chbre=????&paiement=%d&paiement!=%d' % (year-1,year))['adherent'] @@ -49,7 +51,7 @@ for clandestin in bad_boys_e_s: to = clandestin.mail() if not "@" in to: to += "@crans.org" - mail = config.upload.message_demenagement % {"from" : "respbats@crans.org", + mail = config.mails.demenagement.message_demenagement % {"from" : "respbats@crans.org", "chambre" : exchambre, "jours" : int(ttl/86400) + 1, "to" : to} diff --git a/gestion/config.py b/gestion/config.py deleted file mode 100644 index 2f0ef62e..00000000 --- a/gestion/config.py +++ /dev/null @@ -1,890 +0,0 @@ -# -*- python -*- -# -*- coding: utf-8 -*- - -############################################ -## Définition du comportement des scripts ## -############################################ - -from time import localtime -from datetime import datetime - -# Fichier généré -from config_srv import adm_only, role - -# Pour les emails -import email.Header - -##### Gestion des câblages -# Selon la date, on met : -# -ann_scol : Année scolaire en cours -# -periode_transitoire : on accepte ceux qui ont payé l'année dernière - -# Ne modifier que les dates ! -dat = localtime() -if dat[1] < 8 or dat[1] == 8 and dat[2] < 16: - # Si pas encore début août, on est dans l'année précédente - ann_scol = dat[0]-1 - periode_transitoire = False - # sinon on change d'année -elif dat[1] < 10 or (dat[1] == 10 and dat[2] < 4): - # Si pas encore octobre, les gens ayant payé l'année précédente sont - # acceptés - ann_scol = dat[0] - periode_transitoire = True -else: - # Seulement ceux qui ont payé cette année sont acceptés - ann_scol = dat[0] - periode_transitoire = False - - -## Bloquage si carte d'étudiants manquante pour l'année en cours -# /!\ Par sécurité, ces valeurs sont considérées comme False si -# periode_transitoire est True -# Soft (au niveau du Squid) -bl_carte_et_actif = True -# Hard (l'adhérent est considéré comme paiement pas ok) -bl_carte_et_definitif = True - -#Sursis pour les inscription après le 1/11 pour fournir la carte étudiant -sursis_carte=8*24*3600 - -# Gel des cableurs pas a jour de cotisation -# Les droits ne sont pas retires mais il n'y a plus de sudo -bl_vieux_cableurs = False - -##Création de comptes -# Gid des comptes créés -gid=100 -club_gid=120 -# Shell -login_shell='/bin/zsh' -club_login_shell='/usr/bin/rssh' -# Longueur maximale d'un login -maxlen_login=15 - -# Quels droits donnent l'appartenance à quel groupe Unix ? -droits_groupes = {'adm' : [u'Nounou'], - 'respbats' : [u'Imprimeur', u'Cableur', u'Nounou'], - 'moderateurs' : [u'Moderateur'], - 'disconnect' : [u'Bureau'], - 'imprimeurs' : [u'Imprimeur', u'Nounou', u'Tresorier'], - 'bureau' : [u'Bureau'], - 'webadm' : [u'Webmaster'], - 'webradio' : [u'Webradio'], - } - -####### Les ML -# Le + devant un nom de ML indique une synchronisation -# ML <-> fonction partielle : il n'y a pas d'effacement automatique -# des abonnés si le droit est retiré -droits_mailing_listes = {'roots' : [ u'Nounou', u'Apprenti'], - 'mailman' : [ u'Nounou'], - '+nounou' : [ u'Nounou', u'Apprenti'], - 'respbats' : [ u'Cableur', u'Nounou', u'Bureau'], - '+moderateurs' : [ u'Moderateur', u'Bureau'], - '+disconnect' : [ u'Nounou', u'Bureau'], - '+impression' : [ u'Imprimeur'], - 'bureau' : [u'Bureau'], - 'tresorier' : [u'Tresorier'], - '+ca' : [u'Bureau', u'Apprenti', u'Nounou', u'Cableur'], - - '+federez' : [u'Bureau', u'Apprenti', u'Nounou'], - '+install-party' : [u'Bureau', u'Apprenti', u'Nounou'], - - # Correspondance partielle nécessaire... Des adresses non-crans sont inscrites à ces ML. - '+dsi-crans' : [u'Nounou', u'Bureau'], - '+crous-crans' : [u'Nounou', u'Bureau'], - - '+wrc' : [u'Webradio'], - } - -## Répertoire de stockage des objets détruits -cimetiere = '/home/cimetiere' - -## Adresses mac utiles -mac_komaz = '00:19:BB:31:3B:80' -mac_wifi = '00:0f:1f:66:e0:e8' -mac_titanic = 'aa:73:65:63:6f:76' -mac_g = '00:0f:1f:66:e5:92' - -## Serveur principal de bcfg2 -bcfg2_main = "bcfg2.adm.crans.org" -## Compatibilité inverse -cfengine_main = bcfg2_main - -## Fichier de mapping lun/nom de volume iscsi -ISCSI_MAP_FILE = "/usr/scripts/var/iscsi_names.py" -ISCSI_MAP_FILE_TEMPLATE = "/usr/scripts/var/iscsi_names_%s.py" - -# format: { algorithm : (IANA_id, ssh_algo) } -# où algorithm est tel qu'il apparait dans les fichiers /etc/ssh/ssh_host_%s_key.pub % algorithm -# IANA_id correspond à l'entier attribué par l'IANA pour l'algorithm dans les champs dns SSHFP -# ssh_algo correspond a la première chaine de charactère donnant le nom de l'algorithme de chiffrement lorsque la clef ssh est dans le format openssh (algo key comment) -sshfp_algo = { - "rsa" : (1,"ssh-rsa"), - "dsa" : (2,"ssh-dss"), - } - -sshkey_max_age=2*(365.25*24*3600) -sshkey_size = { - 'rsa':4096, - 'dsa':1024, -} - - -## Impression -class impression: - """Cette classe contient toutes les variables - de prix concernant l'impression""" - - # l'imprimante utilisée - imprimante = "canon" - - # Découvert autorisé (en euro) - decouvert = 0. - - ###### Variables de prix (tout est exprimé en centimes) ###### - - # Cout imprimante : 2024 euros pour 30 mois - 19136 euros de partenariat - # 5 000 pages par mois - # Donc ammortissement : 1.3493 centimes par pages - amm = 1.3493 - - # Cout d'une feuille A4 - # 25.06 euros les 2500 feuilles - c_a4 = 1.0024 + amm - - # Cout d'une feuille A3 - # 53.76 euros les 2500 feuilles - c_a3 = 2.1504 + amm - - # Cout d'un transparent - # 15.85 euros les 100 transparents - c_trans = 15.85 + amm - - c_face_couleur = 9.4484 - c_face_nb = 0.9568 - - - # Prix d'une agrafe - # 200 euros les 15 000 - c_agrafe = 1.3333 - - ################# FIN des variables de prix ###################### - - # L'adresse mail de l'imprimante - From_imprimante = 'impression@crans.org' - - # Informations supplémentaires sur l'état de l'imprimante - state_msg = [u"L'impression recto/verso (ou livret) A3 est déconseillée"] - -## Pour le controle d'upload et d'autres trucs qui n'ont en fait rien à foutre là… -class upload: - - # liste des exemptations générales - exempt = [ ['138.231.136.0/21', '138.231.0.0/16'], - ['138.231.148.0/22', '138.231.0.0/16'] ] - - # limite soft - soft = 300 - - # limite hard - hard = 4096 - - # envoi des mails à disconnect@ - disconnect_mail_soft = False - disconnect_mail_hard = True - - # expéditeur des mails de déconnexion - expediteur = "disconnect@crans.org" - - # textes des mails - message_soft = u"""From: %(from)s -To: %(to)s -Subject: [CRANS] Attention !! -Content-Type: text/plain; charset="utf-8" - -Bonjour %(proprio)s, - -Nous t'informons que ta (tes) machine(s) envoie(nt) une quantité -importante de données vers l'extérieur (%(upload)s Mo en 24 heures). - -*Ce message t'est envoyé à titre informatif, il ne te sanctionne pas.* - -Il signifie que tu as envoyé plus de 300 Mo au cours des dernières 24 -heures. Cela peut venir du fait que, *par exemple*, tu essaies -d'envoyer des fichiers de grosse taille à l'extérieur de la zone -crans, ou encore que tu as fait une utilisation importante de -logiciels envoyant une très grande quantité de petites données -(vidéo-conférence par exemple). Il peut y avoir d'autres raisons. - - -Si cela continuait, et que tu dépassais la limite acceptable des 4096 -Mo sur 24 heures, tu serais automatiquement déconnecté du réseau pour -une durée de 24 heures. Il t'appartient donc de surveiller cela de -plus près et de faire en sorte que tes machines n'uploadent pas de -manière excessive à l'avenir. - - -Pour plus d'informations, tu peux consulter la page: -http://wiki.crans.org/VieCrans/DéconnexionPourUpload - -Si tu as des questions, contacte disconnect@crans.org - -N.B. : L'upload consiste en l'envoi de données vers des machines n'étant -pas branchées sur le CRANS. - ---\u0020 -Disconnect team""" - - message_hard = u"""From: %(from)s -To: %(to)s -Subject: [CRANS] =?iso-8859-1?Q?D=E9connexion?= temporaire -Content-Type: text/plain; charset="utf-8" - -Bonjour %(proprio)s, - -Tu as temporairement été déconnecté du réseau en raison de l'envoi trop -important de données vers l'extérieur (%(upload)s Mo en 24h). - -Tu as toujours accès au web ainsi qu'à tes mails crans mais tous les -autres services te sont suspendus. Si cela devait se renouveler trop -souvent, tu serais déconnecté complètement pour une durée plus -importante. Il t'appartient donc de surveiller cela de plus près et de -faire en sorte que ta machine n'uploade plus de manière excessive à -l'avenir. - -Pour plus d'informations, tu peux consulter la page : -http://wiki.crans.org/VieCrans/DéconnexionPourUpload - -Si tu as des questions, contacte disconnect@crans.org - -N.B. : L'upload consiste en l'envoi de données vers des machines n'étant -pas branchées sur le CRANS. - ---\u0020 -Disconnect team""" - - - message_disconnect_soft = u"""From: %(from)s -To: %(to)s -Subject: %(proprio)s uploade -Content-Type: text/plain; charset="utf-8" - -%(proprio)s uploade actuellement %(upload)s Mo. - ---\u0020 -Message créé par deconnexion.py""" - - message_disconnect_hard = u"""From: %(from)s -To: %(to)s -Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20d=E9connect=E9?= -Content-Type: text/plain; charset="utf-8" - -%(proprio)s a été déconnecté pour upload (%(upload)s Mo). - -Ses machines ont été aperçues pour la dernière fois à ces endroits : -%(mdc)s - -La chambre de l'adhérent est %(chambre)s. - ---\u0020 -Message créé par deconnexion.py""" - - message_disconnect_multi = u"""From: %(from)s -To: %(to)s -Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20d=E9connect=E9?= - %(nbdeco)d fois pour upload en un mois ! -Content-Type: text/plain; charset="utf-8" - -L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour upload en un mois ! - -Le PS a été généré et se trouve sur zamok : -%(ps)s - ---\u0020 -Message créé par deconnexion.py""" - - demenagement_delai = 8 - # Nombre de jours après le passage en chambre ???? où on supprime les machines - message_demenagement = u"""From: %%(from)s -To: %%(to)s -Subject: %s -Content-Type: text/plain; charset="utf-8" - -Bonjour, - -Un adhérent au Cr@ns a déclaré résider dans la chambre %%(chambre)s, -que tu occupais précédemment. Cela signifie que nous ne disposons -plus d'informations de résidence valides à ton sujet. - -Si tu souhaites conserver ton accès au Cr@ns : - - et que tu as déménagé hors du campus : il te suffit de nous préciser - ta nouvelle adresse, ton déménagement sera pris en compte. - - et que tu as déménagé vers une chambre du campus : tu dois passer - à une permanence pour signer une autorisation de câblage pour ta nouvelle - chambre. - -Si tu ne souhaites pas conserver ton accès au Cr@ns, un simple message de -ta part et nous supprimerons les machines que tu possèdes de notre base de données. -Cette suppression aura automatiquement lieu dans %%(jours)s jours en l'absence de -réponse. - -S'il s'agit d'une erreur de notre part, préviens-nous au plus vite afin que nous -puissions corriger le problème. - ---\u0020 -Les membres actifs du Crans""" % email.Header.make_header([("Déménagement non déclaré", "utf8")]) - -class mac_prise: - # Pour spammer, mettre à true. - hargneux = True - - # Si pour une chambre donnée, il y a plus de 300 entrées filaires - # n'appartenant pas à l'adhérent propriétaire de la mac, on prévient. - max_inconnues_par_jour = 300 - - # Titre... - titre_mac_inconnue = u"Repérage de macs potentiellement non désirées dans les chambres suivantes." - - # Pour la recherche dans postgres - delay = { 'instant': '2 min', - 'heuristique': '30 min', - 'journalier': '1 day', - } - - # Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect" - # Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect" - suspect = { 'instant':{'mac': 2, 'chambre': 2}, - 'heuristique':{'mac': 2, 'chambre': 2}, - 'journalier':{'mac': 2, 'chambre': 2}, - } - - # Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect" - # Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect" - tres_suspect = { 'instant':{'mac': 3, 'chambre': 3}, - 'heuristique':{'mac': 3, 'chambre': 3}, - 'journalier':{'mac': 3, 'chambre': 3}, - } - - # Le point central des analyses. - rapport_suspect = { 'instant':{'mac': 0.51, 'chambre': 0.51}, - 'heuristique':{'mac': 0.4, 'chambre': 0.55}, - 'journalier':{'mac': 0.2, 'chambre': 0.58}, - } - - titre_suspect = { 'instant':{'mac': u"Macs se baladant un peu trop entre les chambres (instantanné)", 'chambre': u"Chambres avec un peu trop de macs (instantanné)"}, - 'heuristique':{'mac': u"Macs se baladant un peu trop entre les chambres (délai moyen)", 'chambre': u"Chambres avec un peu trop de macs (délai moyen)"}, - 'journalier':{'mac': u"Macs s'étant peut-être un peu trop baladées aujourd'hui", 'chambre': u"Chambres avec un peu trop de macs sur un jour"}, - } - - titre_tres_suspect = { 'instant':{'mac': u"/!\ Spoof potentiel des macs suivantes dans les chambres ci-après (instantanné)", 'chambre': u"/!\ Les chambres ci-après contiennent étrangement trop de macs inconnues ! (instantanné)"}, - 'heuristique':{'mac': u"/!\ Spoof potentiel des macs suivantes dans les chambres ci-après (délai moyen)", 'chambre': u"/!\ Les chambres ci-après contiennent étrangement trop de macs inconnues ! (délai moyen)"}, - 'journalier':{'mac': u"/!\ Spoof probable des macs suivantes dans les chambres ci-après aujourd'hui !!", 'chambre': u"/!\ Les chambres suivantes contiennent trop de macs inconnues (sur un jour)"}, - } - -# Classe pour les paramètres du firewall # -########################################## -class conf_fw: - mark = { 'https-radin': '0x3', - 'https-gratuit' : '0x3', - 'proxy' : '0x2', - 'secours' : '0x4', - 'bittorrent' : '0x1' } - - # Valeur du masque utilisé pour créer un arbre dans les filtres - mask = [24] - - # Empiriquement, 95 correspond à un débit de 100Mbit/s - # sur des outils tels que munin - now=datetime.now() - if now.hour >= 6 and now.hour < 19 and now.weekday() < 5: - debit_max = 95 * 1024 / 8 # kbytes per second en connexion de jour - debit_jour=True - else: - debit_max = 500 * 1024 / 8 # connexion de nuit et du week-end - debit_jour=False - #~ debit_max = 95 * 1024 / 8 # connexion de nuit http://www.speedtest.net/result/2318350458.png - -# Classe pour la détection des virus # -###################################### -class virus: - # Nombre de Flood Par heure - flood = 100 - virus = 10 - -# Classe pour la détection du p2p # -################################### -#Le traffic udp vers les ip (v4 et v6) des hotes dans la liste suivante est bloqué -udp_torrent_tracker=[ - 'tracker.openbittorrent.com', - 'tracker.ccc.de', - 'tracker.istole.it', - 'tracker.publicbt.com', - 'tracker.1337x.org', - 'fr33domtracker.h33t.com', - 'tracker.torrentbox.com', - '11.rarbg.com', - 'exodus.desync.com', - 'fr33dom.h33t.com', - 'torrentbay.to', - 'tracker.ex.ua', - 'tracker.ilibr.org', - 'tracker.prq.to', - 'tracker.publichd.eu', - 'tracker.yify-torrents.com', - ] -class p2p : - # Limite de débit pour l'ensemble du p2p classifié, en octets/s - # identique en upload et download - debit_max = 1000000 # = 1 Mb/s = 125 ko/s - debit_adh = 12000 # = 12 Kb/s = 1500 o/s (>= MTU [1500 bytes]) - - # Limite de paquets acceptés par protocole P2P en deux heures - limite = {'Bittorrent': 100, - 'AppleJuice': 50, - 'SoulSeek': 500, - 'WinMX': 50, - 'eDonkey': 50, - 'DirectConnect': 50, - 'KaZaa': 50, - 'Ares': 50, - 'GNUtella': 50 } - # Envoi des mails à disconnect@ - disconnect_mail = True - - # Expéditeur des mails de déconnexion - expediteur = "disconnect@crans.org" - - avertissement = u"""From: %(From)s -To: %(To)s -Subject: =?iso-8859-1?Q?D=E9tection?= de p2p sur la machine %(hostname)s -Content-Type: text/plain; charset="utf-8" - -La machine %(hostname)s a été déconnectée pendant 24h pour -utilisation du protocole %(protocole)s. -Nombre de paquets : %(nb_paquets)s paquets depuis le %(datedebut)s. -Chambre (si machine fixe) : %(chambre)s - ---\u0020 -Message créé par deconnexion.py""" - - deconnexion = u"""From: %(From)s -To: %(To)s -Subject: Avis de =?iso-8859-15?Q?D=E9connexion?= -Content-Type: text/plain; charset="utf-8" - -Bonjour, -Nous avons détecté que ta machine, %(hostname)s utilisait le -*protocole* %(protocole)s. - -Cela signifie : - - Ou bien que tu utilises le logiciel qui a le même nom - que ce protocole, - - Ou bien que tu utilises un logiciel qui utilise le - protocole en question pour partager des fichiers. - -Or l'usage de *protocoles* de type peer to peer est interdit -sur notre réseau, conformément aux documents que tu as acceptés -en adhérant au CR@NS. - -Lorsqu'un seul des adhérents du CR@NS utilise des protocoles interdits, -il pénalise l'ensemble des adhérents de l'association. - -Tu seras donc déconnecté 24h. - ---\u0020 -Disconnect Team""" - - avertissement_bt = u"""From: %(From)s -To: %(To)s -Subject: Avertissement d'utilisation du protocole Bittorrent -Content-Type: text/plain; charset="utf-8" - -Bonjour, -Nous avons détecté que ta machine, %(hostname)s utilisait le -*protocole* %(protocole)s. - -*Ce message t'est envoyé à titre informatif, il ne te sanctionne pas.* - -Cela signifie : - - Ou bien que tu utilises le logiciel qui a le même nom - que ce protocole, - - Ou bien que tu utilises un logiciel qui utilise le - protocole en question pour partager des fichiers. - -Or l'usage de *protocoles* de type peer to peer est interdit -sur notre réseau, conformément aux documents que tu as acceptés -en adhérant au CR@NS. - -Nous empêchons donc ce trafic Bittorrent de sortir du réseau Cr@ns, -rendant inopérant les logiciels l'utilisant. - -Si tu es à l'origine de ce trafic, merci de couper les logiciels en -question. Sinon, il est possible qu'un logiciel malveillant en soit la -cause, nous te conseillons d'installer un anti-virus et un pare-feu afin -d'arrêter la source de ce trafic. - ---\u0020 -Disconnect Team""" - - message_disconnect_multi = u"""From: %(from)s -To: %(to)s -Subject: %(proprio)s a =?iso-8859-15?Q?=E9t=E9=20d=E9connect=E9?= %(nbdeco)d fois pour p2p en un an ! -Content-Type: text/plain; charset="utf-8" - -L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour p2p en un an ! - -Le PS a été généré et se trouve sur zamok : -%(ps)s - ---\u0020 -Message créé par deconnexion.py""" - - -############################# -## Paramètres des machines ## -############################# - -## >>>>>>>>>>>>>>> La modification des paramètres suivants doit se -## >> ATTENTION >> faire avec précaution, il faut mettre la base à -## >>>>>>>>>>>>>>> jour en parralèle de ces modifs. - -# Sous réseaux alloués à chaque type de machine ou bâtiment -# Pour la zone wifi, il faut penser à modifier le /etc/network/interfaces -# de sable, zamok et komaz pour ajouter les zones en plus (et de -# faire en sorte qu'ils prennent effet immédiatement ; c'est important pour -# komaz car c'est la route par défaut mais aussi pour zamok et sable -# à cause de leur firewall et de leur patte wifi. -_filaire_adh = [ '138.231.137.0/24', '138.231.138.0/24', '138.231.139.0/24','138.231.140.0/22' ] - -NETs = { 'serveurs' : [ '138.231.136.0/24' ], - 'adherents' : _filaire_adh, - 'bornes' : [ '138.231.148.0/24' ], - 'adm' : [ '10.231.136.0/24' ], - 'wifi-adh' : [ '138.231.144.0/24', '138.231.145.0/24', '138.231.146.0/24', - '138.231.147.0/24', '138.231.149.0/24', '138.231.150.0/24', '138.231.151.0/24' ], - 'fil' : [ '138.231.136.0/21' ], - 'gratuit': [ '10.42.0.0/16' ], - 'wifi': [ '138.231.144.0/21' ], - 'accueil': ['10.51.0.0/16' ], - 'isolement': ['10.52.0.0/16' ], - 'personnel-ens': ['10.2.9.0/24' ], - 'ens' : ['138.231.135.0/24'], - 'all' : [ '138.231.136.0/21', '138.231.144.0/21' ], - 'multicast' : ['239.0.0.0/8'], - } - -NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' } - -# Classes de rid -# Merci d'essayer de les faire correspondre avec les réseaux -# ci-dessus... -rid = { - # Rid recouvrant - 'fil' : (0, 2047), - # Rid pour les machines fixes - 'adherents' : (256, 2047), - # Rid pour les machines wifi - 'wifi' : (2048, 4095), - # Rid pour les machines du vlan adm - 'adm' : (51200, 53247), - # Rid pour les machines des personnels ens - 'personnel-ens' : (55296, 55551), - # Mid pour les machines du vlan gratuit - 'gratuit' : (53248, 55295), - # Rid pour machines spéciales - 'special' : (4096, 6143), - # Rid pour les filaires v6-only - 'fil-v6' : (16384, 24575), - # Rid pour les wifi v6-only - 'wifi-v6' : (24576, 32767), - # Rid pour les serveurs - 'serveurs' : (0, 255), - } - -# rid pour les machines spéciales (classe 'special' ci-dessus) -rid_machines_speciales = { - # freebox.crans.org - 4096: '82.225.39.54', - # ovh.crans.org - 4097: '91.121.84.138', -} - -ipv6_machines_speciales = { - # freebox - 4096: 'fe80::210:5aff:feaf:a979', - # ovh - 4097: 'fe80::219:d1ff:fea2:b611', -} - -# Les préfixes ipv6 -prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ], - 'serveurs' : [ '2a01:240:fe3d:4::/64'], - 'serveurs-v6': [ '2a01:240:fe3d:4::/64' ], - 'fil' : [ '2a01:240:fe3d:4::/64' ], - 'adherents' : [ '2a01:240:fe3d:4::/64' ], - 'adm' : [ '2a01:240:fe3d:c804::/64' ], - 'adm-v6' : [ '2a01:240:fe3d:c804::/64' ], - 'wifi' : [ '2a01:240:fe3d:c04::/64' ], - 'fil-v6' : [ '2a01:240:fe3d:4::/64' ], - 'wifi-v6' : [ '2a01:240:fe3d:c04::/64' ], - 'personnel-ens' : [ '2a01:240:fe3d:4::/64' ], - 'sixxs2' : [ '2a01:240:fe00:68::/64' ], - 'evenementiel' : [ '2a01:240:fe3d:d2::/64' ], - } - -# Domaines dans lesquels les machines sont placées suivant leur type -domains = { 'machineFixe': 'crans.org', - 'machineCrans': 'crans.org', - 'machineWifi': 'wifi.crans.org', - 'borneWifi': 'wifi.crans.org' } - -# VLans -vlans = { - # VLan d'administration - 'adm' : 2, - # VLan pour le wifi - 'wifi' : 3, - # VLan pour le wifi de l'ens - 'hotspot' : 4, - # VLan des gens qui paient - 'adherent' : 1, - # VLan des inconnus - 'accueil' : 7, - # VLan de la connexion gratuite - 'gratuit' : 6, - 'radin' : 6, - # Vlan isolement - 'isolement' : 9, - # Vlan de tests de chiffrement DSI - 'chiffrement': 11, - # VLan des appartements de l'ENS - 'appts': 21, - # Vlan evenementiel (install-party, etc) - 'event': 10, - # Vlan zone routeur ens (zrt) - 'zrt': 1132 - } - -filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT', - 'policy_forward' : 'ACCEPT', - 'policy_output' : 'ACCEPT' - }, - 'zamok' : { 'policy_input' : 'ACCEPT', - 'policy_forward' : 'DROP', - 'policy_output' : 'ACCEPT' - }, - 'default' : { 'policy_input' : 'ACCEPT', - 'policy_forward' : 'ACCEPT', - 'policy_output' : 'ACCEPT' - } - } - -# Cf RFC 4890 -authorized_icmpv6 = ['echo-request', 'echo-reply', 'destination-unreachable', - 'packet-too-big', 'ttl-zero-during-transit', 'parameter-problem'] - -output_file = { 4 : '/tmp/ipt_rules', - 6 : '/tmp/ip6t_rules' - } - -file_pickle = { 4 : '/tmp/ipt_pickle', - 6 : '/tmp/ip6t_pickle' - } - -blacklist_sanctions = ['upload', 'warez', 'p2p', 'autodisc_p2p','autodisc_virus','virus','autodisc_upload', 'bloq'] -blacklist_sanctions_soft = ['autodisc_virus','ipv6_ra','mail_invalide','virus', - 'upload', 'warez', 'p2p', 'autodisc_p2p', 'autodisc_upload', 'bloq','carte_etudiant','chambre_invalide'] - -adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis', - 'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ] - -open_ports = { 'tcp' : '22' } - -# Debit max sur le vlan de la connexion gratuite -debit_max_radin = 1000000 -debit_max_gratuit = 1000000 - -############################### -## Vlan accueil et isolement ## -############################### -accueil_route = { - '138.231.136.1':{'tcp':['80','443'],'hosts':['intranet.crans.org']}, - '138.231.136.67':{'tcp':['80','443'],'hosts':['www.crans.org', 'wiki.crans.org', 'wifi.crans.org']}, - '138.231.136.98':{'tcp':['20','21','80','111','1024:65535'],'udp':['69','1024:65535'], 'hosts':['ftp.crans.org']}, - '138.231.136.130':{'tcp':['80','443'],'hosts':['intranet2.crans.org']}, - '138.231.136.18':{'tcp':['80','443'],'hosts':['cas.crans.org', 'login.crans.org', 'auth.crans.org']}, -} - - - - -## gestion du dns -class dns: - parents=[ # ariane et ariane2 pour la zone parente - '138.231.176.4', - '138.231.176.54', - ] - master='10.231.136.9' - slaves=[ - '10.231.136.8', # ovh - '10.231.136.14', # titanic aka freebox - ] - - master_tv=master - slaves_tv=slaves - - secours_relay='10.231.136.14'; - - # résolution directe - zones_direct = [ 'crans.org', 'crans.ens-cachan.fr', 'wifi.crans.org', 'ferme.crans.org' , 'clubs.ens-cachan.fr', 'adm.crans.org','crans.eu','wifi.crans.eu', 'tv.crans.org' ] - # Zones signée par opendnssec sur le serveur master - zones_dnssec = [ - 'crans.org', 'v6.crans.org', 'wifi.crans.org', 'wifi.v6.crans.org', 'adm.crans.org', 'adm.v6.crans.org', 'ferme.crans.org', 'ferme.v6.crans.org', - 'tv.crans.org', 'crans.eu','wifi.crans.eu','v6.crans.eu','wifi.v6.crans.eu' - ] - # Zones alias pour les enregistrements A AAAA CNAME TXT et SSHFP - zone_alias = { - 'crans.org' : ['crans.eu'], - 'wifi.crans.org' : ['wifi.crans.eu'], - } - - # Résolution inverse - zones_reverse = NETs["all"] + NETs["adm"] + NETs["personnel-ens"] + NETs['multicast'] - zones_reverse_v6 = prefix['fil'] + prefix['wifi'] + prefix ['adm'] + prefix['personnel-ens'] # à modifier aussi dans bind.py - - recursiv = ['138.231.136.98', '138.231.136.247'] # charybde et gordon - -####################### -## Mail de bienvenue ## -####################### -#From est respbats@crans.org -txt_mail_bienvenue = u"""From: Crans <%(From)s> -To: %(To)s -Subject: [CRANS] Bienvenue au Cr@ns ! -Content-Type: text/plain; charset="utf-8" - -Bienvenue ! - -Si tu lis ce mail, c'est que ton inscription à l'association -s'est déroulée correctement. - -Le CR@NS est une association gérée, autant d'un point de vue -administratif que technique, par des étudiants bénévoles pour les -étudiants résidant sur le campus. - -Ses membres actifs s'occupent de la maintenance du réseau, et des adhésions -(câblages), ainsi que de plusieurs services mis à la -disposition de tous ses adhérents : - * La connexion à Internet en filaire et en wifi - - * Un wiki, regroupant plein d'informations diverses concernant la vie ici. - - * Les news, fora de discussion abordant divers thèmes - - * Un canal IRC - * Un client de messagerie instantanée Jabber - - * Un service de messagerie : une adresse mail @crans.org disponible à - vie, fiable, et avec possibilité d'installer des filtres très précis** - * Un espace personnel *de 2Go sur le serveur des adhérents * - - * Un service d'impression, 24h/24 7j/7, A3 ou A4, couleur ou noir et - blanc, avec ou sans agrafe, à prix coûtant - - * La télévision par le réseau - -Afin *d'assurer le bon fonctionnement de ces services*, il est -nécessaire que chaque membre respecte la charte signée lors de son -inscription. - -La notice d'utilisation des services du CR@NS est disponible ici : -https://wiki.crans.org/CransPratique. Nous conseillons vivement de s'y reporter -aussi bien pour apprendre à utiliser les différents services que pour -résoudre les problèmes éventuellement rencontrés. - * Chaque membre intéressé par le fonctionnement de l'association peut par - exemple contacter l'équipe technique à nounous@crans.org ou l'équipe - administrative à ca@crans.org et/ou se rendre aux réunions publiques du - CR@NS. . Aucune - connaissance technique préalable n'est requise pour participer ! * - -*A noter* : l'accès aux news et au wiki est limité à un usage interne -au campus. -Pour accéder depuis l'extérieur - * au wiki, il faut se créer un compte - - * aux news, il faut s'identifier - (Utilisateur : Vivelapa / Mot de passe : ranoia!) - ---\u0020 -Les membres actifs. - -PS: Il t'est conseillé de conserver ce mail à toutes fins utiles -""" - - -txt_ajout_droits = u"""From: Crans <%(From)s> -To: %(To)s -Subject: [CRANS] Ajout des droits %(Droit)s -Content-Type: text/plain; charset="utf-8" - -Bonjour, - -Tu viens d'être doté des droits %(Droit)s au Cr@ns. -Une description de ces droits et de la manière -de les utiliser est disponible sur la page : - -%(Page)s - -Si tu as des questions, n'hésite pas à les poser -à d'autres câbleurs ou aux nounous. - ---\u0020 -Les nounous""" - -pages_infos_droits = { "Cableur" : "https://wiki.crans.org/%C3%8AtreC%C3%A2bleur", - "Imprimeur" : "https://wiki.crans.org/%C3%8AtreC%C3%A2bleur/%C3%8AtreImprimeur", - "Bureau" : "https://wiki.crans.org/%C3%8AtreC%C3%A2bleur/%C3%8AtreLeBureau", - "Moderateur" : "https://wiki.crans.org/CransTechnique/ModerationDesNews" - } - - -txt_charte_MA = u"""From: Crans <%(From)s> -To: %(To)s -Subject: [CRANS] Charte des membres actifs -Content-Type: text/plain; charset="utf-8" - -Bonjour, - -Il semble que tu es membre actif du CRANS et que tu n'as pas -signé la charte des membres actifs. Si tu n'es pas membre actif -ou si tu as signé la charte des membres actifs, merci de nous le -signaler. Sinon, il faudrait signer la charte et nous la rendre -rapidement. Tu peux l'imprimer à partir du fichier suivant : - -https://wiki.crans.org/CransAdministratif?action=AttachFile&do=get&target=charte_ma.pdf - -Merci par avance, - ---\u0020 -Le bureau du CRANS""" - -txt_menage_cableurs = u"""From: Crans <%(From)s> -To: %(To)s -Subject: [CRANS] Suppression de droits -Content-Type: text/plain; charset="utf-8" - -Bonjour, - -Les droits que tu avais sur ton compte CRANS ont été retirés -car tu ne cotises pas cette année et que tes droits ne semblent -pas être utiles pour une utilisation à distance. Si nous avons -commis une erreur, nous te prions de nous en excuser. Si tu -souhaites par la suite retrouver des droits, nous serons bien sûr -heureux de te les remettre. - -Cordialement, - ---\u0020 -Le bureau du CRANS""" diff --git a/gestion/config_srv.py b/gestion/config_srv.py deleted file mode 100644 index 3ae27ad1..00000000 --- a/gestion/config_srv.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- python -*- -# -*- coding: utf-8 -*- - -# Généré par gestion/extractionbcfg2.py sur bcfg2, à partir de Metadata/groups.xml -# Fichier obsolète (backward comp ftw) - -adm_only = [] - -role = {'zamok': ['adherents-server'], 'dyson': ['sniffer'], 'titanic': ['failover-proxy'], 'komaz': ['wifi-router', 'appt-proxy', 'main-router'], 'dhcp': ['appt-proxy'], 'ovh': ['externe'], 'routeur': ['appt-proxy']} diff --git a/gestion/extractionbcfg2.py b/gestion/extractionbcfg2.py deleted file mode 100755 index 98613d3e..00000000 --- a/gestion/extractionbcfg2.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# © Olivier Huber, 2010 -# Licence MIT -""" Ce script va chercher la correspondance entre des attributs et des serveurs""" - -from lxml import etree - -template = """# -*- python -*- -# -*- coding: utf-8 -*- - -# Généré par gestion/extractionbcfg2.py sur bcfg2, à partir de Metadata/groups.xml - -adm_only = %(adm_list)s - -role = %(role_dict)s -""" - -srvDict = { 'external' : [], - 'connection-main' : [], - 'failover-proxy-server' : [], - 'vlan-ens' : [], - 'users' : [], - 'sniffer' : [], - 'router-wifi' : [] -} - -tr = { 'external' : 'externe', - 'connection-main' : 'main-router', - 'vlan-ens' : 'appt-proxy', - 'failover-proxy-server' : 'failover-proxy', - 'router-wifi' : 'wifi-router', - 'users' : 'adherents-server', - 'sniffer' : 'sniffer' -} - -fin = open('/var/lib/bcfg2/Metadata/groups.xml') - -# La gestion des exceptions est laissée en exercice pour ceux qui vont -# casser Metadata/groups.xml -parsedGroups = etree.parse(fin) - -for key in srvDict.keys(): - srvDict[key] = parsedGroups.xpath('//Group[@name="%s"]/../@name' % key) - if srvDict[key] == []: - print "Erreur, il n'y a pas de serveur associé à l'attribut %s" % key - exit(1) - - -# On cherche les serveurs qui sont seulement sur le vlan adm -admOnly = parsedGroups.xpath('//Group[@name="adm-only"]/../@name') - -fin.close() - -out = {} -for key, values in srvDict.items(): - for value in values: - if value in out.keys(): - out[value].append(tr[key]) - else: - out[value] = [tr[key]] - -fout = open('/usr/scripts/gestion/config_srv.py', 'w') - -fout.write(template % {'adm_list': admOnly.__str__(), 'role_dict' : out.__str__()}) - -fout.close() diff --git a/gestion/gen_confs/adherents.py b/gestion/gen_confs/adherents.py index 0fa08c45..13d6a4d8 100644 --- a/gestion/gen_confs/adherents.py +++ b/gestion/gen_confs/adherents.py @@ -8,6 +8,7 @@ import smtplib, sys, commands, shutil, os, traceback sys.path.append('/usr/scripts/gestion') from affich_tools import cprint, anim, OK, WARNING, ERREUR import config +import config.mails from time import strftime from ldap_crans import hostname, crans_ldap @@ -172,7 +173,7 @@ class mail_bienvenue: else: To += '@crans.org' conn=smtplib.SMTP('localhost') - conn.sendmail(From, To, config.txt_mail_bienvenue.encode('utf-8') % { 'From': From, 'To': To }) + conn.sendmail(From, To, config.mails.txt_mail_bienvenue.encode('utf-8') % { 'From': From, 'To': To }) conn.quit() print OK except Exception, c: @@ -198,11 +199,11 @@ class mail_ajout_droits: To = login if To.find('@') == -1: To += '@crans.org' print Droit +"\n" - if Droit in config.pages_infos_droits: + if Droit in config.mails.pages_infos_droits: print "envoi du mail" - Page = config.pages_infos_droits[Droit.encode('utf-8')] + Page = config.mails.pages_infos_droits[Droit.encode('utf-8')] conn=smtplib.SMTP('localhost') - conn.sendmail(From, To, config.txt_ajout_droits.encode('utf-8') % { 'From': From, 'To': To , 'Droit': Droit, 'Page': Page}) + conn.sendmail(From, To, config.mails.txt_ajout_droits.encode('utf-8') % { 'From': From, 'To': To , 'Droit': Droit, 'Page': Page}) conn.quit() print OK else: diff --git a/gestion/gen_confs/bind.py b/gestion/gen_confs/bind.py index 0a1e0d31..e32a5353 100755 --- a/gestion/gen_confs/bind.py +++ b/gestion/gen_confs/bind.py @@ -12,6 +12,7 @@ from socket import gethostname from gen_confs import gen_config import config +import config.dns from iptools import AddrInNet, AddrInNets import ip6tools diff --git a/gestion/gen_confs/firewall.py b/gestion/gen_confs/firewall.py index cd030fb0..2cfabf5b 100755 --- a/gestion/gen_confs/firewall.py +++ b/gestion/gen_confs/firewall.py @@ -35,7 +35,7 @@ from ldap_crans import AssociationCrans, Machine, MachineWifi, BorneWifi from affich_tools import * from commands import getstatusoutput from iptools import AddrInNet, NetSubnets, IpSubnet -from config import NETs, mac_komaz, mac_wifi, mac_titanic, mac_g, conf_fw, p2p, vlans, debit_max_radin, adm_users +from config import NETs, mac_komaz, mac_wifi, mac_titanic, conf_fw, p2p, vlans, debit_max_radin, adm_users syslog.openlog('firewall') debug = 1 diff --git a/gestion/gen_confs/firewall6.py b/gestion/gen_confs/firewall6.py index cadf9a51..71bcc9e3 100755 --- a/gestion/gen_confs/firewall6.py +++ b/gestion/gen_confs/firewall6.py @@ -25,9 +25,8 @@ import sys, re, os, pwd sys.path.append('/usr/scripts/gestion') from ldap_crans import hostname -from config import conf_fw, rid, prefix, role, file_pickle, open_ports +from config import conf_fw, rid, prefix, role, file_pickle, open_ports, p2p from config import authorized_icmpv6, mac_wifi, adm_only, adm_users -from config import udp_torrent_tracker from ipt import * # On invoque Ip6tables @@ -43,7 +42,7 @@ Usage: """ % { 'script' : sys.argv[0].split('/')[-1] } def tracker_torrent(ip6tables): - for tracker in udp_torrent_tracker: + for tracker in p2p.udp_torrent_tracker: for dest in gethostbyname(tracker)[1]: ip6tables.filter.tracker_torrent('-p udp -d %s -j LOG --log-level notice --log-prefix "TRACKER:%s "' % (dest,(tracker[:20]) if len(tracker) > 20 else tracker)) ip6tables.filter.tracker_torrent('-p udp -d %s -j REJECT --reject-with icmp6-adm-prohibited' % dest) diff --git a/gestion/gen_confs/firewall_new.py b/gestion/gen_confs/firewall_new.py index 52e68d4c..0d0ee6cb 100755 --- a/gestion/gen_confs/firewall_new.py +++ b/gestion/gen_confs/firewall_new.py @@ -37,7 +37,7 @@ from ldap_crans import AssociationCrans, Machine, MachineWifi, BorneWifi from affich_tools import * from commands import getstatusoutput from iptools import AddrInNet, NetSubnets, IpSubnet -from config import NETs, mac_komaz, mac_wifi, mac_titanic, mac_g, conf_fw, p2p, vlans, debit_max_radin, adm_users, accueil_route, blacklist_sanctions, blacklist_sanctions_soft, periode_transitoire, udp_torrent_tracker +from config import NETs, mac_komaz, mac_wifi, mac_titanic, conf_fw, p2p, vlans, debit_max_radin, adm_users, accueil_route, blacklist_sanctions, blacklist_sanctions_soft, periode_transitoire from ipset import IpsetError, Ipset from lc_ldap import lc_ldap from ipt import gethostbyname @@ -1240,7 +1240,7 @@ class firewall_komaz(firewall_crans) : iptables('-A FILTRE_P2P -m ipp2p --%s -j REJECT --reject-with icmp-admin-prohibited' % filtre[0]) self.anim.cycle() #on rejetes les trackeur udp les plus connus - for tracker in udp_torrent_tracker: + for tracker in p2p.udp_torrent_tracker: for dest in gethostbyname(tracker)[0]: iptables('-A FILTRE_P2P -p udp -d %s -j LOG --log-level notice --log-prefix "TRACKER:%s "' % (dest,(tracker[:20]) if len(tracker) > 20 else tracker)) iptables('-A FILTRE_P2P -p udp -d %s -j REJECT --reject-with icmp-admin-prohibited' % dest) diff --git a/gestion/gen_confs/generate.py b/gestion/gen_confs/generate.py index 6dc7f46a..3a35c040 100755 --- a/gestion/gen_confs/generate.py +++ b/gestion/gen_confs/generate.py @@ -21,7 +21,6 @@ from ldap_crans import crans_ldap, hostname from lock import * from affich_tools import anim, cprint, OK from time import localtime, strftime, time, sleep -import config import ridtools from inspect import getargspec from syslog import * diff --git a/gestion/gen_confs/ipset.py b/gestion/gen_confs/ipset.py index 7cc0862e..64712990 100644 --- a/gestion/gen_confs/ipset.py +++ b/gestion/gen_confs/ipset.py @@ -23,7 +23,6 @@ import commands import lock import lc_ldap -import config import secrets class IpsetError(Exception): diff --git a/gestion/ip6tools.py b/gestion/ip6tools.py index 714ebd59..58575b9d 100644 --- a/gestion/ip6tools.py +++ b/gestion/ip6tools.py @@ -22,8 +22,6 @@ import netaddr -import config - def mac_to_ipv6(ipv6_prefix, mac_address): """Convert a MAC address (EUI48) to an IPv6 (prefix::EUI64).""" diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 99949b2d..d005fe86 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -15,7 +15,7 @@ import ldap, ldap.modlist, ldap_passwd import netaddr import annuaires_pg as annuaires -import config, iptools, ip6tools, cPickle, config_mail +import config, config.impression, iptools, ip6tools, cPickle, config_mail from chgpass import chgpass from affich_tools import coul, prompt, cprint from email_tools import send_email diff --git a/impression/cout.py b/impression/cout.py index a9225c86..e74f8394 100644 --- a/impression/cout.py +++ b/impression/cout.py @@ -33,7 +33,6 @@ import time # Fin import sys, tempfile, os, commands, shutil, syslog, stat sys.path.append('/usr/scripts/gestion') -import config from crans.utils import QuoteForPOSIX as escapeForShell def __init__(): pass @@ -43,7 +42,7 @@ def __init__(): # ########################################################### # # # -import config +import config.impression COUT_UNITE_COULEUR = config.impression.c_coul COUT_UNITE_NOIRE = config.impression.c_noir COUT_PASSAGE_TAMBOUR_NOIR = config.impression.c_tambour_noir diff --git a/surveillance/deconnexion.py b/surveillance/deconnexion.py index df8e797b..c3b643ee 100755 --- a/surveillance/deconnexion.py +++ b/surveillance/deconnexion.py @@ -4,7 +4,7 @@ """ Script de déconnection automatique des machines du crans pour les raisons : - upload - - p2p + - p2p (plus maintenant) - flood - virus @@ -20,7 +20,8 @@ import commands import sys import psycopg2 sys.path.append('/usr/scripts/gestion') -from config import upload, virus, p2p, NETs +from config import upload, virus, NETs +import config.mails.upload import ipt import smtplib from ldap_crans import crans_ldap @@ -242,14 +243,14 @@ for elupload, eltype, elid in uploadeurs: ################################ mail = connectsmtp() - corps = upload.message_hard % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} + corps = config.mails.upload.message_hard % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, proprio.email(), corps) # On envoie un mail à disconnect ################################ if upload.disconnect_mail_hard: - corps = upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom(), 'mdc': mdcf, 'chambre': proprio.chbre()} + corps = config.mails.upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom(), 'mdc': mdcf, 'chambre': proprio.chbre()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, upload.expediteur, corps) @@ -266,7 +267,7 @@ for elupload, eltype, elid in uploadeurs: + "/usr/scripts/surveillance/fiche_deconnexion/generate.py --upload aid=%d" % int(proprio.id())) # Envoi du mail à disconnect - corps = upload.message_disconnect_multi % {'from': upload.expediteur, 'to': upload.expediteur, 'nbdeco': nb_decos, 'proprio': proprio.Nom(), 'ps': fichier_ps} + corps = config.mails.upload.message_disconnect_multi % {'from': upload.expediteur, 'to': upload.expediteur, 'nbdeco': nb_decos, 'proprio': proprio.Nom(), 'ps': fichier_ps} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, upload.expediteur, corps) @@ -298,14 +299,14 @@ for elupload, eltype, elid in uploadeurs: ################################ mail = connectsmtp() - corps = upload.message_soft % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} + corps = config.mails.upload.message_soft % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, proprio.email(), corps) # On envoie un mail à disconnect ################################ if upload.disconnect_mail_soft: - corps = upload.message_disconnect_soft % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()} + corps = config.mails.upload.message_disconnect_soft % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, upload.expediteur, corps) @@ -458,148 +459,3 @@ for IP in infectes: print "Suppression de %s des machines infectees, mais aucune blackliste"%hostname requete = "DELETE FROM avertis_virus where ip_crans='%s'"%IP curseur.execute(requete) - -################################################################################ -# Gestion du peer to peer # -################################################################################ - -# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau -requete = "SELECT ip_src,id_p2p,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '2 hours' AND id_p2p != 1 GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans -curseur.execute(requete) -fraudeurs = curseur.fetchall() - -# Récupération des fraudeurs pour ne pas les resanctionner -requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '3 hours'" -curseur.execute(requete) -avertisp2p = curseur.fetchall() - -for ip, id_p2p, nombre in fraudeurs: - - # On récupére le protocole de p2p : - requete = "SELECT nom FROM protocole_p2p WHERE id_p2p=%d" % id_p2p - curseur.execute(requete) - protocole = curseur.fetchall()[0][0] - - # On ne prend pas en compte s'il est sous le seuil admis, ou - #s'il est averti - if nombre <= p2p.limite[protocole] or (ip, protocole) in avertisp2p: - continue - - # Récupération des ref de la machine - machines = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine'] - if len(machines) == 0: - # La machine a ete supprimee entre temps - continue - machine = machines[0] - hostname = machine.nom() - proprio = machine.proprietaire() - blacklist = proprio.blacklist() - - if isinstance(machine, MachineFixe): - _, chambre = reperage_chambre(machine.mac()) - else: - chambre = 'machine wifi' - - - # Envoi du mail à disconnect - mail = connectsmtp() - - if p2p.disconnect_mail: - requete = "select date from p2p where date > timestamp 'now' - interval '2 hours' and ip_src='%s' order by date limit 1"%ip - curseur.execute(requete) - date = curseur.fetchall()[0][0] - corps = p2p.avertissement % { 'From': upload.expediteur, - 'To': upload.expediteur, - 'protocole': protocole, - 'hostname': hostname, - 'nb_paquets': nombre, - 'datedebut': date, - 'chambre': chambre, - } - corps = corps.encode('utf-8') - mail.sendmail(upload.expediteur, upload.expediteur, corps) - - # Inscription dans la base des avertis - requete = "INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole) - curseur.execute(requete) - - # On envoie un mail a l'adhérent - ################################ - corps = p2p.deconnexion % { 'From': p2p.expediteur, - 'To': proprio.email(), - 'protocole': protocole, - 'hostname': hostname } - corps = corps.encode('utf-8') - mail.sendmail(p2p.expediteur, proprio.email(), corps) - - # L'adhérent n'est pas encore blacklisté - fin = int(time()) + 24*3600 - proprio.blacklist(['now', fin, 'autodisc_p2p', hostname]) - proprio.save() - - # Vérification du nombre de déconnexions - ######################################### - nb_decos = len([ x for x in proprio.blacklist() if int(x.split('$')[0]) > time()-365*24*3600 and x.split('$')[2] == 'autodisc_p2p' ]) - if nb_decos >= 3: - # Génération du fichier postscript - try: - fichier_ps = generate_ps('p2p', proprio, ldap) - except: - fichier_ps = ("ERREUR lors de la génération. Merci de regénérer manuellement la fiche avec la commande :\n" - + "/usr/scripts/surveillance/fiche_deconnexion/generate.py --p2p aid=%d" % int(proprio.id())) - - # Envoi du mail à disconnect - corps = p2p.message_disconnect_multi % { 'from': p2p.expediteur, - 'to': p2p.expediteur, - 'nbdeco': nb_decos, - 'proprio':proprio.Nom(), - 'ps': fichier_ps } - corps = corps.encode('utf-8') - mail.sendmail(p2p.expediteur, p2p.expediteur, corps) - -################################################################################ -# Gestion du bittorrent # -################################################################################ - -# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau -requete = "SELECT ip_src,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '2 hours' AND id_p2p = 1 GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans -curseur.execute(requete) -fraudeurs = curseur.fetchall() - -# Récupération des fraudeurs pour ne pas les avertir de nouveau -requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '14 days'" -curseur.execute(requete) -avertisp2p = curseur.fetchall() - -for ip, nombre in fraudeurs: - # On récupére le protocole de p2p : - protocole = 'Bittorrent' - - # On ne prend pas en compte s'il est sous le seuil admis, ou - #s'il est averti - if nombre <= p2p.limite[protocole] or (ip, protocole) in avertisp2p: - continue - - # Récupération des ref de la machine - machines = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine'] - if len(machines) == 0: - # La machine a ete supprimee entre temps - continue - machine = machines[0] - hostname = machine.nom() - proprio = machine.proprietaire() - - # On envoie un mail a l'adhérent - ################################ - mail = connectsmtp() - - corps = p2p.avertissement_bt % { 'From': p2p.expediteur, - 'To': proprio.email(), - 'protocole': protocole, - 'hostname': hostname } - corps = corps.encode('utf-8') - mail.sendmail(p2p.expediteur, proprio.email(), corps) - - # Inscription dans la base des avertis - requete = "INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole) - curseur.execute(requete) diff --git a/surveillance/statistiques.py b/surveillance/statistiques.py index 9ba1700c..d6a0e95a 100755 --- a/surveillance/statistiques.py +++ b/surveillance/statistiques.py @@ -18,7 +18,7 @@ import sys, os import psycopg2 sys.path.append('/usr/scripts/gestion') sys.path.append('/usr/scripts/surveillance') -import config +import config.virus import smtplib import socket import time, random, hashlib