Les fichiers sources
Copie : Consulter la derniere version, si le site dynamique original
"www.trousperdu.org" est connecte *


( Reponse du 04/08/2023 09:24:56 UTC, par serveur :
    SERVER NAME : "www.trousperdu.org"
    SERVER_PORT : "80"
 Suite a la requete :
    HTTP_HOST : "www.trousperdu.org"
    REQUEST_URI : "/cgi-bin/viewsource.bin?/root/webcam/getimage.sh"
 Adresse du demandeur : "46.22.94.252" ) :


LE SOURCE DU FICHIER "/mnt/hda1/root/webcam/getimage.sh"
 ( du 09/06/2016 13:55:35 UTC ) :
-rwxrwxrwx 1 root root 35388 Jun 9 2016 /mnt/hda1/root/webcam/getimage.sh
#! /bin/sh

#NC imcp.ba@free.fr IMCP Blandy Alain

#  Pour pouvoir faire une video surveillance de ma maison :
#   -  par un syteme de webcams peut cheres * ,
#   -  des capteurs infrarouge de mouvement, ...
#   -  des projeteurs electriques,
#    le tous commande par la box libre
#     et accesible par son serveur http,
#      n'importe ou sur internet ou sms ....

# ce sript shell prend en charge les webcams :


#  ------------------------------
#
#      *  La webcam la plus loin, qui surveille l'exterieur,
#        est en USB, TRES FAIBLE CONSOMATION
#        (car au bout d'une rallogne passive 
#          improvisee de 15m : ethe rj45 cath 5)
#         Elle fonctionne avec le driver UVC video standar
#        et a un micro usb integre,
#         De moins de 3 cm de diametre,
#        elle est dissimule dans un trous dans le mur)
#         C'est une NGS 300K USB 2.0, pour 18 euros, en mars 2014 ...
#        Apparament plus fabriquee ? !!
#
#  ------------------------------
#
# ce script shell prend en charge les webcams :
#
#  il permet les reglage et le test webcam et la prise photo 
# il peut etre apelle en interne, pour changer le mode video d'une webcam  ....
# il est aussi utilise comme demon serveur de declanchemant photograpique
#
#  En mode demon il repond aux requettes des clients qui veulent :
#      faire des photo
#      consulter ou changer de preregleages video ..... 
#  Les clients peuvent etre varies : script http , cron ,
# detection mouvement infrarouge etc etc
#
#  On peut gerer plusieurs webcams, 
# sans pratiquement utiliser le cpu dans les attentes :
#  les requettes des clients et les reponses transittent
# par des fichiers, dans les sous directory, specifique a chaque webcam.
#
#  Ce programme en mode demon ne consomme donc pas de cpu
# il est en attente, par tail de lecture sur le fichier lastdemande ...
#    il prend la photo demande et se remet en attente
#
#  La video est transmisse au besoin sur le display X:0 !
#
#  Une connection telnet ssh peut lancer ce programme en mode test
# il suffit de changer la variable DISPLAY pour rerouter image sur un serveur X
# "export DISPLAY=MamMachine:0"
# et de lancer le programme a distance 
#  Faire un "xhost  myipwhi" avant pour autoriser votre box libre
# a utiliser votre display n'importe ou sur le net !
#  Cependant seul image sera rerouter, pour le son faudra proceder autrement (voir aplay )!!!
#
#   Pour securiser SSH voir autoritee de certification  : le CA BLib (sur ce serveur !!!)
# ---------------
#
#  Parametre d'appel de ce script
#
# le parametre UN est le nom du sous directory associe a la webcam
#
# le parametre DEUX est un prereglage de fonctionnement video a appliquer
#      immediatement a la webcam
#          SOLEIL NUAGE NUIT
#          NOCH(ou vide) pour pas de changement
#               chaque webcam a ces prereglages specifiques
#
# le parametre TROIS permet de lancer en iteractif
#   un teste video en continus sur ecran
#    et de pofinner les reglages video ...
#      F1 permet alors de memoriser ces reglages
#       dans le prereglages courant en service ( SOLEIL NUAGE ... )
#        pour le rendre disponible aux clients http ...
#
# le parametre QUATRE specifis le mode de lancement du demon  ....
#
# ---------------
#
#  Ce script fait un change directory dans le directory de son source
# ensuite il migre dans le (sous)directory de le webcam designe au parmetre 1
#  chaque webcam a un directory specifique, avec ces reglages, ces photos ces historiques etc etc ...
#
#  ce script utilise le logiciel luvcview ( uvcview est un driver universel)
# et accesoirement pour l'ecoute sonnore /usr/bin/arecord /usr/bin/aplay
#
#  Pour des raisons de securite les directory des webcams
# ne sont pas accesibles par le serveur HTTP !(mais peut l'etre pour les script cgi ) :
#  Donc apres chaque photographie, le demon etablis un lien hard de la derniere photo
# avec le fichier photo designe de cette webcam dans le directory public http (atomic operation)
# (voir plus loin variable ffw)
#
#  En mode demon, en attente , le demon  n'utilise plus la  webcam (pas de consommation cpu)
# il est simplement en attente de lecture sur le fichier de commande client de cette webcam.
# les client peuvent etre un script http , cron , un programme de surveillance ...
#  En retour etat courant du demon est renseigne dans un fichier status a destination des clients.
#
# ---------------



