Nettoyage des restes de paiement par année scolaire
Ça fait plus d'un an qu'on est passés aux factures avec generalizedTimeFormat
This commit is contained in:
parent
af0e971764
commit
baf79bdda7
13 changed files with 498 additions and 220 deletions
|
@ -10,39 +10,34 @@ import datetime
|
|||
from config_srv import adm_only, role
|
||||
|
||||
# Valeur par défaut pour les champs d'études
|
||||
etudes_defaults = [u"Établissement inconnu", u"Année inconnue", u"Domaine d'études inconnu"]
|
||||
etudes_defaults = [
|
||||
u"Établissement inconnu",
|
||||
u"Année inconnue",
|
||||
u"Domaine d'études inconnu"
|
||||
]
|
||||
|
||||
gtfepoch = "19700101000000Z"
|
||||
##### 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:
|
||||
# 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
|
||||
# On récupère l'année scolaire à tout besoin
|
||||
__annee = time.localtime()[0]
|
||||
|
||||
# Prochaine période transitoire de l'année
|
||||
gtf_debut_periode_transitoire = "%s0816000000+0200" % (dat[0],)
|
||||
gtf_fin_periode_transitoire = "%s0930235959+0200" % (dat[0],)
|
||||
debut_periode_transitoire = time.mktime(time.strptime("%s/08/16 00:00:00" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
|
||||
fin_periode_transitoire = time.mktime(time.strptime("%s/09/30 23:59:59" % (dat[0],), "%Y/%m/%d %H:%M:%S"))
|
||||
# Prochaine période transitoire de l'année version generalizedTimeFormat
|
||||
gtf_debut_periode_transitoire = "%s0816000000+0200" % (__annee,)
|
||||
gtf_fin_periode_transitoire = "%s0930235959+0200" % (__annee,)
|
||||
|
||||
#Sursis pour les inscription après le 1/11 pour fournir la carte étudiant
|
||||
sursis_carte=8*24*3600
|
||||
# Version timestampées timezone-naïves
|
||||
debut_periode_transitoire = time.mktime(time.strptime("%s/08/16 00:00:00" % (__annee,), "%Y/%m/%d %H:%M:%S"))
|
||||
fin_periode_transitoire = time.mktime(time.strptime("%s/09/30 23:59:59" % (__annee,), "%Y/%m/%d %H:%M:%S"))
|
||||
|
||||
# On est en période transitoire si on est dans le bon intervale
|
||||
periode_transitoire = (debut_periode_transitoire <= time.time() <= fin_periode_transitoire)
|
||||
|
||||
ann_scol = __annee
|
||||
if time.time() <= debut_periode_transitoire:
|
||||
ann_scol -= 1
|
||||
|
||||
# Gel des cableurs pas a jour de cotisation
|
||||
# Les droits ne sont pas retires mais il n'y a plus de sudo
|
||||
|
@ -60,89 +55,201 @@ quota_hard = 10000000
|
|||
fquota_soft = 0
|
||||
fquota_hard = 0
|
||||
# Shell
|
||||
login_shell='/bin/zsh'
|
||||
club_login_shell='/usr/bin/rssh'
|
||||
login_shell = '/bin/zsh'
|
||||
club_login_shell = '/usr/bin/rssh'
|
||||
# Longueur maximale d'un login
|
||||
maxlen_login=25
|
||||
maxlen_login = 25
|
||||
|
||||
shells_possibles = [u'/bin/csh',
|
||||
u'/bin/sh', # tout caca
|
||||
u'/bin/dash', # un bash light
|
||||
u'/usr/bin/rc',
|
||||
u'/usr/bin/ksh', # symlink vers zsh
|
||||
u'/bin/ksh', # symlink vers zsh
|
||||
u'/usr/bin/tcsh', # TENEX C Shell (csh++)
|
||||
u'/bin/tcsh', # TENEX C Shell (csh++)
|
||||
u'/bin/bash', # the Bourne-Again SHell
|
||||
u'/bin/zsh', # the Z shell
|
||||
u'/usr/bin/zsh', # the Z shell
|
||||
u'/usr/bin/screen',
|
||||
u'/bin/rbash', # Bash restreint
|
||||
u'/usr/bin/rssh', # restricted secure shell allowing only scp and/or sftp
|
||||
u'/usr/local/bin/badPassSh', # demande de changer de mot de passe
|
||||
u'/usr/bin/passwd', # idem
|
||||
u'/usr/local/bin/disconnect_shell', # déconnexion crans
|
||||
u'/usr/scripts/surveillance/disconnect_shell', # idem
|
||||
u'/usr/sbin/nologin', # This account is currently not available.
|
||||
u'/bin/false', # vraiement méchant
|
||||
u'/usr/bin/es', # n'exsite plus
|
||||
u'/usr/bin/esh', # n'existe plus
|
||||
u'', # le shell vide pour pouvoir les punis
|
||||
shells_possibles = [
|
||||
u'/bin/csh',
|
||||
u'/bin/sh', # tout caca
|
||||
u'/bin/dash', # un bash light
|
||||
u'/usr/bin/rc',
|
||||
u'/usr/bin/ksh', # symlink vers zsh
|
||||
u'/bin/ksh', # symlink vers zsh
|
||||
u'/usr/bin/tcsh', # TENEX C Shell (csh++)
|
||||
u'/bin/tcsh', # TENEX C Shell (csh++)
|
||||
u'/bin/bash', # the Bourne-Again SHell
|
||||
u'/bin/zsh', # the Z shell
|
||||
u'/usr/bin/zsh', # the Z shell
|
||||
u'/usr/bin/screen',
|
||||
u'/bin/rbash', # Bash restreint
|
||||
u'/usr/bin/rssh', # restricted secure shell allowing only scp and/or sftp
|
||||
u'/usr/local/bin/badPassSh', # demande de changer de mot de passe
|
||||
u'/usr/bin/passwd', # idem
|
||||
u'/usr/local/bin/disconnect_shell', # déconnexion crans
|
||||
u'/usr/scripts/surveillance/disconnect_shell', # idem
|
||||
u'/usr/sbin/nologin', # This account is currently not available.
|
||||
u'/bin/false', # vraiement méchant
|
||||
u'/usr/bin/es', # n'exsite plus
|
||||
u'/usr/bin/esh', # n'existe plus
|
||||
u'', # le shell vide pour pouvoir les punis
|
||||
]
|
||||
|
||||
shells_gest_crans_order = [
|
||||
"zsh",
|
||||
"bash",
|
||||
"tcsh",
|
||||
"screen",
|
||||
"rbash",
|
||||
"rssh",
|
||||
"badPassSh",
|
||||
"disconnect_shell"
|
||||
]
|
||||
|
||||
shells_gest_crans_order = ["zsh", "bash", "tcsh", "screen", "rbash", "rssh",
|
||||
"badPassSh", "disconnect_shell"]
|
||||
shells_gest_crans = {
|
||||
"zsh": {"path":"/bin/zsh", "desc":"Le Z SHell, shell par defaut sur zamok"},
|
||||
"bash": {"path":"/bin/bash", "desc":"Le Boune-Again SHell, shell par defaut de la plupart des linux"},
|
||||
"tcsh": {"path":"/bin/tcsh", "desc":"C SHell ++"},
|
||||
"screen":{"path":'/usr/bin/screen', "desc":"Un gestionnaire de fenêtre dans un terminal"},
|
||||
"rbash": {"path":"/bin/rbash", "desc":"Un bash très restreint, voir man rbash"},
|
||||
"rssh": {"path":"/usr/bin/rssh", "desc":"Shell ne permetant que les transferts de fichiers via scp ou sftp"},
|
||||
"badPassSh":{"path":"/usr/local/bin/badPassSh", "desc":"Demande de changer de mot de passe à la connexion"},
|
||||
"disconnect_shell":{"path":"/usr/local/bin/disconnect_shell", "desc":"Shell pour les suspensions de compte avec message explicatif"},
|
||||
"zsh" : {
|
||||
"path" : "/bin/zsh",
|
||||
"desc" : "Le Z SHell, shell par defaut sur zamok"
|
||||
},
|
||||
"bash" : {
|
||||
"path" : "/bin/bash",
|
||||
"desc" : "Le Boune-Again SHell, shell par defaut de la plupart des linux"
|
||||
},
|
||||
"tcsh" : {
|
||||
"path" : "/bin/tcsh",
|
||||
"desc" : "C SHell ++"
|
||||
},
|
||||
"screen" : {
|
||||
"path" : '/usr/bin/screen',
|
||||
"desc" : "Un gestionnaire de fenêtre dans un terminal"
|
||||
},
|
||||
"rbash" : {
|
||||
"path" : "/bin/rbash",
|
||||
"desc" : "Un bash très restreint, voir man rbash"
|
||||
},
|
||||
"rssh" : {
|
||||
"path" : "/usr/bin/rssh",
|
||||
"desc" : "Shell ne permetant que les transferts de fichiers via scp ou sftp"
|
||||
},
|
||||
"badPassSh" : {
|
||||
"path" : "/usr/local/bin/badPassSh",
|
||||
"desc" : "Demande de changer de mot de passe à la connexion"
|
||||
},
|
||||
"disconnect_shell" : {
|
||||
"path" : "/usr/local/bin/disconnect_shell",
|
||||
"desc" : "Shell pour les suspensions de compte avec message explicatif"
|
||||
},
|
||||
}
|
||||
# Quels droits donnent l'appartenance à quel groupe Unix ?
|
||||
droits_groupes = {'adm' : [u'Nounou'],
|
||||
'respbats' : [u'Imprimeur', u'Cableur', u'Nounou'],
|
||||
'apprentis' : [u'Apprenti'],
|
||||
'moderateurs' : [u'Moderateur'],
|
||||
'disconnect' : [u'Bureau'],
|
||||
'imprimeurs' : [u'Imprimeur', u'Nounou', u'Tresorier'],
|
||||
'bureau' : [u'Bureau'],
|
||||
'webadm' : [u'Webmaster'],
|
||||
'webradio' : [u'Webradio'],
|
||||
}
|
||||
droits_groupes = {
|
||||
'adm' : [
|
||||
u'Nounou',
|
||||
],
|
||||
'respbats' : [
|
||||
u'Imprimeur',
|
||||
u'Cableur',
|
||||
u'Nounou',
|
||||
],
|
||||
'apprentis' : [
|
||||
u'Apprenti',
|
||||
],
|
||||
'moderateurs' : [
|
||||
u'Moderateur',
|
||||
],
|
||||
'disconnect' : [
|
||||
u'Bureau',
|
||||
],
|
||||
'imprimeurs' : [
|
||||
u'Imprimeur',
|
||||
u'Nounou',
|
||||
u'Tresorier',
|
||||
],
|
||||
'bureau' : [
|
||||
u'Bureau',
|
||||
],
|
||||
'webadm' : [
|
||||
u'Webmaster',
|
||||
],
|
||||
'webradio' : [
|
||||
u'Webradio',
|
||||
],
|
||||
}
|
||||
|
||||
####### Les modes de paiement accepté par le crans
|
||||
|
||||
modePaiement = ['liquide', 'paypal', 'solde', 'cheque', 'carte', 'comnpay', 'arbitraire', 'note']
|
||||
modePaiement = [
|
||||
'liquide',
|
||||
'paypal',
|
||||
'solde',
|
||||
'cheque',
|
||||
'carte',
|
||||
'comnpay',
|
||||
'arbitraire',
|
||||
'note',
|
||||
]
|
||||
|
||||
####### 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'],
|
||||
'apprentis' : [u'Apprenti'],
|
||||
'+ca' : [u'Bureau', u'Apprenti', u'Nounou', u'Cableur'],
|
||||
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',
|
||||
],
|
||||
'apprentis' : [
|
||||
u'Apprenti',
|
||||
],
|
||||
'+ca' : [
|
||||
u'Bureau',
|
||||
u'Apprenti',
|
||||
u'Nounou',
|
||||
u'Cableur',
|
||||
],
|
||||
'+federez' : [
|
||||
u'Bureau',
|
||||
u'Apprenti',
|
||||
u'Nounou',
|
||||
],
|
||||
'+install-party' : [
|
||||
u'Bureau',
|
||||
u'Apprenti',
|
||||
u'Nounou',
|
||||
],
|
||||
|
||||
'+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'],
|
||||
}
|
||||
# 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'
|
||||
|
@ -166,21 +273,21 @@ ISCSI_MAP_FILE = "/usr/scripts/var/iscsi_names_%s.py"
|
|||
# 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"),
|
||||
"ecdsa-256" : (3, "ecdsa-sha2-nistp256"),
|
||||
"ecdsa-384" : (3, "ecdsa-sha2-nistp384"),
|
||||
"ecdsa-521" : (3, "ecdsa-sha2-nistp521"),
|
||||
"ecdsa" : (3, "ecdsa-sha2-nistp521"),
|
||||
}
|
||||
"rsa" : (1, "ssh-rsa"),
|
||||
"dsa" : (2, "ssh-dss"),
|
||||
"ecdsa-256" : (3, "ecdsa-sha2-nistp256"),
|
||||
"ecdsa-384" : (3, "ecdsa-sha2-nistp384"),
|
||||
"ecdsa-521" : (3, "ecdsa-sha2-nistp521"),
|
||||
"ecdsa" : (3, "ecdsa-sha2-nistp521"),
|
||||
}
|
||||
|
||||
sshfs_ralgo = {}
|
||||
for key, value in sshfp_algo.items():
|
||||
sshfs_ralgo[value[1]] = (value[0], key)
|
||||
|
||||
sshfp_hash = {
|
||||
"sha1" : 1,
|
||||
"sha256" : 2,
|
||||
"sha1" : 1,
|
||||
"sha256" : 2,
|
||||
}
|
||||
|
||||
sshkey_max_age = int(9.869604401089358 * (365.25 * 24 * 3600))
|
||||
|
@ -218,40 +325,74 @@ plage_ens = '138.231.0.0/16'
|
|||
# clefs qui cassent la bijectivité, mais qui peuvent servir.
|
||||
# NETs est l'union des deux
|
||||
NETs_primaires = {
|
||||
'serveurs' : ['138.231.136.0/24'],
|
||||
'adherents' : ['138.231.137.0/24', '138.231.138.0/23', '138.231.140.0/22'],
|
||||
'wifi-adh' : ['138.231.144.0/22',
|
||||
'138.231.148.32/27',
|
||||
'138.231.148.64/26',
|
||||
'138.231.148.128/25',
|
||||
'138.231.149.0/24',
|
||||
'138.231.150.0/23',
|
||||
],
|
||||
'bornes' : [
|
||||
'138.231.148.0/27',
|
||||
],
|
||||
'adm' : ['10.231.136.0/24'],
|
||||
'personnel-ens' : ['10.2.9.0/24'],
|
||||
'gratuit' : ['10.42.0.0/16'],
|
||||
'accueil' : ['10.51.0.0/16'],
|
||||
'federez' : ['10.53.0.0/16'],
|
||||
'isolement' : ['10.52.0.0/16'],
|
||||
'evenementiel' : ['10.231.137.0/24'],
|
||||
'multicast' : ['239.0.0.0/8'],
|
||||
'ens' : ['138.231.135.0/24'],
|
||||
}
|
||||
'serveurs' : [
|
||||
'138.231.136.0/24',
|
||||
],
|
||||
'adherents' : [
|
||||
'138.231.137.0/24',
|
||||
'138.231.138.0/23',
|
||||
'138.231.140.0/22',
|
||||
],
|
||||
'wifi-adh' : [
|
||||
'138.231.144.0/22',
|
||||
'138.231.148.32/27',
|
||||
'138.231.148.64/26',
|
||||
'138.231.148.128/25',
|
||||
'138.231.149.0/24',
|
||||
'138.231.150.0/23',
|
||||
],
|
||||
'bornes' : [
|
||||
'138.231.148.0/27',
|
||||
],
|
||||
'adm' : [
|
||||
'10.231.136.0/24'
|
||||
],
|
||||
'personnel-ens' : [
|
||||
'10.2.9.0/24'
|
||||
],
|
||||
'gratuit' : [
|
||||
'10.42.0.0/16'
|
||||
],
|
||||
'accueil' : [
|
||||
'10.51.0.0/16'
|
||||
],
|
||||
'federez' : [
|
||||
'10.53.0.0/16'
|
||||
],
|
||||
'isolement' : [
|
||||
'10.52.0.0/16'
|
||||
],
|
||||
'evenementiel' : [
|
||||
'10.231.137.0/24'
|
||||
],
|
||||
'multicast' : [
|
||||
'239.0.0.0/8'
|
||||
],
|
||||
'ens' : [
|
||||
'138.231.135.0/24'
|
||||
],
|
||||
}
|
||||
|
||||
NETs_secondaires = {
|
||||
'all' : ['138.231.136.0/21', '138.231.144.0/21'],
|
||||
'wifi': ['138.231.144.0/21'],
|
||||
'fil' : ['138.231.136.0/21'],
|
||||
}
|
||||
'all' : [
|
||||
'138.231.136.0/21',
|
||||
'138.231.144.0/21',
|
||||
],
|
||||
'wifi': [
|
||||
'138.231.144.0/21',
|
||||
],
|
||||
'fil' : [
|
||||
'138.231.136.0/21',
|
||||
],
|
||||
}
|
||||
|
||||
NETs = {}
|
||||
NETs.update(NETs_primaires)
|
||||
NETs.update(NETs_secondaires)
|
||||
|
||||
NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' }
|
||||
NETs_regexp = {
|
||||
'all' : r'^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$'
|
||||
}
|
||||
|
||||
# Classes de rid
|
||||
# Merci d'essayer de les faire correspondre avec les réseaux
|
||||
|
@ -288,13 +429,13 @@ rid_primaires = {
|
|||
'personnel-ens' : [(55296, 55551),],
|
||||
# Un unique rid pour les machines multicast
|
||||
'multicast' : [(65535, 65535),],
|
||||
}
|
||||
}
|
||||
|
||||
rid_secondaires = {
|
||||
# Rid pour les machines filaire ipv4
|
||||
'fil' : [(0, 2047),],
|
||||
'wifi' : [(2048, 4095), (34816, 35071),],
|
||||
}
|
||||
}
|
||||
|
||||
rid = {}
|
||||
rid.update(rid_primaires)
|
||||
|
@ -320,24 +461,59 @@ ipv6_machines_speciales = {
|
|||
}
|
||||
|
||||
# Les préfixes ipv6 publics
|
||||
prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ],
|
||||
'serveurs' : [ '2a01:240:fe3d:4::/64' ],
|
||||
'adherents' : [ '2a01:240:fe3d:4::/64' ],
|
||||
'fil' : [ '2a01:240:fe3d:4::/64' ],
|
||||
'adm' : [ '2a01:240:fe3d:c804::/64' ],
|
||||
'adm-v6' : [ '2a01:240:fe3d:c804::/64' ],
|
||||
'wifi' : [ '2a01:240:fe3d:c04::/64' ],
|
||||
'serveurs-v6' : [ '2a01:240:fe3d:c04::/64' ],
|
||||
'adherents-v6' : [ '2a01:240:fe3d:4::/64' ],
|
||||
'wifi-adh-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' ],
|
||||
'bornes' : [ '2a01:240:fe3d:c04::/64' ],
|
||||
'bornes-v6' : [ '2a01:240:fe3d:c04::/64' ],
|
||||
'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ],
|
||||
'v6only' : [ '2001:470:c8b9:a4::/64' ],
|
||||
}
|
||||
prefix = {
|
||||
'subnet' : [
|
||||
'2a01:240:fe3d::/48',
|
||||
],
|
||||
'serveurs' : [
|
||||
'2a01:240:fe3d:4::/64',
|
||||
],
|
||||
'adherents' : [
|
||||
'2a01:240:fe3d:4::/64',
|
||||
],
|
||||
'fil' : [
|
||||
'2a01:240:fe3d:4::/64',
|
||||
],
|
||||
'adm' : [
|
||||
'2a01:240:fe3d:c804::/64',
|
||||
],
|
||||
'adm-v6' : [
|
||||
'2a01:240:fe3d:c804::/64',
|
||||
],
|
||||
'wifi' : [
|
||||
'2a01:240:fe3d:c04::/64',
|
||||
],
|
||||
'serveurs-v6' : [
|
||||
'2a01:240:fe3d:c04::/64',
|
||||
],
|
||||
'adherents-v6' : [
|
||||
'2a01:240:fe3d:4::/64',
|
||||
],
|
||||
'wifi-adh-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',
|
||||
],
|
||||
'bornes' : [
|
||||
'2a01:240:fe3d:c04::/64',
|
||||
],
|
||||
'bornes-v6' : [
|
||||
'2a01:240:fe3d:c04::/64',
|
||||
],
|
||||
'wifi-adh' : [
|
||||
'2a01:240:fe3d:c04::/64',
|
||||
],
|
||||
'v6only' : [
|
||||
'2001:470:c8b9:a4::/64',
|
||||
],
|
||||
}
|
||||
|
||||
# Préfixes ipv6 internes (ula)
|
||||
int_prefix = {
|
||||
|
@ -346,10 +522,12 @@ int_prefix = {
|
|||
}
|
||||
|
||||
# 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' }
|
||||
domains = {
|
||||
'machineFixe': 'crans.org',
|
||||
'machineCrans': 'crans.org',
|
||||
'machineWifi': 'wifi.crans.org',
|
||||
'borneWifi': 'wifi.crans.org',
|
||||
}
|
||||
|
||||
# VLans
|
||||
vlans = {
|
||||
|
@ -383,33 +561,45 @@ vlans = {
|
|||
'iscsi': 42,
|
||||
# freebox (pour faire descendre la connexion au 0B)
|
||||
'freebox': 8,
|
||||
}
|
||||
}
|
||||
|
||||
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'
|
||||
}
|
||||
}
|
||||
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']
|
||||
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'
|
||||
}
|
||||
output_file = {
|
||||
4 : '/tmp/ipt_rules',
|
||||
6 : '/tmp/ip6t_rules',
|
||||
}
|
||||
|
||||
file_pickle = { 4 : '/tmp/ipt_pickle',
|
||||
6 : '/tmp/ip6t_pickle'
|
||||
}
|
||||
file_pickle = {
|
||||
4 : '/tmp/ipt_pickle',
|
||||
6 : '/tmp/ip6t_pickle',
|
||||
}
|
||||
|
||||
##################################################################################
|
||||
#: Items de la blackliste
|
||||
|
@ -433,7 +623,7 @@ blacklist_sanctions = [
|
|||
]
|
||||
|
||||
#: Blacklistes redirigeant le port 80 en http vers le portail captif (avec des explications)
|
||||
blacklist_sanctions_soft = [
|
||||
blacklist_sanctions_soft = [
|
||||
'ipv6_ra',
|
||||
'mail_invalide',
|
||||
'virus',
|
||||
|
@ -447,10 +637,24 @@ blacklist_bridage_upload = ['autodisc_upload', 'upload']
|
|||
|
||||
##################################################################################
|
||||
|
||||
adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis',
|
||||
'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ]
|
||||
adm_users = [
|
||||
'root',
|
||||
'identd',
|
||||
'daemon',
|
||||
'postfix',
|
||||
'freerad',
|
||||
'amavis',
|
||||
'nut',
|
||||
'respbats',
|
||||
'list',
|
||||
'sqlgrey',
|
||||
'ntpd',
|
||||
'lp',
|
||||
]
|
||||
|
||||
open_ports = { 'tcp' : '22' }
|
||||
open_ports = {
|
||||
'tcp' : '22',
|
||||
}
|
||||
|
||||
# Debit max sur le vlan de la connexion gratuite
|
||||
debit_max_radin = 1000000
|
||||
|
@ -460,13 +664,83 @@ debit_max_gratuit = 1000000
|
|||
## Vlan accueil et isolement ##
|
||||
###############################
|
||||
accueil_route = {
|
||||
'138.231.136.1':{'tcp':['80','443', '22'],'hosts':['ssh.crans.org', 'zamok.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', 'intranet.crans.org']},
|
||||
'138.231.136.18':{'tcp':['80','443'],'hosts':['cas.crans.org', 'login.crans.org', 'auth.crans.org']},
|
||||
'213.154.225.236':{'tcp':['80','443'], 'hosts':['crl.cacert.org']},
|
||||
'213.154.225.237':{'tcp':['80','443'], 'hosts':['ocsp.cacert.org']},
|
||||
'138.231.136.1' : {
|
||||
'tcp' : [
|
||||
'80',
|
||||
'443',
|
||||
'22'
|
||||
],
|
||||
'hosts' : [
|
||||
'ssh.crans.org',
|
||||
'zamok.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',
|
||||
'intranet.crans.org',
|
||||
],
|
||||
},
|
||||
'138.231.136.18' : {
|
||||
'tcp' : [
|
||||
'80',
|
||||
'443',
|
||||
],
|
||||
'hosts' : [
|
||||
'cas.crans.org',
|
||||
'login.crans.org',
|
||||
'auth.crans.org',
|
||||
],
|
||||
},
|
||||
'213.154.225.236' : {
|
||||
'tcp' : [
|
||||
'80',
|
||||
'443',
|
||||
],
|
||||
'hosts' : [
|
||||
'crl.cacert.org',
|
||||
],
|
||||
},
|
||||
'213.154.225.237' : {
|
||||
'tcp' : [
|
||||
'80',
|
||||
'443',
|
||||
],
|
||||
'hosts' : [
|
||||
'ocsp.cacert.org',
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
dhcp_servers = ['dhcp.adm.crans.org', 'isc.adm.crans.org']
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
import sys
|
||||
import os, re, syslog, cPickle, socket
|
||||
|
||||
from ldap_crans import crans_ldap, hostname
|
||||
from ldap_crans import crans_ldap, hostname, generalizedTimeFormat
|
||||
from commands import getstatusoutput
|
||||
from config import NETs, role, prefix, rid, output_file, filter_policy, rid_primaires
|
||||
from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, ann_scol, periode_transitoire
|
||||
from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, periode_transitoire, gtf_debut_periode_transitoire
|
||||
from iptools import AddrInNet
|
||||
from ridtools import Rid, find_rid_plage
|
||||
import subprocess
|
||||
|
@ -257,7 +257,7 @@ REJECT --reject-with icmp6-port-unreachable')
|
|||
os.remove(file_pickle[ip_proto])
|
||||
|
||||
# On sauve les chaînes
|
||||
|
||||
|
||||
save_pickle(ipt_p)
|
||||
return 0
|
||||
|
||||
|
@ -330,16 +330,16 @@ REJECT --reject-with icmp6-port-unreachable')
|
|||
# ipt_p.filter.mac.items.remove[i]
|
||||
# break
|
||||
# print "Erreur, la mac " + mac + " n'est pas dans la chaîne."
|
||||
#
|
||||
#
|
||||
# for mac in macs['add']:
|
||||
# ipt_p.macip(mac)
|
||||
#
|
||||
#
|
||||
# # On écrit et applique les règles
|
||||
# write_rules(ipt_p)
|
||||
# apply_rules(6)
|
||||
#
|
||||
#
|
||||
# os.remove(file_pickle[ip_proto])
|
||||
#
|
||||
#
|
||||
# # On sauve les chaînes
|
||||
# save_pickle(ipt_p)
|
||||
# return 0
|
||||
|
@ -459,18 +459,18 @@ class UnknowUserError(Exception):
|
|||
|
||||
##############################################################################
|
||||
#
|
||||
# Déclaration des fonctions
|
||||
# Déclaration des fonctions
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
def gethostbyname(hostname):
|
||||
hosts4=[]
|
||||
hosts6=[]
|
||||
try :
|
||||
try :
|
||||
for host in socket.getaddrinfo(hostname,None,socket.AF_INET,socket.IPPROTO_IP,socket.AI_CANONNAME):
|
||||
hosts4.append(host[4][0])
|
||||
except(socket.gaierror): pass
|
||||
try :
|
||||
try :
|
||||
for host in socket.getaddrinfo(hostname,None,socket.AF_INET6,socket.IPPROTO_IP,socket.AI_CANONNAME):
|
||||
hosts6.append(host[4][0])
|
||||
except(socket.gaierror): pass
|
||||
|
@ -544,14 +544,14 @@ def iface6(net):
|
|||
|
||||
raise NoIface(net, msg)
|
||||
|
||||
|
||||
|
||||
def check_table(table):
|
||||
''' Vérifie que la table existe bien '''
|
||||
ctables = open('/etc/iproute2/rt_tables', 'r')
|
||||
rt_tables = ctables.readlines()
|
||||
tables = [item for item in rt_tables if not re.match('#', item)]
|
||||
if any(re.search(table, elt) for elt in tables):
|
||||
return 0
|
||||
return 0
|
||||
else:
|
||||
raise NoRtTable(table)
|
||||
|
||||
|
@ -682,7 +682,7 @@ def disable_forwarding(ip_proto = 4):
|
|||
|
||||
|
||||
def not_private(arg):
|
||||
''' Retourne un boolén suivant que la fonction passé en argument
|
||||
''' Retourne un boolén suivant que la fonction passé en argument
|
||||
est privée ou non'''
|
||||
if re.match('^_.*', str(arg)):
|
||||
return False
|
||||
|
@ -727,7 +727,7 @@ def write_rules(ipt):
|
|||
}
|
||||
|
||||
# On parcours une première fois l'instance pour initialiser correctement
|
||||
# nos chaînes
|
||||
# nos chaînes
|
||||
for itables in ['filter', 'mangle', 'raw']:
|
||||
for ichain in filter(not_private,
|
||||
dir(ipt.__getattribute__(itables))):
|
||||
|
@ -768,10 +768,14 @@ def blacklist(ipt):
|
|||
if [x for x in sanctions if x in blacklist_sanctions_ipv6]:
|
||||
blcklst.extend(target.machines())
|
||||
|
||||
s = db.search('mblacklist=*&paiement=%s' % ann_scol)
|
||||
s = db.search('mblacklist=*&finConnexion>=%(fin)s&finAdhesion>=%(fin)s' % {
|
||||
'fin': generalizedTimeFormat(),
|
||||
})
|
||||
if periode_transitoire:
|
||||
s['machine'].extend(db.search('mblacklist=*&paiement=%s' % (ann_scol-1))['machine'])
|
||||
|
||||
s['machine'].extend(db.search('mblacklist=*&finConnexion>=%(fin)s&finAdhsion>=%(fin)s' % {
|
||||
'fin': gtf_debut_periode_transitoire,
|
||||
})['machine'])
|
||||
|
||||
for target in s['machine']:
|
||||
sanctions = target.blacklist_actif()
|
||||
if [x for x in sanctions if x in blacklist_sanctions_ipv6]:
|
||||
|
@ -837,7 +841,7 @@ def macips(ipt, machines, types_machines):
|
|||
if int(machine.rid()) in range(plage[0], plage[1]):
|
||||
ipt.macip(machine.mac(), type_m)
|
||||
break
|
||||
|
||||
|
||||
for type_m in types_machines:
|
||||
if not type_m in tab.keys():
|
||||
type_mm = re.sub('-', '', type_m)
|
||||
|
|
|
@ -134,7 +134,6 @@ droits_vieux = [u'Nounou', u'Bureau']
|
|||
### Variables internes diverses
|
||||
#isadm = user_tests.isadm()
|
||||
#isdeconnecteur = user_tests.isdeconnecteur()
|
||||
ann_scol = config.ann_scol
|
||||
#script_utilisateur = user_tests.getuser()
|
||||
script_utilisateur = cur_user
|
||||
|
||||
|
@ -159,12 +158,15 @@ def tz(thetz):
|
|||
else:
|
||||
return "%s%04d" % ("+"*(thetz < 0) + "-"*(thetz > 0), abstz)
|
||||
|
||||
def generalizedTimeFormat(stamp):
|
||||
def generalizedTimeFormat(stamp=None):
|
||||
"""Converts a timestamp (local) in a generalized time format
|
||||
for LDAP
|
||||
|
||||
"""
|
||||
|
||||
if stamp is None:
|
||||
stamp = time.time()
|
||||
|
||||
return "%s%s" % (time.strftime("%Y%m%d%H%M%S", time.localtime(stamp)), tz(time.altzone/3600))
|
||||
|
||||
def fromGeneralizedTimeFormat(gtf):
|
||||
|
@ -833,9 +835,13 @@ class CransLdap:
|
|||
# définifif (cf config.py).
|
||||
if config.periode_transitoire:
|
||||
# Pour la période transitoire année précédente ok
|
||||
el = "(|(paiement=%d)(paiement=%d)(finAdhesion>=%s))" % (config.ann_scol, config.ann_scol-1, generalizedTimeFormat(time.time()))
|
||||
el = "(&(finAdhesion>=%(fin)s)(finConnexion>=%(fin)s))" % {
|
||||
'fin': config.gtf_debut_periode_transitoire,
|
||||
}
|
||||
else:
|
||||
el = "(|(paiement=%s)(finAdhesion>=%s))" % (config.ann_scol, generalizedTimeFormat(time.time()))
|
||||
el = "(&(finAdhesion>=%(fin)s)(finConnexion>=%(fin)s))" % {
|
||||
'fin': generalizedTimeFormat(),
|
||||
}
|
||||
# Doit-on bloquer en cas de manque de la carte d'etudiant ?
|
||||
# (si période transitoire on ne bloque dans aucun cas)
|
||||
elif champ[1:] == 'blacklist':
|
||||
|
@ -1062,9 +1068,6 @@ class BaseClasseCrans(CransLdap):
|
|||
def connexion(self, update=False, f=None):
|
||||
return 0.0
|
||||
|
||||
def sursis_carte(self):
|
||||
return False
|
||||
|
||||
def chbre(self, new=None):
|
||||
return "????"
|
||||
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
#!/bin/bash /usr/scripts/python.sh
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
import datetime
|
||||
import pytz
|
||||
from gestion import config
|
||||
from gestion.affich_tools import cprint
|
||||
from gestion import mail as mail_module
|
||||
import lc_ldap.shortcuts
|
||||
|
||||
# Attention, si à True envoie effectivement les mails
|
||||
SEND=False
|
||||
# TODO ces deadlines devraient être dans config.py
|
||||
deadline=datetime.datetime(config.ann_scol, 11, 6)
|
||||
fin_conn = datetime.datetime(config.ann_scol, 11, 1, tzinfo=pytz.UTC)
|
||||
fin_conn = fin_conn.strftime('%Y%m%d%H%M%S%z')
|
||||
ldap_filter=u"""(&
|
||||
(finConnexion>=%(fin_conn)s)
|
||||
(!(carteEtudiant=*))
|
||||
(!(etudes=Personnel ENS))
|
||||
(aid=*)
|
||||
)""" % {'fin_conn': fin_conn, }
|
||||
|
||||
conn=lc_ldap.shortcuts.lc_ldap_readonly()
|
||||
mailaddrs=set()
|
||||
for adh in conn.search(ldap_filter):
|
||||
mail = adh.get_mail()
|
||||
if not mail:
|
||||
print "Skip %r (no valid mail)" % adh
|
||||
continue
|
||||
mailaddrs.add(mail)
|
||||
|
||||
print "Va envoyer le message à %s personnes." % len(mailaddrs)
|
||||
if not SEND:
|
||||
print "Mettre la variable SEND à True effectuer l'envoi"
|
||||
print "Appuyer sur entrée pour la génération"
|
||||
raw_input()
|
||||
|
||||
echecs=[]
|
||||
with mail_module.ServerConnection() as conn_smtp:
|
||||
for To in mailaddrs:
|
||||
cprint(u"Envoi du mail à %s" % To)
|
||||
params = {
|
||||
'deadline': deadline,
|
||||
'To': To,
|
||||
'lang_info': 'English version below',
|
||||
}
|
||||
mailtxt=mail_module.generate('carte_etudiant', params).as_string()
|
||||
try:
|
||||
# TODO DBG_MAIL
|
||||
if SEND:
|
||||
conn_smtp.sendmail("cableurs@crans.org", (To,), mailtxt)
|
||||
except:
|
||||
cprint(u"Erreur lors de l'envoi à %s " % To, "rouge")
|
||||
echecs.append(To)
|
||||
|
||||
if echecs:
|
||||
print "\nIl y a eu des erreurs :"
|
||||
print echecs
|
|
@ -1 +0,0 @@
|
|||
Les câbleurs du Crans <cableurs@crans.org>
|
|
@ -1 +0,0 @@
|
|||
[Crans] Rappel carte d'étudiant
|
|
@ -1 +0,0 @@
|
|||
{{To}}
|
|
@ -1 +0,0 @@
|
|||
{{ mailer }}
|
|
@ -1,17 +0,0 @@
|
|||
Cher adhérent,
|
||||
|
||||
Il apparaît que tu n'as pas encore fourni de justificatif de scolarité
|
||||
valide pour l'année en cours. Le Crans utilisant le réseau RENATER, il lui
|
||||
est nécessaire d'avoir une copie d'un papier attestant de ton statut
|
||||
d'étudiant.
|
||||
|
||||
Il est nécessaire que tu viennes à la Kfet avec un certificat de scolarité
|
||||
original ou ta carte d'étudiant, avant le {{deadline}}. Si tu ne
|
||||
pouvais venir avant cette date, ton accès serai suspendu jusqu'à ce que tu
|
||||
régularises ta situation.
|
||||
|
||||
Bien cordialement,
|
||||
|
||||
--
|
||||
Les câbleurs
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
Dear Crans member,
|
||||
|
||||
It seems that your haven't yet given a school certificate for this academic
|
||||
year. The Crans is connected to the RENATER network so we have to justify the
|
||||
academic status of all our members.
|
||||
|
||||
You must therefore go to the Kfet with an original school certificate or with
|
||||
your student card, before {{deadline|date}}. In case you fail to come before that
|
||||
date, your Internet access will be suspended until you have the document sorted
|
||||
out.
|
||||
|
||||
Please do not send us your certificate by email, we need to see an original.
|
||||
|
||||
Faithfully,
|
||||
|
||||
--
|
||||
The Crans active members
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
Cher adhérent,
|
||||
|
||||
Il apparaît que tu n'as pas encore fourni de justificatif de scolarité
|
||||
valide pour l'année en cours. Le Crans utilisant le réseau RENATER, il lui
|
||||
est demandé de pouvoir justifier ton statut d'étudiant.
|
||||
|
||||
Ainsi, il est nécessaire que tu viennes à la Kfet avec un certificat de
|
||||
scolarité original ou ta carte d'étudiant, avant le {{deadline|date}}. Si tu ne
|
||||
pouvais venir avant cette date, ton accès serait suspendu jusqu'à ce que tu
|
||||
régularises ta situation.
|
||||
|
||||
Merci de ne pas envoyer de certificat ou carte par retour de courriel,
|
||||
ceux-ci ne seront pas acceptés.
|
||||
|
||||
À bientôt !
|
||||
|
||||
--
|
||||
Les membres actifs du Crans
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue