#! /usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) Frédéric Pauget # Licence : GPLv2 import smtplib, sys, commands, shutil, os, traceback,grp from time import strftime sys.path.append('/usr/scripts/gestion') if '/usr/scripts' not in sys.path: sys.path.append('/usr/scripts') from gestion.affich_tools import cprint, anim, OK, WARNING, ERREUR import gestion.config as config import config.mails as config_mails import gestion.mail as mail_module from gestion.ldap_crans import hostname, crans_ldap try: sys.path.append('/usr/lib/mailman') from Mailman.MailList import MailList from Mailman.UserDesc import UserDesc from Mailman.Errors import MMAlreadyAMember except: # Machine sans mailman, les ML ne seront pas reconfigurées pass CONN = crans_ldap() class del_user: """ Suppression des fichiers d'un compte utilisateur """ debug = True def __init__(self, args): self.args = args def delete_directory(self, caption, pattern): cprint(caption, "gras") for args in self.args: anim('\t' + args) try: login = args.split(',')[0] d = pattern % login if os.path.isdir(d): shutil.rmtree(d) print OK except: print ERREUR if self.debug: import traceback traceback.print_exc() def delete_zbee(self): cprint(u'Archivage fichiers utilisateur', 'gras') for args in self.args: anim('\t' + args) try: login, home = args.split(',') homesplit = home.split("/") symlink = "/home-adh/%s" % (homesplit[-1],) if not login or not home: raise ValueError('Argument invalide') if home.startswith('/home/') and hostname == "zbee": home = "/home-adh/" + home[6:] warn = '' f = '%s/files/%s_%s.tar.bz2' % ('/home-adh/cimetiere', strftime('%Y-%m-%d-%Hh%Mm'), login) status, output = commands.getstatusoutput("tar cjf '%s' '%s' /home-adh/mail/%s" % (f, home, login)) if (status != 512 and status != 0) or not os.path.isfile(f): # La 512 est si un des paths n'exite pas. raise OSError(output) if os.path.isdir(home) and os.stat(home)[4] >= 500: if homesplit[-2] != "club": if os.path.exists(symlink) and os.path.islink(symlink): os.unlink(symlink) shutil.rmtree(home) else: warn += '%s incorrect\n' % home if os.path.isdir('/home-adh/mail/' + login): shutil.rmtree('/home-adh/mail/' + login) else: warn += '/home-adh/mail/%s incorrect\n' % login if warn: print WARNING if self.debug: sys.stderr.write(warn) else: print OK except: print ERREUR if self.debug: import traceback traceback.print_exc() def reconfigure(self): if hostname == "zbee": self.delete_zbee() elif hostname == "owl": self.delete_directory(u"Suppression des fichiers index de dovecot", "/var/dovecot-indexes/%s") elif hostname == "zamok": self.delete_directory(u"Suppression des fichiers d'impression", "/var/spool/impression/%s") class home: debug = True def __init__(self, args): self.args = args def reconfigure(self): cprint(u'Création home', 'gras') for args in self.args: anim('\t' + args) try: login, oldLogin, oldHome = args.split(",") if login: res = CONN.search("login=%s" % (login,)) if res['adherent']: adh = res['adherent'][0] gid = config.gid elif res['club']: adh = res['club'][0] gid = config.club_gid home = adh.home() uid = adh.uidNumber() mail_redirect = adh.email_exterieur() if oldHome and hostname == "zbee": home_service = del_user(["%s,%s" % (oldLogin, oldHome)]) home_service.delete_zbee() homesplit = home.split("/") symlink = "/home-adh/%s" % (homesplit[-1],) ### Home if not os.path.exists(home): # Le home n'existe pas os.mkdir(home, 0755) os.chown(home, int(uid), gid) if homesplit[-2] != "club": if os.path.exists(symlink) and os.path.islink(symlink): os.unlink(symlink) elif os.path.exists(symlink): raise OSError("Impossible de créer le lien %s : un fichier ou un dossier existe déjà." % (symlink,)) os.symlink(home, symlink) elif os.path.isdir(home): # Il y un répertoire existant # Bon UID ? stat = os.stat(home) if stat[4] != int(uid) or stat[5] != gid: # Le home n'est pas pas à la bonne personne raise OSError('home existant') if homesplit[-2] != "club": if os.path.exists(symlink) and os.path.islink(symlink): os.unlink(symlink) elif os.path.exists(symlink): raise OSError("Impossible de créer le lien %s : un fichier ou un dossier existe déjà." % (symlink,)) os.symlink(home, symlink) ### Quota status, output = commands.getstatusoutput('/usr/sbin/setquota -u %s %s %s %s %s -a' % (uid, config.quota_soft, config.quota_hard, config.fquota_soft, config.fquota_hard) ) if status: print WARNING if self.debug: sys.stderr.write(output+'\n') else: print OK ### Mail if not os.path.exists(home + '/Mail'): os.mkdir(home + '/Mail', 0700) os.chown(home + '/Mail', int(uid), gid) if not os.path.exists('/home-adh/mail/' + login): os.mkdir('/home-adh/mail/' + login, 0700) os.chown('/home-adh/mail/' + login, int(uid), 8) ### Redirection if mail_redirect: write_in_forward = True # On vérifie s'il y a déjà un .forward if os.path.exists(os.path.join(home, ".forward")): write_in_forward = False if write_in_forward: with open(os.path.join(home, '.forward'), 'w') as forward_file: forward_file.write(mail_redirect + '\n') os.chown(home + '/.forward', int(uid), gid) os.chmod(home + '/.forward', 0600) ### Owncloud dans le home if not os.path.exists(home + '/OwnCloud'): os.mkdir(home + '/OwnCloud') os.chown(home + '/OwnCloud', int(uid), grp.getgrnam('www-data').gr_gid) os.chmod(home + '/OwnCloud', 0770) except: print ERREUR if self.debug: import traceback traceback.print_exc() class mail_bienvenue: debug = True def __init__(self, mails): self.mails = mails def reconfigure(self): cprint(u'Envoi mail de bienvenue', 'gras') for mail in self.mails: anim('\t' + mail) try: From = "respbats@crans.org" To = mail if '@crans.org' in To: if not os.path.exists("/home/" + To.replace('@crans.org','')): print ERREUR continue conn=smtplib.SMTP('localhost') #conn.sendmail(From, To, mail_module.generate('bienvenue', { 'From': From, 'To': To, 'lang_info': 'English version below' }).as_string()) conn.quit() print OK except Exception, c: print ERREUR if True: #self.debug: import traceback traceback.print_exc() class mail_ajout_droits: debug = True def __init__(self, args): self.args = args def reconfigure(self): cprint(u'Envoi mail ajout de droits', 'gras') for arg in self.args: login = arg.split(":")[0] Droit = arg.split(":")[1] anim('\t' + login) try: From = "root@crans.org" To = login if To.find('@') == -1: To += '@crans.org' print Droit +"\n" if Droit in config_mails.pages_infos_droits: print "envoi du mail" Page = config_mails.pages_infos_droits[Droit.encode('utf-8')] conn=smtplib.SMTP('localhost') 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: print "ca marche pas" except Exception, c: print ERREUR if self.debug: import traceback traceback.print_exc()