diff --git a/gestion/__init__.py b/gestion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gestion/config/__init__.py b/gestion/config/__init__.py new file mode 100644 index 00000000..09ee0fad --- /dev/null +++ b/gestion/config/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from config import * + diff --git a/gestion/config/config.py b/gestion/config/config.py new file mode 100644 index 00000000..d8fff273 --- /dev/null +++ b/gestion/config/config.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Définition de variables de configuration et de comportement des scripts Cr@ns """ + +import time +import datetime + +# Fichier généré à partir de bcfg2 +from config_srv import adm_only, role + +##### 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 = time.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' + +#: Serveur principal de bcfg2 +bcfg2_main = "bcfg2.adm.crans.org" + +#: 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" + +#: Algorithmes de hashage pour le champ SSHFP +# 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 caractères 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, +} + +#: Nombre de jours après le passage en chambre ???? où on supprime les machines +demenagement_delai = 8 + + + +############################# +## 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 pour les machines fixes + 'fil' : (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'], + 'fil' : [ '2a01:240:fe3d:4::/64' ], + 'adm' : [ '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']}, +} diff --git a/gestion/config/config_srv.py b/gestion/config/config_srv.py new file mode 100644 index 00000000..3ae27ad1 --- /dev/null +++ b/gestion/config/config_srv.py @@ -0,0 +1,9 @@ +# -*- 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/config/dns.py b/gestion/config/dns.py new file mode 100644 index 00000000..e3ee326d --- /dev/null +++ b/gestion/config/dns.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Variables de configuration pour la gestion du DNS """ + +#: ariane et ariane2 pour la zone parente +parents = [ + '138.231.176.4', + '138.231.176.54', +] +#: DNS master +master = '10.231.136.9' +#: DNS slaves (ovh et titanic /aka/ freebox) +slaves = [ + '10.231.136.8', # ovh + '10.231.136.14', # titanic aka freebox +] +#: DNS master de la zone tv +master_tv = master +#: DNS slaves de la zone tv +slaves_tv = slaves + +#: DNS en connexion de secours +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 \ No newline at end of file diff --git a/gestion/config/extractionbcfg2.py b/gestion/config/extractionbcfg2.py new file mode 100755 index 00000000..98613d3e --- /dev/null +++ b/gestion/config/extractionbcfg2.py @@ -0,0 +1,67 @@ +#!/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/config/firewall.py b/gestion/config/firewall.py new file mode 100644 index 00000000..9d4abeac --- /dev/null +++ b/gestion/config/firewall.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Variables de configuration pour le firewall """ + +import datetime + +#: Pour marquer les paquets +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.datetime.now() +if now.hour >= 6 and now.hour < 19 and now.weekday() < 5: + #: Débit maximal autorisé + debit_max = 95 * 1024 / 8 # kbytes per second en connexion de jour + #: Est-ce qu'on est en connexion de jour ou de nuit/week-end ? + debit_jour = True +else: + #: Débit maximal autorisé + debit_max = 500 * 1024 / 8 # connexion de nuit et du week-end + #: Est-ce qu'on est en connexion de jour ou de nuit/week-end ? + debit_jour = False \ No newline at end of file diff --git a/gestion/config/impression.py b/gestion/config/impression.py new file mode 100644 index 00000000..3f066c05 --- /dev/null +++ b/gestion/config/impression.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +""" Définition des variables d'impression utilisées par les scripts, l'intranet… """ + +#: L'imprimante utilisée +imprimante = "canon" + +#: Découvert autorisé (en euro) +decouvert = 0. + +## Variables de prix (tout est exprimé en centimes) + +#: Coût de l'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 + +#: Coût d'une feuille A4 : 25.06 euros les 2500 feuilles +c_a4 = 1.0024 + amm + +#: Coût d'une feuille A3 : 53.76 euros les 2500 feuilles +c_a3 = 2.1504 + amm + +#: Coût d'un transparent : 15.85 euros les 100 transparents +c_trans = 15.85 + amm + +#: Coût d'impression d'une face en couleur +c_face_couleur = 9.4484 +#: Coût d'impression d'une face en noir & blanc +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, affichée sur l'intranet +state_msg = [u"L'impression recto/verso (ou livret) A3 est déconseillée"] diff --git a/gestion/config/mac_prise.py b/gestion/config/mac_prise.py new file mode 100644 index 00000000..8bdcf477 --- /dev/null +++ b/gestion/config/mac_prise.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Variables de configuration pour mac_prises. """ + +#: 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 utilisé dans le corps du message +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 très suspect" +#: Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit très 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 des paragraphes suspects +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 des paragraphes très suspects +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)"}, + } diff --git a/gestion/config/mails/__init__.py b/gestion/config/mails/__init__.py new file mode 100644 index 00000000..d5fc1f64 --- /dev/null +++ b/gestion/config/mails/__init__.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mails import * diff --git a/gestion/config/mails/demenagement.py b/gestion/config/mails/demenagement.py new file mode 100644 index 00000000..58eb7cfc --- /dev/null +++ b/gestion/config/mails/demenagement.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Template de mail envoyé en cas de déménagement mais présence de machines. """ + +import email.Header + +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")]) \ No newline at end of file diff --git a/gestion/config/mails/mails.py b/gestion/config/mails/mails.py new file mode 100644 index 00000000..74a7b789 --- /dev/null +++ b/gestion/config/mails/mails.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Templates de mails. """ + + +#: 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 +""" + +#: Mail envoyé à un adhérent qui obtient de nouveaux droits. +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 wiki explicatives sur les droits +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" + } + +#: Mail de rappel envoyé à un adhérent ayant des droits mais n'ayant pas encore signé sa charte membre actifs +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""" + +#: Mail envoyé à un adhérent à qui on a retiré ses droits. +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/mails/p2p.py b/gestion/config/mails/p2p.py new file mode 100644 index 00000000..9053821f --- /dev/null +++ b/gestion/config/mails/p2p.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Templates des mails envoyés en cas de p2p. """ + +#: Envoyé à la ML disconnect@ en cas de déconnexion pour p2p +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""" + +#: Envoyé à l'adhérent en cas de déconnexion pour p2p +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""" + +#: Envoyé à l'adhérent en cas de détection de p2p +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""" + +#: Envoyé à la ML disconnect@ en cas de déconnexion pour p2p plusieurs fois +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""" \ No newline at end of file diff --git a/gestion/config/mails/upload.py b/gestion/config/mails/upload.py new file mode 100644 index 00000000..3fa25f9b --- /dev/null +++ b/gestion/config/mails/upload.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Templates des mails envoyés en cas d'upload. """ + +#: Envoyé à l'adhérent en cas de dépassement de la limite soft +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""" + +#: Envoyé à l'adhérent en cas de dépassement de la limite hard +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""" + +#: Envoyé à la ML disconnect@ en cas de dépassement de la limite soft (désactivé) +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""" + +#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard +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""" + +#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard plusieurs fois +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""" \ No newline at end of file diff --git a/gestion/config/p2p.py b/gestion/config/p2p.py new file mode 100644 index 00000000..bdbc99d0 --- /dev/null +++ b/gestion/config/p2p.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + + +""" Variables de configuration pour la détection du peer-to-peer """ + +#: Le traffic udp vers les ip (v4 et v6) des hotes dans cette liste 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', + ] + +#: 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" + diff --git a/gestion/config/upload.py b/gestion/config/upload.py new file mode 100644 index 00000000..c74a03a1 --- /dev/null +++ b/gestion/config/upload.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Définitions des variables pour le contrôle d'upload. """ + +#: liste des exemptions 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 + +#: envoyer des mails à disconnect@ en cas de dépassement soft ? +disconnect_mail_soft = False +#: envoyer des mails à disconnect@ en cas de dépassement hard ? +disconnect_mail_hard = True + +#: expéditeur des mails de déconnexion +expediteur = "disconnect@crans.org" \ No newline at end of file diff --git a/gestion/config/virus.py b/gestion/config/virus.py new file mode 100644 index 00000000..f1aafbe5 --- /dev/null +++ b/gestion/config/virus.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" Définitions des variables pour la détection des virus. """ + +#: Nombre de flood par heure pour déclencher une entrée dans la base +flood = 100 +#: Nombre d'entrées dans la base pour détecter un virus +virus = 10