blob: e4aa4ee69381ab2e316502555197479f537ade61 (
plain) (
tree)
|
|
#!/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) # <infile> fichiers sources des autres fichiers
[ "$2" ] || PRINTUSAGE=1
INPUT=( $INPUT $2 )
shift;
;;
-l) # <logfile> fichier de reference pour les associations fichier/package
[ "$2" ] || PRINTUSAGE=1
LOGFILE="$2"
shift
;;
-p) # <pkgdir> repertoire de recherche pour les packages
[ "$2" ] || PRINTUSAGE=1
SEARCHPATH="$SEARCHPATH $2/."
shift
;;
-R) # <destdir> 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
|