Pagina 1 di 3

[Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 18:22
da joe
A volte capita di installare un programma, e tentare di eseguirlo senza successo a causa per esempio della mancanza di librerie. A questo proposito, è facile vedere quali mancano grazie al comando:

ldd /usr/bin/programma |grep "not found"

A quel punto sapiiamo quali files mancano, ma non conosciamo ancora a quale pacchetto apperengono tali files e quindi occorre fare qualche ricerca per capire cosa installare.

Porto ad esempio un sito che permette di risolvere agevolmente (si potrebbe anche fare qualcosa di meglio forse ma va bè)questo problema:
http://packages.slackware.it/

A questo indirizzo vi è un motore di ricerca che permette di trovare il pacchetto a cui appartiene un certo file (pattern di ricerca). Da ciò risulta piuttosto semplice capire quale sia il pacchetto da installare in caso di librerie mancanti.
Purtroppo il sito sopracitato consente la ricerca tra i soli pacchetti ufficiali, quindi se la libreria necessaria sta in un pacchetto per esempio di slacky.eu, non si trova....bisognoa ricorrere a google...che comunque restituisce sempre qualche risultato.

Mi chiedevo se si potesse predisporre un motore di ricerca del genere anche per il repository di slacky.eu.
Francamente io non ho esperienza di database e non conosco le problematicità che potrebbero venirne fuori.

A me piacciono paarecchio le cose semplici...
E l'idea che mi viene per realizzare un sistema del genere potrebbe passare per la registrazione su semplici files di testo dei files presenti in un pacchetto.
Si potrebbe pubblicare nel repository un grosso file di testo da scaricari in locale:
su ogni riga troviamo:

nome_software/usr/bin/file1
nome_software/usr/lib/file2
ecc

insomma in pratica la stampa dell'explodepkg di quel pacchetto. La cosa importante è appunto che il "campo" nome_software ci sia.
Avendo in mano un tale file diventa semplice dare:
grep lbreria_mancante slacky.repo.files.txt

e salta fuori il "nome_software" che corrisponde al pacchetto da installare per avere la libreria mancante.

Insomma, io lancio l'idea, e ho pensato di aggiungere qualche qualche proposta pratica. Che non è detto essere la scelta migliore.
Ho postato in questa sezione perchè alla fine rigurada il repo dei pacchetti e soprattutto perchè occorrerebbe aggiungere eventualmente tale file di testo, magari ben compresso al repo stesso.

Esempio buttato lì:
In una directory ho dei pacchetti tgz, voglio creare un file di testo contente l'explode dei pacchetti: Nel mio caso ho solo due pacchetti rtorrent e libtorrent:

Codice: Seleziona tutto

$ ls
libtorrent-rt-0.11.9-i486-1bj.tgz  rtorrent-0.7.9-i486-1bj.tgz
$ for PKG in $(ls *tgz); do tar -tzf $PKG| sed 's/^/'$PKG'   /'; done > list.txt
$ cat list.txt
libtorrent-rt-0.11.9-i486-1bj.tgz    ./
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/NEWS
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/TODO
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/README
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/slack-desc
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/AUTHORS
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/INSTALL
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/libtorrent-rt.SlackBuild
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/ChangeLog
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/doc/libtorrent-rt-0.11.9/COPYING
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/libtorrent.so.10.0.8
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/libtorrent.la
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/pkgconfig/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/pkgconfig/libtorrent.pc
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/file_manager.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/file_utils.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/file_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/block_transfer.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/block_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/transfer_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/file.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/file_list_iterator.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/piece.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/data/block.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/peer_info.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/peer_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/client_info.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/client_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/peer/peer.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/resume.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/download.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/tracker_list.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/error.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/event.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/chunk_manager.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/bitfield.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/common.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/hash_string.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/http.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/object_stream.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/path.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/poll.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/rate.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/poll_kqueue.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/poll_select.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/object.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/poll_epoll.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/torrent.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/exceptions.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/tracker.h
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/include/torrent/connection_manager.h
libtorrent-rt-0.11.9-i486-1bj.tgz    install/
libtorrent-rt-0.11.9-i486-1bj.tgz    install/doinst.sh
libtorrent-rt-0.11.9-i486-1bj.tgz    install/slack-desc
libtorrent-rt-0.11.9-i486-1bj.tgz    install/slack-required
rtorrent-0.7.9-i486-1bj.tgz    ./
rtorrent-0.7.9-i486-1bj.tgz    usr/
rtorrent-0.7.9-i486-1bj.tgz    usr/bin/
rtorrent-0.7.9-i486-1bj.tgz    usr/bin/rtorrent
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/TODO
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/rtorrent.rc
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/README
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/faq.xml
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/slack-desc
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/rtorrent.SlackBuild
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/AUTHORS
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/INSTALL
rtorrent-0.7.9-i486-1bj.tgz    usr/doc/rtorrent-0.7.9/COPYING
rtorrent-0.7.9-i486-1bj.tgz    usr/man/
rtorrent-0.7.9-i486-1bj.tgz    usr/man/man1/
rtorrent-0.7.9-i486-1bj.tgz    usr/man/man1/rtorrent.1.gz
rtorrent-0.7.9-i486-1bj.tgz    install/
rtorrent-0.7.9-i486-1bj.tgz    install/slack-desc
rtorrent-0.7.9-i486-1bj.tgz    install/slack-required
Se avessi installato sol rtorrent e al lancio mi dicesse che manca "libtorrent.so.10.0.8", mi basterebbe dare:

Codice: Seleziona tutto

$ grep libtorrent.so.10.0.8 list.txt
libtorrent-rt-0.11.9-i486-1bj.tgz    usr/lib/libtorrent.so.10.0.8
Per essere sicuro che installando il pacchetto libtorrent-rt otterrò il file mancante.
Ovviamente il pattern di ricerca da usare con grep dovrà essere ponderato, avrei per esempio potuto cercare solo libtorrent.

Lascio a voi commenti sull'utilità/fattibilità della pubblicazione di un file di testo del genere per il repository (magari un file per ogni release di slackware ospitata qui). O per altre proposte alternative.

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 18:48
da conraid
MANIFEST.bz2

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 18:55
da targzeta
Qui su slacky esiste questo script:
http://www.slacky.eu/wikislack/index.ph ... =Fmanifest

che fa nel file MANIFEST.bz2 quello che chiedi. Se scarichi i MANIFEST.bz2 da altri repository, tipo quelli di slacky puoi fare la ricerca anche su quelli. In pratica se in locale hai i file:

slackware_MANIFEST.bz2
slacky_MANIFEST.bz2

puoi effettuare la ricerca per il file 'casa' su entrambi i file con:

Codice: Seleziona tutto

fMANIFEST -f slackware_MANIFEST.bz2 casa;
fMANIFEST -f slacky_MANIFEST.bz2 casa;
Ovviamente nessuno ti vieta di scriverti alias del tipo: "slacky_search" o "slackware_search" e quindi di tenerti tutti i MANIFEST.bz2 in una directory ben specifica.

Inoltre nessuno ti vieta di modificare lo script inserirgli degli URL in cui andare a beccare il MANIFEST.bz2 così da non dovertelo scaricare ogni giorno.

Spina

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 19:50
da joe
È il caso di dire Beata Ignoranza...
Magari cambio il titolo: "la scoperta dell'acqua calda".

Grazie ad entrambi per la risposta. Considererò lo script di cui parlavi.
A presto! :-D

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 19:53
da gohanz
Ma sul motore di ricerca di Slacky, questa funzionalità è applicabile?

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 20:39
da ulisse89
Grazie a joe che hai aperto questo topic e a chi ha risposto. Anch'io ho scoperto solo adesso questa cosa del MANIFEST + relativo script. L'ho sempre visto, ma non mi sono mai domandato cosa fosse. :D Infatti mi era capitato spesso di andare alla ricerca di librerie mancanti su google senza successo.

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 20:40
da teox99
a fare si puo' fare tutto!
ho sviluppato un motore di ricerca dei paccetti di slack che comunque ritorna le dipendenze dei paccheti (segue slack-required di ogni /src) (e come fa' anche il motore di slacky.eu)
il pacchetto dipendente puo' essere poi cercato o nei repo base o in slacky.eu
http://www.teoxonline.com/utils/sse/

per una motore di ricerca piu' evoluto come nel caso di MANIFEST cosa che sto cercando di implementare a breve,
bisognera' vedere la performance della ricerca (php su srv remoto) dato che il file di testo e' grande circa 50Mb! bah vedremo!

vi tengo aggiornati

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: ven 15 mag 2009, 22:37
da joe
spina ha scritto: Ovviamente nessuno ti vieta di scriverti alias del tipo: "slacky_search" o "slackware_search" e quindi di tenerti tutti i MANIFEST.bz2 in una directory ben specifica.
Per pignoleria...Tenute presenti le consuetudini del file system di linux ed in particolare di slackware.... dove slveresti i files MANIFEST.bz2 ?
Tipo in /var/cache/fmanifest potrebbe andare?

Inoltre nessuno ti vieta di modificare lo script inserirgli degli URL in cui andare a beccare il MANIFEST.bz2 così da non dovertelo scaricare ogni giorno.
Mmmm.... potresti spiegarti meglio circa questa frase?
Cosa intendevi di preciso?

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 9:18
da danix
joe ha scritto:
spina ha scritto: Ovviamente nessuno ti vieta di scriverti alias del tipo: "slacky_search" o "slackware_search" e quindi di tenerti tutti i MANIFEST.bz2 in una directory ben specifica.
Per pignoleria...Tenute presenti le consuetudini del file system di linux ed in particolare di slackware.... dove slveresti i files MANIFEST.bz2 ?
Tipo in /var/cache/fmanifest potrebbe andare?

Inoltre nessuno ti vieta di modificare lo script inserirgli degli URL in cui andare a beccare il MANIFEST.bz2 così da non dovertelo scaricare ogni giorno.
Mmmm.... potresti spiegarti meglio circa questa frase?
Cosa intendevi di preciso?
Ti dico la mia...
Potresti strutturare lo script in modo che cerchi prima nella copia locale e se non trova nulla prova ad aggiornare il MANIFEST.bz2 scaricandolo da internet (con wget o quello che ti pare)...
Io farei ancora diversamente, cioè prima di procedere a riscaricare il MANIFEST che è bello pesante, istruirei lo script a controllare prima il changelog, basta scaricare una copia locale la prima volta, e in seguito ogni volta che si rende necessario il download faccio scaricare prima il changelog, se alla prima riga riporta una data successiva a quella della copia locale allora procedo a scaricare il MANIFEST, altrimenti no...

spero di essermi spiegato chiaramente :D

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 11:54
da targzeta
Non saprei dove poterteli salvare, io ho messo il MANIFEST.bz2 della Slamd64 in /tmp e lo sovrascrivo ad ogni aggiornamento (seguo la current). Poi mi sono fatto questo alias:

Codice: Seleziona tutto

alias fMANIFEST.sh='fMANIFEST.sh -f /tmp/MANIFEST.bz2'
così dovunque mi trovo posso lanciare fMANIFEST.sh per cercare il pacchetto (ovviamente in questo modo cerco solo nel "repository" ufficiale).

L'idea di danix non è cattiva, prima fai una ricerca sui file locali, poi se non trovi nulla controlli se magari il MANIFEST.bz2 locale non sia datato, quindi se è così te lo riscarichi. Solo io suggerirei di usare sempre wget sullo stesso file (ad esempio il MANIFEST.bz2 di GSlacky-12.0 è abbastanza piccolo da fare prove), scarichi sempre il file con:

Codice: Seleziona tutto

data=$(date -r MANIFEST.bz2 -R); wget --header="If-Modified-Since: $data" http://repository.slacky.eu/gnome-slacky-12.0/MANIFEST.bz2
in questo modo, se il file non esiste lo scarichi, se esiste lo scarichi solo se è stato modificato.
Prova ad eseguire i comandi qui sopra due volte di seguito e lo vedrai, la seconda volta wget dovrebbe uscire con "304: Not Modified".

Spina

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 12:46
da danix
Emanuele, ma usare il changelog non è meglio?? Alla fine se cambia quello cambia il manifest, se nel primo viene notificata l'aggiunta di un pacchetto questo risulterà nel manifest, se verrà rimosso questo verrà tolto dal manifest, quindi in entrambi i casi è meglio riscaricarlo... e il changelog e solo pochi KB...


o mi sfugge qualcosa??

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 13:14
da targzeta
danix ha scritto:...o mi sfugge qualcosa??
Credo di si, usando il wget per come l'ho postato prima non riscarichi il MANIFEST.bz2, a meno che il file non sia stato effettivamente modificato.

Io avevo capito che tu volessi scaricare il ChangeLog per verificare se il MANIFEST.bz2 fosse cambiato e se si, allora riscaricare il MANIFEST.bz2. Il mio comando fa la stessa cosa senza scaricare il ChangeLog.txt.
Provalo, basta eseguirlo due volte, la prima volta wget scarica il file perchè nella directory locale non è presente, la seconda invece non lo scarica, visto che sul server il file non è stato modificato.

Emanuele

Offtopic: P.S. D'ora in poi mi firmerò sempre Emanuele

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 13:24
da conraid
Emanuele, se non ho capito male quel che vuoi fare basta wget -N url
io nel mio script che aggiorna il changelog per slackers.it ho
/usr/bin/wget -q -t 5 -N ftp://ftp.slackware.com/pub/slackware/s ... ngeLog.txt

-q non mostra niente
-t 5 per fare 5 tentativi
-N mi scarica il file sono se nuovo

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: sab 16 mag 2009, 13:29
da targzeta
conraid ha scritto:Emanuele, se non ricordo male basta wget -N url
Si, l'ho provato ora, così è decisamente più carino.
Nel man di wget non riuscivo a trovare niente, allora sono andato a memoria sul --header.

Emanuele

Re: [Proposta] Ricerca tra i files contenuti nei pacchetti

Inviato: lun 18 mag 2009, 14:58
da joe
Dunque, il comando wget -N url, ha una certa "eleganza" in effetti.
Ma mi resta un dubbio...
Abbiano N repositories che ci forniscono N files nominati sui rispettivi repo MANIFEST.bz2. Quindi hanno tutti lo stesso nome.

In locale mi piaceva predisporre una "cache" in cui stoccare questi files di testo.
Evidentemente nella cache ciascun MANIFEST.bz2 dovrebbe avere un nome significativo in base al repo cui appartiene tipo:

Codice: Seleziona tutto

../var/cache/finder
slacky-MANIFEST.bz2
linuxpackages-MANIFEST.bz2
official-slackware-MANIFEST.bz2
official-extra-MANIFEST.bz2
Ora il problema che si presenta volendo usare il flag -N di wget è che tale flag non è compatibile con il flag -O.
Stavo cercando di costruire un piccolo script per aggiornare questa cache e invocare opportunamente lo script di Spina.
In pratica volevo predisporre un file di configurazione del tipo:

Codice: Seleziona tutto

cat /etc/finder/repo.conf
slacky repository.slacky.eu/blabla/MANIFEST.bz2
linuxpackages repository.linuxp.net/blabla/MANIFEST.bz2
official-slackware http://mirror2.mirror.garr.it/mirrors/Slackware/blabla/slackware/MANIFEST.bz2
Ora per ogni coppia "nome repo-url" si potrebbe pensare di usare il comando:
wget -N -O $CACHE/$REPONAME-MANIFEST.bz2 $REPOURL

Con l'idea di ottenere i files nella cache nominati in modo razionale ed esplicativo e allo stesso tempo sfruttare il timestamp del file remoto.
Ma come dicevo sopra i flag -N e -O non sono compatibili.
C'è qualche modo per farli convivere pur rinominando il file locale?

Mi viene in mente che sarebbe possibile strutturare la cache in modo diverso: invece di mettere i files rrinominati nella stessa directory di cache, creare per ogni file una directory nominata opportunamente che contenga il relativo file MANIFEST.bz2 senza rinominarlo.
Altrimenti volendo tenere una cache a directory unica mi pare necessario ricorrere al flag --header di wget... che penso sia compatibile con il flag -O di rinomina.

Avete opinioni e idee in merito, nuove alternative ecc?