#
#directory html commun ou sont stocke les liens hards pour la dernier photo de chaque webcam
PSEUDOR='/mnt/hda1'; #decallage de pseudo racine d'une version a l'autre
if test ! -d $PSEUDOR ; then #si pas monte
  PSEUDOR='';
fi;
WEBDIRECTORYALLPHOTO="$PSEUDOR/root/Web-Server/"; #directory html pour les derniere photo de chaque webcam  !!! PRW

# -----------------------------------------------------------------------
#  Le logiciel luvcview utilise un fichier de prereglage standar webcam
# (qui peut aussi mettre a jour par F1) contraste gamma ...
#  Le client peut choisir parmis plusieurs fichier de preglages disponibles
# celui qu'il veut utiliser ...

#  La fonction utilitaire interne suivante, etablis un lien hard avec le fichier de preglage demande :
function setmodevideo #mise en place de la configuration video demandee dans newmode
{
# parametre appel newmode : mots clef de prereglage
#     si newmode est possitionne : c'est la demande de nouveau mode
#
# utilise aussi
#   regvide : le nom du directory de cette webcam
#   listmode : liste des mots clef de prereglage reconnus
#
# possitione en retour  newmode et infomode
# ( en retour newmode est vide si la configuration demande est reconnue)
# ( en retour newmode est vide si la configuration est faite)
# si le mode n'est pas reconu(ou vide) la fonction reste silencieuse; mais renseigne infomode

#utilise le directory de regvide pour faire un lien hard sur le fichier de reglage selectionne

infomode=""; #variable globale pour message resultat operateur (mis a vide : pas de changement demande)

if test "$newmode" != ""; then #si il y a une demande de changement de mode
  infomode="Configuration video demandee \"$newmode\" inconnue !\a\a\a\a"; #(erreur par anticipation)
  for i in $listmode; do #identifier le mode dans la liste autorisee
    if test "$newmode" == "$i"; then #le changement de mode demande est reconnus
      ln -f $regvide.${newmode}  $regvide;  #changement du hard link sur la fichier de reglage selectionne 
      err="$?"; #code retour de la commande de liens HARD fichier
      infomode=""; #OK ? raz message erreur precedant !
      if test "$err" != "0"; then
        echo "Mise en service de la configuration video \"$newmode\" sur $dirsuffix : Erreur $err !";
        infomode="Pas de changement de mode video \"$newmode\" sur $dirsuffix !";
      else
        echo "Mise en service de la configuration video \"$newmode\" sur $dirsuffix faite.";
      fi;
      newmode=""; #ACK (meme si erreur)
      break; #on a trouve un mode reconnu : on arrete la recherche
    fi;
  done # si on a pas trouve,  alors newmode reste inchange; mais infomode est renseigne
fi;

} # fin de la fonction de selection du prereglage video

# -----------------------------------------------------------------------


#pg principal
# changement de mode
# test video et reglages memorisation
# demon


trap "" USR1; #signal a ignorer : pour verifier presence de ce programme en mode demon


listmode="NUIT PENOMBRE NUAGE SOLEIL"; #liste des mode video reglage reconnus au niveau de CE script serveur !!!
                                       # voir aussi programme shellregvideo.inc cote clients
                                       # les deux listes peuvent etre differantes (ex : infrarouge )!!!

if test "$1" == ""; then # si pas de nom de webcam directory alors help

  namepg="`basename $0`"; #raccourci du nom de ce programme 
  echo " Programme $0 $1 $2 $3
 usage :

$0
     Ce message d'aide 

$namepg NOM_DU_DIRECTORY_WEBCAM  MODEVIDEO  TEST  DEMON

      MODEVIDEO defini le mode de fonctionnement de la camera

               MODEVIDEO  = [vide|NOCH   || SOLEIL | NUAGE | .. | autre]
               les prereglages reconnus sont : \"$listmode\"

      TEST permet la visualisation directe sur l'ecran,
           le reglage des parametres et leur meorisation par F1,
           dans le fichier de mode video courant

               TEST       = [vide|autre  || NOTEST]

      DEMON permet de lancer eventuellement le demo
            en prenant une photo au demarrage
            (DNF interdit la photo de demarrage demon) 
            (si argument est un nombre, il represente en segonde,
             une temporisation entre la fin du test video,
              et la photo eventuelle au demarrage du demon )

               DEMON      = [vide        || DNF | autre | nombre_tempo_retardateur]

