S'enregistrerS'enregistrer RechercherRechercher FAQFAQ ConnexionConnexion
Serveur FTP et flux RSS

 
Poster un nouveau sujet   Répondre au sujet    Teamatic.net Index du Forum -> Linux: Questions et dépannage
Message Auteur
MessagePosté le: 27 03 2007 04:18    Sujet du message: Serveur FTP et flux RSS

J'ai écrit un petit script pour ceux qui ont un serveur FTP sous linux et qui souhaiteraient créer un flux RSS contenant la liste des nouveaux fichiers venant d'être ajoutés (liens vers le fichier + liens vers la fiche allociné si c'est un film).
J'ai essayé de le faire le plus paramétrable possible: tout est modifiable dans l'entête de configuration.
Ca marche plutôt bien, c'est assez simple à mettre en place (adapter config + installer serveur apache et lancer en root) et c'est quand même bien pratique alors je me suis dis autant en faire profiter les autres... Wink

En espérant que ça puisse servir!

Code:

#!/bin/sh
# Author : Jib <jib.leo@gmail.com>
# Date : 27/03/2007
# Depends: sed, apache2

filename=`basename $0`
if [[ `ps -A |grep "[ ]\{1\}$filename*\{0\}" | wc -l` > 2 ]]
then
        echo "$filename: already running!"
        exit
fi

#################################################################################
                                 CONFIGURATION                              #################################################################################
delay=10
out_txt=/home/ftp/virtual/whatsnew.txt
out_rss=/var/www/rss.xml

#Tableau des dossier (par rapport à la racine du ftp)
declare -a ftp_folder=(DivX eMule Musique Jeux)

#Tableau des dossier (par rapport au disque dur local)
declare -a local_folder=(/media/extern/DivX /mnt/data/emule /media/extern/Musique /media/extern/Jeux)

#Tableau spécifiant pour chacun des dossiers du FTP s'il faut afficher
#tous les nouvaux fichiers ou seulement les nouveaux dossier (ex: Album musique = afficher uniquement le dossier)
declare -i show_folders_only=(0 0 1 1)

declare -a video_extensions=(avi mpg mpeg mkv)

movies_search_engine="http://www.allocine.fr/recherche/?motcle="
movies_link_name="Lien allocine.fr"

ftp_login="user"
ftp_passwd="password"
ftp_host="host.hd.free.fr"

rss_title="FTP"
rss_descript="Liste des nouveaux fichiers"
#################################################################################

utf8=`env | grep LANGUAGE | grep "UTF-8" | wc -l`
if [[ $utf8 == 1 ]]
then
   encoding="UTF-8"
else
   encoding="ISO-8859-1"
fi

if [ -s $out_txt ]
then
   echo "Text file OK :)"
else
   echo "Text file missing :( Creating text file..."
   echo "---" > $out_txt
fi

if [ -s $out_rss ]
then
   echo "RSS feed OK :)"
else
   echo "RSS feed missing :( Creating RSS feed..."

   echo "<?xml version=\"1.0\" encoding=\"$encoding\"?>" > $out_rss
   echo -e "\t<rss version=\"2.0\">" >> $out_rss
   echo -e "\t\t<channel>" >> $out_rss
   echo -e "\t\t\t<title>$rss_title</title>" >> $out_rss
   echo -e "\t\t\t<link>ftp://$ftp_login:$ftp_passwd@$ftp_host</link>" >> $out_rss
   echo -e "\t\t\t<description>$rss_descript</description>" >> $out_rss
   echo -e "\t\t\t<language>fr</language>" >> $out_rss
   echo -e "\t\t\t<generator>$rss_title</generator>" >> $out_rss
   echo -e "\t\t</channel>" >> $out_rss
   echo -e "\t</rss>" >> $out_rss
fi

echo "*$filename: loaded sucessfuly*"

nb_folders=${#ftp_folder[*]}

declare -i nb1[$nb_folders]
declare -i nb2[$nb_folders]

sep=`seq --separator=, 2 1 100`

function handle_trap()
{
   ftp_foler=$1
   nb_folders=$2
   for i in `seq 0 1 $(($nb_folders-1))`
   do
      rm -rf /tmp/.$$_1_${ftp_folder[$i]}.txt
      rm -rf /tmp/.$$_2_${ftp_folder[$i]}.txt
      rm -rf /tmp/.$$_3_${ftp_folder[$i]}.txt

   done
}

trap 'handle_trap $ftp_folder $nb_folders; exit' 1 2 3 15


function conversion_url()
{
   convert="$1"
   
   #attention à l'encodage utilisé pour les caractères accentués!!
   declare -a tab_car=(é è ê ë à â ä ï î ç ù)
        declare -a tab_url=(%E9 %E8 %EA %EB %E0 %E2 %E4 %EF %EE %E7 %F9)

        for i in `seq 0 1 $((${#tab_url[*]}-1))`
        do
      car=${tab_car[$i]}
      url=${tab_url[$i]}
      convert=`echo $convert | sed 's/'$car'/'$url'/g'`
        done
        echo $convert | sed 's/ /%20/g'
}

for i in `seq 0 1 $(($nb_folders-1))`
do
   if [[ -d "${local_folder[$i]}" ]]
   then   
      cd "${local_folder[$i]}"
      nb1[$i]=`du -aLD|wc -l`
      du -aLD|cut -d"." -f $sep > /tmp/.$$_1_${ftp_folder[$i]}.txt
   fi
done

while true
do
   for i in `seq 0 1 $(($nb_folders-1))`
   do
   if [[ -d "${local_folder[$i]}" ]]
   then
         cd "${local_folder[$i]}"
         nb2[$i]=`du -aLD|wc -l`
   
         if [[ ${nb1[$i]} != ${nb2[$i]} ]]
         then
            du -aLD|cut -d"." -f $sep > /tmp/.$$_2_${ftp_folder[$i]}.txt
            if [[ `diff /tmp/.$$_1_${ftp_folder[$i]}.txt /tmp/.$$_2_${ftp_folder[$i]}.txt|grep ">"` != "" ]]
            then
               echo "`diff /tmp/.$$_1_${ftp_folder[$i]}.txt /tmp/.$$_2_${ftp_folder[$i]}.txt|grep '>'| cut -d' ' -f $sep`" > /tmp/.$$_3_${ftp_folder[$i]}.txt
               nbl=`cat /tmp/.$$_3_${ftp_folder[$i]}.txt| wc -l`
               for j in `seq $nbl`
               do
                  file=`cat /tmp/.$$_3_${ftp_folder[$i]}.txt |head -n $j |tail -n 1`   

                  if [[ ${show_folders_only[$i]} == 1 ]]
                  then
                     if [[ -d "${local_folder[$i]}$file" ]]
                     then
      
                        keep_file=1
                        folder_level=`echo $file | tr -cd / |wc -c`
                     else
                        keep_file=0
                        folder_level=0
                     fi

                  else
                     keep_file=1
                     folder_level=1
                  fi

                  if [ $keep_file -eq 1 -a $folder_level -eq 1 ]
                  then
   
                     #text file:
                     sed -i 1i"`date +"%d/%m/%y %H:%M"` Ajout de \"${ftp_folder[$i]}$file\"" $out_txt
      
                     #rss feed:
                     sed -i '1,8d' $out_rss
                     sed -i 1i"<tab><tab><tab></item>" $out_rss
                     
                     is_video=0                     
                     for k in `seq 0 1 $((${#video_extensions[*]}-1))`
                     do
                        let "is_video+=`echo $file | grep "[[:alnum:]]\{0,\}.${video_extensions[$k]}" | wc -l`"
                     done
                     
                     if [[ $is_video == 1 ]]
                     then
                        query=${file%.*}
                        query=${query#/*}
                        query=`echo "$query" |tr " " "+"`
                        sed -i 1i"<tab><tab><tab><tab><description><![CDATA[`date +"%d/%m/%y %H:%M"` Ajout de \"${ftp_folder[$i]}$file\"<br /><a href='$movies_search_engine`conversion_url "$query"`'>$movies_link_name</a>]]></description>" $out_rss
                     else
                        sed -i 1i"<tab><tab><tab><tab><description><![CDATA[`date +"%d/%m/%y %H:%M"` Ajout de \"${ftp_folder[$i]}$file\"]]></description>" $out_rss
                     fi
                        sed -i 1i"<tab><tab><tab><tab><pubDate>`date -R`</pubDate>" $out_rss
                        sed -i 1i"<tab><tab><tab><tab><link>ftp://$ftp_login:$ftp_passwd@$ftp_host/${ftp_folder[$i]}`conversion_url "$file"`</link>" $out_rss
                        sed -i 1i"<tab><tab><tab><tab><title>\"${ftp_folder[$i]}$file\"</title>" $out_rss
                        sed -i 1i"<tab><tab><tab><item>" $out_rss
                        sed -i 1i"<tab><tab><tab><generator>$rss_title</generator>" $out_rss
                        sed -i 1i"<tab><tab><tab><language>fr</language>" $out_rss
                        sed -i 1i"<tab><tab><tab><description>$rss_descript</description>" $out_rss
                        sed -i 1i"<tab><tab><tab><link>ftp://$ftp_login:$ftp_passwd@$ftp_host</link>" $out_rss
                        sed -i 1i"<tab><tab><tab><title>$rss_title</title>" $out_rss
                        sed -i 1i"<tab><tab><channel>" $out_rss
                        sed -i 1i"<tab><rss version=\"2.0\">" $out_rss
                        sed -i 1i"<?xml version=\"1.0\" encoding=\"$encoding\"?>" $out_rss
                        sed -i 's/<tab>/\t/g' $out_rss
                  fi
               done
               echo -e "\t*${ftp_folder[$i]}* (+)"
               fi
               du -aLD|cut -d"." -f $sep > /tmp/.$$_1_${ftp_folder[$i]}.txt
            fi
            nb1[$i]=`du -aLD|wc -l`
            sleep $delay
            echo "${ftp_folder[$i]} (OK)"
      fi
   done
done


N'hésitez pas si vous avez des remarques, surtout en ce qui concerne l'amélioration du code...
Bryce
Équipe Teamatic
Équipe Teamatic


Inscrit le: 08 Mar 2002
Messages: 720
Localisation: Dans la matrice...

Revenir en haut
MessagePosté le: 28 03 2007 23:02    Sujet du message:

c'est la classe ca...

j'vais voir ce que je peux en faire...

merci
SandMan
Modérateur
Modérateur


Inscrit le: 28 Juil 2004
Messages: 5062
Localisation: The Dreaming

Revenir en haut
MessagePosté le: 25 04 2007 17:56    Sujet du message:

Pour faire les choses un peu mieux j'ai fait une archive avec un script d'init.d, un fichier de conf séparé et même un ptit installer/remover
whatsnew.tar.bz2

J'ai une autre version beaucoup plus avancé qui permet de "suivre la trace des fichier" (barre le liens si le fichier a été supprimé, met a jour le liens si le fichier a été déplacé, etc...)
Quand ça marchera complètement je le mettrais peut être sur sourceforce (s'ils acceptent Wink

Mais pour l'instant le gros problème de fond c'est de savoir reconnaitre un nouveau fichier d'un fichier déplacé (sans consommer trop de ressources inutilement). Enfin, si quelqu'un à une réponse je suis preneur pcq je commence a être un peu a cours d'idées...
Bryce
Équipe Teamatic
Équipe Teamatic


Inscrit le: 08 Mar 2002
Messages: 720
Localisation: Dans la matrice...

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet Toutes les heures sont au format GMT
Page 1 sur 1

 
 
 
Powered by phpBB © 2001, 2005 phpBB Group - Traduction : phpBB-fr.com
Gzip: Disabled  -  Queries: 15  -  Generation Time: 0.78423 s