[Resolu] Script de rappel de dates d'anniversaire

Script de rappel de dates d'anniversaire [Resolu] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 21-10-2005 à 22:27:56    

Bonsoir a tous.
Comme je suis tres tete en l'air, j'oublie tout le temps les dates d'anniversaire de mes proches.
 
J'ai eu une idée qui je pense peut etre tres simple a realiser avec un script, mais je ne sais pas trop comment faire.
Comme j'ai un serveur qui tourne 24/24, il faudrait que le script soit lancé 1 fois par jour, et qu'il lise dans un fichier les dates d'anniversaire configurés ainsi qu'un message associé. (pour le lancer une fois par jour je compte utiliser crontab)
 
On pourrait par exemple avoir un fichier anniversaires.txt qui contiendrait :
 

Code :
  1. 06/10 "Nous sommes le 6 octobre ! C'est l'anniversaire de X !"
  2. 16/12 "Nous sommes le 12 decembre ! C'est l'anniversaire de Y !"


 
Le script lancé chaque jour devrait donc ouvrir ce fichier, regarder si une date correspond a la date du jour, et si oui envoyer un mail avec le message associé.
On pourrait meme envisager de mettre l'adresse mail dans le fichier :
 

Code :
  1. 06/10 destinataire@domaine.truc "Nous sommes le 6 octobre ! C'est l'anniversaire de X !"
  2. 16/12 destinataire@domaine.truc "Nous sommes le 12 decembre ! C'est l'anniversaire de Y !"


 
En fait ensuite on pourrait meme imaginer un truc encore plus generaliste, qui permettrait d'envoyer un mail pour rappeler de faire quelque chose, de facon cyclique (chaque année pour un anniversaire par ex) ou pas (un truc ponctuel), avec une configuration tres souple par une page web ? Une page PHP par exemple qui permettrait de generer le fichier txt contenant les dates, les mails et les messages ?
 
Enfin pour l'instant j'en suis pas là ;)
Il faut que je fasse juste un petit script qui scanne les lignes et envoit un mail au destinataire avec le message associé si la date correspond a la date du jour. Pour envoyer le mail je vais trouver comment faire, mais pour depioter les lignes et tester la date je vois pas  :??:  
 
Si vous avez des idées...   :hello:  
 
Cyril


Message édité par nlc le 22-10-2005 à 14:00:59
Reply

Marsh Posté le 21-10-2005 à 22:27:56   

Reply

Marsh Posté le 21-10-2005 à 22:40:02    

c'est typiquement le genre de truc que tu peux faire avec n'importe quel language. Tout depend de tes connaissances.
 
bash est ton ami. Python aussi :)

Reply

Marsh Posté le 21-10-2005 à 23:04:59    

"Une copinedegeek, comme toute femme, est une encyclopédie de dates, elle se rappelle du jour de sa rencontre avec son geek, de toutes les disputes surtout quand c’est l’autre qui a tort (attention aux vieux dossiers), du premier baiser, de la date d’anniversaire de son geek, de ses parents, des parents de son geek, de la date de son mariage etc...
Un homme en général connaît... la date du jour de sa naissance et ne voit pas pourquoi il faudrait retenir toutes ces dates...
Mais parlons plus précisément du geek, avec l’expérience, je commence à intégrer la gestion des anniversaires par nos petits amis les geeks."
 
La suite sur copine de geek

Reply

Marsh Posté le 21-10-2005 à 23:10:09    

Ben oui je sais bien que n'importe quel script pourrait faire l'affaire. Le souci ensuite c'est de le faire ;)
 
Ce que je voudrais faire, c'est un truc du style, que je dois convertir en bash :
 
boucle sur toutes les lignes du fichier
 1) Separer dans 3 variables les 3 champs de la ligne ( $date $destinataire $message )
 2) Si la date correspond, on envoit le mail :
  $dateDuJour=date +%d/%m
  if [ $dateDuJour -eq $date ]; then
   echo $message | mail -s "Anniversaire !!" $destinataire
  fi
fin boucle
 
Là ou je coince, c'est pour faire la boucle et scinder une ligne du fichier en 3 champs.
Comment on peut faire ca en bash ?

Reply