exemples :

$namepg cam0;
        #permet de tester la video de la camera zero en mode courant

$namepg cam1 PENOMBRE;
        #met la camera un en mode penombre et la test

$namepg cam1 PENOBRE NOTEST;
        #met la camera un en mode penombre sans la tester
 
$namepg cam1 NUAGE TEST  DEMON;
        #met la camera un en mode nuage,  la teste ,
        # demarre evnetuellement le demo en prenant une photo

$namepg cam1 NUAGE TEST  DNF;
        #met la camera un en mode nuage,  la teste ,
        # demarre eventuellement le demo sans prendre de photo

$namepg cam1 NOCH TEST  DEMON;
        # teste la camera un en mode courant,
        # demarre eventuellement le demo en prenant une photo

$namepg cam1 NOCH NOTEST  DNF;
        # redemarre eventuellement le demo cam1 sans prendre de photo

$namepg cam1 NOCH TEST  20;
        # teste la camera un en mode courant,
        # attendre 20 segondes
        # demarre eventuellement le demo en prenant une photo
";
  exit 1; #fin en cas de help
fi;


# A aller dans le directory des source
thisdir="`dirname $0`"; #relatif ou pas, lien physique ou pas ...
cd $thisdir; 
if test "$?" != "0"; then
  echo "Impossible d'aller dans le directory $thisdir : Fichiers sources non accesibles !";
  exit 1; # !!!!!!!!
fi;
dirsource="`/bin/pwd`";  #pwd commande EXTERNE : memorisation pour trouver utilitaire executables en absolu !!!
                         #nom Unique sur la machine (peut differer de la commande pwd interne au shell !!)
echo " Directory des sources et executables \"$dirsource\"";

#le parametre UN est obligatoire !!!!! :

thisdir="$1";  #parametre 1 : nom du directory webcam  ( en relatif ou en absolue !!! )
if test "$thisdir" == ""; then #normlement pas possible a cause du help
  echo "Invalid : not argument 1 \"DirNameWebcam\"";
  exit 2;
fi;
cd $thisdir;  #aller dans le (sous)directory de la webcam (en partant du source)
if test "$?" != "0"; then
  echo "Impossible d'aller dans le directory \"$thisdir\" : Webcam directory iconnue ?";
  exit 3;
fi;

# B on est dans le directory de la webcam selecte !
thisdir="`pwd`"; #on utilise la commande INTERNE pwd du shell !!!!
echo " Directory de travail de la webcam  \"$thisdir\"";
dirsuffix="`basename $thisdir`"; #le nom du directory de la webcam (nom cours pour suffix fichier)


#chaque webcam a un sous directory different de configuration
# ce directory de travail  contiend ces parametres, ces photo ...

# specifcations interfacage d'une webcam dans son directory specifique --------------------
# --- fichiers propre a la webcam

#     RQ : le directory de travail d'une webcam ne doit pas etre acessible par le serveur http !

fdev="device.txt"; #nom du fichier contenant le nom du perif video a utiliser : dans directory travail
                   # de la forme /dev/video0 /dev/video1 ....

fson="arecordD.txt";  #nom du fichier qui contiend le periferique micro de la camera associe logicile :  arecor -D XXXX
                      # ramene le canal son de la webcam sur la station
                      # voir liste perif par commande /usr/bin/arecord -L

regvide="luvcview.cfg"; #path de base fichier de reglage video a utiliser :  dans directory travail
                        # le fichier de reglage courant :
                          # il est utilise par luvcview et il peut y etre mis a jour rw
                            # a un instant T ce nom de fichier est un lien hardware
                            # vers un fichier de reglage selectionne
                            # correspondant au reglage courant de la camera  NUIT JOUR INFRAROUGE ....

bolarchive="archive.txt"; #si le premier mot de ce fichier est "oui" la photo est aussi archivee
                        
fpiddemon="pidfile.txt";  #le pid du demon courant de cette webcam : pour assurer son unicitee


# toujour dans le directory dedie de la webcam 
# ---- fichiers interfaces avec autres clients : suveillance , script cgi http ....

fstamp="lastdemande.txt"; #nom du fichier extampile de demande du web : dans directory travail  !!! CGI
                          # la modification de ce fichier provoque le reveil de ce demon
                          #  le demon analyse la dernier ligne de ce fichier texte
                          # et ragis   (journal des demandes IN) ... 


