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

Codice: Seleziona tutto

# xz -l
xz: --list is not implemented yet.
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,

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:

Codice: Seleziona tutto

USIZE_tuo=9240
USIZE_mio=8972
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

Codice: Seleziona tutto

for i in $a; do b=$((b+i)); done
e poi

Codice: Seleziona tutto

b=$((b/1024))

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 :tongue: :tongue: :tongue:
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 :tongue: :tongue: :tongue:
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