#!/bin/bash # # flxextract - package extracter - version 0.0.4 - 2006-07-17 # This file is part of the Formilux project : http://formilux.ant-computing.com/ # # Copyright (C) 2001-2003 Benoit Dolez & Willy Tarreau # mailto: benoit@ant-computing.com,willy@ant-computing.com # # This program is licenced under GPLv2 ( http://www.gnu.org/licenses/gpl.txt ) function main { local file packages pack pkgsrc exec 3>&0 # cette boucle permet de rechercher le package à utiliser pour trouver # le fichier si cela est possible while read file packages; do echo -n \# >&2 if [ -z "$packages" ] ; then echo -n "P" >&2 echo "##no package## $file" >> $LOGFILE continue fi for pack in ${packages//,/ }; do pkgsrc=$(find $SEARCHPATH -name ${pack}'*'.lst | head -1) [ -n "$pkgsrc" ] && break done if [ -z "$pkgsrc" ]; then echo -n "P" >&2 echo "##no package## $file $packages" >> $LOGFILE continue fi set -- $(awk "/${file##*/}/ { if (\$8==\"$file\") print \$0; }" $pkgsrc) if [ -z "$*" ]; then echo -n "F" >&2 echo "##not found## $file $pkgsrc" >> $LOGFILE continue fi if [ "x$1" = "xd" ]; then # it's a directory rm -f $ROOTDIR/$8 >/dev/null 2>&1 # just in case it was something else mkdir -p $ROOTDIR/$8 touch -t $(date -d "Jan 1 00:00:00 UTC 1970 + $7 sec" +"%Y%m%d%H%M.%S" ) $ROOTDIR/$8 chown $3:$4 $ROOTDIR/$8 chmod $2 $ROOTDIR/$8 echo "$8/" >> $LOGFILE else # it's a regular file echo $8 $pkgsrc >> $SFILES fi done < $LFILES echo >&2 ; echo -n "Extracting files ..." >&2 for lst in $( awk '{print $2}' $SFILES | sort -u ) ; do awk "/${lst##*/}\$/ { if (\$2 == \"$lst\") print \$1}" $SFILES | tee -a $LOGFILE | tar zUxpf ${lst%.lst}.tgz -C $ROOTDIR -T - >>$LOGFILE.err 2>&1 ( [ $? -eq 0 ] && echo -n "." || echo -n "!" ) >&2 done [ -s "$LOGFILE.err" ] || rm -f "$LOGFILE.err" echo "." >&2 } # temporary file and directory TMP=$(date +%y%m%d)-$RANDOM while [ -e /tmp/pg-$TMP ] ; do TMP=$(date +%y%m%d)-$RANDOM ; done TMPDIR=/tmp/pg-$TMP PRINTUSAGE=0 # traitement des parametres if [ $# -eq 0 ]; then PRINTUSAGE=1 fi while [ $# -gt 0 ] ; do case "$1" in -i) # fichiers sources des autres fichiers [ "$2" ] || PRINTUSAGE=1 INPUT=( $INPUT $2 ) shift; ;; -l) # fichier de reference pour les associations fichier/package [ "$2" ] || PRINTUSAGE=1 LOGFILE="$2" shift ;; -p) # repertoire de recherche pour les packages [ "$2" ] || PRINTUSAGE=1 SEARCHPATH="$SEARCHPATH $2/." shift ;; -R) # répertoire d'extraction pour les fichiers [ "$2" ] || PRINTUSAGE=1 ROOTDIR="$2" shift ;; -h) # affiche l'aide sur les paramètres PRINTUSAGE=1 shift ;; esac shift done # repertoire contenant les .lst et les .tgz servant de source SEARCHPATH=${SEARCHPATH:-${PKGROOT:+$PKGROOT/.}} SEARCHPATH=${SEARCHPATH:-.} if [ $PRINTUSAGE -gt 0 ]; then # affiche les lignes du case ci-dessus echo "Usage : $0 followed by these parameters :" grep '^[ ]\+-.) #.*' $0 echo exit 1 fi # par défaut, ROOTDIR est fonction de la date DATE=$(date +%Y%m%d-%H%M%S) ROOTDIR=${ROOTDIR:-/tmp/package-$DATE-$$} #if [ -e $ROOTDIR ] ; then # echo "Error : directory $ROOTDIR already exists." # exit 1 #fi LOGFILE=${LOGFILE:-/tmp/package-$DATE-$$.log} if [ -e $LOGFILE ] ; then echo "Error : log file $LOGFILE exists." exit 0 fi mkdir -p $ROOTDIR # fabrication des fichiers temporaires mkdir -p -m 700 $TMPDIR # fichier contenant l'ensemble des fichiers requis LFILES=$TMPDIR/lfiles ; touch $LFILES # fichier contenant la correspondance non du package source du package SFILES=$TMPDIR/sfiles ; touch $SFILES # fabrication d'un fichier contenant la liste de tous les fichiers recherchés # le fichier source peut contenir lui-même des informations de packages de provenance cat $INPUT > $LFILES sort -u $LFILES > $LFILES.new ; rm $LFILES ; mv $LFILES.new $LFILES main echo "Le résultat est dans $ROOTDIR, et les opérations sont dans $LOGFILE" rm -rf $TMPDIR