fstatus="laststatus.txt"; #nom du fichier status du declencheur et depart hinibition web : dans directory travail  !!! CGI
                          # ces etat courant en clair du demon, au fur et a mesure de son travail
                          # le serveur http, apres temprisation, la renvois au demandeur (journal des reponses  OUT)....

findex="lastindex.txt"; # ce fichier contiend le numero index externe suffix de la dernierer photo
                        # numerotation modulo , utilise pour forcer le raffraichissement
                        # de certains seurfeurs parresseux ( voir plus deletedimage ) !

# fin specifcations directory interfacage  d'un directrory webcam -------------------------------------

#autre specification generale commune --------------------------------------

comvide="$dirsource/luvcview -i 30 -r "; #commande de base : HZ et restore  
                                         # ce demoon lance des variantes de la commmande de base pour gerer la webcam
                                    # contrairemment a ce qui est dit dans le help,
                                    # l'option qui specifis la taille de l'image
                                    # est de la forme "-s 352x258" avec le caractere x (pas * )!

                     #   Pour facilliter installation de utiltaire luvcview
                     # excutable  a etait recopie dans le directory des sources.

deletedimage="$dirsource/oldimage.gif"; #prevenire seurfeur distrait : cette image signifie a etait supprime :

        

#les dernieres photos de chaque webcam sont mises au meme endrois dans l'espace du serveur http
#elle sont differenties par le suffix de la webcam : lastphotocam0.jpg, lastphotocam1.jpg ...
#( c'est en fait un lien hard sur la dernier frame photo du sous directory de la cam )
# voir plus loin variables ffw
#   les nom de fichiers images ne sont que des liens hardware, pour minimiser la place !

 #  Certain seurfeur ou androide gere mal la datation
 # de leur cache et ne raffraichise pas les images
 # contenu dans une page html en cours de raffraichissemnt
 # malgre les directives nocache !
 #  Pour contourner le probleme un suffixer variable (numero modulo) est ajoute au nom du fichier image
 # pour ivalider le cache du seurfeur (le nom de l'image change)
 #  lastphotocam0_1.jpg,   lastphotocam0_2.jpg,    ....  
 # on utilise pour index courant  le contenu  du fichier dedie
 # dont le nom est dans $findex   


# fin specifications interfacage  -------------------------------------


#chercher le perif video a utiliser
perif="`cat $fdev`"; #lire fichier de configuration du directory
if test "$perif" != ""; then #si trouve
  perif="-d $perif"; #specifier a luvcview par une option , le perif dans la commande a utiliser
fi;  #si vide : alors  par defaut ce sera  /dev/video0

# traitement des arguments parametres d'appel du script :

#PARAMETRE 2 : mode de fonctionnement video : SOLEIL NUIT ... NOCH

#mise en place eventuelle de la configuration video demandee dans parametre
newmode="$2"; setmodevideo;   #procedure bavarde ; infomode est possitionne par setmode en cas erreur
#si le mode demande est inconnu, il est inchange dans newmode
#newmode est remis a zero si le changement de mode est effectue
if test "$2" == "NOCH"; then #mot resever "No CHange mode video" (non reconnus par le setmodevideo precedant)
                             #pour lancer le programme directement dans le dernier mode utilise
                             # ( qui peut etre le meme, non referance cote client )
 infomode=""; #annulation du message d'erreur de demande changement video precedante
fi;
if test "$infomode" != ""; then #si toujours en erreur dans demande de changement de mode en parametre
 echo -e " $infomode"; #afficher le message d'erreur de changement de mode une premiere foix
fi;

#PARAMETRE 3 : faire un test de reglage video

testing="$3"; #faire un  test video a ecran avant de lancer le demon
if test "$testing" == ""; then #par default si absent
 testing="DEFAULT FAIRE TEST"; #faire le test
fi;
if test "$testing" == "NOTEST"; then #mots reserve pour hiniber le test
 testing="";  #ne pas faire le test
fi;

