Pagina 1 di 8
txz e packages.txt
Inviato: mer 27 mag 2009, 11:33
da conraid
Per creare packages.txt su slackers.it uso lo script di Alien Bob leggermente modificato
Codice: Seleziona tutto
for pkg in $(find . -type f -name '*cf.tgz' -print)
do
NAME=$(echo $pkg|sed -re "s/(.*\/)(.*.tgz)$/\2/")
LOCATION=$(echo $pkg|sed -re "s/(.*)\/(.*.tgz)$/\1/")
SIZE=$( expr $(gunzip -l $pkg |tail -1|awk '{print $1}') / 1024 )
USIZE=$( expr $(gunzip -l $pkg |tail -1|awk '{print $2}') / 1024 )
REQUIRED=""
CONFLICTS=""
SUGGESTS=""
METAFILE=${NAME%tgz}meta
echo "PACKAGE NAME: $NAME" > $LOCATION/$METAFILE
if [ -n "$DL_URL" ]; then
echo "PACKAGE MIRROR: $DL_URL" >> $LOCATION/$METAFILE
fi
echo "PACKAGE LOCATION: $LOCATION" >> $LOCATION/$METAFILE
echo "PACKAGE SIZE (compressed): $SIZE K" >> $LOCATION/$METAFILE
echo "PACKAGE SIZE (uncompressed): $USIZE K" >> $LOCATION/$METAFILE
echo "PACKAGE DESCRIPTION:" >> $LOCATION/$METAFILE
echo $NAME
tar xzfO $pkg install/slack-desc |grep -E '\w+\:'|grep -v '^#' >> $LOCATION/$METAFILE
echo "" >> $LOCATION/$METAFILE
done
per i file txz come potrei fare?
xz -l purtroppo non è ancora abilitato
Ho provato una cosa come questa (prendendo spunto dai tool del team che ha creato xz), ma non riesco a farla funzionare
Codice: Seleziona tutto
SIZE=$(expr $(ls -lL $pkg | tr -s ' ' | cut -f 5 -d ' ') / 1024 )
mknod "$TMP/fifo" p
( xz -c "$1" | tee "$TMP/fifo" | $TAR xf - -C "$TMP" install > /dev/null 2> /dev/null ) & USIZE=$(wc -c < "$TMP/fifo" | tr -d ' ')
USIZE=$((USIZE / 1024))
rm -f "$TMP/fifo"
mi date una mano a trovare la dimensione del pacchetto decompresso, praticamente a tradurre questa riga
Codice: Seleziona tutto
USIZE=$( expr $(gunzip -l $pkg |tail -1|awk '{print $2}') / 1024 )
meglio ancora sarebbe fare un'unca sezione che prende sia i tgz sia i txz
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 11:50
da d4z_c0nf
Eh infatti stavo pensando, che per SIZE si poteva usare tranquillamente ls,
per USIZE ci penso...
rock
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 12:46
da targzeta
La domanda spontanea è:"ora alien come fa?"
Emanuele
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:07
da conraid
spina ha scritto:La domanda spontanea è:"ora alien come fa?"
e come fa Pat anche. Boh
Alien nel suo repository usa sempre tgz e non ha modificato gli script
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:20
da targzeta
A meno di non decomprimerlo in memoria bisognerebbe vedere gli script di Pat, ma se li nasconde? E' quasi un ora che cerco di trovare qualcosa con google e non trovo niente. Tra l'altro anche Fred Emmot ha aggiornato e quindi anche lui usa uno script analogo a quello di Pat, visto che ora usa gli xz.
Da quello che ho visto sembra che nel file xz ci sia scritta la dimensione del file non compressa, così come quella del file compresso. Se vuoi puoi dare una lettura qui:
/usr/doc/xz-4.999.8beta/file-format.txt
Quindi si potrebbe scrivere un piccolo programma in C che produce queste info in output. Solo che da quello che ho capito con uno sguardo veloce, implica scandire tutto il file, perchè dovrebbe essere diviso in blocchi, e ogni blocco si porta dietre le informazioni relative solo alla sua parte.
Non so se mi sono spiegato bene,
Emanuele
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:36
da conraid
spina ha scritto:
Non so se mi sono spiegato bene,
sì
se guardi gli autori di xz, producono anche pkgtool per Slackware che supporta però i file tlz (lzma prima di xz) e lo mette proprio in memoria. Da li ho preso spunto per quell'esempio che ho mostrato, ma non riesco a farlo funziona con xz
Quando metteranno xz -l con compatibilità gzip sarà semplice
Ora scrivo a Pat, anche se è da un anno che non mi caca
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:44
da targzeta
conraid ha scritto:...
se guardi gli autori di xz, producono anche pkgtool per Slackware che supporta però i file tlz (lzma prima di xz) e lo mette proprio in memoria. Da li ho preso spunto per quell'esempio che ho mostrato, ma non riesco a farlo funziona con xz...
Non ho capito che vuoi dire, io mi sto guardando i sorgenti di xz per vedere cosa si può fare. Il tuo script dovresti modificarlo per cercare tutti i t.z e non solo i tgz. Poi si dovrebbe parametrizzare il comando da eseguire per prelevare le info.
Emanuele
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:51
da d4z_c0nf
Conraid io ho fatto un attimo una prova con un mio tgz, trovando delle dicordanze:
In questa fase il mio usize è stato calcolato facendo questi passi:
Codice: Seleziona tutto
a=`tar -tvf amsn-0.97.2-athlon64-2sl.tgz | tr -s ' ' | cut -f 3 -d ' ' | sed -r 's/^0$/4096/' `
il sed è perchè tar -tvf le directory le valuta 0 byte, non so perchè
for per sommare tutti i valori di a
e poi
per la conversione in Kb.
Per l'xz
a sarebbe del tipo
Codice: Seleziona tutto
a=`xz -dc $pkg | tar -tv | tr -s ' ' | cut -f 3 -d ' ' | sed -r 's/^0$/4096/' `
e b calcolato nello stesso modo.
Ci sta una differenza di 300k su un pacchetto intorno ai 10mega, quindi una tolleranza del 3%.
In ogni caso ho provato anche a scompattare il tgz e fare un procedimento simile per il calcolo della dimensione, in questo caso la discordanza con il valore calcolato scompattandolo è di 76k (facendo un ls ricorsivo e sommando tutte le dimensioni dei file mi viene 8896K che è comunque molto lontano dal "tuo" USIZE). Devo aver fatto qualche errore concettuale, comunque segnalo sta cosa perchè magari può essere uno spunto.
rock
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 13:58
da conraid
spina ha scritto:conraid ha scritto:...
se guardi gli autori di xz, producono anche pkgtool per Slackware che supporta però i file tlz (lzma prima di xz) e lo mette proprio in memoria. Da li ho preso spunto per quell'esempio che ho mostrato, ma non riesco a farlo funziona con xz...
Non ho capito che vuoi dire, io mi sto guardando i sorgenti di xz per vedere cosa si può fare. Il tuo script dovresti modificarlo per cercare tutti i t.z e non solo i tgz. Poi si dovrebbe parametrizzare il comando da eseguire per prelevare le info.
Fin li ci sono emanuale, per desso mi basta anche fare due sezioni distinte, tanto quelle parti creano i file .meta (che poi cancello) e da li poi nasce il packages.txt
Intendo questi script
http://tukaani.org/pkgtools/
esiste un makerepo che fa quel che chiedo, ma ancora senza txz, loro usano i tlz, che erano una delle opzioni di Pat quando ha scelto il metodo di compressione. Cioè utilizzano lzma utils, che sono le vecchie xz utils
La funziona è questa
Codice: Seleziona tutto
# PACKAGES.TXT
create_packagestxt() {
local I DIRNAME
echo
echo "Creating $1/PACKAGES.TXT"
DIRNAME=${1##*/}
# Cache file:
if [ "$NO_CACHE" = 1 ]; then
: > "$TMP/cache"
elif [ -f "$1/PACKAGES.TXT" ]; then
cat "$1/PACKAGES.TXT" > "$TMP/cache"
elif [ -f "$1/PACKAGES.TXT.gz" ]; then
gunzip -c "$1/PACKAGES.TXT.gz" > "$TMP/cache"
fi
# Create the list of valid package names:
create_safelist "$1"
# Create the new PACKAGES.TXT with requested fields:
for I in $(cat "$TMP/pkglist.$DIRNAME"); do
# A kind of progress indicator:
printf "%-60s" "$I:"
# Package may be already in PACKAGES.TXT. We save a lot of time
# by reusing that information:
unset P_NAME P_MIRROR P_LOCATION P_CSIZE P_USIZE P_MD5SUM P_SHA1SUM \
P_REQUIRED P_CONFLICTS P_SUGGESTS P_DESC
if [ -s "$TMP/cache" ]; then
packagestxt_parse "$TMP/cache" "$I"
else
examine_package_contents "$I"
fi
# Set the variables:
[ -z "$P_NAME" ] && P_NAME=${I##*/}
# Refresh P_LOCATION since the package may be moved:
P_LOCATION="./${I%/*}"
[ "$P_LOCATION" = "./$I" ] && P_LOCATION=.
P_CSIZE=${P_CSIZE:-"$(($(ls -lL "$I" | tr -s ' ' | cut -f 5 -d ' ') / 1024))"}
[ -z "$P_USIZE" ] && examine_package_contents "$I"
# Optional fields:
if [ $O_MD5SUM = 1 -a ${#P_MD5SUM} != 32 ];then
echo -n " MD5"
P_MD5SUM=$(md5sum < "$I" | cut -f 1 -d ' ')
fi
if [ $O_SHA1SUM = 1 -a ${#P_SHA1SUM} != 40 ]; then
echo -n " SHA1"
P_SHA1SUM=$(sha1sum < "$I" | cut -f 1 -d ' ')
fi
if [ $O_SLAPT = 1 -a \( -z "$P_REQUIRED" -o -z "$P_CONFLICTS" \
-o -z "$P_SUGGESTS" \) ]; then
examine_package_contents "$I"
fi
# Set mirror after all examine_pakcage_contents commands because we want
# this to be overridable by a command line option:
P_MIRROR=${MIRROR:-"$P_MIRROR"}
# Write the entry to a preliminary PACKAGES.TXT file:
{
echo "PACKAGE NAME: $P_NAME"
[ $O_MIRROR = 1 ] && echo "PACKAGE MIRROR: $P_MIRROR"
echo "PACKAGE LOCATION: $P_LOCATION"
printf "PACKAGE SIZE (compressed): %6d K\n" "$P_CSIZE"
printf "PACKAGE SIZE (uncompressed): %6d K\n" "$P_USIZE"
[ $O_MD5SUM = 1 ] && echo "PACKAGE MD5 SUM: $P_MD5SUM"
[ $O_SHA1SUM = 1 ] && echo "PACKAGE SHA1 SUM: $P_SHA1SUM"
if [ $O_SLAPT = 1 ]; then
echo "PACKAGE REQUIRED: $P_REQUIRED"
echo "PACKAGE CONFLICTS: $P_CONFLICTS"
echo "PACKAGE SUGGESTS: $P_SUGGESTS"
fi
echo "$P_DESC"
# Empty line works as a separator:
echo
} >> "$TMP/txt"
# Collect statistics:
TOTAL_CSIZE=$((TOTAL_CSIZE + P_CSIZE))
TOTAL_USIZE=$((TOTAL_USIZE + P_USIZE))
echo " OK"
done
# Convert from KiB to MiB:
TOTAL_CSIZE=$((TOTAL_CSIZE / 1024))
TOTAL_USIZE=$((TOTAL_USIZE / 1024))
# Add the header information:
cat << EOF > "$TMP/PACKAGES.TXT"
PACKAGES.TXT; $(date)
This file provides details on the packages found
in the $1/ directory.
EOF
printf "Total size of all packages (compressed) : %5d MB\n" "$TOTAL_CSIZE" >> "$TMP/PACKAGES.TXT"
printf "Total size of all packages (uncompressed) : %5d MB\n" "$TOTAL_USIZE" >> "$TMP/PACKAGES.TXT"
echo >> "$TMP/PACKAGES.TXT"
echo >> "$TMP/PACKAGES.TXT"
# Remove trailing spaces and append to the final PACKAGES.TXT:
sed 's/ *$//' "$TMP/txt" >> "$TMP/PACKAGES.TXT"
rm -f "$TMP/txt"
}
lasciando perdere create_safelist (crea la lista dei pacchetti, io uso find) le funzioni utili sono
Codice: Seleziona tutto
examine_package_contents() {
echo -n " uncompress"
mknod "$TMP/fifo" p
( uncompress_pkg "$1" | tee "$TMP/fifo" | $TAR xf - -C "$TMP" install \
> /dev/null 2> /dev/null ) &
P_USIZE=$(wc -c < "$TMP/fifo" | tr -d ' ')
P_USIZE=$((P_USIZE / 1024))
rm -f "$TMP/fifo"
wait # Wait for tar.
# Nice trick to avoid blank lines in P_DESC:
P_DESC=$(echo; grep "^$(package_basename "$1"):" "$TMP/install/slack-desc" 2> /dev/null)
P_DESC="PACKAGE DESCRIPTION:$P_DESC"
if [ $O_SLAPT = 1 ]; then
# See packagestxt_parse() for reasoning of the extra space.
P_REQUIRED="$(slapt_extract "$TMP/install/slack-required") "
P_CONFLICTS="$(slapt_extract "$TMP/install/slack-conflicts") "
P_SUGGESTS="$(slapt_extract "$TMP/install/slack-suggests") "
fi
rm -rf "$TMP/install"
}
Codice: Seleziona tutto
uncompress_pkg() {
case "$1" in
*.tlz|*.lzma)
# Reset PKGTOOLS_LZMA if we are installing/upgrading
# the lzma package:
case "$1" in (lzma-*) PKGTOOLS_LZMA= ;; esac
# Check which lzma command we are using:
[ -z "$PKGTOOLS_LZMA" ] && check_cmd_lzma
case "$PKGTOOLS_LZMA" in
# -d is only temporarily here
new) unlzma -dc "$1" 2> /dev/null ;;
old) lzma d -si -so < "$1" 2> /dev/null ;;
*) echo 'BUG in uncompress_pkg!' 1>&2 ;;
esac
;;
*.tbz|*.bz2)
# Use bunzip2 instead of bzip2 for BusyBox compatibility:
bunzip2 -c "$1" 2> /dev/null
;;
*.tar)
cat "$1" 2> /dev/null
;;
*)
# For explodepkg compatibility we default to tgz.
# Do no add -f as it does not work with busybox.
gunzip -c "$1" 2> /dev/null
;;
esac
}
In pratica per un tgz per esempio tutto diventerebbe
Codice: Seleziona tutto
mknod "$TMP/fifo" p
( gunzip -c "$1" | tee "$TMP/fifo" | $TAR xf - -C "$TMP" install \
> /dev/null 2> /dev/null ) &
P_USIZE=$(wc -c < "$TMP/fifo" | tr -d ' ')
P_USIZE=$((P_USIZE / 1024))
rm -f "$TMP/fifo"
siccome esiste xz -c pensavo di fare la stessa cosa, ma mi da errore
sicuramente sbaglio qualcosa io
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:00
da conraid
Ora guardo d4z_c0nf, ma lo script non è "mio", come ti dicevo uso quello di Alien Bob (ho scritto anche a lui, speriamo almeno lui risponda)
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:02
da d4z_c0nf
conraid ha scritto:Ora guardo d4z_c0nf, ma lo script non è "mio", come ti dicevo uso quello di Alien Bob (ho scritto anche a lui, speriamo almeno lui risponda)
Sì lo so che non è tuo, ho scritto tuo per comodità.
Se vuoi edito e scrivo USIZE_ALIEN
rock
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:05
da conraid
Alien risponde subito
Hi Corrado
For my own repository I am not planning to switch to .txz and therefore I
have not yet modified my repository generator script to support .txz yet.
The script is found at
http://www.slackware.com/~alien/tools/g ... s_files.sh and it should not
be hard to expand it to also look at .txz packages.
Cheers, Eric
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:06
da conraid
d4z_c0nf ha scritto:
Sì lo so che non è tuo, ho scritto tuo per comodità.
Se vuoi edito e scrivo USIZE_ALIEN
rock

era per dire che non arrivo a tanto

Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:10
da targzeta
Sarà che non è difficile, ma senza l'opzione -l di xz si deve decomprimere il file in memoria. Non lo so, sto guardando lo script che mi hai postato ma...
Emanuele
Re: txz e packages.txt
Inviato: mer 27 mag 2009, 14:12
da conraid
spina ha scritto:Sarà che non è difficile, ma senza l'opzione -l di xz si deve decomprimere il file in memoria. Non lo so, sto guardando lo script che mi hai postato ma...
è quello che gli ho risposto, vediamo
Se rispondesse Pat... grrrrrrrr
Comunque questo indica che Alien segue Slackware64, ma poi il tutto lo tiene Pat ugualmente