aboutsummaryrefslogblamecommitdiff
path: root/scripts/flxextract
blob: bfecb251024dc04064d43f365f7e3ee1a182ba6e (plain) (tree)
1
2
3
4
5
6
7
8
9


               
                                   




                                                                          



                                                                                            
                                  



















                                                                                      
            

                                      

                  

                                                 
                                                           
                                                       

                                                                                                  
        
                



                                                             
                             















                                                                 
                               








                                                                                  
                                         

























                                                                 



                                                      
 
                                          








                                            




                                                                      

                                                                                     
                    







                                                                          
#!/bin/bash

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  # 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
}

# repertoire contenant les .lst et les .tgz servant de source
SEARCHPATH=$PKGROOT
SEARCHPATH=${SEARCHPATH:-.}/.

# 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

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