#on lance le test prealable en utilisant luvcview en interactif
if test "$testing" != ""; then #si mode test

  # et juste avant :  evetuellement la capture du son en batch
  batchson="";
  perifson="`head -n 1 $fson`";  #  default:CARD=Camera

  if test "$perifson" != ""; then
     echo "Lancement de l'ecoute sonnore \"$perifson\" pour $dirsuffix ...
                 =>  /usr/bin/arecord --test-nowait -D $perifson | /usr/bin/aplay &  ";
     lastbatch="$!"; #batch precedant
     #lancement du batch d'ecoute sonnore
     /usr/bin/arecord --test-nowait -D $perifson | /usr/bin/aplay &  #recopier dans webcam ?????
     batchson="$!"; #si batch lance alors nouvelle valeur du groupemnet
     if test "$batchson" == "$lastbatch"; then #erreur pas de nouveau batch
        echo "Erreur impossible de lancer le batch d'ecoute sonnore sur $dirsuffixb !";
        batchson=""; #no kill nead !
     fi;
  fi;

  # dans ce mode avant de lancer le logiciel demon on peut regler les parametres video en iteractif ecran
  echo  "Mode test, F1 permet de sauvegarder les modif dans le prereglages video courant !
                => $comvide $perif; ";
  $comvide $perif; #mode interactif pour reglage manuel de la  webcam et du fichier courant de reglages

  if test "$batchson" != ""; then  #si le batch sonnore a etait lance 
     echo "Arret du batch son $batchson ! ";
     kill $batchson;
  fi;

  # le but de ce test est aussi de modifier manuellemnt les parametres de la camere
  #  contraste luminosite 
  #  en utilisant les boutons menu de la camera
  #  et en memorisany eventuellemnt cette nouvell config
  #  dans le fichier de reglage courant (lien hard NUIT JOUR )

fi;  #fin du test interactif de la camera


if test "$infomode" != ""; then #si erreur dans demande precedante de changement de mode en parametre
 echo -e " $infomode"; #afficher le message d'erreur de changement de mode une deuxieme foix
fi;


#PARAMETRE 4 mode de lancement du demon eventuel
auto="$4";

# apres le lancer le demon autonome doit on
#faire une photo implicite au demarrage du demon ?
# par defaut oui (sauf si parametre == DNF )
declencher="Par declencheur au demarrage"; #cause du declenchement 
if test "$auto" == "DNF"; then #demarrer le demon sans faire de photo "Do Not Foto"
 declencher=""; #pas de photo au demarrage
 echo " Ne pas faire de photo, si le demon demarre !";   
fi;

if test "$auto" == ""; then # si pas automatique : pas de demon demande
  echo " Mode manuel sur $dirsuffix : Arret de ce programme. ";
  exit 0; 
fi;

# si le paramtre est une valeur numerique c'est alors un retardateur
# de prise de vue (ou de lancement demon)
#temporisation avant demarrage eventuel demon
tempo="$[$auto +0]"; #zero si pas numerique
if test "$[$tempo > 0]" == "1"; then
  echo " Temporisation de $tempo segondes ...";
  sleep $tempo;
fi;

#ici on est en mode automatique et on essai donc de lancer le demon ...

#verifier cependant qu'il y pas un autre demon actif dans ce directory
pidfile="`head -n 1 $fpiddemon`"; #voir si fichier pid loock
if test "$pidfile" != ""; then #perap actif daemon
  # cependant la presence d'un fichier de blocage n'est pas suffisant
  # le demon qui la possitionne est peut etre dcd depuis
  # on vas donc tester si il a survecus 
  kill -s USR1 $pidfile; #envois signal au numero de tache enregistre du demon presume (qui ignore)
  if test "$?" != "0"; then #erreur : plus de daemon actif
    pidfile=""; #pas de reponse : il n'y a pas de demon actif ! on vas le replacer
  else
    # la place est deja prise !!
    echo " Il y a deja un autre daemon actif $pidfile sur la camera $dirsuffix ; Arret de ce programme !!!!";
    exit 1; #arret de ce programme car autre demon deja actif
  fi;
fi;

#  Dans le cas ou un autre demon est deja actif ce programme s'arrete donc ici
# mais il a pus cependant servir localement a visualiser des image ou son en direct
# et a changer le mode de fonctionnement courant de la camera ....


# TRANSFORMER CE PG EN DEMON

#  Ce programme deviend doncle daemon de cette webcam
# il ,signale ca presence dans le fichier loock
echo "$$
#  la premiere ligne de ce fichier $fpiddemon
# est le numero de process du dernier demon, de la camera $dirsuffix .">$fpiddemon  # enregistre son numero de tache dans le fichier pid loock
#  attention les deux lignes prcedantes ne sont pas des commentaires sh !

#derniere date du fichier declencheur traite (vide si pas fichier !)
#extraction de la date de la derniere photo (hors video)
dstamp="`ls -l --time-style="+%s" $fstamp |( read a b c d e f g; echo $f)`"; #memo date file 6 eme champs
#dstamp est une valeur temoin pour detecter les changement dans le journal
# (si le fichier n'existe pas/plus il sera cree automatiquement si apres)

#mise a jours du fichier status pour synchro clients
echo "Demarrage du Declencheur sur $dirsuffix :  ..." | tee $fstatus;  # envoye aussi en message http
       # le tee duplique le message pour operateur, dans le fichier status de reponse

