#!/bin/bash # # flxextract - package extracter - version 0.0.2 - 2003-06-16 # 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 "##no package## $file" >> $LOGFILE ; continue ; fi for pack in ${packages//,/ }; do pkgsrc=$(find $SEARCHPATH -name ${pack}'*'.lst | head -1) [ "$pkgsrc" ] && break done if [ -z "$pkgsrc" ]; then echo "##no package## $file $packages" >> $LOGFILE continue fi set -- $( grep "$file" $pkgsrc | awk '{ if ($8=="'$file'") print $0; }' ) if [ -z "$*" ]; then 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:$7 UTC 1970" +"%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 tgz="$(dirname $lst)/$(basename $lst .lst).tgz" grep -- " $lst$" $SFILES | awk '{print $1}' | tar zUxpvf $tgz -C $ROOTDIR -T - >> $LOGFILE echo -n "." >&2 done 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