Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/03/2024, à 20:15

geole

Encore un script pour sauvegarder les données des utilisateurs

Bonjour.
Il y a pas mal d outils permettant de sauvegarder les données des utilisateurs. Ils ont l'avantage d'être pratiques. Cependant, il reste possible d'utiliser les lignes de commandes. Cet échange a pour but de donner ma vision puis de le citer dans le tuto  pour aspect documentaire.

Voici les points  du cahier des charges.
   - Disposer d'une partition  contenant un double  le plus récent possible de la partition  de référence.
   - Disposer d'une partition  contenant les anciennes références consultables aisément (gigantesque corbeille)
   - Faire la sauvegarde en pénalisant le moins possible l'utilisateur.

Voici les moyens techniques utilisés.
   - Commandes rsync ne traitant pas  en un seul paquet mais en de multiples paquets avec pose entre chaque paquet.( Je vais retrouver une discussion où je montrais que  mon ordinateur était inutilisable pendant le rsync).
   - Utilisation des services systemd pour exécuter les lancements des sauvegardes.
        - Régulièrement ( chaque heure) ou  lorsque l'utilisateur choisit de se déconnecter. Ne sauvegarde que ses données modifiées.
         - A l'arrêt de l'ordinateur: Soit par mise en sommeil, par arrêt, par redémarrage.   Dans ce cas, sauvegarde de la totalité des données modifiées.
   -  Suivis  mis dans la partition à sauvegarder, dans les log système et à l'écran de l'utilisateur.
   -  Si dysfonctionnement des commandes RSYNC,  alerte à l'écran de l'utilisateur si présent et consultation possible des rapports  qui restent disponibles pendant une heure.


Voici le découpage  fait
    Un script  sous la responsabilité de root qui sauvegarde les données des utilisateurs qui ne sauvegardent pas eux-même leurs données.
   Un  script sous la responsabilité de l'utilisateur qui réalise lui-même sa sécurité.
Ce qui peut être amélioré fonctionnellement.
    - Les applications d'alerte à l'écran.
    - La récupération des variables de systemd.  Je ne sais pas faire la distinction entre une mise en sommeil,  un redémarrage ou un arrêt.   Sauf à faire des services distincts.
   - Savoir que le lancement est horaire est plutôt une astuce  abandonnée au profit d'un service distinct. Le lancement à la déconnexion est aussi paramétré.
    - Le suivi du fonctionnement fiable de systemd
              - Si le service est décrit oneshot et  qu'il se plante, la seule façon de  détecter son non-fonctionnement  est de constater  qu'il n'a pas informé qu'il allait nous  enquiquiner en faisant une sauvegarde.
              - Si le service est décrit simple, il peut redémarrer automatiquement.

Le gros raté. Je n'ai pas su trouver le moyen de lancer la sauvegarde  au changement d'utilisateur. Le palliatif à retenir est de se déconnecter.

Voici la partie système

#1) Créer le fichier contenant  les exclusions  des fichiers reliés directement au répertoire /home.
# Si ce fichier n'existe pas  dans un répertoire $HOME, tout ce répertoire $HOME est sauvegardé sauf les exclusions générales.
# Si ce fichier existe dans un répertoire $HOME, le réperttoire $HOME n'est pas sauvegardé car l'utilisateur a certainement mis en place sa propre sécurité. .

cat>/home/Filtre.txt<<EOF
.tmp                            
lost+found/
.Trash/
.cache/
Passage Rsync.log
Passage Rsync.d/
EOF

                                                                             
#2) Créer le fichier de paramétrage.

cat>/home/Rsync.par<<'EOF'
#!/bin/bash
######################################## Le paramétrage ######################################## 
   ##
Data=/home
   ## Le répertoire  de premier niveau à sauvegarder.   Il peut aussi être /Data  ou /media/Data
   ##  
Log1=/var/log/LOG-ROOT ; Log2=$Log1/Rsync.log 
##  Lieu de stockage des messages.  Le répertoire et le nom de fichier sont modifiables.   
    ##
Err=/tmp/Rsync-ROOT 
    ## lieu de stockage des  sorties Rsync pour consultation en cas de dysfonctionnement de la commande "RSYNC" et pas du reste.          
    ##   
Label1=homeSAV ; Sortie=/media/Savhome
    ##  Label de la partition de duplication des données du home et  son  point de montage.
    ##  Ils sont modifiables mais  éviter les espaces et les caractactères spéciaux. 
    ##  La partition peut être montée grace au fstab. Obligatoire si elle n'est pas locale
    ##  Si partition n'est pas montée, le script tente de la monter. Echec certain si elle n'est pas locale.   
    ##
Label2=homeOLD ; Suppression=/media/Oldhome
    ##  Label de la partition de stockage  des vieilles données du home et  son  point de montage.
    ##  Ils sont modifiables mais  éviter les espaces et les caractactères spéciaux. 
    ##  La partition peut être montée grace au fstab. Obligatoire si elle n'est pas locale
    ##  Si la partition n'est pas montée, le script tente de la monter. Echec certain si elle n'est pas locale.   
    ##     
Att1="HomeRsync va travailler."
Att2="Possibilité de perte de performance dans les accès disques!"
    ## Messages  d'informations modifiables. Limités  60 caractères
    ##  
Att3="HomeRsync a rencontré au moins une erreur. Veuillez consulter le répertoire $Err pour corriger."
    ## Message  signalant que la copie s'est mal déroulée. Modifiable.
    ## 
Epur1=.Old- ; Epur2=365 
    ## Suppprimer tous les fichiers sorties périmés ayant  une partie de nom   ".Old-"  et plus vieux de 365 jours.
    ##   
Rsync="rsync -ab  --suffix="$Epur1$(date +"%y%m%d%H")"  --exclude-from=$Data/Filtre.txt --stats --delete "
    ## Ce sont des choix personnels de la commande.  
    ##  -a   =>  recursive; copy symlinks as symlinks; preserve permissions; preserve modification times; preserve group; preserve owner; same as --devices --specials
    ##
    ##  -b  make backups (see --suffix & --backup-dir).
    ##      Dans un  contexte de sauvegarde automatique, cela me semble vital. On n'est pas à l'abri de supprimer  un répertoire par accident. Mếme si on s'en rend compte, il peut être trop tard si la sauvegarde se déclenche!
    ##
    ## Je n'ai pas mis l'option progress  qui liste  tout. J'aurais aimé une option de suivi qui, toutes les N minutes, affiche le fichier en cours de traitement.
    ##      J'ai donc fait un progess à ma sauce personnelle pour afficher  chaque traitement de répertoire de troisième niveau....
    ##
    ## Les statistiques sont simplifiées
    ##
    ##  On transfert ce qui est périmé dans un autre répertoire dont le point de montage est défini par la variable Suppression
    ##      
    ##
Repos=5
    ## Délai d'attente  en secondes entre le traitement de chaque répertoire de troisième niveau. 
    ## afin de minimiser les messages des applications graphiques disant qu'elles ne répondent pas et proposant de les tuer.
    ##