while test "$auto" != ""; do ###### BOUCLE DEMON ACTIF (hors operateur) ##########################

 trap "auto=\"\";" SIGINT; #vectorisation interruption ou ctl+c clavier
                           # pour passer en manuel,  par clear de la variable 
                           #  utilisable pour reprendre, plus tard 
                           #le controle du demon en mode manuel  !!!

 if test "$infomode" != ""; then #si erreur dans demande de changement de mode
   echo -e " $infomode"; #RE afficher le message d'erreur de changement de mode
   infomode=""; #et annnuler ce message de rappel
 fi;

 echo "Derniere demande sur $dirsuffix le $dstamp s"; #datation du fichier estampille

 # attente evenement demande de declanchment photo ------------------

 while test "1" == "1"; do #boucle interne attente de commande : du web, de l'interne ou autre

   if ! test -f $fstamp; then #creation du fichier de demande,  si il n'est pas present !
      echo "#    Fichier $fstamp de $dirsuffix 
# Cree par $0 le `date -u`
# attend les demandes au declencheur photo : 
  Creation du fichier le `date -u` !" >$fstamp;
      chmod 0666 $fstamp; # acessible en ecriture pour les scripts cgi clients
      # utiliser ce nouneau fichier en extampille temps de referance
      dstamp="`ls -l --time-style="+%s" $fstamp |( read a b c d e f g; echo $f)`"; #memo date file : 6 eme champ
      echo "Creation fichier $fstamp at $dstamp !";
      sleep 1; #pour pouvoir differentier les datation faite a la segonde pret
   fi;

   # traiter les demande internes (init ou continue si apres)(ou premiere photo a demarrage)
   if test "$declencher" != ""; then # photo demandee en interne :
     echo "$declencher le `date -u` !">>$fstamp; # mode ajout dans le fichier des demandes
     # on a simule une ecriture par un client externe qui ferais une demande de photo
     declencher=""; #forcage faite annulation demande interne
   fi;

   #calculer la date Actuelle du fichier de demande courant estampille
   datef="`ls -l --time-style="+%s" $fstamp |( read a b c d e f g; echo $f)`";  #memo date file : 6 eme champ

   #attention l'estampille est a la segonde pret !!!!
   # la comparere avec la reference memoirisee de referance dstamp
   if test "$datef" != "$dstamp"; then #si la date fichier a changee de plus d'une segonde !!!
     break; # alors fin attente client : on sort de la boucle interne d'attente
   fi;

   # fausse alerte !!! on reste en attente

   #ici on a plus rien a faire
     #on peut lancer un batch qui ecrit dans le fichier au bout de n segonde pour s'auto reveiller
     #(sleep 30; echo "Surveillance ">>$fstamp;)&

   #pour eviter de consommer du cpu on se met en attente ecriture sur fichier estampille
   echo "ATTENT SUR ${dirsuffix} DE LA DEMANDE SUIVANTE DE :";
   #attendre arrive d'une nouvelle ligne au bout du fichier : SOMMEIL interruptible :

      #   le programme qui suit, au prelable, affiche la dernier ligne,
      #  et attends l'arrive d'un commande dans le journal (attente tail  ne consomme pratiquement plus de cpu) :
      #tail -f -n 1 $fstamp  | head -n 1 ; #head n'est lance que sur EOF (s'arrete quand la nouvelle ligne arrive) (pipe beufeurise) ??? !  KOKKKK
      tail --lines=1 -f  $fstamp  | head -n 1 ; #head n'est lance que sur EOF (s'arrete quand la nouvelle ligne arrive) (pipe beufeurise) ??? !  KOKKKK


      #le premier tail affiche la dernier ligne et attends pour afficher les prochaines
      #head affiche la premier ligne recus et quitte a la deuxieme (et romp le pipe)
      reptail="$?"; # la reponse global
      if test "$reptail" != "0"; then #erreur dans tail ????
         auto="";  #fin mode automatique : pour provoquer la sortie boucle Externe demon
         break; #mais d'abord : sortie boucle Interne attente
      fi;
      #RQ :en cas interruption signal trap a deja remis auto a zero

   #on peut envisager de sortir regulierement par le timeout

     #ici on peut mettre des controle supp pour declencher automatiquement !!!!
         #  declencher="Pour changement detecte"  ( sur tempomaxi)
         #  declencher="Pour changement luminositee"
         #  interruption capteur infrarouge
              #    et faire alors un continue dans cette boucle sur demande interne 

   if test "$auto" == ""; then  #sortie boucle attente par signal qui a invalide auto
     break; #fin mode automatique on repasse en controle manuel operateur
   fi; 

   #on va tester extampille ....

 done; #fin de la boucle interne d'attente 
 # on est arrive ici par une demande web ou par un signal ou first photo (auto est possitionne ou pas)

 if test "$auto" == ""; then
  break;  #fin mode automatique on sort auusi de la boucle externe automatique demon
 fi;

 # on est toujours dans la boucle demon externe !!!

 #arrive ici on traite la demande de photo
 # on mets a jour la variable estampille de referance pour ne pas reboucler
 dstamp="$datef"; #la demande est de fait considere comme servie, par ce programme
                  # ; meme si il y a une erreur plus tard !!!

 #on lit la DERNIERE ligne du fichier de commande estampille
 # elle contiends la commande du client avec des parametres eventuels
 #lignecom="`tail -n 1 $fstamp`"; #entre temps elle ne doit pas avoir changee !!!! KOKKKKKKKKKKKKKK
 lignecom="`tail --lines=1 -f $fstamp`"; #entre temps elle ne doit pas avoir changee !!!! KOKKKKKKKKKKKKKK

 # on ignore les lignes vides ou debutant par UN # (ce qui permet des commentaire dans fstamp)
 pfirst="`echo $lignecom | (read a b ; echo $a)`"; # extraction premier champs
 if test "$pfirst" == ""; then # ligne vide
   echo "Ligne de commande vide ou blanche : ignoree";
   continue; #ignore NOP commande
 fi;
 if test "$pfirst" == "#"; then # ligne comencant par [blanc]#blanc (blanc apres le # oblogatoire)
   echo "Ligne de commande  $pfirst  : ignoree";
   continue; #ignore NOP commande
 fi;
 #traiter ici les extensions futures ...

 #la demande de declenchement photo est donc valide !

 #on recherche dans la dernier ligne de commande une demande eventuelle de changement de mode video demandee par client
 confirm="`echo $lignecom |( read a b c d ; echo $a $b)`"; #extraire 1er et 2eme  champ de la ligne
 if test "$confirm" == "en mode"; then #la ligne de changement de mode est confirme par les deux premiers mots
   newmode="`echo $lignecom |( read a b c d ; echo $c)`"; #on selectionne le 3 troisieme champ : ( En mode XXXX ) ! 
   echo " Changement de mode video \"$newmode\" demande !";
   oldmode="$newmode";setmodevideo; #procedure bavarde (infomode sera reaffiche)
   #  si en retour newmode differre de oldmode  alors demande reconnu ...
   # infomode est possitinne si il y a une erreur
   if test "$infomode" != ""; then #si erreur dans demande de changement de mode
      echo -e " $infomode"; #afficher le message d'erreur de changement de mode une premiere foix
   fi;
 fi;

 #ici tous les lignes son consideres comme des demandes de photo :

 #rechercher le perif video a utiliser (changement possible en route !)
 perif="`cat $fdev`";
 if test "$perif" != ""; then #si trouve
   perif="-d $perif"; #specifier le perif dans option de la commande a utiliser
 fi;

 echo -e "\a\a\a\a\a\a\a\a"; #pour bepper sur ordinateur interne juste avant photo 

 #memoriser dans le fichier status http l'etat courant : suppose en cours
 echo " Batch video sur $dirsuffix : en cours ... (cliquer \"Voir\" )!" | tee $fstatus;
 #envois 1er message vers le fichier de status du demon http qui n'a pas forcement le temps d'attendre !!!

 rm -f frame*.raw; #supprimer toutes les frames photo presentes (pour valider le controle par le  batch)

 lastbatch="$!"; #batch precedant
 $comvide -C $perif &  # lancement batch acquisition photo raffale 
 batch="$!"; #si batch lance => alors nouvelle valeur

 if test "$batch" == "$lastbatch"; then #erreur pas de nouveau batch
    echo "Erreur impossible de lancer le programme video batch sur $dirsuffixb !" | tee $fstatus;
    continue; #on annule la commande (qui est deja  considere comme servie)
 fi;

 # a partir d'ici il faudra pas oublier de killer le batch que l'on viend de lancer !!!

 #on selecte la frame a utiliser : tempo mise au point video (commune toutes camera !! ???)
 framevoulue="frame020.raw"; #la frame selectionne (le temps que la mise au point)(voir Hz exposition ...)
 framejapres="frame021.raw"; #la frame juste apres (pour etre sur que la precedante est finie)

 #attendre que la trame suivante soit commencee ( on a deja fait un rm avant de commencer !)
 ns="0"; tempos="0.2"; warn="";
 while ! test -f $framejapres; do #attendre la creation complete du fichier frame juste apres ....
  #controle de timeout : pour ne pas rester bloque si le batch traine
  if test "$[$ns >= 40]" == "1"; then #environ 8 segondes (ns * tempos)
    echo "Surcharge : la \"$framevoulue\" sur $dirsuffix n'est pas encore termine ? a ($ns*${tempos}S) !" | tee $fstatus;
    warn="war"; #pour hiniber message deja possitionne : "photo faite complete"
    break;
  fi;
  ns="$[1 + $ns]";
  sleep $tempos; #attente se poursuit
 done

 # batch lance ! : aboutis ou pas 
 # on fait comme si la photo (qui peut etre encore en cours) est bonne

 # gestion d'un numerot index changeant pour raffraichissemnt imposse image sur androide
 # lire premier ligne fichier index modulo courant
 numphoto="`head -n 1 $findex`"; #numero index courant
 numphoto="$[$numphoto+0]"; #zero si pas numerique

 #incrementer numero courant
 newnumphoto="$[$numphoto+1]"; # ++
 pmodulo="64"; #numerotation photo recycle modulo
 if test "$[$newnumphoto >= $pmodulo]" == "1"; then
   newnumphoto="$[$newnumphoto - $pmodulo]";  #calcul du modulo
 fi;
 #determiner le nom du fichier photo a generer dans weeb directory http
 ffw="${WEBDIRECTORYALLPHOTO}lastphoto${dirsuffix}_${newnumphoto}.jpg"; #nom de la photo a generer dans weeb directory http
 
 # "effacer" une autre de la consultation 
 #calculer le numero photo a invalider (de maninere a en garder que qq une en consultation )
 deletnumphoto="$[$newnumphoto + $[$pmodulo - 5]]"; #nombre de photo a conserver (>=1): revenir en arrier
 if test "$[$deletnumphoto >= $pmodulo]" == "1"; then 
    deletnumphoto="$[$deletnumphoto - $pmodulo]";  #calcul du modulo a deleter
 fi;
 #detreminer le nom du fichie photo a invalider dans weeb directory http
 dffw="${WEBDIRECTORYALLPHOTO}lastphoto${dirsuffix}_${deletnumphoto}.jpg"; #nom de la photo a invalider dans weeb directory http
 #invalider la photo a deleter et corriger son heure :
 # on fait evoluer le lien vers une image fixe
 # et on change son extampille au cas ou le seurfeur est vraiment bourre !
 ln -f $deletedimage $dffw; touch $dffw;  # link and update preventivement

 #echo "numerot modulo  de la photo a faire $newnumphoto  ; a supprimer $deletnumphoto";

 rm $ffw; #on supprimer fichier courant du web 
 #et le remettre apres en lien sur la nouvelle frame
 #  si pendant ce temps la le batch a fini !
 ln -f $framevoulue  $ffw;  #hard link sur la frame selectionne pour avoir acces http (atomic commande)
 #le lien ne peut pas aboutire si le fichier n'est pas encore recree
 if test "$?" != "0"; then  #impossible de faire le link frame non encore cree ?

   echo "Surcharge : la \"$framevoulue\" sur $dirsuffix n'est pas encore commencee a ($ns*${tempos}S) !" | tee $fstatus;

 else # est deja commence ou peut etre finie ? !

   if test "$warn" == ""; then #si pas en surchage : no warning 
     echo "Mise a jour photo complete sur $dirsuffix faite en moins de ($ns*${tempos}S) ." | tee $fstatus;
   fi; #sinon : message "en cours" deja possitionne
 
   #valider le nouveau numero index dans le fichier specifique dans tous les autres cas
   echo "$newnumphoto
