aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/NOTES36
-rwxr-xr-xscripts/flxextract149
-rwxr-xr-xscripts/flxsearch266
3 files changed, 451 insertions, 0 deletions
diff --git a/scripts/NOTES b/scripts/NOTES
new file mode 100644
index 0000000..1005ce3
--- /dev/null
+++ b/scripts/NOTES
@@ -0,0 +1,36 @@
+pkgfind permet de déterminer de quel package provient tel ou tel fichier.
+Cet outil prend en entrée une liste de fichier avec des packages de provenance souhaités et
+des répertoires et fichier sources de fichier (.lst).
+Une première étape de résolution consiste à compléter la liste en ajoutant des packages sources
+probables aux fichiers.
+La deuxième étape consiste à retourner une liste en indiquant le fichier et le package source (.lst)
+utilisé pour le trouver. Il peut aussi générer un fichier TGZ contenant l'ensemble des fichiers
+mis à jour.
+
+pkgbuild -i <list>.dep [-i <list>.dep] -p <path> -r -R -n -o output.tgz
+ -i <list_file> : fichier(s) source contenant la liste des fichiers recherchés au format .dep
+ -p <path> : répertoires contenant contenant les packages dans lesquel effectuer les recherches
+ -r : determine la source des fichiers dont aucune source n'est précisée
+ -R : redéterminer la source des fichiers (même pour ceux dont la source est précisée)
+ -n : ne créer par le fichier tgz, ecrit sur l'output la fichier résultant au format .dep
+ -o <fichier.tgz> : non de l'archive dans laquelle stocker le package résultant
+
+
+flxsearch [ -p path ] -i needed_files -o found_files
+-p path : répertoire de recherche pour les packages (.lst, .tgz)
+-l logfile : fichier mettant en relation le fichier recherché et le package de provenance
+-i need_files : liste de fichiers souhaités
+-o founded_files : liste des fichiers trouvés avec leur résolution
+
+flxextract [ -p path ] [-o archive] -i defined_files
+-p path : répertoire de recherche pour les packages (.lst, .tgz)
+-o output : archive optionnelle à créer
+-R rootdir : répertoire d'installation des fichiers pour prégénération de l'archive (default /tmp/package)
+-l logfile : fichier mettant en relation le fichier recherché et le package de provenance
+
+
+
+
+
+
+
diff --git a/scripts/flxextract b/scripts/flxextract
new file mode 100755
index 0000000..43d4ca0
--- /dev/null
+++ b/scripts/flxextract
@@ -0,0 +1,149 @@
+#!/bin/bash
+
+function main {
+ local file packages pack
+ 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 "$file -" >> $SFILES ; continue ; fi
+ packagesgrep=${packages//,/\\|}
+ files=( $(grep -m 1 "^$file .*/\($packagesgrep\).*$" $SOURCE | awk '{print $2}') )
+ pkgsrc=""
+ for pack in ${packages//,/ } ; do
+ i=0; while [ $i -lt ${#files[*]} ] ; do
+ [ ${files[$i]/$pack} != ${files[$i]} ] && pkgsrc=${files[$i]} && break
+ i=$[$i+1]
+ done
+ [ "$pkgsrc" ] && break
+ done
+ if [ "$pkgsrc" ] ; then
+ echo "$file $pkgsrc" >> $SFILES
+ else
+ echo "$file -" >> $SFILES
+ fi
+ done < $LFILES
+ echo
+ for lst in $( awk '{print $2}' $SFILES | sort -u ) ; do
+ if [ "x$lst" = "x-" ] ; then continue ; fi
+ tgz="$(dirname $lst)/$(basename $lst .lst).tgz"
+ grep -- " $lst$" $SFILES | awk '{print $1}' | tar zxpvf $tgz -C $ROOTDIR -T - >> $LOGFILE
+ done
+ grep -- " -$" $SFILES | awk '{print "##unresolved##",$1}' >> $LOGFILE
+}
+
+# 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 disponibles et leur package source
+SOURCE=$TMPDIR/source ; touch $SOURCE
+# 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 l'ensemble des fichiers disponibles avec leur package
+# source
+OLDIFS=$IFS ; IFS=$'\n'
+for path in $SEARCHPATH ; do
+ if [ -d $path ] ; then
+ for file in $( ls $path/*.lst ) ; do
+ # echo -n \# >&2
+ # pkgname=$( basename $file .lst )
+ # matchlist=$pkgname # ,${pkgname%-*},${pkgname%-*-*},${pkgname%%-*}
+ # attention aucun traitement d'un espace (\ ) dans le nom de fichier
+ awk '{print $8,"'$file'"}' $file >> $SOURCE
+ done
+ fi
+done
+
+IFS=$OLDIFS
+
+# 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
+if [ "$INPUT" ] ; then
+ for file in $INPUT ; do
+ cat $file >> $LFILES
+ done
+else
+ cat >> $LFILES
+fi
+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
+
diff --git a/scripts/flxsearch b/scripts/flxsearch
new file mode 100755
index 0000000..55b3dec
--- /dev/null
+++ b/scripts/flxsearch
@@ -0,0 +1,266 @@
+#!/bin/bash
+
+
+# cette fonction donne le choix entre plusieurs possibiltés de source
+function choice {
+ local file=$1 ; shift
+ local -a choices=()
+ local i=1
+ local best choice
+
+ OLDIFS=$IFS ; IFS=$'\n'
+ choices=( $( for choice in $* ; do
+ awk '{ if ($8 == "'$file'") print "'$choice'",$0 }' $choice
+ done ) )
+ IFS=$OLDIFS
+
+ echo
+ echo "Choix indéterminé pour '$file':" >&2
+ best=0
+ i=0 ; while [ $i -lt ${#choices[*]} ] ; do
+ # if [ $i == $best ] ; then echo -n " * " ;
+ # else echo -n " " ;
+ # fi
+ echo -n " " ;
+ set -- ${choices[$i]}
+ case $2 in
+ l) type="lien vers ${10}" ;;
+! d) type="repertoire" ;;
+ s) type="socket" ;;
+ c|b) type="device" ;;
+ *)
+ if [ $6 -lt 100000 ] ; then type="fichier ($[$6]o)"
+ elif [ $6 -lt 100000000 ] ; then type="fichier ($[$6/1000]Ko)"
+ else type="fichier ($[$6/1000000]Mo)"
+ fi
+ esac
+ echo "$[$i+1]: dans $( basename $1 .lst), $type créé le $(date -d "1/1/1970 00:00:$8" "+%Y/%m/%d %H:%M")" >&2
+ i=$[$i+1]
+ done
+ if [ ${#choices[*]} == 0 ] ; then
+ echo -n "Entrez le nom du package pour forcer une source ('.' pour arreter)" >&2
+ best=""
+ else
+ echo -n "Entrez le nom du package ou sélectionnez les numéros souhaités ('.' pour arreter): " >&2
+ fi
+ read choice ; # [ -z "$choice" ] && choice=$[$best+1]
+
+ if [ "x$choice" = "x." ] ; then
+ SIGINT=1 ; REPLY=""
+ return
+ fi
+
+ choices=( $( for i in ${choice//,/ } ; do
+ if [ "$i" -a "x${i//[0-9]/}" == "x" ] ; then
+ echo ${choices[$[$i-1]]%% *}
+ else
+ echo $i
+ fi
+ done ) )
+
+ REPLY="${choices[*]}"
+}
+
+# cette fonction permet de rechercher l'existance de chacun des fichiers de LFILES dans
+# les packages préparés
+function main {
+ local file
+ local packages pack
+ local -a sources
+ local pkgname matchlist
+
+ exec 3>&0
+ while read file packages; do
+ # attention on ne traite pas pour le moment le cas des entrées multiples
+ # on commence par rechercher pour tous les fichiers quels sont les packages
+ # source qui répondent à la demande
+
+ [ "$SIGINT" = 1 ] && echo -n \# >&2 && echo $file $packages >> $TMPDIR/OUTPUT && continue
+
+ sources=( $( IFS=,$IFS ; v=$( grep "^$file " $SOURCE | \
+ awk '{ print $2 }' ) ; echo $v) )
+
+ # check forced packages
+ if [ ${#sources[*]} -gt 1 ] ; then
+ local -a forced=( $( for i in ${sources[*]} ; do f=${i##*/} ; f=${f%%.lst};
+ [ "x${FORCED/* $f */}" == "x" ] && echo $i ; done ) )
+ [ "${#forced[*]}" -gt 0 ] && sources=( $forced[*] )
+ fi
+
+ # remove rejected package
+ if [ ${#sources[*]} -gt 1 ] ; then
+ sources=( $( for i in ${sources[*]} ; do f=${i##*/} ; f=${f%%-*};
+ [ "x${EXCEPT/* $f */}" != "x" ] && echo $i ; done ) )
+ fi
+
+ if [ "$RECHECK" = 1 -a "$packages" ] ; then
+ local tab=" ${sources[*]} "
+ local found=0
+
+ for pack in $packages ; do
+ [ "x${tab/* $pack */}" = "x" ] && found=1 && break
+ done
+ if [ "$found" = 0 ] ; then
+ packages=""
+ fi
+ fi
+ if [ "$packages" ] ; then # des packages potenties de source ont été donnés
+ echo -n \# >&2
+ REPLY=""
+ elif [ $SILENT = 0 -a ${#sources[*]} = 0 ] ; then # le fichier n'a été trouvé dans aucun package
+ # etant la recherche
+ sources=( $( IFS=,$IFS ; v=$( grep "^[^ ]*$file " $SOURCE | awk '{ print $2 }' ) ; echo $v) )
+ if [ ${#sources[*]} -lt 20 ] ; then # trop de possibilité
+ choice $file ${sources[*]} <&3
+ else
+ packages=""
+ REPLY=""
+ fi
+ elif [ ${#sources[*]} -gt 1 ] ; then # le fichier a été trouvé dans plusieurs packages
+ choice $file ${sources[*]} <&3
+ else
+ echo -n \# >&2
+ REPLY=${sources}
+ fi
+ if [ "$REPLY" ] ; then
+ pkgname=$( basename $REPLY .lst )
+ matchlist=$pkgname,${pkgname%-*},${pkgname%-*-*},${pkgname%%-*}
+ echo $file $matchlist >> $TMPDIR/OUTPUT
+ else
+ echo $file $packages >> $TMPDIR/OUTPUT
+ fi
+ done < $LFILES
+}
+
+# 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
+
+SIGINT=0
+UPDATE=0
+SILENT=0
+RECHECK=0
+PRINTUSAGE=0
+
+EXCEPT=" "
+FORCED=" "
+
+# 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;
+ ;;
+ -u) # update first source file with results
+ UPDATE=1
+ ;;
+ -s) # do not tell a choice for null list of choices
+ SILENT=1
+ ;;
+ -c) # want to verify each package
+ RECHECK=1
+ ;;
+ -o) # <outfile> fichier dans lequel écrire le résultat des recherches
+ [ "$2" ] || PRINTUSAGE=1
+ OUTPUT="$2"
+ shift
+ ;;
+ -l) # <logfile> fichier de reference pour les associations fichier/package
+ [ "$2" ] || PRINTUSAGE=1
+ LOGFILE="$2"
+ shift
+ ;;
+ -U) # <package> ignore this package if not alone
+ [ "$2" ] || PRINTUSAGE=1
+ EXCEPT="$EXCEPT$2 "
+ shift
+ ;;
+ -F) # <package> force to use this package when possible
+ [ "$2" ] || PRINTUSAGE=1
+ FORCED="$FORCED$2 "
+ shift
+ ;;
+ -p) # <path> repertoire de recherche pour les packages
+ [ "$2" ] || PRINTUSAGE=1
+ SEARCHPATH="$SEARCHPATH $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
+
+# fabrication des fichiers temporaires
+mkdir -p -m 700 $TMPDIR
+# fichier contenant l'ensemble des fichiers disponibles et leur package source
+SOURCE=$TMPDIR/source ; touch $SOURCE
+# 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 l'ensemble des fichiers disponibles avec leur package
+# source
+OLDIFS=$IFS ; IFS=$'\n'
+for path in $SEARCHPATH ; do
+ if [ -d $path ] ; then
+ for file in $( ls $path/*.lst ) ; do
+ # echo -n \# >&2
+ # pkgname=$( basename $file .lst )
+ # matchlist=$pkgname # ,${pkgname%-*},${pkgname%-*-*},${pkgname%%-*}
+ # attention aucun traitement d'un espace (\ ) dans le nom de fichier
+ awk '{print $8,"'$file'"}' $file >> $SOURCE
+ done
+ fi
+done
+
+IFS=$OLDIFS
+
+# 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
+if [ "$INPUT" ] ; then
+ for file in $INPUT ; do
+ cat $file >> $LFILES
+ done
+else
+ cat >> $LFILES
+fi
+sort -u $LFILES > $LFILES.new ; rm $LFILES ; mv $LFILES.new $LFILES
+
+main
+
+if [ -e $TMPDIR/OUTPUT ] ; then
+ if [ "$UPDATE" == 1 -a "$INPUT" ] ; then
+ set -- $INPUT
+ rm -f $1 ; mv $TMPDIR/OUTPUT $1
+ elif [ "$OUTPUT" ] ; then
+ mv $TMPDIR/OUTPUT $OUTPUT
+ else
+ cat $TMPDIR/OUTPUT
+ fi
+fi
+echo
+rm -rf $TMPDIR
+exit $SIGINT