Marsh Posté le 21-10-2005 à 23:25:33    

J'ai fait un bout du script pour debugguer la detection de la bonne date et envoyer le mail. Cette partie fonctionne.
 

Code :
  1. #!/bin/sh
  2. date="21/10";
  3. destinataire="chaenel@free.fr";
  4. message="C'est l'anniversaire de personne !"
  5. dateDuJour=`date +%d/%m`;
  6. if [ $dateDuJour = $date ]; then
  7.         echo $message | mail -s "Anniversaire !!" $destinataire
  8. fi

Reply

Marsh Posté le 21-10-2005 à 23:31:37    

man bash :)
 
mouais donc, a supposer que le separateur est : (deux points)
mon fichier dates.txt contient ca, et se trouve dans le répertoire courant :

Code :
  1. toto:titi:tata
  2. dodo:didi:dada


 

Code :
  1. #!/bin/sh
  2. for i in `cat dates.txt`;do
  3. var1=`echo $i | cut -d: -f1`
  4. var2=`echo $i | cut -d: -f2`
  5. var3=`echo $i | cut -d: -f3`
  6. done
  7. echo "valeur 1 : ${var1}"
  8. echo "valeur 2 : ${var2}"
  9. echo "valeur 3 : ${var3}"


 
C'est crade, y'a des methodes plus propre pour le faire, mais tu obtiendras ton résultat. Apres, tu fais ce que tu veux des variables


Message édité par syl94 le 21-10-2005 à 23:32:28
Reply

Marsh Posté le 22-10-2005 à 00:00:12    

Bon j'ai reussi a faire un truc qui marche :
 

Code :
  1. #!/bin/sh
  2. admin="xxx@xxx.fr";
  3. file="anniversaire.txt";
  4. # On verifie si le fichier anniversaire existe
  5. if [ ! -f $file ]; then
  6.         echo "Attention, le fichier anniversaire.txt n'existe pas !!" | mail -s "Anniversaire !!" $admin
  7.         exit 1
  8. fi
  9. # On recupere la date du jour
  10. dateDuJour=`date +%d/%m`;
  11. # On teste chaque ligne
  12. cat < $file | while true
  13. do
  14.         # Si le fichier est fini on sort
  15.         read ligne
  16.         if [ "$ligne" = "" ]; then break;
  17.         fi
  18.         # On recupere les 3 champs separés par un ';'
  19.         date=`echo $ligne | awk -F ';' '{print $1}'`
  20.         destinataire=`echo $ligne | awk -F ';' '{print $2}'`
  21.         message=`echo $ligne | awk -F ';' '{print $3}'`
  22.         # Si la date correspond on envoit le mail
  23.         if [ $dateDuJour = $date ]; then
  24.                 echo $message | mail -s "Anniversaire !!" $destinataire
  25.         fi
  26. done


 
Par contre le fichier anniversaire.txt ne doit pas avoir de lignes superflues et doit etre de la forme :
21/10;desti@domaine.truc;C'est l'anniversaire de personne !
 
Pensez vous qu'on peut faire plus simple et plus propre ? Notemment sur la separation des champs peut etre ?


Message édité par nlc le 22-10-2005 à 00:08:05
Reply

Marsh Posté le 22-10-2005 à 00:04:18    

syl94 : ok merci je viens de voir ta reponse. Ok j'ai compris, le principe est un peu le meme que moi mais avec une commande differente.
 
Par contre je vais utiliser ta methode pour la boucle, je trouve ca plus clair que la mienne :)

Reply

Marsh Posté le 22-10-2005 à 18:36:06    

c'est dingue je voulais faire exactement le meme script il y a 2 jours ...


---------------
Radio Club de Fontainebleau F8KTH
Reply

Marsh Posté le 22-10-2005 à 18:41:39    

Trop fort
 
Je met ca dans mon bash.bashrc :love:


Message édité par M300A le 22-10-2005 à 18:41:49
Reply

Marsh Posté le 22-10-2005 à 18:41:39   

Reply

Marsh Posté le 22-10-2005 à 18:42:53    

le format du fichier text m'a l'air un peu chiant ... Je me demande si je vais pas faire ca en php/mysql avec la page php appellé a traver un wget par le cron ... Si l'un de vous a déjà fait ca m'evitera de la refaire :)