# Ce fichier a etait mis a jour automatiquement 
#par $0 le `date -u`
# Il fait le lien avec la partie html (le programme viewsource.bin)
#et permet de changer le nom de la photo web (index);
#car certain seurfeur ne gere pas correctement leur cache !
" > $findex;

   #teste ici le fichier de commande : sauvegarde bolarchive
   arc="`cat $bolarchive |(read a b ;echo $a)`"; # champs un
   if test "$arc" == "oui"; then
     #memorisation pour archive dans directory webcam avec nom_date
     fname="photo_$dirsuffix_`date -u +%d_%m_%Y__%H_%M_%S`.raw";
     echo "Archivage en \"$fname\" ...";
     ln -f $framevoulue $fname;  #lien hard pour archiver cette photo !!!! (attention a la place disque )
     #le lien est cree sur la frame en cours
   fi;

   # la framevoulue en cours est ce quel est ! : errone bonne pas finie ?????

 fi;

 kill $batch; #arreter le batch
 if test "$?" != "0"; then #impossible de le killer ? : deja mort ?
   echo "Erreur programme video sur $dirsuffix : Arret premature !" | tee $fstatus;
 fi;


done ################################
#ici on est sortie de la boucle automatique du demon

echo "Declencheur sur $dirsuffix arrete !" | tee $fstatus; # pour message http
#le programme s'arret :
exit 10; #tempo pour visualisation dans fenetre

#

#
Retour a la page d'appel du web miroir courant
#


Adresse du demandeur : "46.22.94.252"

NC imcp.ba@trousperdu.org imcp.ba@free.fr IMCP Blandy Alain
Statistiques