Webcam de surveillance avec transfert FTP automatisé

Rédigé par BeHuman 8 commentaires
Classé dans : Shell/Bash Mots clés : webcam, ftp, surveillance, sécurité


Dans le cadre de mon travaille, j'ai mis en place un système de webcam de surveillance avec transfert FTP automatisé. Au préalable il vous faudra installer un serveur icecast2:

voici quelques liens au sujet de icecast2:

Je pense qu'avec ça vous pourrez utiliser mes trois petits scripts tranquillement ;-)

code du lanceur

#! /bin/bash

if [[ `which expect` == '' ]]; then
    zenity --question --title="Installation" --text="<b>expect</b> ne semble pas installé. Souhaitez vous l'installer maintenant ?"
    if [[ "$?" == 0 ]]; then
        gksudo -m "L'installation de expect nécessite les privilèges administrateur" "apt-get install -y -f expect" | zenity --progress --title="Installation" --text="Installation de <b>expect</b> en cours..." --auto-close --pulsate
    else
        exit
    fi
fi

function interface() {
    choice=`zenity \
            --list \
            --title="$ztitle" \
            --text="$ztext" \
            --height="275" \
            --width="200" \
            --column    "Actions" \
                        "Démarrer le serveur vidéo" \
                        "Stopper le serveur vidéo" \
                        "Purger le serveur vidéo" \
                        "Heure du lancement du serveur vidéo"`


    case $choice in
        "Démarrer le serveur vidéo")
            /home/chrono/Documents/scripts/Bash/webcam/webcam.sh & 
            pID=$!
            ztitle="[Démarré] Serveur Vidéo"
            ztime=`cat /home/chrono/Documents/scripts/Bash/webcam/start.time`
            ztext="<span color='green'>Serveur vidéo démarré</span>\n<span color='red'>L'enregistrement commencera à <b>$ztime</b></span>\n\nChoisissez une des actions disponible dans la liste :"
            interface
        ;;
        "Stopper le serveur vidéo")
            kill $pID
            kill `cat /home/chrono/Documents/scripts/Bash/webcam/webcam.pid`
            killall gst-launch*
            killall gst-launch-0.10
            ztitle="[Stoppé] Serveur Vidéo"
            ztext="<span color='red'>Serveur vidéo stoppé</span>\nChoisissez une des actions disponible dans la liste :"
            interface
        ;;
        "Purger le serveur vidéo")
            rm -rf /home/chrono/Documents/scripts/Bash/webcam/outputs/*.ogg
            rm -rf /home/chrono/Documents/scripts/Bash/webcam/*.pid
            rm -rf /home/chrono/Documents/scripts/Bash/webcam/*.lock
            interface
        ;;
        "Heure du lancement du serveur vidéo")
            gedit /home/chrono/Documents/scripts/Bash/webcam/start.time
            kill $pID
            kill `cat /home/chrono/Documents/scripts/Bash/webcam/webcam.pid`
            killall gst-launch*
            killall gst-launch-0.10
            ztitle="[Stoppé] Serveur Vidéo"
            ztext="<span color='red'>Serveur vidéo stoppé</span>\nChoisissez une des actions disponible dans la liste :"
            interface
        ;;
        
    esac

    
}

gksudo -m "Le lancement du serveur vidéo nécessite les privilège administrateur !" "service icecast2 restart"

ztitle="[Stoppé]  Serveur Vidéo"
ztext="<span color='red'>Serveur vidéo stoppé</span>\nChoisissez une des actions disponible dans la liste :"
interface

 

code de l'enregistrement webcam:

#!/bin/bash

function gst_start() {
    trap control_c SIGINT
    echo -en "\n*** Enregistrement en cours ***\n"
    tim=`date +%m-%d_%H-%M-%S`
    killall gst-launch*
    killall gst-launch-0.10
    kill `cat /home/chrono/Documents/scripts/Bash/webcam/gst.pid`
    echo -en "\n*** Synchronisation FTP en cours... ***\n"
    /home/chrono/Documents/scripts/Bash/webcam/ftpsync.sh
    gst-launch-0.10 v4l2src ! \
        video/x-raw-rgb, framerate=25/1, width=800, height=600 ! \
        ffmpegcolorspace ! \
        theoraenc quality=8 ! \
        queue ! \
        oggmux name=mux pulsesrc ! \
        queue ! \
        audioconvert ! \
        vorbisenc quality=0.1 ! \
        queue ! \
        mux. mux. ! \
        queue ! \
        tee name=tfile ! \
        queue ! \
        filesink location=/home/chrono/Documents/scripts/Bash/webcam/outputs/$tim.ogg tfile. ! \
        queue ! \
        shout2send ip=localhost port=8000 mount=mountpoint.ogg password=pass &
    echo $!  > /home/chrono/Documents/scripts/Bash/webcam/gst.pid
    touch /home/chrono/Documents/scripts/Bash/webcam/webcam.lock
    for ((a=1; a <= 10; a++)); do
        sleep 5
        echo -en "\n*** Synchronisation FTP PASS N°$a cours... ***\n"
        /home/chrono/Documents/scripts/Bash/webcam/ftpsync.sh 
    done
    echo -en "*** Fin de la synchronisation FTP ***\n"
    gst_start
}


function gst_launch() {
    gst_start
#    echo $! > $PWD/webcam.pid
#    sleep 62
#    put_ftp
    
    kill `cat /home/chrono/Documents/scripts/Bash/webcam/webcam.pid`
    kill `cat /home/chrono/Documents/scripts/Bash/webcam/gst.pid`
    kill `cat /home/chrono/Documents/scripts/Bash/webcam/osize.pid`
    rm -rf /home/chrono/Documents/scripts/Bash/webcam/webcam.pid
    rm -rf /home/chrono/Documents/scripts/Bash/webcam/webcam.lock
    rm -rf /home/chrono/Documents/scripts/Bash/webcam/ftp.lock
    rm -rf /home/chrono/Documents/scripts/Bash/webcam/out.ogg

}

function control_c(){
    echo -en "\n*** Quitter ***\n"
    killall lftp
    kill $gstPID
    kill $putPID
    exit $?
}

gstPID=""
putPID=""

trap control_c SIGINT

while [[ "`date +%H:%M`" != `cat /home/chrono/Documents/scripts/Bash/webcam/start.time` ]]; do echo -n; done
gst_launch

code du transfert FTP:

#!/bin/bash
#
# Synchronise deux répertoires en utilisant FTP
  
HOST="ftp.delamortquitue.fr"
LOGIN="behuman"
PASSWORD="salutlemonde"
LOCALDIR="/home/chrono/Documents/scripts/Bash/webcam/outputs"
REMOTEDIR="/security/backups/"
EXCLUDED="*.*~"

function Usage()
{
  echo -e "\n  Synchronise un répertoire local avec un répertoire distant en utilisant FTP";  
  echo -e "\n  USAGE: ftpsync local_dir";
  echo;
}

if [ "$LOCALDIR" = "" ]
then
  echo -e "  ERREUR: Veuillez spécifier un répertoire local";
  Usage;
  exit 1;
fi

if [ -e "$LOCALDIR" ]
then
  lftp -c "set ftp:list-options -a;
  open ftp://$LOGIN:$PASSWORD@$HOST; 
  lcd $LOCALDIR;
  cd $REMOTEDIR;
  mirror --reverse \
         --delete \
         --verbose \
         --exclude-glob $EXCLUDED";
fi

un petit fichier en parrallèle permettra de définir l'heure de lancement de la webcam de surveillance

start.time:

16:00

voilà donc pour se script, je pense qu'il y a moyen de mieux gérer le transfert FTP,  actuellement ce script tourne quotidiennement sur notre infrastructure.

8 commentaires

#1  - ap7 a dit :

Bonjour j'ai tester votre script permettant de synchroniser deux repertoire.
A l'éxecution rien ne ce passe et il ne m'affiche pas d'erreur.

Répondre
#2  - BeHuman a dit :

@ap7 :
as tu bien modifié les chemin d'accès qu'il y a dans le script, car ils pointent vers /home/chrono...etc en modifiant les chemin d'accès, je pense que ça réglera ton souci. ++

Répondre
#3  - ap7 a dit :

Merci de votre réponse. La vidéo une fois sur mon serveur distant je me connecte via ftp pour la recuperer et quand j'essaie de la visionner mais sans succès. Je me demande si vous n'avez pas activer le mode binary?

Répondre
#4  - BeHuman a dit :

@ap7 :
Re, ton lecteur multimédia lit t'il le format OGG OGV(vidéo)/OGA(audio)? essaye avec VLC, Totem ...etc Le format OGG nécessite la librairie Vorbis pour gestion audio et la librairie Theora pour la gestion vidéo.
++

Répondre
#5  - ap7 a dit :

Ma vidéo est au format mp4, format qui est normalement lus avec VLC ou d'autre multimédia Windows.

Répondre
#6  - BeHuman a dit :

@ap7 :
Le script actuel encode la vidéo au format Ogg. Si tu as changé l'encodage, le problème doit venir de lui et non du script :-) désolé de ne pouvoir plus t'aider.
PS: à la rigueur poste moi ta routine d'encodage, je regarderai ça quand j'aurais 5 mins. ++

Répondre
#7  - ap7 a dit :

merci pour vos précieux conseil, au final j'ai encodé ma vidéo en .h264 et j'arrive à l'envoyer parfaitement sur un serveur distant.

Répondre
#8  - Eloise Fey a dit :

Un grand merci pour votre article

Répondre

Écrire un commentaire

Quelle est la dernière lettre du mot 6dzcm ?

Fil RSS des commentaires de cet article