---------------
Radio Club de Fontainebleau F8KTH
Reply

Marsh Posté le 23-10-2005 à 16:16:23    

En meme temps, le fichier texte, une fois qu'il est rempli..... ;)

Reply

Marsh Posté le 02-11-2005 à 00:29:29    

Citation :


Code :
 
    * #!/bin/sh
    *
    * admin="xxx@xxx.fr";
    * file="anniversaire.txt";
    *
    *
    *
    * # On verifie si le fichier anniversaire existe
    *
    * if [ ! -f $file ]; then
    *         echo "Attention, le fichier anniversaire.txt n'existe pas !!" | mail -s "Anniversaire !!" $admin
    *         exit 1
    * fi
    *
    *
    *
    * # On recupere la date du jour
    *
    * dateDuJour=`date +%d/%m`;
    *
    *
    * # On teste chaque ligne
    *
    * cat < $file | while true
    * do
    *         # Si le fichier est fini on sort
    *
    *         read ligne
    *         if [ "$ligne" = "" ]; then break;
    *         fi
    *
    *         # On recupere les 3 champs separés par un ';'
    *
    *         date=`echo $ligne | awk -F ';' '{print $1}'`
    *         destinataire=`echo $ligne | awk -F ';' '{print $2}'`
    *         message=`echo $ligne | awk -F ';' '{print $3}'`
    *
    *         # Si la date correspond on envoit le mail
    *
    *         if [ $dateDuJour = $date ]; then
    *                 echo $message | mail -s "Anniversaire !!" $destinataire
    *         fi
    *
    * done


 
Sympa ce script ! J'aimerais savoir s'il était possble d'y apporter une petite modification.
J'ai une dizaine de comptes utilisateurs sur mon serveur et plutôt que d'avoir un seul fichier "anniversaire.txt", j'aimerais que le script prenne en compte les fichiers "anniversaire.txt" de tous les utilisateurs du serveur. De manière à ce que chaque utilisateur puisse apporter ses propres modification dans son fichier "anniversaire.txt" situé dans /home/username.
 
C'est possible ?
Merci d'avance...

Reply

Marsh Posté le 02-11-2005 à 09:13:35    

oui, c'est faisable, et meme facilement realisable. On pourrait placer une condition en tete du script genre  
 

Code :
  1. if [ -f ~/anniversaire.txt ];then
  2. ...
  3. fi


 
ensuite, un appel au script dans le .bashrc (ou autre *rc du shell user)

Reply

Marsh Posté le 04-11-2005 à 20:52:49    

C'est vrai que ton idée hobgob est pas mal.
 
Mais je pense que plutot que le script soit lancé dans le bashrc de l'utilisateur, il faudrait que le script soit lancé par crond tous les matins, et qu'il scanne tous les repertoires utilisateurs pour voir si l'un d'entre eux possede un fichier anniversaire.txt.


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 04-11-2005 à 22:50:30    

Citation :

   *         date=`echo $ligne | awk -F ';' '{print $1}'`
    *         destinataire=`echo $ligne | awk -F ';' '{print $2}'`
    *         message=`echo $ligne | awk -F ';' '{print $3}'`


beurk :D
 

Citation :

IFS=;
set $ligne


 
et hop la date est dans $1, le destinataire dans $2 et le message dans $3 !


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 04-11-2005 à 22:52:08    

nlc a écrit :

C'est vrai que ton idée hobgob est pas mal.
 
Mais je pense que plutot que le script soit lancé dans le bashrc de l'utilisateur, il faudrait que le script soit lancé par crond tous les matins, et qu'il scanne tous les repertoires utilisateurs pour voir si l'un d'entre eux possede un fichier anniversaire.txt.


 
 
/etc/bashrc ou un truc dans le genre et ca roule. pas besoin de "scanner".


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 07-11-2005 à 21:34:02    

Si tu met ca dans un bashrc, tu aura un message a chaque fois que tu lances un nouveau shell (xterm...). En plus, bashrc n'est pas sense produire d'output car ca casse scp et rcp. Et enfin ca ne s'appliquera pas aux utilisateurs qui n'utilisent pas bash.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed