Subversion Repositories wimsdev

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

!!RepairClass
!! permet de detecter et corriger d'eventuels probleme dans la classe

!read scripts/check.class
!if $error!=$empty
  !exit
!endif

# Ther is only 2 options : "checkonly" and "checkandrepair"
!if $option notsametext checkandrepair
  option=checkonly
  action=must be corrected
!else
  action=corrected
!endif

backup_file = $wims_home/backup/$qclass-$wims_now.tgz

log = !sh cd $wims_home/log/classes\
  tar -czf $backup_file $qclass

## attention : ceci ne marchera surement pas si repairclass est appelé
#     directement sur une sous-classe !
userfiles=!sh cd $wims_home/log/classes/$qclass/.users; ls | sort
userfiles=!singlespace $userfiles
userfiles=!words2items $userfiles
userfiles_cnt=!itemcnt $userfiles

# On commence par vérifier que le userlist est cohérent avec le dossier .users
userlist_cnt_before=!recordcnt wimshome/log/classes/$qclass/.userlist
!if $userfiles_cnt!=$userlist_cnt_before
  # Si le nombre d'utilisateurs ne coincide pas, on réindexe les utilisateurs.
  !read adm/class/mkuserlist $qclass
  userlist_cnt_after=!recordcnt wimshome/log/classes/$c/.userlist

  !if $userfiles_cnt!=$userlist_cnt_after
    error = malgré la reindexation, l'index des utilisateurs de la classe $qclass est incohérent. \
     Vérifiez manuellement. ($userfiles_cnt != $userlist_cnt_after)
  !else
    difference = $[$userlist_cnt_after-$userlist_cnt_before]
    !if $difference>0
      difference=+$difference
    !endif
    mess_list = L'index des utilisateurs était incorrect dans la classe $qclass mais il a bien été corrigé. ($difference utilisateurs)
  !endif
  !exit
!endif


!readdef $classdeffile
#Cas du groupement de classes
!if $class_type==2

  # Remove temp files
  !sh cd $wims_home/log/classes/$qclass\
      rm *.tmp

  # On construit la liste des sous-classes
  subclasses_cnt=!recordcnt wimshome/log/classes/$qclass/.subclasses
  !for id=1 to $subclasses_cnt
    subclass=!record $id of wimshome/log/classes/$qclass/.subclasses
    subclass=!item 1 of $subclass
    subclass_list=!append item $subclass to $subclass_list
  !next id

  # TODO : ici il faudrait vérifier que toutes les subclass_list existent,
  #    et qu'il n'en manque pas !

  # On parcourt ensuite la liste de tous les utilisateurs
  #   pour recréer les .userlist de chaque sous-classe
  userdir=wimshome/log/classes/$qclass/.users
  deleted_users=0
  corrected_users=0
  !reset sub_list_participate

  !for u in $userfiles
    !reset user_firstname, user_lastname, user_supervisable,\
      user_class, user_participate, user_exists, user_external_auth
    !readdef $userdir/$u
    userline=:$user_lastname,$user_firstname,$u
    !reset new_participate
    !for participate in $user_participate
      !if $participate isitemof $subclass_list
        particip_file=!replace internal / by _ in $participate
        !if $participate notitemof $sub_list_participate
          sub_list_participate = !append item $participate to $sub_list_participate
        !endif
        !appendfile wimshome/log/classes/$qclass/$particip_file.tmp $userline
        new_participate=!append item $participate to $new_participate
      !endif
    !next participate
    !if $new_participate=$empty
      # L'utilisateur ne participe a aucune sous-classe : on le met a la corbeille.
      !if $option notsametext checkonly
        !sh cd $wims_home/log/classes/$qclass/.users\
            mv $u ../trash_OB/$u
      !endif
      !increase deleted_users
    !else
      !if $new_participate notsametext $user_participate
        # L'utilisateur participait a au moins une sous-classe qui n'existe plus.
        # on met a jour sa liste de classes
        !if $option notsametext checkonly
          !setdef !set user_participate=$new_participate in $userdir/$u
        !endif
        !increase corrected_users
      !endif
    !endif
  !next u
  !if $deleted_users>0
    mess_list = !append item $deleted_users users are no more participating in any class to $mess_list
  !endif
  !if $corrected_users>0
    mess_list = !append item $corrected_users users are participating in deleted classes to $mess_list
  !endif

  # On parcourt maintenant l'ensemble des userlist temporaires
  #   pour les comparer avec les userlist existants dans les sous-classes
  !for subclass in $sub_list_participate
    old_cnt = !recordcnt wimshome/log/classes/$subclass/.userlist
    temp_file=!replace internal / by _ in $subclass
    new_cnt = !recordcnt wimshome/log/classes/$qclass/$temp_file.tmp

    !if $old_cnt != $new_cnt
      difference = $[$new_cnt-$old_cnt]
      !if $difference>0
       difference=+$difference
      !endif
      mess_list = !append item $subclass : userlist $action. (before=$old_cnt | after=$new_cnt | $difference users) to $mess_list
      !sh cd $wims_home/log/classes/$qclass\
          sort -f ./$temp_file.tmp >./$temp_file-sorted.tmp 2>/dev/null
      !if $option notsametext checkonly
        !sh cd $wims_home/log/classes/$qclass\
            sort -f ./$temp_file.tmp >./$temp_file-sorted.tmp 2>/dev/null
            mv ./$temp_file-sorted.tmp ../$subclass/.userlist
      !endif
    !endif
  !next subclass
  corrected_subclasses = !itemcnt $mess_list

  # Remove temp files
  !sh cd $wims_home/log/classes/$qclass\
      rm *.tmp
!endif


!!read adm/class/stat