Suivi="Passage Rsync"
    ## Nom de suivi des passages de Rsync.      Un répertoire $Suivi.d   et un fichier S$uivi.log seront créés. 
    ##     
######################################## Fin du paramétrage ########################################
EOF
sleep 1
chmod +x /home/Rsync.par
grep -v "##" /home/Rsync.par

#3) Créer le script de sauvegarde et l'essayer. https://pro-domo.ddns.net/blog/tutoriel … ffrees.htm 

cat>/home/Rsync.sh<<'EOF'
#!/bin/bash
###
#### Initialisation
source  /home/Rsync.par
Epur3=$(echo $(date --date "$Epur2 day ago" "+%y%m%d%H")) # Date de fin de validité du suivi.
#      -mtime n
#              File's data was last modified less than, more than or exactly n*24 hours ago.  See the comments for -atime to understand how rounding affects the interpretation of file modification times.
#   Il faut malgré tout que je fasse la multipication par 24  pour un fonctionnement correct   Est-ce un bug de programation? de documentation? de compréhension?
Epur4=$(echo $((Epur2*24)))
function erreur() { if [ -f "$Err2" ]; then cat "$Err2" >>$Log2 ; cat "$Err2" >>$Err/erreurs.txt; grep Number "$Err1" >>$Log2; fi;}
function Epurer() {  while read M1 M2 M3 M4; do if [ $M4 -gt $Epur3 ];  then  echo $M1 $M2 $M3 $M4 >>$Err/Epur5; fi; done <"$1"; cp $Err/Epur5 "$1" ; rm -f /$Err/Epur5;  echo Traitement Rsync le $(date +"%y%m%d%H")>>"$1"; }
shopt -s globstar
rm -rf $Err; sleep 1; mkdir  $Err ; #### chown :sudo $Err ; chmod 770 $Err
#
#### Quelques contrôles.  Quel utilisateur bosse ?
MOI=$(loginctl list-users | head -2 | tail -1)
IDn=$(echo $MOI | cut -d" " -f1) ; IDx=$(echo $MOI | cut -d" " -f2) ;  
#   Quelques variables importantes.....
if [ -z "$Epur1" ];  then sudo -u $IDx  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$IDn/bus notify-send "Le filtre d'épuration n'est pas défini ('\$Epur1')."  "Risque de tout supprimer.";  exit ; fi
if [ -z "$Log2" ];  then  sudo -u $IDx  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$IDn/bus notify-send "Le lieu de stockage des Logs n'est pas défini ('\$Log2')."  "Risque de  ne rien voir.";  exit ; fi
if [ -z "$Data" ];  then  sudo -u $IDx  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$IDn/bus notify-send "Le répertoire à traiter  n'est pas défini ('\$Data')."  "Risque de ne rien sauvegarder.";  exit ; fi
rm -rf "$Err" ; mkdir -p "$Err" ;
Mount1=0 ; Mount2=0 ; 
if [ ! -d "$Log1" ];then mkdir "$log1"  ; touch $Log2; fi
if [ ! -d "$Sortie" ];then mkdir "$Sortie"  1>>$Log2 2>>$Log2 ; fi
if [ ! "$(mountpoint $Sortie)" = "$Sortie est un point de montage" ]; then echo "La partition $Sortie n'est pas montée " 1>>$Log2 ; mount -v /dev/disk/by-label/$LABEL1 $Sortie 1>>$Log2 2>>$Log2;
   if [ ! "$(mountpoint $Sortie)" = "$Sortie est un point de montage" ] ; then echo "La partition $Sortie ne peut pas se monter"  1>>$Log2   ; exit 1 ; else Mount1=1;  fi ; fi
if [ ! -d "$Suppression" ];then mkdir "$Suppression"  1>>$Log2 2>>$Log2 ; fi    
if [ ! "$(mountpoint $Suppression)" = "$Suppression est un point de montage" ]; then echo "La partition $Suppression n'est pas montée " 1>>$Log2 ; mount -v /dev/disk/by-label/$LABEL2 $Suppression 1>>$Log2 2>>$Log2;
   if [ ! "$(mountpoint $Suppression)" = "$Suppression est un point de montage" ] ; then echo "La partition $Suppression ne peut pas se monter"  1>>$Log2   ; exit 1 ; else Mount2=1;  fi ; fi   
if [ ! -d $Sortie/"$Data" ];then if [ $(ls -1 -a | wc -l)   -gt 2 ]; then echo "la partition montée contient $(ls -1 -a | wc -l) entrées de premier niveau mais pas home. Celui-ci va être créé." >>$Log2 ; mkdir -v $Sortie"$Data" 1>>$Log2 2>>$Log2; fi ; fi;
#
#### Quel Type d'activation?
# Si activation par timer, on prend des poses, sinon,  on va le plus vite possible.
A=$(systemctl status HomeRsync.timer | head -3 | tail -1);
if [ "$Cause" = "Arrêt" ]; then
   echo ========== Lancement pour cause arrêt machine de HomeRsync le $(date +"%y%m%d%H%M").  | tee -a /dev/kmsg 2>>$Log2 ; 
   echo ========== Lancement pour cause arrêt machine de HomeRsync le $(date +"%y%m%d%H%M").  >>$Log2 ; 
   echo Pour information $A >>$Log2 ;
   Repos=0
fi
###if [[ $A  =~  running ]]; then  ##### NOta cette commande fonctionne bien, Mais autre choix fait
if [ "$Cause" = "Cyclique" ]; then
   #  if [ $IDn   -gt 999 ]; then 
   wall  "$Att1 $Att2" ;
   echo ========== Lancement  cyclique de HomeRsync le $(date +"%y%m%d%H%M").  | tee -a /dev/kmsg 2>>$Log2 ; 
   echo ========== Lancement  cyclique de HomeRsync  avec  utilisateur $IDx et N° utilisateur $IDn  connecté.>>$Log2 ;
   sudo -u $IDx  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$IDn/bus notify-send  "$Att1"  "$Att2" --icon=dialog-warning;
   ##### https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html#guidelines
   # fi       
