bonjour tout le monde,

Voici mon contexte : je mets en place une vidéo surveillance. J'ai une caméra IP qui détecte le mouvement et envoie des vidéos et des photos par FTP.
J'ai installé un Raspberry PI3 avec un serveur FTP. La caméra lui envoie ses fichiers, et j'ai mis un cron pour virer les fichiers de + de 5 jours.
Tout ça marche très bien.

Oui, mais si je suis cambriolé et qu'on me vole le Raspberry, je suis marron.
Comme j'ai un espace de stockage chez mon FAI (free), accessible par FTP, je pourrais décider d'uploader les fichiers chez lui, plutôt que sur mon Raspberry.
2 problèmes :
- si le voleur coupe le fil du téléphone, je suis marron.
- je ne sais pas virer les fichiers anciens sur le FTP du FAI (enfin je peux y arriver mais c'est galère de le faire régulièrement ).

Alors j'ai choisi de mettre les fichiers sur le raspberry, et de les "mirrorer" chez le FAI.
Il faut que le mirroring se fasse vite - disons dans les 3 à 5 mn après détection.
J'ai mis en place un "incron", qui détecte les évènements file-system dans les répertoires de mes fichiers, sur le raspberry.
J'ai ainsi un script shell (bash) qui est invoqué
- à la création d'un fichier
- à la fermeture d'un fichier après écriture
- à la suppression d'un fichier.

Quand un de ces évènements survient, je peux lancer le mirroring chez mon FAI par lftp.
Mais il faut différer un peu le mirroring car la caméra envoie plusieurs fichiers sur détection. Il faut attendre qu'elle ait fini !
De même, mon cron de nettoyage supprime plusieurs fichiers, il vaut mieux attendre qu'il ait fini.

Alors, voici ce dont j'ai besoin : une attente qui soit "resetable".
Lorsque qu'un fichier est terminé (closed), je lance l'attente pour 3 mn.
Si un nouveau fichier arrive (create) ou si un ficher est effacé (delete), je réarme l'attente à 3mn
Si l'attente va bout des 3 mn, je fais le mirroring.
Si je reçois un nouveau fichier pendant le transfert FTP du mirroring, je tue la tâche FTP et je recommence (attente 3mn)

Voici la soliution que j'ai trouvée. Merci de commenter si c'est foireux ou s'il y a mieux !
Mon script do_mirroring.sh :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
PID_FILE=/var/run/do_mirroring.pid
echo $$ > $PID_FILE
sleep 180
lftp ftp://myaccount:mypasswd@ftpperso.free.fr -e "mirror -e -R /home/pi/Camera /Camera ; quit"
rm $PID_FILE
mon script callback_incron.sh, invoqué par incrond en cas d'événement fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
PID_FILE=/var/run/do_mirroring.pid
#------------------------
file_created()
{
  echo  "File created: "  $1/$2 " le " $(date) >> /home/pi/incron.log
  # un nouveau fichier arrive
  # arreter le mirroring si en cours 
  if [ -r $PID_FILE ] then
    kill $(cat $PID_FILE)
    rm $PID_FILE
  fi
}
#------------------------
file_closed()
{
  echo  "File closed : "  $1/$2 " le " $(date) >> /home/pi/incron.log
  # un nouveau fichier est termine :
  # arreter le mirroring si en cours 
  if [ -r $PID_FILE ] then
    kill $(cat $PID_FILE)
    rm $PID_FILE
  fi
  # et lancer
  ~/do_mirroring.sh
}
#------------------------
file_deleted()
{
  echo  "File deleted: "  $1/$2 " le " $(date) >> /home/pi/incron.log
  # un nouveau fichier est efface :
  # arreter le mirroring si en cours 
  if [ -r $PID_FILE ] then
    kill $(cat $PID_FILE)
    rm $PID_FILE
  fi
  # et lancer
  ~/do_mirroring.sh
}
#------------------------
# les arguments sont : 1=type d'évènement 3=chemin du fichier 4=nom du fichier
#------------------------
case $1 in
  IN_CREATE)
    file_created $3 $4
    ;;
  IN_CLOSE_WRITE)
    file_closed $3 $4 
    ;;
  IN_DELETE)
    file_deleted $3 $4
    ;;
  *)
    echo  "Event: " $1 " (" $2 ")  File: "  $3/$4 " le " $(date) >> /home/pi/incron.log
    ;;
esac
Merci d'avoir lu !