source: spip-zone/_plugins_/site_archive/bin/site_archive.sh @ 41456

Last change on this file since 41456 was 41456, checked in by paladin@…, 9 years ago

creer index.html pour archive multi pages

  • Property svn:executable set to *
File size: 11.9 KB
Line 
1#!/bin/sh
2
3# Site Archive (SiA)
4
5# Script batch d'archive de site
6
7# $LastChangedRevision: 35 $
8# $LastChangedBy: cpaulus $
9# $LastChangedDate: 2010-09-01 14:23:47 +0200 (Mer 01 sep 2010) $
10
11# @author Christian Paulus <cpaulus at quesaco.org>
12
13# Script lancé en batch par le plugin.
14
15# Peut etre lancé directement du terminal à
16# partir de la racine du site.
17
18# options par défaut
19LOGGER="/usr/bin/logger"
20LOGGER_TAG="[SIA]"
21WGET="/opt/local/bin/wget"
22WGET_LOG_MAX_SIZE=200 # en Ko
23
24# LOG_DIR et LOG_SUFFIX de SPIP
25LOG_DIR="tmp/"
26LOG_SUFFIX=".log"
27
28IP_HOST=""
29
30# journaux de wget. Ne devraient pas arriver ici.
31# défini par sia_fonctions.php
32SIA_LOGS_DIR="tmp/sia/"
33
34syslog_log()
35{
36        #/usr/bin/syslog -s -l $2 "[SIA] $1"
37        $LOGGER -t "$LOGGER_TAG" "$1"
38       
39        # Ecriture dans le journal (si existe) en double
40        if [ "$SIA_LOG_FILE" != "" ] && [ -f "$SIA_LOG_FILE" ]
41        then
42                NOW=`date '+%b %d %X'`
43                echo "$NOW $IP_HOST (pid ${PPID}) [SIA] $1" >> "$SIA_LOG_FILE"
44        fi
45}
46
47notice_log()
48{
49        syslog_log "$1" 5
50}
51
52error_log()
53{
54        syslog_log "$1" 3
55}
56
57help_usage()
58{
59        echo "help_usage: `basename $0` [-n nom_archive] [-p chemin_destination] [-u url_cible]
60       
61                -n nom du fichier
62                -p chemin du répertoire de destination
63                -t type de cible (unique, multi ou  texte)
64                -u url du document cible utilisé par wget
65       
66        Si appelé sans argument, recherche dans le chemin courant :
67                tmp/<site_archive_name>*.lock
68               
69        Si fichier trouvé, charge du todo correspondant
70        les paramètres de l'archivage demandé.
71       
72        Exemple de contenu d'un fichier tmp/site_archive-unique.todo
73       
74                sia: LastChangedRevision: 35
75                siajobname: quesaco-Archive-de-site-Website-archiver-u
76                destdir: img/zip/
77                tmpdir: tmp/
78                lockfile: tmp/quesaco-Archive-de-site-Website-archiver_u.lock
79                logdir: tmp/
80                logsuf: .log
81                sialogsdir: tmp/sia/
82                type: texte
83                level: 1
84                targeturl: http://127.0.0.1:8011/spip.php?page=site_archive-texte&id_rubrique=2
85                iphost: 127.0.0.1
86                wget: /opt/local/bin/wget
87
88        "
89       
90        # Cet exemple peut différer si options choisies (strict, etc.)
91}
92
93# Vérifier position en racine SPIP
94if [ -d "ecrire" ] && [ -d "squelettes-dist" ] && [ -d "tmp" ]
95then 
96        syslog_log "`basename $0` starting"
97else
98        error_log "`basename $0` doit être lancé à la racine du site SPIP"
99        exit -1
100fi
101
102NOTICE="Calling shell site_archive"
103
104if [ ! -n "$1" ]
105then
106        # via at ou batch, les params sont dans un todo
107        NOTICE="$NOTICE whithout arguments"
108else
109        # en direct, les paramètres sont disponibles
110        while getopts :n:p:t:u:h argument
111        do
112                case $argument in
113               
114                        h) help_usage; exit 64 ;;
115                       
116                        n) target_name="$OPTARG";; ##
117                        :) help_usage; exit 64 ;;
118                       
119                        p) path_dest="$OPTARG";;
120                        :) help_usage; exit 64 ;;
121                       
122                        t) type_archive="$OPTARG";;
123                        :) help_usage; exit 64 ;;
124                       
125                        u) url_objet=$OPTARG;;
126                        :) help_usage; exit 64 ;;
127       
128                esac
129        done
130        NOTICE="$NOTICE with arguments"
131fi
132
133# tente de lire un todo dans le tmp/
134TODOFILES=`ls tmp/*todo`
135if [ "$?" -ne "0" ]
136then
137        echo "Error: todo file missing."
138        exit "$?"
139fi
140
141# traiter les todo
142for ii in `ls tmp/*todo`
143do
144        SIA=""
145       
146        # le todo est composé d'une clé:valeur par ligne
147        while read key val
148        do
149                case $key in
150                        "sia:")         SIA="$val";;
151                        "siajobname:")  SIA_JOB_NAME="$val";;
152                        "destdir:")     SIA_DEST_FOLDER="$val";;
153                        "tmpdir:")      SIA_SPIP_TEMP="$val";;
154                        "lockfile:")    SIA_LOCK_FILE="$val";;
155                        "logdir:")      LOG_DIR="$val";;
156                        "logsuf:")      LOG_SUFFIX="$val";;
157                        "sialogsdir:") SIA_LOGS_DIR="$val";;
158                        "type:")        SIA_TYPE="$val";;
159                        "level:")       SIA_LEVEL="$val";;
160                        "targeturl:")   SIA_TARGET_URL="$val";;
161                        "iphost:")      IP_HOST="$val";;
162                        "wget:")        WGET="$val";;
163                        "randomwait:")  RANDOM_WAIT="$val";;
164                        "strict:")      STRICT_MODE="$val";;
165                        "useragent:")   USER_AGENT="$val";;
166                esac
167        done < "$ii"
168
169        # si fichier valide, quitter la boucle
170        if [ "$SIA" != "" ]
171        then
172                # le fichier lock est vide = tache disponible
173                # Prendre la main
174                if [ -f "$SIA_LOCK_FILE" ] && [ ! -s "$SIA_LOCK_FILE" ]
175                then
176                        echo "$PPID" > "$SIA_LOCK_FILE"
177                        SIA_TODO_FILE="$ii"
178                        NOTICE="$NOTICE using $ii"
179                        break 2
180                fi
181                # sinon, passer au suivant
182        fi
183done
184
185# les surcharges passées via la console
186# (options du script)
187if [ ! -z "$target_name" ]
188then
189        SIA_JOB_NAME="$target_name"
190fi
191if [ ! -z "$path_dest" ]
192then
193        SIA_DEST_FOLDER="$path_dest"
194fi
195if [ ! -z "$type_archive" ]
196then
197        SIA_TYPE="$type_archive"
198fi
199if [ ! -z "$url_objet" ]
200then
201        SIA_TARGET_URL="$url_objet"
202fi
203
204# le log géré par SPIP
205SIA_LOG_FILE="${LOG_DIR}sia${LOG_SUFFIX}"
206
207# le log de wget
208if [ -d "${SIA_LOGS_DIR}" ]
209then
210        WGET_LOG_FILE="${SIA_JOB_NAME}${LOG_SUFFIX}"
211else
212        WGET_LOG_FILE="/dev/null"
213fi
214
215# a partir d'ici, notice_log et error_log sont utilisables
216notice_log "$NOTICE"
217notice_log "sia log file: $SIA_LOG_FILE"
218notice_log "wget log file: $WGET_LOG_FILE"
219
220#######
221WGET_OPTIONS=""
222
223# Pas de hiérarchie de répertoires
224WGET_OPTIONS="$WGET_OPTIONS --no-directories "
225
226# -nH --no-host-directories
227# Ne pas créer le répertoire destination
228WGET_OPTIONS="$WGET_OPTIONS --no-host-directories "
229
230# Cacher le premier composant
231WGET_OPTIONS="$WGET_OPTIONS --cut-dirs=1 "
232
233# Ne pas remonter dans les répertoires parents
234WGET_OPTIONS="$WGET_OPTIONS --no-parent "
235
236# En fin de traitement, convertir les liens internes
237# pour une consultation locale.
238WGET_OPTIONS="$WGET_OPTIONS --convert-links "
239
240# Renommer les fichiers, compatibilité Windows.
241# (les '?' sont sources à problèmes)
242WGET_OPTIONS="$WGET_OPTIONS --restrict-file-names=windows "
243
244# -E --adjust-extension --html-extension: forcer l'extension html si besoin
245WGET_OPTIONS="$WGET_OPTIONS -E "
246
247# Ajouter les messages au journal
248WGET_OPTIONS="$WGET_OPTIONS -a $WGET_LOG_FILE "
249
250# Options complémentaires
251if [ ! -z "$USER_AGENT" ]
252then
253        WGET_OPTIONS="$WGET_OPTIONS --user-agent=\"$USER_AGENT\" "
254fi
255if [ ! -z "$RANDOM_WAIT" ]
256then
257        WGET_OPTIONS="$WGET_OPTIONS --random-wait "
258fi
259
260WGET_RECUR_OPTIONS=""
261# -r: recursif
262WGET_RECUR_OPTIONS="-r "
263
264# -l 1: profondeur récursif, 1 pour ramener les images, a minima
265if [ ! -z "$SIA_LEVEL" ] && [ "$SIA_LEVEL" -gt "1" ] && [ "$SIA_LEVEL" -le "5" ]
266then
267        WGET_RECUR_OPTIONS="$WGET_RECUR_OPTIONS -l $SIA_LEVEL "
268else
269        WGET_RECUR_OPTIONS="$WGET_RECUR_OPTIONS -l 1 "
270fi
271
272# -k: convert-links: convertir les liens relatifs
273WGET_RECUR_OPTIONS="$WGET_RECUR_OPTIONS -k "
274
275if [ "$SIA_TYPE" = "multi" ]
276then
277        WGET_OPTIONS="$WGET_RECUR_OPTIONS $WGET_OPTIONS"
278else
279        if [ "$SIA_TYPE" = "unique" ]
280        then
281                WGET_OPTIONS="$WGET_RECUR_OPTIONS $WGET_OPTIONS"
282        else
283                # la version texte est un seul fichier, sans lien
284                WGET_OPTIONS="$WGET_OPTIONS"
285        fi
286fi
287
288notice_log "wget options: $WGET_RECUR_OPTIONS $WGET_OPTIONS"
289
290# Créer si besoin le réceptacle des logs wget
291# (a dû être créé par le plugin)
292if [ ! -d "${SIA_TEMP_FOLDER}${SIA_LOGS_DIR}" ]
293then
294        notice_log "Create wget logs dir ${SIA_TEMP_FOLDER}${SIA_LOGS_DIR}"
295        mkdir "${SIA_TEMP_FOLDER}${SIA_LOGS_DIR}"
296       
297        if [ "$?" -ne "0"]
298        then
299                error_log "${SIA_TEMP_FOLDER}${SIA_LOGS_DIR} not writable"
300        else
301                SIA_LOGS_DIR="${SIA_TEMP_FOLDER}${SIA_LOGS_DIR}"
302        fi
303fi
304
305# Le download a lieu dans un dossier qui porte
306# le nom de l'archive dans le temporaire.
307SIA_TEMP_FOLDER="${SIA_SPIP_TEMP}${SIA_JOB_NAME}"
308
309notice_log "sia temp folder: $SIA_TEMP_FOLDER"
310
311# Créer le répertoire temporaire de download
312if [ ! -e "$SIA_TEMP_FOLDER" ]
313then
314
315        mkdir "$SIA_TEMP_FOLDER"
316
317        if [ "$?" -ne 0 ]
318        then
319                # n'a pas réussi à le créer. Abandon.
320                error_log "${SIA_TEMP_FOLDER} not writable"
321                exit $?
322        else
323                notice_log "Runing wget in ${SIA_TEMP_FOLDER}/"
324               
325                # wget dans un sous shell, au bon endroit
326                ( cd "${SIA_TEMP_FOLDER}/"; $WGET $WGET_OPTIONS $SIA_TARGET_URL )
327               
328                ERR="$?"
329               
330                if [ "$ERR" -ne "0" ]
331                then
332                        case $ERR in
333                        1) MSERR="No problems occurred.";;
334                        2) MSERR="Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc...";;
335                        3) MSERR="File I/O error.";;
336                        4) MSERR="Network failure.";;
337                        5) MSERR="SSL verification failure.";;
338                        6) MSERR="Username/password authentication failure.";;
339                        7) MSERR="Protocol errors.";;
340                        8) MSERR="Server issued an error response.";;
341                        esac
342                       
343                        if [ "$STRICT_MODE" = "on" ] || [ "$ERR" -ne "8" ]
344                        then
345                                error_log "FATAL ERROR: wget error using: $WGET $WGET_OPTIONS $SIA_TARGET_URL"
346                                error_log "FATAL ERROR: wget error $ERR. $MSERR"
347                                exit "$ERR"
348                        fi
349                fi
350
351                if [ -c "${WGET_LOG_FILE}" ]
352                then
353
354                        # device ?
355                        SIA_CURR_LOG="${WGET_LOG_FILE}"
356                        SIA_REAL_LOG="${WGET_LOG_FILE}"
357                else
358
359                        # Le log de l'opération wget en cours
360                        # se trouve dans le rép en cours
361                        SIA_CURR_LOG="${SIA_TEMP_FOLDER}/${WGET_LOG_FILE}"
362               
363                        # Le log wget officiel
364                        SIA_REAL_LOG="${SIA_LOGS_DIR}${SIA_JOB_NAME}.log"
365                fi
366               
367                notice_log "Curr log: ${SIA_CURR_LOG}"
368                notice_log "Real log: ${SIA_REAL_LOG}"
369               
370                # si vrai fichier (et pas device)
371                if [ -f "$SIA_CURR_LOG" ]
372                then
373
374                        # si log déjà présent, vérifier taille
375                        if [ -f "$SIA_REAL_LOG" ]
376                        then
377                                # obtenir la place occupée par le log, en ko
378                                size=`du -k "$SIA_REAL_LOG" | cut -f1`
379                                notice_log "Current log size: $size K"
380                               
381                                if [ "$size" -gt "$WGET_LOG_MAX_SIZE" ]
382                                then
383                                        notice_log "Rotate log ${SIA_LOGS_DIR}${SIA_JOB_NAME}"
384                                        for ii in 2 1
385                                        do
386                                                let nn=1+$ii
387                                                f="${SIA_LOGS_DIR}${SIA_JOB_NAME}.$ii.log"
388                                                if [ -f "${f}" ]
389                                                then
390                                                        mv "${f}" "${SIA_LOGS_DIR}${SIA_JOB_NAME}.$nn.log"
391                                                fi
392                                        done
393                                       
394                                        # Archiver le log actuel
395                                        cat ${SIA_REAL_LOG} > ${SIA_LOGS_DIR}${SIA_JOB_NAME}.1.log
396                                fi
397                        fi
398
399                        # créer le log officiel ou mettre à 0
400                        cat /dev/null > $SIA_REAL_LOG
401                       
402                        # recopier le log courant sur le log officiel
403                        cat $SIA_CURR_LOG >> $SIA_REAL_LOG
404                       
405                        # supprimer le log courant de l'archive
406                        rm $SIA_CURR_LOG
407                fi
408               
409                # le nom du fichier principal (le premier fichier) rapatrié
410                # par wget est composé de l'uri appelé en premier.
411                SIA_FIRST_URI=`echo "$SIA_TARGET_URL" | sed "s/http\:\/\/[^/]*\///"`
412               
413                # Convertir ce nom en mode windows
414                # car --restrict-file-names=window est utilisé
415                # wget remplace '?' par '@'
416                SIA_FIRST_INDEX=${SIA_FIRST_URI/\?/@}
417                # relatif à son répertoire d'accueil + extension
418                SIA_FIRST_INDEX="${SIA_TEMP_FOLDER}/${SIA_FIRST_INDEX}.html"
419                       
420                if [ "$SIA_TYPE" = "unique" ] || [ "$SIA_TYPE" = "multi" ]
421                then
422                        # si type unique, le fichier index.html est manquant.
423                        # Le créer à partir du premier fichier chargé par wget
424                        SIA_NEW_INDEX="${SIA_TEMP_FOLDER}/index.html"
425                       
426                        if [ -f "$SIA_FIRST_INDEX" ]
427                        then
428                                notice_log "Copying ${SIA_FIRST_INDEX} to ${SIA_NEW_INDEX}"
429                                cp "${SIA_FIRST_INDEX}" "${SIA_NEW_INDEX}"
430                        fi
431                fi
432               
433                # Pour les versions html, archiver le répertoire d'accueil
434                # dans le fichier compressé par zip
435                if [ "$SIA_TYPE" = "multi" ] || [ "$SIA_TYPE" = "unique" ]
436                then
437                        SIA_ZIP_TARGET="${SIA_SPIP_TEMP}${SIA_JOB_NAME}"
438                       
439                        notice_log "Compressing ${SIA_ZIP_TARGET} to ${SIA_SPIP_TEMP}${SIA_JOB_NAME}.zip"
440                        ( cd ${SIA_SPIP_TEMP}; zip -q -r "${SIA_JOB_NAME}.zip" "${SIA_JOB_NAME}" )
441                        ZIPRESULT="$?"
442                fi
443               
444                # Pour les versions texte, il n'y a qu'un seul fichier rapatrié.
445                # Il est archivé au premier niveau, sans son répertoire.
446               
447                if [ "$SIA_TYPE" = "texte" ]
448                then
449                       
450                        # le fichier à compresser porte le nom
451                        # de l'objet. Il sera placé près du répertoire pour le zip
452                        SIA_TXT_FILE="${SIA_JOB_NAME}.txt"
453                       
454                        SIA_ZIP_TARGET="${SIA_TXT_FILE}"
455                       
456                        if [ -f "$SIA_FIRST_INDEX" ]
457                        then
458                                notice_log "Copying text file to ${SIA_SPIP_TEMP}${SIA_TXT_FILE}"
459                                cp "$SIA_FIRST_INDEX" "${SIA_SPIP_TEMP}${SIA_TXT_FILE}"
460                               
461                                notice_log "Compressing text file to ${SIA_SPIP_TEMP}${SIA_JOB_NAME}.zip"
462                                ( cd ${SIA_SPIP_TEMP}; zip -q "${SIA_JOB_NAME}.zip" "${SIA_TXT_FILE}" )
463                                ZIPRESULT="$?"
464                               
465                                # nettoyage
466                                rm "${SIA_SPIP_TEMP}${SIA_TXT_FILE}"
467                        fi
468                fi
469               
470                if [ "$ZIPRESULT" -ne 0 ]
471                then
472                         error_log "Error compressing ${SIA_ZIP_TARGET}"
473                else
474                        notice_log "Archive OK. Moving ${SIA_SPIP_TEMP}${SIA_JOB_NAME}.zip to $SIA_DEST_FOLDER"
475                        mv "${SIA_SPIP_TEMP}${SIA_JOB_NAME}.zip" "$SIA_DEST_FOLDER"
476                       
477                        # nettoyage
478                        notice_log "Removing temp files $SIA_TEMP_FOLDER $SIA_TODO_FILE $SIA_LOCK_FILE"
479                        rm -fR $SIA_TEMP_FOLDER
480                        rm $SIA_TODO_FILE $SIA_LOCK_FILE
481                fi
482        fi
483fi
Note: See TracBrowser for help on using the repository browser.