fi
#
#### Traitement des répertoires de premier niveau.
find $Data -mindepth 1 -maxdepth 1 ! -empty -type d -print0 | while IFS='' read -r -d '' My ;
   do   
      # Vérifions que la sauvegarde est bien voulue.
      if [ -f "$My/Filtre.txt" ];then echo Fichier Filtre  présent. Pas de sauvegarde  pour $My>> "$Log2"; else
         ID1=$(echo $My|cut   -d"/" -f3)
         echo Sauvegarde cyclique le $(date +"%y%m%d%H") >>"/$Data"/$ID1/"Passage Rsync.log"
         # Si l'utilisateur n'existe pas, on le fabrique.
         if [ ! -d  "$Sortie$My" ]     ; then mkdir -pv "$Sortie$My"      1>>$Log2 2>>$Log2; chown "$ID1":"$ID1" "$Sortie$My"      1>>$Log2 2>>$Log2;  fi;  
         if [ ! -d  "$Suppression$My" ]; then mkdir -pv "$Suppression$My" 1>>$Log2 2>>$Log2; chown "$ID1":"$ID1" "$Suppression$My" 1>>$Log2 2>>$Log2;  fi;
         mkdir  $Err/$(echo $My | cut -d"/" -f3)   1>>$Log2 2>>$Log2;
         find $My -mindepth 1 -maxdepth 1 ! -empty -type d -print0 | while IFS='' read -r -d '' Dir ;     
             do
                # On ne sauvegarde pas les répertoires exclus
                Dir1=$(echo "$Dir"|cut   -d"/" -f4)  
                BB=$(echo $(grep "$Dir1/"  "$Data"/Filtre.txt)); 
                if [ -z "$BB" ] ; then
                   echo ========== Le $(date +"%y%m%d%H%M").  traitement de $Dir>>$Log2  ;
                   echo Traitement de $Dir | tee -a /dev/kmsg 2>>$Log2; 
                   # Si le repertoire n'existe pas, on le fabrique.
                   if [ ! -d "$Sortie$Dir" ]     ; then mkdir  "$Sortie$Dir"     1>>$Log2 2>>$Log2; chown "$ID1":"$ID1" "$Sortie$Dir"      1>>$Log2 2>>$Log2; fi;
                   if [ ! -d "$Suppression$Dir" ]; then mkdir "$Suppression$Dir" 1>>$Log2 2>>$Log2; chown "$ID1":"$ID1" "$Suppression$Dir" 1>>$Log2 2>>$Log2; fi;        
                   if [ $Repos -gt 0 ];  then find "$Suppression$Dir" -type f  -name "*$Epur1*" -mtime +$Epur4 -exec rm -v {} 1>>$Log2 2>>$Log2 \\; fi;          
                   Err1="$Err$(echo $Dir | cut -b6- ).1";   Err2="$Err$(echo $Dir | cut -b6- ).2";    
                   echo    $Rsync --backup-dir=$Suppression"$Dir/"     '"'$Dir/'"'  '"'$Sortie$Dir'"'   >"$Err1"         
                   $Rsync --backup-dir=$Suppression"$Dir/"              "$Dir/"      "$Sortie$Dir"   1>>"$Err1" 2>"$Err2"     
                   erreur ; sleep  $Repos      
                   if [ ! -d  "$My/$Suivi".d ];then mkdir -pv "$My/$Suivi".d ;chown "$ID1":"$ID1" "$My/$Suivi".d;
                   echo  Création Rsync le $(date +"%y%m%d%H") > "$My/$Suivi".d/"$Suivi".log; 
                      chown "$ID1":"$ID1"  "$My/$Suivi".d/"$Suivi".log
                      echo Création  Rsync le $(date +"%y%m%d%H") > "$My/$Suivi".log; 
                      chown "$ID1":"$ID1"  "$My/$Suivi".log
                      Epurer "$My/$Suivi".d/"$Suivi".log ; sleep  $Repos
                   fi;   
               fi;
             done                                                
         #### Traitement des fichiers. 
         echo ========== Le $(date +"%y%m%d%H%M") traitement des fichiers de $ID1 >>$Log2 ; 
         echo traitement des fichiers de $ID1 | tee -a /dev/kmsg 2>>$Log2 ;
         Err1=$Err/$(echo $My | cut -b7-)/TRTFICS.1; Err2=$Err/$(echo $My | cut -b7-)/TRTFICS.2
         echo rsync -blptgod  --suffix='"'.Old$(date +'"'-%y%m%d%H'"')'"' --exclude-from=$Data/Filtre.txt --backup-dir=$Suppression$My --stats   $My/  $Sortie$My >$Err1
         rsync -blptgod --suffix=".Old$(date +"-%y%m%d%H")" --exclude-from=$Data/Filtre.txt --backup-dir=$Suppression$My --stats --delete $My/ $Sortie$My 1>>$Err1 2>$Err2;
         erreur ; sleep  $Repos
         Epurer $My/"$Suivi".log        
         sleep  $Repos
         #
         if [ $Repos   -gt 0 ];  then 
            find $Suppression$My -mindepth 1 -maxdepth 1 -type f -name "*$Epur1*"  -mtime +$Epur4 -exec rm -v {} 1>>$Log2 2>>$Log2 \\;
            #### Des comptages.
            echo ========== Le $(date +"%y%m%d%H%M") Exécution des comptages fichiers de $ID1 >>$Log2 ; 
            echo Exécution des comptages fichiers de $ID1| tee -a /dev/kmsg 2>>$Log2; 
            for i in $My/*;         do echo -n "$i : " ; find "$i" | wc -l; done | sort -n -k3 | tail -8 | column -t >>$Log2 
            sleep  $Repos 
            for i in $Sortie$My/*; do echo -n "$i : " ; find "$i" | wc -l; done | sort -n -k3 | tail -8 | column -t >>$Log2
            sleep  $Repos
         fi;
      fi;  
   done  
#
#### Traitement final.   
echo ========== Le $(date +"%y%m%d%H%M").  traitement des fichiers  de $Data>>$Log2  ;
Err1=$Err/TRTFIC.1;Err2=$Err/TRTFIC.2
echo rsync -blptgod --suffix=".Old$(date +"-%y%m%d%H")" --exclude-from=$Data/Filtre.txt --backup-dir=$Suppression"$Data"/ --stats --delete "$Data"/  $Sortie"$Data"  >"$Err1"  
rsync -blptgod --suffix=".Old$(date +"-%y%m%d%H")"  --exclude-from=$Data/Filtre.txt --backup-dir=$Suppression"$Data"/ --stats --delete "$Data"/  $Sortie"$Data"  1>>"$Err1" 2>"$Err2"
erreur
if [ ! -f  "/Data/$Suivi".log ];then  echo Création  Rsync le $(date +"%y%m%d%H") > "$Data/$Suivi".log; fi;
Epurer "$Data/$Suivi".log
if [ $Repos   -gt 0 ];  then find $Suppression"/$Data"/ -mindepth 1 -maxdepth 1 -type f -name "*$Epur1*"  -mtime +$Epur4 -exec rm -v {} 1>>$Log2 2>>$Log2 \\; fi;
echo ========== Le $(date +"%y%m%d%H%M") Fin de traitement >>$Log2 ;
if [ $Mount1   -eq  1 ]; then  umount -v /dev/disk/by-label/$LABEL1 1>>$Log2 2>>$Log2 ; fi
if [ $Mount2   -eq  1 ]; then  umount -v /dev/disk/by-label/$LABEL2 1>>$Log2 2>>$Log2 ; fi
if [ $Repos   -gt 0 ];  then if [ -s $Err/erreurs.txt ]; then sudo -u $IDx DISPLAY=:0 zenity --error --text "$Att3"; fi ;fi;
echo Fin de traitement | tee -a /dev/kmsg 2>>$Log2;
EOF  
sleep 1
chmod +x /home/Rsync.sh
#cat /home/Rsync.sh
##Cause=Arrêt
Cause=Cyclique
export Cause
/home/Rsync.sh

#4) Créer un fichier service  pour arrêt ordinateur.

#rm  /etc/systemd/system/HomeRsynd.service
cat >/etc/systemd/system/HomeRsynd.service<<EOF
[Unit] 
Description=Duplication du HOME des utilisateurs n'ayant pas  installé de sauvegarde.
DefaultDependencies=no
Before=shutdown.target sleep.target 
[Service]
ExecStartPre=echo  "Sauvegardes suite à arrêt de l'ordinateur."  | sudo tee -a  /dev/kmsg
Type=oneshot
Environment="Cause=Arrêt"
ExecStart=/home/Rsync.sh
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=15minutes
#### Durée exécution avant plantage      
[Install]
WantedBy=shutdown.target sleep.target
EOF
sleep 1

#5) Activer le service.

systemctl stop HomeRsynd.service ; systemctl disable HomeRsynd.service;systemctl daemon-reload;
systemctl enable HomeRsynd.service
systemctl --no-pager -l status HomeRsynd.service

#6) Facultatif: Vérifier  et lister les dépendances.

systemctl --no-pager cat HomeRsynd #; systemctl --no-pager show HomeRsynd
systemctl --no-pager  list-dependencies HomeRsynd ; systemctl --no-pager  list-dependencies HomeRsynd --reverse     

#7) Essayer le service
#Dans un terminal, le lancer.

systemctl start HomeRsynd.service

#Dans un  terminal, suivre son exécution.

watch -n 1 systemctl status HomeRsynd

#8) Facultatif: Voir l'exécution des commandes RSYNC pendant l'arrêt de  l'ordinateur.
Il faut déactiver le masquage des traces de mise en route et d'arrêt de  l'ordinateur.

sed -i 's/quiet splash/ /' /etc/default/grub
update-grub

#9) Créer le service cyclique.

#rm  /etc/systemd/system/HomeRsync.service
cat >/etc/systemd/system/HomeRsync.service<<EOF
Description=Duplication des données de l'ordinateur.
DefaultDependencies=no
[Service]
Type=simple
Restart=always
RestartSec=1 hour 5 minutes 10 seconds
Environment="Cause=Cyclique"
ExecStartPre=echo  "Suivi des sauvegardes cycliques de l'ordinateur" | sudo tee -a  /dev/kmsg
ExecStart=/home/Rsync.sh
ExecStopPost=echo  "Suivi des sauvegardes cycliques de l'ordinateur".  La sauvegarde est terminée.  | sudo tee -a  /dev/kmsg
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=1hour
EOF
sleep 1

#10) Activer le service.

systemctl stop HomeRsync.service ; systemctl disable HomeRsync.service;systemctl daemon-reload;
systemctl enable HomeRsync.service
systemctl start  HomeRsync.service
systemctl --no-pager status HomeRsync.service

#11) Paramètrer le service.

cat>/etc/systemd/system/HomeRsync.timer<<EOF
[Unit]
Description=Lance une sauvegarde des données des utilisateurs imprévoyants toutes les  heures 10 minutes et 20 secondes. 
[Timer]
OnActiveSec=40min 20 sec
### Va démarrer dans 30 minutes.
OnUnitActiveSec=1hour 10 minutes 20 seconds
[Install]
WantedBy=timers.target
EOF
sleep 1
systemctl stop   HomeRsync.timer ; systemctl disable HomeRsync.timer ; systemctl daemon-reload
systemctl enable HomeRsync.timer ; systemctl start   HomeRsync.timer ; 
systemctl status -l HomeRsync.timer  

#12) Penser à l'épuration.

cat >/etc/logrotate.d/homeRsync<<EOF 
/var/log/LOG-ROOT/Rsync.log {
rotate 14
daily
missingok
notifempty
nocompress #compress
}
EOF
logrotate -f /etc/logrotate.conf
ls -ls /var/log/LOG-ROOT

#13) Un suivi rapide du fonctionnement.

grep ====== /var/log/LOG-ROOT/*.log
journalctl --no-pager -g ==========

#14) La déinstallation.

systemctl stop HomeSync.service; systemctl disable HomeSync.service; systemctl disable HomeSynd.service
systemctl stop HomeSync.timer; systemctl disable HomeSync.timer
systemctl daemon-reload
find / -xdev -name "HomeSync*"

Espérons que les copier/coller  se sont bien passés.

Exemple de suivi

Lancement pour cause arrêt machine de HomeRsync le mar. 05 mars 2024 17:32:35 CET.
========== Le mar. 05 mars 2024 17:32:35 CET traitement de /home/a
========== Le mar. 05 mars 2024 17:32:35 CET traitement de /home/a/.john
========== Le mar. 05 mars 2024 17:32:35 CET traitement de /home/a/Bureau
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/Mon Bureau
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/.config
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/snap
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/ventoy-1.0.87
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/.gnupg
========== Le mar. 05 mars 2024 17:32:36 CET traitement de /home/a/Mon repertoire
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Documents
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Images
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Maildir
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Musique
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Public
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/Passage Rsync.d
========== Le mar. 05 mars 2024 17:32:37 CET traitement de /home/a/.shutter
========== Le mar. 05 mars 2024 17:32:38 CET traitement de /home/a/Messagerie
========== Le mar. 05 mars 2024 17:32:38 CET traitement de /home/a/.cache
========== Le mar. 05 mars 2024 17:32:43 CET traitement de /home/a/.local
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/a/Suivi Rsync
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/a/.gphoto
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/a/Connexion
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/a/.mozilla
========== Le mar. 05 mars 2024 17:32:57 CET traitement des fichiers de a
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/b
========== Le mar. 05 mars 2024 17:32:57 CET traitement de /home/b/.config
========== Le mar. 05 mars 2024 17:33:13 CET traitement de /home/b/snap
========== Le mar. 05 mars 2024 17:33:14 CET traitement de /home/b/Maildir
========== Le mar. 05 mars 2024 17:33:14 CET traitement de /home/b/Musique
========== Le mar. 05 mars 2024 17:33:16 CET traitement de /home/b/Passage Rsync.d
========== Le mar. 05 mars 2024 17:33:16 CET traitement de /home/b/.cache
========== Le mar. 05 mars 2024 17:33:18 CET traitement de /home/b/.local
========== Le mar. 05 mars 2024 17:33:18 CET traitement de /home/b/Suivi Rsync
========== Le mar. 05 mars 2024 17:33:18 CET traitement des fichiers de b
========== Le mar. 05 mars 2024 17:33:18 CET traitement de /home/enfants
========== Le mar. 05 mars 2024 17:33:18 CET traitement de /home/enfants/.config
========== Le mar. 05 mars 2024 17:33:19 CET traitement de /home/enfants/snap
========== Le mar. 05 mars 2024 17:33:20 CET traitement de /home/enfants/Documents
========== Le mar. 05 mars 2024 17:33:20 CET traitement de /home/enfants/Passage Rsync.d
========== Le mar. 05 mars 2024 17:33:20 CET traitement de /home/enfants/.cache
========== Le mar. 05 mars 2024 17:33:20 CET traitement de /home/enfants/.local
========== Le mar. 05 mars 2024 17:33:20 CET traitement de /home/enfants/Suivi Rsync
========== Le mar. 05 mars 2024 17:33:21 CET traitement des fichiers de enfants
========== Le mar. 05 mars 2024 17:33:21 CET Fin de traitement
Lancement homeRysnc le mar. 05 mars 2024 17:36:15 CET pour cause de déconnexion de l'utilisateur: a.
========== Le mar. 05 mars 2024 17:36:15 CET traitement de /home/a
========== Le mar. 05 mars 2024 17:36:16 CET traitement de /home/a/.john
========== Le mar. 05 mars 2024 17:36:17 CET traitement de /home/a/Bureau
========== Le mar. 05 mars 2024 17:36:17 CET traitement de /home/a/Mon Bureau
========== Le mar. 05 mars 2024 17:36:17 CET traitement de /home/a/.config
========== Le mar. 05 mars 2024 17:36:20 CET traitement de /home/a/snap
========== Le mar. 05 mars 2024 17:36:34 CET traitement de /home/a/ventoy-1.0.87
========== Le mar. 05 mars 2024 17:36:35 CET traitement de /home/a/.gnupg
========== Le mar. 05 mars 2024 17:36:35 CET traitement de /home/a/Mon repertoire

Exemple de vieux fichiers. Pas besoin d'aller consulter  36 répertoires... du jour, de la semaine, du mois.

a@p:/media/Oldhome/home/a$ 
a@p:/media/Oldhome/home/a$ ls -als .bash*
24 -rw------- 1 root root 21937 mars   2 14:47 .bash_history.H0T9Hk.OLD-24030214
28 -rw------- 1 a    a    24673 févr. 29 19:52 .bash_history.OLD-24030118
32 -rw------- 1 a    a    28943 mars   1 18:32 .bash_history.OLD-24030119
28 -rw------- 1 a    a    27066 mars   1 19:54 .bash_history.OLD-24030213
24 -rw------- 1 a    a    22643 mars   2 13:46 .bash_history.OLD-24030214
24 -rw------- 1 a    a    21937 mars   2 14:47 .bash_history.OLD-24030219
20 -rw------- 1 a    a    20259 mars   2 19:09 .bash_history.OLD-24030314
12 -rw------- 1 a    a    11277 mars   3 14:15 .bash_history.OLD-24030315
20 -rw------- 1 a    a    17716 mars   3 15:12 .bash_history.OLD-24030316
20 -rw------- 1 a    a    17623 mars   3 16:57 .bash_history.OLD-24030317
20 -rw------- 1 a    a    17574 mars   3 17:34 .bash_history.OLD-24030318
24 -rw------- 1 a    a    21443 mars   3 18:10 .bash_history.OLD-24030319
20 -rw------- 1 a    a    20226 mars   4 14:50 .bash_history.OLD-24030414
24 -rw------- 1 a    a    22290 mars   4 15:31 .bash_history.OLD-24030415
24 -rw------- 1 a    a    22244 mars   4 15:37 .bash_history.OLD-24030417
20 -rw------- 1 a    a    20399 mars   4 17:01 .bash_history.OLD-24030500
24 -rw------- 1 a    a    20770 mars   4 23:49 .bash_history.OLD-24030512
24 -rw------- 1 a    a    22085 mars   5 12:18 .bash_history.OLD-24030516
24 -rw------- 1 a    a    21879 mars   5 17:21 .bash_history.OLD-24030517
a@p:/media/Oldhome/home/a$

Lste des passages

a@p:~$ cat 'Passage Rsync.log'
Traitement Rsync le 24030512
Traitement Rsync le 24030513
Traitement Rsync le 24030513
Traitement Rsync le 24030513
Traitement Rsync le 24030514
Traitement Rsync le 24030515
Traitement Rsync le 24030515
Traitement Rsync le 24030516
Traitement Rsync le 24030516
Traitement Rsync le 24030516
Traitement Rsync le 24030516
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
Traitement Rsync le 24030517
a@p:~$ 

Dernière modification par geole (Le 24/03/2024, à 18:39)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#2 Le 05/03/2024, à 20:25

calimero

Re : Encore un script pour sauvegarder les données des utilisateurs

Bonjour & merci du post Geole.
C'est toujours intéressant de connaitre des scripts pour la sauvegarde et c'est très gentil de partager les tiens


But we've got to verify it legally to see...to see? If she...if she? Is Morally, Ethic'lly, Spiritually, Physically, Positively, Absolutely, Undeniably and Reliably Dead!
Munchkin's Mayor Council

Hors ligne

#3 Le 05/03/2024, à 21:33

Watael

Re : Encore un script pour sauvegarder les données des utilisateurs

un détail :

cat <<eof > fichier
bla 
bla
eof

de la même façon qu'on écrirait cat fic1 >fic2


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 06/03/2024, à 11:50

geole

Re : Encore un script pour sauvegarder les données des utilisateurs

Bonjour Watael
Pas de chance, cela ne résout pas le problème

a@p:~$ cat <<eof > fichier
b$la 
b\$la
eof
cat fichier
b 
b$la
a@p:~$ 

Nota:  Je vais faire un second jet en faisant tout en service  utilisateur et supprimer le service utilisateur du premier jet. Cela va grandement simplifier les scripts car le panachage a été pénible et je ne veux plus le compliquer pour tester le doublonnage.
J'en profiterais pour encadrer toutes les variables non  numériques par des quotes. il y en a encore quelques-unes d'oubliées.
J'aime bien  ne pas encadrer une variable numérique. Cela permet de la repérer facilement.


N'y aurait-il pas une règle disant par exemple qu'il est souhaitable que  les variables numériques commencent  par  N,   que les variables susceptibles de contenir des espaces commencent pas  S, que les variables contenant des dates, commencent par D, que les...

Dernière modification par geole (Le 06/03/2024, à 11:51)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#5 Le 06/03/2024, à 14:58

Watael

Re : Encore un script pour sauvegarder les données des utilisateurs

je ne prétend pas que ça résoud un problème (je n'ai même pas vu s'il y avait un problème hmm).

si la n'est pas définie, que veux-tu qu'il soit affiché ?

$ v=foo\ \ bar
$ cat <<eof
b "$v"
b \$v
eof
b foo  bar
b $v
$

Dernière modification par Watael (Le 06/03/2024, à 14:58)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 06/03/2024, à 18:22

geole

Re : Encore un script pour sauvegarder les données des utilisateurs

Je ne veux pas que  le contenu de la variable v soit affiché. je veux que les  quatre caractères de la première ligne soient écrits tels qu'ils sont  vus.       Un fonctionnent   un peu comme une commande cp  que tu cites en référence qui n'altère pas le contenu des fichiers.

En clair, ce qui est écrit.   

J'ai trouvé une astuce en mettant un caractère parasite devant,   Mais, de  temps en temps,   j'oublie de le mettre.

Je cherche une option   à cette commande qui dirait que le caractère $ est un caractère aussi banal que les autres et que tenter de faire une interprétation est malvenu.

La sortie de la commande  devrait  être la seconde ligne de ta liste sans que je sois obligé de frapper un antislash.
Je n'ai pas trouvé d'option dans la commande cat  qui empêche l'interprétation, et  je n'ai pas su trouver  une option globale temporaire empêchant cette interprétation, le  temps d'exécuter la commande cat

Nota,  s'il existe une option qui mettrait systématiquement $v entre quotes  avec comme résultat "$v" pour respecter les bonnes règles,  je suis preneur.


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#7 Le 06/03/2024, à 20:14

Watael

Re : Encore un script pour sauvegarder les données des utilisateurs

$ v=foo\ \ bar
$ cat <<'eof'
b$v
eof
b$v
$

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 06/03/2024, à 22:19

geole

Re : Encore un script pour sauvegarder les données des utilisateurs

Merci pour la solution........... Dans les exemples que j'ai cherché dans internet, je n'ai pas eu la chance de voir eof entre simple quote.

Dernière modification par geole (Le 06/03/2024, à 22:22)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#9 Le 07/03/2024, à 09:03

bruno

Re : Encore un script pour sauvegarder les données des utilisateurs

C'est normal si tu cherches des exemples plutôt que de lire la doc officielle wink
https://www.gnu.org/software/bash/manua … -Documents


Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#10 Le 24/03/2024, à 19:15

geole

Re : Encore un script pour sauvegarder les données des utilisateurs

Voici maintenant la déclinaison si un utilisateur veut prendre en charge lui-même sa propre sécurité.
Les services seront alors installés chez lui.   Les statistiques seront chez lui  et plus dans /var. Ses données ne  seront plus sauvegardées par le script général de root.

#1) Créer le fichier des exclusions.
# Lorsque le fichier n'existe pas, le script général, sauvegarde les données de l'utilisateur. On peut le créer vide.

cat>$HOME/Filtre.txt<<EOF
.tmp                            
lost+found/
.Trash/
.cache/
Passage_Rsync.log*
*.iso
Divers/d*
Divers/fic*a.txt
snap/firefox/common/.cache/
EOF

# Les fichiers "Passage Rsync.log1" contiennent les commanders et les statistiques du dernier passage. Le fichier "Passage Rsync.log2" contient les erreurs  du dernier passage.   Le fichier "Passage Rsync.log3" contient les  statistiques de tous les passages.
# Mon avis.  Est-il utile d'interdire de sauvegarder des répertoires?
# Je n'ai pas réussi à  interdire la sauvegarde si je mets plusieurs niveaux. (les trois derniers cas).
# NOTA. Les exclusions sur deux niveaux ne fonctionnent pas
                                                                                         
#2) Créer le fichier de paramétrage.

cat<<'EOF'>$HOME/Rsync.par
#!/bin/bash
######################################## Le paramétrage ######################################## 
   ##
Data=$HOME
   ## Le répertoire de l'utilisateur. Il peut aussi être /Data/$USER  ou /media/Data/$USER
   ##   
Suivi="Passage_Rsync" 
    ## Partie de nom des fichiers et répertoires de suivi du passage des sauvegardes.      
    ##  
EpurSuivi=3 
    ## Nombre de jours de conservation des traces de suivi du passage des sauvegardes.      
    ##    
Label1=homeSAV ; Sortie=/media/Savhome
    ##  Label de la partition de duplication des données du home et  son  point de montage.
    ##  Ils sont modifiables mais  éviter les espaces et les caractactères spéciaux. 
    ##  La partition peut être montée grace au fstab. Obligatoire si elle n'est pas locale
    ##  Si partition n'est pas montée, le script tente de la monter. Echec certain si elle n'est pas locale.   
    ##
Label2=homeOLD ; Suppression=/media/Oldhome
    ##  Label de la partition de stockage  des vieilles données du home et  son  point de montage.
    ##  Ils sont modifiables mais  éviter les espaces et les caractactères spéciaux. 
    ##  La partition peut être montée grace au fstab. Obligatoire si elle n'est pas locale
    ##  Si partition n'est pas montée, le script tente de la monter. Echec certain si elle n'est pas locale.   
    ##      
Att1="HomeRsync va travailler."
Att2="Possibilité de perte de performance dans les accès disques!"
    ## Messages  d'information modifiables. Mais limités à 60 caractères
    ##  
Att3="HomeRsync a rencontré au moins une erreur. Veuillez consulter le fichier $Suivi.log2 pour corriger."
    ## Message  signalant que la copie s'est mal déroulée. Modifiable.
    ## 
Epur1=.OLD- ; Epur2=3  #66  
    ## Suppprimer tous les fichiers sorties périmés ayant  une partie de nom ".OLD-" et plus vieux de 3 #66 jours.
    ##   
Rsync="rsync -ab  --suffix="$Epur1$(date +"%y%m%d%H")" --stats --delete "
    ## Ce sont des choix personnels de la commande.  
    ##  -a   =>  recursive; copy symlinks as symlinks; preserve permissions; preserve modification times; preserve group; preserve owner; same as --devices --specials
    ##
    ##  -b  make backups (see --suffix & --backup-dir).
    ##      Dans un  contexte de sauvegarde automatique, cela me semble vital. On n'est pas à l'abri de supprimer  un répertoire par accident. Mếme si on s'en rend compte, il peut être trop tard si la sauvegarde se déclenche!
    ##
    ## Je n'ai pas mis l'option progress  qui liste  tout. J'aurais aimé une option de suivi qui, toutes les N minutes, affiche le fichier en cours de traitement.
    ##      J'ai donc fait un progress à ma sauce personnelle pour afficher  chaque traitement de répertoire de troisième niveau....
    ##
    ## Les statistiques sont simplifiées.
    ##
    ## On transfert ce qui est périmé dans un autre répertoire dont le point de montage est défini par la variable Suppression
    ##      
    ##
Repos=5
    ## Delai d'attente  en secondes entre le traitement de chaque répertoire de troisième niveau. 
    ## afin de minimiser les messages des applications graphiques disant qu'elles ne répondent pas et proposant de les tuer.
    ##    
######################################## Fin du paramétrage ########################################
EOF
sleep 1
chmod +x $HOME/Rsync.par
grep -v "##" $HOME/Rsync.par

#3) Créer et essayer le script de sauvegarde.  

 
cat<<'EOF'>$HOME/Rsync.sh
#!/bin/bash
###
#### Initialisation.
source  $HOME/Rsync.par
Log=$Data/$Suivi
Epur3=$(echo $(date --date "$Epur2 day ago" "+%y%m%d%H%M")) # Date de fin de validité des vieux fichiers.
#      -mtime n
#              File's data was last modified less than, more than or exactly n*24 hours ago.  See the comments for -atime to understand how rounding affects the interpretation of file modification times.
#   Il faut malgré tout que je fasse la multipication par 24  pour un fonctionnement correct. Est-ce un bug de programation? de documentation? de compréhension?
Epur4=$(echo $((Epur2*24)))
Suiv3=$(echo $(date --date "$EpurSuivi day ago" "+%y%m%d%H%M")) # Date de fin de validité de lignes de suivi des sauvegardes
#### Quelques contrôles.
if [ -z "$Epur1" ];  then  echo "Le filtre d'épuration n'est pas défini ('\$Epur1'). Risque de tout supprimer." >>"$Log"-0.log ; fi
if [ -z "$Suivi" ];  then  echo "Le lieu de stockage des Logs n'est pas défini ('\$suivi'). Risque de  ne rien voir." >>"$Log"-0.log; fi
if [ -z "$Data" ];   then  echo "Le répertoire à traiter  n'est pas défini ('\$Epur1').  Risque de ne rien sauvegarder." >>"$Log"-0.log; fi
if [ ! -d "$Sortie" ];then echo Le répertoire "$Sortie" est absent   >>"$Log"-0.log ; fi
if [ ! "$(mountpoint $Sortie)" = "$Sortie est un point de montage" ]; then echo "La partition $Sortie n'est pas montée " >>"$Log"-0.log ; fi 
if [ ! -d "$Suppression" ];then echo Le répertoire  "$Suppression"  est absent >>"$Log"-0.log ; fi    
if [ ! "$(mountpoint $Suppression)" = "$Suppression est un point de montage" ]; then echo "La partition $Suppression n'est pas montée " >>"$Log"-0.log ; fi  
if [ ! -f "$Data/Filtre.txt" ];then echo Le fichier Filtre est absent. Sauvegarde  faite par le script administrateur >>"$Log"-0.log ; fi 
if [ -f "$Log"-0.log ];then DISPLAY=:0 zenity --error --text "Des erreurs graves ont été rencontrées. Pas de sauvegarde exécutée. Consulter le fichier "$Log"-0.log. Corrigez et supprimez-le.";  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send  "$Att1"  "$Att2" --icon=dialog-warning;exit;fi
#             
####          
if [ ! -d "$Sortie/$Data/$USER" ]; then echo "la partition $Sortie contient $(ls "$Sortie"  -1 -a | wc -l) entrées  mais pas $DATA/$USER. Celui-ci va être créé." >>"$Log"-1.log ; mkdir -pv "$Sortie$Data/$USER" 1>>"$Log"-1.log 2>>"$Log"-1.log; fi
if [ ! -d "$Suppression/$Data/$USER" ]; then echo "la partition $Suppression contient $(ls "$Suppression" -1 -a | wc -l) entrées  mais pas $DATA/$USER. Celui-ci va être créé." >>"$Log"-1.log ; mkdir -pv "$Suppression$Data/$USER" 1>>"$Log"-1.log 2>>"$Log"-2.log; fi  
#
#### Quel type de traitement ? 
if [[ $Cause = "Fermeture" ]]; then Repos=0 ; fi
if [[ $Cause = "Cyclique"  ]]; then  #DISPLAY=:0 zenity --notification --text   "$Att1  $Att2";
   DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$gid/bus notify-send  "$Att1"  "$Att2" --icon=dialog-warning; fi
echo Passage $Cause $(date +"%y%m%d%H%M") >>"$Data/$Suivi"-3.log
#
##### Traitement des répertoires.
find "$Data" -mindepth 1 -maxdepth 1 ! -empty -type d -print0 | while IFS='' read -r -d '' Dir ;
do
   # On ne sauvegarde pas les répertoires exclus
   Dir1=$(echo "$Dir"|cut   -d"/" -f4)  
   BB=$(echo $(grep "$Dir1/"  "$Data"/Filtre.txt)); 
   if [ -z "$BB" ] ; then    
      echo ========== Le $(date +"%y%m%d%H%M")  traitement de $Dir>>"$Dir/$Suivi"-1.log  ; 
      # Si les repertoires sorties n'existent pas, on les fabrique.
      if [ ! -d  "$Sortie$Dir" ]     ;then mkdir  "$Sortie$Dir" ; fi;
      if [ ! -d  "$Suppression$Dir" ];then mkdir  "$Suppression$Dir" ; fi;         
      Err1="$Data/$(echo $Dir | cut -d"/" -f4 )/$Suivi-1.log";   
      # Epuration de très vieilles données.                 
      if [ $Repos   -gt 0 ];  then find "$Suppression$Dir" -type f  -name "*$Epur1*" -mtime +$Epur4 -exec rm -v {} 1>>"$Err1" ; sleep $Repos; fi
      ### Je ne collecte pas les erreurs pour éviter cette capture (find: paramètre manquant pour « -exec ») lorsque  rien n'est à supprimer. 
      # Sauvegarde       
      echo    $Rsync --backup-dir=$Suppression"$Dir/" --exclude-from=$Data/Filtre.txt '"'$Dir/'"'  '"'$Sortie$Dir'"'  >>"$Err1"         
      $Rsync --backup-dir=$Suppression"$Dir/" --exclude-from="$Data"/Filtre.txt         "$Dir/"      "$Sortie$Dir"   1>>/tmp/Rsync-$USER-0 2>>/tmp/Rsync-$USER-2
      grep Number /tmp/Rsync-$USER-0 >>"$Err1"; rm /tmp/Rsync-$USER-0
      if [  -s  /tmp/Rsync-$USER-2 ]; then cat /tmp/Rsync-$USER-2 >>"$Log"-2.log ; cat /tmp/Rsync-$USER-2 >>"$Err1" ; rm /tmp/Rsync-$USER-2 ; fi;
      # Epurer le suivi
      Copy=0 ; while read line; do 
         if [ $Copy = 0 ]; then Deb=$(echo $line|cut -c -7)
            if [ "$Deb" = "======="  ]; then M3=$(echo $line|cut -d' ' -f3) 
              if [ $M3 -gt $Suiv3 ];  then Copy=1;fi    
            fi
         fi
      if [ $Copy -gt 0 ]; then echo $line  >>/tmp/Rsync-$USER-3; fi; done <"$Err1";
      cp /tmp/Rsync-$USER-3 "$Err1";  rm /tmp/Rsync-$USER-3;             
      sleep  $Repos
   fi       
done
#
#### Traitement des fichiers. 
echo ========== Le $(date +"%y%m%d%H%M") traitement des fichiers de $USER >>"$Log"-1.log ; 
echo rsync -blptgod  --suffix='"'".OLD$(date +"-%y%m%d%H")"'"'  --backup-dir="$Suppression$Data" --stats --exclude-from="$Data/Filtre.txt"  "$Data/ $Sortie$Data"/ >>"$Log"-1.log
rsync -blptgod  --suffix=".OLD$(date +"-%y%m%d%H")"  --backup-dir="$Suppression$Data" --stats --exclude-from="$Data/Filtre.txt"  "$Data/" "$Sortie$Data"  >/tmp/Rsync-$USER-0 2>>/tmp/Rsync-$USER-2
grep Number /tmp/Rsync-$USER-0 >>"$Log"-1.log; rm /tmp/Rsync-$USER-0
# Epurer historique
Copy=0 ; 
while read M1 M2 M3 ; do
      if [ $Copy -eq 0 ]; then
         if [ "$M1" = "Passage"  ]; then  
            if [ $M3 -gt $Suiv3 ]; then Copy=1;fi
         fi
      fi
      if [ $Copy -eq 1 ]; then echo $M1 $M2 $M3 >> /tmp/Rsync-$USER-0; fi
done<"$Log"-3.log
cp /tmp/Rsync-$USER-0 "$Data/$Suivi"-3.log ; rm /tmp/Rsync-$USER-0;
echo Fin  Rsync $(date +"%y%m%d%H%M") >>"$Data/$Suivi"-3.log; 
 #
#### Epuration et comptages et alerte
if [ $Repos -gt 0 ];  then find $Suppression$Data/ -mindepth 1 -maxdepth 1 -type f -name "*$Epur1*"  -mtime +$Epur4 -exec rm -v {} 1>>"$Data/$Suivi"-1.log  ;
   ###  Je ne collecte pas les erreurs pour éviter cette capture (find: paramètre manquant pour « -exec ») lorsque  rien n'est à supprimer.   
   sleep  $Repos   
   for i in "$Data"/*; do echo -n "$i : " ; find "$i" | wc -l; done | sort -n -k3 | tail -8 | column -t >>"$Data/$Suivi"-3.log
   sleep  $Repos 
   for i in "$Sortie$Data"/*; do echo -n "$i : " ; find "$i" | wc -l; done | sort -n -k3 | tail -8 | column -t >>"$Data/$Suivi"-3.log
   if [ -s "$Log"-2.log ];then DISPLAY=:0 zenity --error --text "Des erreurs ont été rencontrées par la commande  RSYNC. Sauvegarde PARTIELLE exécutée. Consulter le fichier "$Log"-2.log. Corrigez et supprimez-le.";fi    
fi  
echo ========== Le $(date) Fin de Sauvegarde >>"$Log"-1.log ;
EOF
sleep 1
chmod +x $HOME/Rsync.sh
#cat $HOME/Rsync.sh
#Cause=Fermeture
Cause=Cyclique
gid=1000
export Cause
export gid
$HOME/Rsync.sh

#5) Messages d'erreurs possibles.
# could not make way for new regular file: Nom d'un fichier.

# Il faut vérifier que dans les partitions de sorties, il n'existe pas un répertoire avec le même nom.
# En effet, lorsqu'un répertoire de premier niveau est supprimé en entrée, il reste présent dans les deux partitions de sortie comme historique. Il faudrait ajouter une séquence récupérant cette erreur et renommer les répertoires de sortie en .old.....
# Ce cas est donc classique lorsqu'un répertoire est remplacé par un lien symbolique.

#6) Créer un fichier service pour utilisation cyclique.

mkdir -pv .config/systemd/user
cat <<EOF>.config/systemd/user/HomeRsync.service  
[Unit] 
Description=Duplication cyclique du HOME de l'utilisateur connecté.
DefaultDependencies=no
[Service]
Type=simple
Restart=always
RestartSec=1hour
Environment="USER=%u"
Environment="gid=%G"
#https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html
Environment="Cause=Cyclique"
ExecStartPre=echo  "Suivi des sauvegardes cycliques de l'utilisateur"   %u ) | sudo tee -a  /dev/kmsg
ExecStart=/home/%u/Rsync.sh
ExecStopPost=echo  "Suivi des sauvegardes cycliques de l'utilisateur"   %u.  La sauvegarde est terminée  | sudo tee -a  /dev/kmsg
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=1hour
#[Install]
#WantedBy=sleep.target
EOF
sleep 1

#5) Activer le service.

systemctl --user stop HomeRsync.service ; systemctl --user disable HomeRsync.service;systemctl --user daemon-reload; 
systemctl --user enable HomeRsync.service; systemctl --user start HomeRsync.service
systemctl --user -l status HomeRsync.service       

#7) Essayer le service

systemctl --user start HomeRsync.service
watch systemctl --user --no-pager status HomeRsync

#8) Créer et Activer le service cyclique.

cat <<EOF>.config/systemd/user/HomeRsync.timer
[Unit]
Description=Lance une sauvegarde toutes les  heures  5 minutes et 10 secondes. 
[Timer]
OnUnitActiveSec=1 hour 5 minutes 10 seconds
[Install]
WantedBy=timers.target
EOF
sleep 1
systemctl --user stop   HomeRsync.timer ; systemctl --user disable HomeRsync.timer ; systemctl --user daemon-reload
systemctl --user enable HomeRsync.timer ;
systemctl --user start   HomeRsync.timer ; systemctl --user status HomeRsync.timer   

#9) Créer un fichier service pour déconnexion utilisateur.

cat <<EOF>.config/systemd/user/HomeRsynd.service    
[Unit] 
Description=Duplication  du HOME de l'utilisateur lorsqu'il se déconnecte.
DefaultDependencies=no
[Service]
Type=oneshot
Environment="USER=%u"
Environment="Cause=Fermeture"
ExecStartPre=echo  "Suivi des déconnexions  de l'utilisateur"   %u ) | sudo tee -a  /dev/kmsg
ExecStart=/home/%u/Rsync.sh
ExecStopPost=echo  "Suivi des déconnxions de l'utilisateur"   %u.  La sauvegarde est terminée  | sudo tee -a  /dev/kmsg
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=10min
#### Durée exécution avant plantage      
[Install]
WantedBy=default.target
EOF
sleep 1
systemctl --user --no-pager start  HomeRsynd
systemctl --user --no-pager status HomeRsynd   

#10) Facultatif: Vérifier  et lister les dépendances.

systemctl --user --no-pager cat HomeRsynd #; systemctl --user --no-pager show HomeRsynd
systemctl --user --no-pager  list-dependencies HomeRsynd ; systemctl --user --no-pager  list-dependencies HomeRsynd --reverse     

#11) Un suivi rapide du fonctionnement.

grep Passage $HOME/Passage_Rsync-3.log
grep ======== $HOME/Passage_Rsync-1.log 

#12) La déinstallation.

systemctl --user stop HomeSync.service; systemctl --user disable HomeSync.service
systemctl --user stop HomeSync.timer; systemctl --user disable HomeSync.timer
systemctl daemon-reload
rm -v .config/systemd/user/HomeSync.service .config/systemd/user/HomeSync.timer

Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne