#1 Le 05/03/2024, à 19: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, à 17: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
En ligne
#2 Le 05/03/2024, à 19: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, à 20: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, à 10: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, à 10: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
En ligne
#5 Le 06/03/2024, à 13: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 ).
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, à 13:58)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 06/03/2024, à 17: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
En ligne
#7 Le 06/03/2024, à 19: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, à 21: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, à 21: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
En ligne
#9 Le 07/03/2024, à 08: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
https://www.gnu.org/software/bash/manua … -Documents
#10 Le 24/03/2024, à 18: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
En ligne