Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Le interdipendenze dei pacchetti slackware

    prima parte
    codice:
    Autore : 
    Pierluigi Previtali
    Argomento: 
    Le interdipendenze tra i pacchetti della mia distro
    preferita... la Slackware.
    Stato: 
    0.1b delirio incompleto in beta stage
    Lamentele: 
    slack@ERASETHISslack.z00.it
    pierluigi.previtali@ERASETHIStiscali.it
    
    
    Scopo del gioco e' creare una lista in stile "MANIFEST" delle
    interdipendenze tra i pacchetti, cioe' sapere da quali pacchetti
    dipende un dato pacchetto, argomento affrontato da vari tools di
    aggiornamento automatico come swaret e altri in maniera oscura.
    Usando io sul mio portatile una current, e utilizzando per tenerla
    aggiornata un mio script (sul mio sito) che mi mirrora in locale la
    current e mi avvisa se ci sono pacchetti da upgradare ecc. ecc. (
    non sto' qui' a parlarne, dovrebbe esserci pure un mio post qui e
    comunque come detto e' scaricabile dal mio sito) e utilizzando un
    altro mio script (sempre disponibile e postato pure qui') che gia'
    e' in grado di controllare le dipendenze e suggerire pacchetti
    mancanti, mi mancava un file da consultare per avere un riferimento
    veloce su cosa dipendesse da cosa in una release completa della
    slackware. Per chi non avesse mai curiosato, preso per riferimento
    un punto di mount standard del cdrom come /mnt/cdrom, nella
    sotto-directory /mnt/cdrom/slackware e' presente un file chiamato
    MANIFEST.bz2 che non e' altro che un file compresso che contiene la
    lista di tutti i file presenti nella sotto-directory
    /mnt/cdrom/slackware e chiaramente quindi la lista dei pacchetti e
    del loro contenuto. Per chi non si fosse mai posta la domanda poi
    possiamo aggiungere che al 99% dei casi il problema delle dipendenze
    tra i pacchetti riguarda la presenza in altri pacchetti di librerie
    dinamiche necessarie al programma che installiamo (quelle che nel
    mondo windows sono .dll o altre estensioni di libreria), il comando
    che ci permette di conoscere, dato un eseguibile, le librerie dalle
    quali dipende (a meno che sia staticamente compilato cioe' include
    tutte le funzioni che gli necessitano da altre librerie gia' al suo
    interno, spesso a scapito delle dimensioni e della memoria occupata
    in esecuzione ...detta alla grezza), e' il comando ldd.
    ldd /percorso/del/file/eseguibile ci restituisce una lista delle
    librerie collegate, a questo punto si potrebbe pensare di guardare
    nel MANIFEST in quali pacchetti sono le eventuali librerie non
    trovate. Non e' purtroppo cosi' semplice dato che spesso, quasi
    sempre le librerie a cui fa' riferimento l'eseguibile sono dei
    collegamenti (link) alle librerie originali, per esempio se
    consideriamo il comando:
    ls -l /lib/libc.so.6
    ci dira' che in realta' al momento dell'installazione e' stato
    creato un link di nome libc.so.6 che in realta' punta
    a libc-2.3.3.so*
    lrwxrwxrwx  1 root root 13 2004-10-18 16:23 /lib/libc.so.6 ->
    libc-2.3.3.so*
    Nel MANIFEST chiaramente sara' presente solo il file puntato che fa'
    parte effettivamente di un pacchetto... e il link dove esce?
    I pacchetti standard slackware al loro interno hanno sempre una
    cartella /install al cui interno ci sono due file, uno che contiene
    la descrizione del pacchetto e uno il file /install/doinst.sh che
    contiene i comandi che eseguira' installpkg dopo aver scompresso il
    pacchetto slackware che a parte i succitati files non e' altro che
    un tgz cioe' un tar.gz, in questo file ci sono i comandi che creano
    i link e la libreria cercata potrebbe essere (quasi sempre) uno di
    questi link...a questo punto abbiamo bisogno di un altra lista da
    consultare oltre il MANIFEST.bz2 che contenga tutti i nomi dei link
    creati e quali pacchetti li contengano, sara' la seconda cosa che
    faremo dopo aver scompresso per comodita' il file MANIFEST.bz2 sotto
    /tmp , per ottenerlo dobbiamo utilizzare uno script che e'
    volutamente grezzo e con pochi controlli sull'utente, dato che e'
    stato realizzato in un pomeriggio di bash-fu , va' rifinito e
    completato ma per adesso funge e lo possiamo usare, andremo a
    ottenere cosi' un file MANIFESTLINK che consulteremo insieme al
    MANIFEST per scoprire le varie dipendenze tra i pacchetti, la
    ricerca sara' svolta da un'altro script che generera' finalmente il
    file MANIFESTDEP che conterra' la lista dei pacchetti presenti sulla
    distro e i pacchetti necessari al corretto funzionamento dei
    primi... ho parlato pure troppo si capisce meglio se procediamo
    praticamente... osokaaaaaaaaaa budaaaaaaaaa sooo (invocazione di
    bash-fu) assumiamo la posizione del loto fumato...si parte...
    segue.....
    z00keeper of
    www.z00.it
    www.slack.z00.it

  2. #2
    codice:
    Parte prima montaggio e scompressione... chiaramente necessitiamo
    del disco di installazione che contiene i pacchetti... nel mio caso
    si tratta di un disco unico avendo io escluso il kde tex e qualche
    altre sciocchezza, chiaramente current ma funge anche su altri
    dischi come le iso scaricate o fatte a mano da voi purche' abbiano
    conservato la struttura slackware, per esempio nel mio caso:
    # mount /dev/hdc /mnt/cdrom -t iso9660
    # ls -1 /mnt/cdrom
    ANNOUNCE.10_0
    BOOTING.TXT
    ChangeLog.txt
    CHECKSUMS.md5
    CHECKSUMS.md5.asc
    COPYING
    COPYRIGHT.TXT
    CRYPTO_NOTICE.TXT
    CURRENT.WARNING
    extra/
    FAQ.TXT
    FILELIST.TXT
    GPG-KEY
    isolinux/
    kernels/
    PACKAGES.TXT
    README.TXT
    RELEASE_NOTES
    slackware/
    Slackware-HOWTO
    SPEAK_INSTALL.TXT
    SPEAKUP_DOCS.TXT
    UPGRADE.TXT
    nella sotto-directory slackware c'e' il file MANIFEST.bz2 copiamolo
    scompresso sotto /tmp
    # bzcat /mnt/cdrom/slackware/MANIFEST.bz2 > /tmp/MANIFEST
    prima parte incruenta e terminata ora dobbiamo crearci il secondo
    file che ci serve cioe' il MANIFESTLINK per fare cio' estrarremo dai
    vari pacchetti solo il file /install/doinst.sh lo scorreremo alla
    ricerca dei comandi che creano i link e ci annoteremo sia il
    pacchetto da dove lo abbiamo estratto sia i nomi dei link che
    saranno creati e con questo output creeremo un file con la stessa
    struttura del MANIFEST, la stessa struttura solo per riutilizzare
    funzioni di ricerca gia' scritte. 
    Parte seconda, ovvero come farlo in pratica...detto anche il file
    make_links_manifest.sh ...
    per evitare casini da formattazione scaricatevi il file
    che contiene gli script da:
    
    http://www.slack.z00.it/users/share/pkgdeps.tar.bz2
    
    
    creiamo una cartella di lavoro
    # mkdir /usr/local/src/pkgdeps
    creiamoci dentro il file "make_links_manifest.sh" 
    con il seguente contenuto
    
    
    #!/bin/bash 
    #copyleft 2004 Pierluigi Previtali bashing for fun
    #make_links_manifest.sh
    
    MOUNT_CD="/mnt/cdrom/slackware/"
    FILES_LIST=$(find $MOUNT_CD* -name "*.tgz")
    MANIFEST_FILE="/tmp/MANIFESTLINK"
    TMP_FILE="/tmp/MyTeMpFiLe"
    rm -fr *386* *486* *noarch* $TMP_FILE $MANIFEST_FILE &>  /dev/null
    for i in $FILES_LIST; do
    PACK="$i"
    PACK_FILE=$(basename "$(echo "$PACK" | sed 's/.tgz//g')")
    W_DIR="./"
    echo -e "\n\
    ++========================================\n\
    ||\n\
    ||   Package:  $PACK\n\
    ||\n\
    ++========================================" > $PACK_FILE
    tar -O   -xzf "$PACK" install/doinst.sh 2> /dev/null \
    | grep "; ln -sf" | cut -d " " -f 8 |grep .so >> $W_DIR/$PACK_FILE
    done
    for i in $(ls -1 $W_DIR | grep -v $(basename $0) | grep -v .sh); do 
    	EMPTY_TEST=$(sed -n "7p" $i) 
    	if [ -z "$EMPTY_TEST" ];then
    		rm $W_DIR/$i
    	fi	
    done
    for i in $(ls -1 $W_DIR |grep -v $(basename $0) |grep -v .sh); do 
    	cat $i >> $TMP_FILE
    done
    sed 's/^[Aa-Zz]/lrwxr\-xr\-x root\/root      0 2004-01-01 00:00:00 &/g' $TMP_FILE > $MANIFEST_FILE
    rm -fr *386* *486* *586* *686* *noarch* $TMP_FILE &>  /dev/null
    
    rendiamo eseguibile e sempre col cdrom montato lanciatelo...
    sul mio celeron 2600 impiega oltre i tre minuti...
    otterremo alla fine il file /tmp/MANIFESTLINK che contiene i nomi
    dei link creati dai pacchetti durante l'installazione...
    parte seconda finita senza lacrime...
    segue....
    z00keeper of
    www.z00.it
    www.slack.z00.it

  3. #3
    codice:
    Ora ci occorre uno script che dato come argomento un nome di
    pacchetto ci restituisca le dipendenze dagli altri...
    Lo script prendera' uno ad uno i pacchetti li scomprimera' cerchera'
    all'interno la presenza di binari compilati linkati siano essi
    eseguibili o librerie a loro volta e li testera' con il comando ldd,
    cerchera' poi nei vari pacchetti scorrendo i file MANIFEST e
    MANIFESTLINK chi fornisce quelle librerie e creera' una lista
    ordinata...
    Lo script che useremo si chiamera' "pkgdep.sh" ed e' questo:
    
    
    #!/bin/bash 
    #copyleft 2004 Pierluigi Previtali bashing for fun
    #pkgdep.sh
    PACK=$(echo "$(basename $1)" | sed 's/.tgz//g')
    W_DIR="./"
    CHECK_PATH="./$PACK"
    LOG_FILE="/tmp/$PACK"
    TMP_CHECK="/tmp/TmP_ChEcK"
    MANIFEST_FILE="/tmp/MANIFEST"
    MANIFEST_LINK="/tmp/MANIFESTLINK"
    mkdir "$CHECK_PATH"
    tar xvzf $1 -C $CHECK_PATH &> /dev/null
    RESULTS="$(find ${CHECK_PATH}/* -type f -perm +111 -xdev -print| \
    	    xargs file |grep ELF|awk '{print $1 }'|sed 's/://g')"
    for i in $RESULTS; do
    output="`ldd \"$i\" 2> /dev/null | \
    		cut -d' ' -f1 | sed -e 's/^[[:space:]*]//'`"
    NOT_FOUND_LIST=""
    for k in $output ; do
    k="$(basename $k)"
    cat $MANIFEST_FILE | awk '
    BEGIN {
      starting = 1
    }
    
    /^\|\|   Package:  / {
      if( starting == 1 )
        starting = 0
      else
        printf( "\n" )
      printf( "%s ", $3 )
    }  
    
    /^[-bcdlps][-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT][[:space:]]/ {
      printf( "%s ", $6 )
    }  
    
    END {
      printf( "\n" )
    }  
    ' | fgrep "${k}" | cut -d' ' -f1 | grep -v "${PACK}" | tee -a $LOG_FILE > $TMP_CHECK
    
    TEST_FILE=$(cat $TMP_CHECK)
    if [ -z "$TEST_FILE" ]; then
    #inner loop	
    	cat $MANIFEST_LINK | awk '
    BEGIN {
      starting = 1
    }
    
    /^\|\|   Package:  / {
      if( starting == 1 )
        starting = 0
      else
        printf( "\n" )
      printf( "%s ", $3 )
    }  
    
    /^[-bcdlps][-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT][[:space:]]/ {
      printf( "%s ", $6 )
    }  
    
    END {
      printf( "\n" )
    }  
    '| fgrep "${k}"| cut -d' ' -f1 |sort |uniq |\
    sed 's/\/mnt\/cdrom\/slackware/./g' \
    | grep -v "${PACK}" | tee -a $LOG_FILE > $TMP_CHECK
    
    TEST_FILE=$(cat $TMP_CHECK)
    if [ -z "$TEST_FILE" ]; then
    	NOT_FOUND_LIST="$NOT_FOUND_LIST $k"
    fi
    #inner loop
    fi
    done
    done
    REALLY_NOT=$(echo "$NOT_FOUND_LIST"| grep -v linux-gate)
    RESULT=$(cat $LOG_FILE | sort | uniq)
    
    echo -e "\n\
    ++========================================\n\
    ||\n\
    ||   Package:  $(basename $1)\n\
    ||\n\
    ++========================================" 
    
    if [  -z "$RESULT" ]; then
    	
    	echo "No libs deps"
    else
    	for i in $RESULT ;do
    		echo $i
    	done
    fi
    if [ ! -z $REALLY_NOT ]; then
    	echo "Not found in any packages: $REALLY_NOT"
    fi
    echo " "
    rm -fr $CHECK_PATH $LOG_FILE $TMP_CHECK &> /dev/null
    segue...
    z00keeper of
    www.z00.it
    www.slack.z00.it

  4. #4
    codice:
    lo script cosi' come e' strutturato (volutamente grezzo come gli
    altri non ho molto tempo) prende come argomento il pacchetto e
    genera le sue dipendenze, a questo punto useremo per comodita' un
    terzo script che lo applichera' a tutti i pacchetti...
    lo script si chiamera' "make_dep_manifest.sh" e conterra' quanto
    segue:
    
    
    #!/bin/bash
    #copyleft 2004 Pierluigi Previtali bashing for fun
    #make_dep_manifest.sh
    for i in $(find /mnt/cdrom/slackware/* -name *.tgz ); do
    	echo "working on : $i"
    	(./pkgdep.sh $i 1>> /tmp/MANIFESTDEP)
    done
    
    il perche' di questo script... punto primo ci permette di applicarlo
    a tutti i pacchetti, punto secondo dato che alcuni pacchetti non
    contengono eseguibili come aaa_base o dev oppure gli howto lo script
    andrebbe in errore (normale tranquilli) eseguendolo in una
    sotto-shell con le parentesi tonde l'errore verra' solo segnalato e
    lo script principale continuera' , non avendo tempo per controlli
    piu' complessi e' un buon compromesso...
    A questo punto avremo il file /tmp/MANIFESTDEP che conterra' la
    famosa lista che un mio presumo futuro script rendera' piu' facile
    da consultare, anche se anche a mano e' comprensibile, facendo una
    ricerca ricorsiva anche sui pacchetti da cui dipende l'originale per
    creare una lista di dipendenze "totali" del pacchetto; per esempio
    se un pacchetto richiede le lib pango e quest'ultime richiedono il
    pacchetto xyz.tgz... comunque questo si deve ancora fare ora al
    primo livello possiamo vedere le dipendenze a mano....
    Sul mio pc ci ha messo oltre 10 ore per generare il MANIFESTDEP
    quindi meglio che lo lanciate la sera :-) anche perche' dal path
    dell'ultimo script notate che lo faccio per tutti i pacchetti
    nessuno mi impedirebbe di lanciarlo solo per ./xap/mozillaeccecc.tgz
    per esempio o solo per ./xap/* ....
    Questa lentezza mi fara' probabilmente ricodare il tutto per basarmi
    invece che su file di testo su un db stavo pensando di implementarlo
    con sqlite sempre in bash.....eliminando la parte di ricerca con awk
    che e' macchinosa e dispendiosa di risorse...ma essendo nato questo
    come esperimento del week.end.... per ora questo e'...
    un'altra possibile implementazione sarebbe quella di controllare
    durante un installazione presi i tagfile se abbiamo messo tutto
    quello che ci serve (finita l'inst si puo' fare con l'altro mio
    script) e cmq e' un valido riferimento alla conoscenza della
    struttura del nostro sistema ... come chiedere le dep di un rpm o di
    un pacchetto deb e quest'ultime richiedono il pacchetto xyz.tgz...
    comunque questo si deve ancora fare ora al primo livello possiamo
    vedere le dipendenze a mano....
    uno stralcio dell'output di less /tmp/MANIFESTDEP
    e' per esempio il seguente...
    
    ++========================================
    ||
    ||   Package:  aaa_base-10.0.0-noarch-1.tgz
    ||
    ++========================================
    No libs deps
     
    
    ++========================================
    ||
    ||   Package:  aaa_elflibs-9.2.0-i486-1.tgz
    ||
    ++========================================
    ./a/cxxlibs-5.0.6-i486-1.tgz
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./a/gpm-1.19.6-i486-6.tgz
    ./a/openssl-solibs-0.9.7d-i486-1.tgz
    ./d/gcc-3.3.4-i486-1.tgz
    ./d/gcc-g++-3.3.4-i486-1.tgz
    ./l/glib2-2.4.7-i486-1.tgz
    ./l/glibc-2.3.3-i486-2.tgz
    ./l/gmp-4.1.4-i486-1.tgz
    ./l/libjpeg-6b-i386-4.tgz
    ./l/libpng-1.2.7-i486-1.tgz
    ./l/libtiff-3.6.1-i486-2.tgz
    ./l/ncurses-5.4-i486-2.tgz
    ./l/pcre-5.0-i486-1.tgz
    ./l/zlib-1.2.2-i486-1.tgz
    ./n/openssl-0.9.7d-i486-1.tgz
     
    
    ++========================================
    ||
    ||   Package:  acpid-1.0.4-i486-1.tgz
    ||
    ++========================================
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
     
    
    ++========================================
    ||
    ||   Package:  apmd-3.0.2-i386-1.tgz
    ||
    ++========================================
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
    ./x/x11-6.8.1-i486-2.tgz
     
    
    ++========================================
    ||
    ||   Package:  bash-3.0-i486-1.tgz
    ||
    ++========================================
    ./a/aaa_elflibs-9.2.0-i486-1.tgz
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
    ./l/libtermcap-1.2.3-i486-6.tgz
     
    
    ++========================================
    ||
    ||   Package:  bin-9.2.0-i486-2.tgz
    ||
    ++========================================
    ./a/aaa_elflibs-9.2.0-i486-1.tgz
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
    ./l/libtermcap-1.2.3-i486-6.tgz
    ./l/zlib-1.2.2-i486-1.tgz
     
    
    ++========================================
    ||
    ||   Package:  bzip2-1.0.2-i486-5.tgz
    ||
    ++========================================
    ./a/aaa_elflibs-9.2.0-i486-1.tgz
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
     
    
    ++========================================
    ||
    ||   Package:  coreutils-5.2.1-i486-1.tgz
    ||
    ++========================================
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
     
    
    ++========================================
    ||
    ||   Package:  cpio-2.5-i386-1.tgz
    ||
    ++========================================
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./l/glibc-2.3.3-i486-2.tgz
     
    
    ++========================================
    ||
    ||   Package:  cups-1.1.21-i486-1.tgz
    ||
    ++========================================
    ./a/aaa_elflibs-9.2.0-i486-1.tgz
    ./a/glibc-solibs-2.3.3-i486-2.tgz
    ./a/openssl-solibs-0.9.7d-i486-1.tgz
    ./d/gcc-3.3.4-i486-1.tgz
    ./l/glibc-2.3.3-i486-2.tgz
    ./l/libjpeg-6b-i386-4.tgz
    ./l/libpng-1.2.7-i486-1.tgz
    ./l/libtiff-3.6.1-i486-2.tgz
    ./l/zlib-1.2.2-i486-1.tgz
    ./n/openssl-0.9.7d-i486-1.tgz
     
    notate che spesso c'e' la coppia 
    ./a/glibc-solibs-2.3.3-i486-2.tgz ./l/glibc-2.3.3-i486-2.tgz
    ./a/openssl-solibs-0.9.7d-i486-1.tgz ./n/openssl-0.9.7d-i486-1.tgz
    questo perche' i primi sono un set ridotto dei secondi
    per garantire un funzionamento minimo dei programmi 
    e viene esclusa linux-gate che e' una lib virtuale presente nei
    kernel 2.6.x .
    z00keeper of
    www.z00.it
    www.slack.z00.it

  5. #5
    come supponevo anche con l'uso del tag "code" il forum scompagina gli script scaricateveli dal link indicato che fate prima dentro il tar.bz2 c'e' anche il file del post...
    buon divertimento.. e lo so' ci sono un paio di bug che comunque non pregiudicano il risultato...
    se usate il pacchetto nella dir che creera' togliete il file di testo di questo post potrebbe irritare gli scripts che vogliono stare da soli o rinominatelo .sh in modo che gli scripts lo ignorino

    pierluigi
    z00keeper of
    www.z00.it
    www.slack.z00.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.