| Message |
Auteur |
Posté 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...
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

Inscrit le: 08 Mar 2002 Messages: 720 Localisation: Dans la matrice...
|
|
Revenir en haut |
|
|
|
 |
Posté 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

Inscrit le: 28 Juil 2004 Messages: 5062 Localisation: The Dreaming
|
|
Revenir en haut |
 |
Posté 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
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

Inscrit le: 08 Mar 2002 Messages: 720 Localisation: Dans la matrice...
|
|
Revenir en haut |
 |
|