diff --git usr/bin/importation_scribe usr/bin/importation_scribe index 0db4982..290d66e 100755 --- usr/bin/importation_scribe +++ usr/bin/importation_scribe @@ -42,21 +42,21 @@ choix de la source de données et imports - personnels administratifs - comptes invités """ import sys from os import environ, getcwd, chdir from os.path import isfile, dirname from pyeole.process import system_out, system_code from scribe.storage import init_store from scribe.eoleldap import Ldap -from scribe.ldapconf import SUPPORT_ETAB +from scribe.ldapconf import SUPPORT_ETAB, BRANCHE_ETAB, PROF_FILTER from scribe.eoletools import nscd_start, nscd_stop from scribe.parsing import sconet, aaf, be1d, scribecsv2 from scribe.importation import preferences, writer, config from scribe.importation import log #______________________________________________________________________________ # utilitaires de manipulation de la console class OutOfRange(Exception): """ Exception OutOfRange """ @@ -458,33 +458,44 @@ class Console: """ log.add_lock() log.debuglog("Arrêt de LSC...", title=True) nscd_stop() connexion = Ldap() connexion.connect() if SUPPORT_ETAB: prefs = preferences.get_enseignants_prefs() etab = prefs.get_default('etab') etab_prefix = prefs.get_default('etab_prefix') + branche_etab = BRANCHE_ETAB % {'etab': etab} + purge_option = 'keep' + old_logins = connexion._search('(&{})'.format(PROF_FILTER), 'uid', suffix=branche_etab) else: etab = None etab_prefix = '' if self.import_type != 'maj': writer.purge_equipes(connexion=connexion, etab=etab) writer.verify_classe(store=self.store, connexion=connexion, etab_prefix=etab_prefix) writer.write_matiere(store=self.store, connexion=connexion, etab=etab, etab_prefix=etab_prefix) writer.verify_option(store=self.store, connexion=connexion, etab_prefix=etab_prefix) - writer.write_enseignant(store=self.store, connexion=connexion, + logins = writer.write_enseignant(store=self.store, connexion=connexion, etab=etab) + if SUPPORT_ETAB: + old_dns = [login[0] for login in old_logins if login[1]['uid'] not in logins] + for old_dn in old_dns: + connexion._delete(old_dn) + if prefs.get_default('backup') == 'oui': + target = f'/home/backup/{etab}/' + print(f'copie dans {target}') + if self.data_type in ['sconet', 'aaf']: writer.write_service(store=self.store, connexion=connexion, etab=etab, etab_prefix=etab_prefix) writer.write_administratif(store=self.store, connexion=connexion, etab=etab) writer.write_samba(connexion) connexion.close() log.debuglog("Démarrage de LSC...", title=True) nscd_start() log.del_lock() diff --git usr/lib/python3/dist-packages/scribe/importation/preferences.py usr/lib/python3/dist-packages/scribe/importation/preferences.py index fdcb142..fe11e3b 100644 --- usr/lib/python3/dist-packages/scribe/importation/preferences.py +++ usr/lib/python3/dist-packages/scribe/importation/preferences.py @@ -141,20 +141,24 @@ PREF_MAIL = ['mail', 'liste', ('perso_internet', 'adresse fournie ou domaine Internet'), ('perso_aucune', 'adresse fournie ou aucune'), ('restreint', 'adresse locale, domaine restreint'), ('internet', 'adresse locale, domaine Internet'), ('aucune', 'aucune adresse'), )] PREF_PREFIX_ETAB = ['etab_prefix', 'texte', "Préfixe des groupes de l'établissement", ""] +PREF_PURGE = ['backup', 'liste', + "Sauvegarde des données des utilisateurs supprimés", + (('oui', 'oui'), ('non', 'non'))] + if dico.get('activer_nfs', 'non') == 'oui' or 'interface_client_ltsp' in dico: DEFAULT_CHANGE_PWD = 'non' DEFAULT_SHELL = 'oui' else: DEFAULT_CHANGE_PWD = 'oui' DEFAULT_SHELL = 'non' def get_etab(): """ charge les établissements à chaque fois qu'on le demande @@ -211,20 +215,21 @@ def get_responsables_prefs(): return Preferences(prefs_resp, PREF_FILES['responsable']) def get_enseignants_prefs(): """ préférences pour les enseignants """ prefs_ens = [ Preference(default='0', *PREF_QUOTA), Preference(*PREF_LOGIN), Preference(default=DEFAULT_SHELL, *PREF_SHELL), Preference(default='1', *PREF_PROFIL), Preference(default='perso_aucune', *PREF_MAIL), + Preference(default='oui', *PREF_PURGE), ] if FORCED_PASSWORD_MODIFICATION_ALLOWED: prefs_ens.insert(2, Preference(default=DEFAULT_CHANGE_PWD, *PREF_CHANGE_PWD)) if SUPPORT_ETAB: prefs_ens.insert(0, Preference(*get_etab())) prefs_ens.insert(1, Preference(*PREF_PREFIX_ETAB)) prefs_ens.append(Preference(*get_etabprefix())) return Preferences(prefs_ens, PREF_FILES['enseignant']) def get_administratifs_prefs(): diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py index 34ce0fb..40865d5 100644 --- usr/lib/python3/dist-packages/scribe/importation/writer.py +++ usr/lib/python3/dist-packages/scribe/importation/writer.py @@ -834,23 +834,20 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): enseignant : store.Enseignant() user : eoleuser.Enseignant() login : uid de l'utilisateur dans ldap administratif : personnel administratif avec un compte enseignant """ log.log.debug("maj de %s" % login) classe = [] groups = [] # attention : des administratifs peuvent avoir un compte enseignant if isinstance(enseignant, Enseignant): - old_etab = user.get_etab(login) - if old_etab != etab: - user._change_etab(login, old_etab, etab) for joint in enseignant.get_classes(): groups.append('profs-%s' % str(joint.classe.nom)) if joint.profprincipal: classe.append(str(joint.classe.nom)) for matiere in enseignant.get_matieres(): groups.append(str(matiere.nom)) for option in enseignant.get_groupes(): groups.append('profs-%s' % str(option.nom)) disciplines = eval(enseignant.disciplines) else: @@ -874,64 +871,70 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): else: info = "%s;%s;%s;%s" % (str(enseignant.nom), str(enseignant.prenom), login, ATTRIB) log.write_info(info, config.ENS_INFO) def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAULT_USER): """ insertion des enseignants """ num = 0 + logins = [] log.infolog("Intégration des enseignants...", title=True) log.write_header(config.ENS_HEADER, config.ENS_INFO) user = LdapEnseignant() user.ldap_admin = connexion prefs = preferences.get_enseignants_prefs() quota = prefs.get_default('quota') if FORCED_PASSWORD_MODIFICATION_ALLOWED: change_pwd = prefs.get_default('change_pwd') == 'oui' else: change_pwd = False new_passwords = [] for enseignant in store.query(Enseignant): if enseignant.force_login: # login forcé if user._is_enseignant(str(enseignant.force_login)): login = str(enseignant.force_login) else: login = '' else: - login = _enseignant_exists(enseignant, user) + login = _enseignant_exists(enseignant, user, etab=etab) if login != '': # enseignant existant - _maj_enseignant(enseignant, user, login, etab) + _maj_enseignant(enseignant, user, login, etab=etab) else: # nouvel enseignant if str(enseignant.nom) == '' or str(enseignant.prenom) == '': log.infolog("Enseignant n°%s invalide" % str(enseignant.int_id)) continue try: login = _new_enseignant(enseignant, user, prefs, etab=etab, new_passwords=new_passwords) except BadLogin as message: log.infolog(str(message)) continue # enregistrement du login attribué enseignant.login = str(login) + logins.append(enseignant.login) num += 1 if num % config.DEBUG_NUM == 0: log.debuglog("%d enseignants traités..." % num) if EOLE_AD: _sync_passwords(user, new_passwords, change_pwd=change_pwd) _create_dirs(user, quota, new_passwords) log.infolog("TOTAL : %d enseignants" % num) + # write unmodified users list + # filtrer les enseignants avec LastUpdate plus vieux que le début de l’import et vérifier qu’ils ne sont pas dans store.query(Enseignant) ? + #user.ldap_admin._search(PROF_FILTER, attrlist=['uid'], suffix=branche_etab % {'etab': etab}) if num != 0: log.copy_info(config.ENS_INFO, user=current_ead_user) + return logins # -------------------- administratifs -------------------- # def _new_administratif(administratif, user, prefs, etab=None, new_passwords=[]): """ traitement d'un nouvel administratif (création) administratif : store.Administratif() user : eoleuser.Administratif() """ @@ -1020,21 +1023,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF if user._is_administratif(str(administratif.force_login)): login = str(administratif.force_login) else: login = '' else: login = _administratif_exists(administratif, user) if login != '': # personnel existe _maj_administratif(administratif, user, login) else: - login = _enseignant_exists(administratif, user) + login = _enseignant_exists(administratif, user, etab) if login != '': # le personnel a été crée comme un professeur... log.infolog("(%s a un compte enseignant)" % login) ldap_ens = LdapEnseignant() ldap_ens.ldap_admin = connexion _maj_enseignant(administratif, ldap_ens, login, etab, administratif=True) else: # nouveau personnel if str(administratif.nom) == '' or str(administratif.prenom) == '': log.infolog("Administratif n°%s invalide" % str(administratif.int_id)) diff --git usr/lib/python3/dist-packages/scribe/linker.py usr/lib/python3/dist-packages/scribe/linker.py index 4cc6082..94099e9 100644 --- usr/lib/python3/dist-packages/scribe/linker.py +++ usr/lib/python3/dist-packages/scribe/linker.py @@ -3,21 +3,21 @@ # Eole NG - 2009 # Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) # Licence CeCill cf /root/LicenceEole.txt # eole@ac-dijon.fr ########################################################################### """ recherche les liens entre les utilisateurs importes et l'annuaire ldap """ from scribe.ldapconf import ELEVE_FILTER, PROF_FILTER, ADMINISTRATIF_FILTER, \ -RESPONSABLE_FILTER, USER_FILTER, AUTRE_FILTER, LDAP_MODE +RESPONSABLE_FILTER, USER_FILTER, AUTRE_FILTER, LDAP_MODE, BRANCHE_ETAB from scribe.eoletools import deformate_date, strip_adresse from scribe.eoleldap import Ldap def _eleve_exists(eleve, user): """ recherche si un élève existe déjà dans l'annuaire eleve : storage.Eleve() user : eoleuser.Eleve() """ filtres = [] @@ -96,21 +96,21 @@ def _responsable_exists(responsable, user): if responsable.mail and res.get('mailPerso', [''])[0] == str(responsable.mail): # mail + nom + prenom (#6061) mais mail + nom => mauvaise idée (#4191) return res['uid'][0] if responsable.adresse.adresse and \ strip_adresse(res.get('ENTPersonAdresse', [''])[0]) == \ strip_adresse(str(responsable.adresse.adresse)): # adresse + nom + prenom (#6934) return res['uid'][0] return '' -def _enseignant_exists(enseignant, user): +def _enseignant_exists(enseignant, user, etab=None): """ recherche si un enseignant existe déjà dans l'annuaire enseignant : storage.Enseignant() user : eoleuser.Enseignant() """ filtres = [] if enseignant.date and enseignant.date != '01/01/0001': date = deformate_date(str(enseignant.date)) if enseignant.int_id: # date + id interne @@ -126,22 +126,26 @@ def _enseignant_exists(enseignant, user): # mail (federation) + nom filtres.append("(&%s(FederationKey=%s)(sn=%s))" % (PROF_FILTER, str(enseignant.mail), str(enseignant.nom) )) if enseignant.int_id: # nom + id interne filtres.append("(&%s(sn=%s)(intid=%s))" % (PROF_FILTER, str(enseignant.nom), str(enseignant.int_id) )) # beurk (homonymes) -> à améliorer #filtres.append("(&%s(cn=%s %s)(objectClass=enseignant))" % (USER_FILTER, # str(enseignant.prenom), str(enseignant.nom))) + if etab: + branche_etab = BRANCHE_ETAB % {'etab': etab} + else: + branche_etab = None for filtre in filtres: - res = user.ldap_admin._search_one(filtre, 'uid') + res = user.ldap_admin._search_one(filtre, 'uid', suffix=branche_etab) if res != {}: return res['uid'][0] return '' def _administratif_exists(administratif, user): """ recherche si un administratif existe déjà dans l'annuaire administratif : storage.Administratif() user : eoleuser.Administratif() """