Old:Debuctio
![]() |
Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica. |
Introduzione
Come descritto in questo thread del forum (http://forum.debianizzati.org/viewtopic.php?f=20&t=41968) con questa pagina si vuole aprire un progetto per capire meglio come funziona il sistema operativo Debian ed in particolare il suo gestore dei pacchetti ([| APT], Advanced Packaging Tool).
Quando si utilizza un sistema "misto", ossia installando pacchetti provenienti da repository di versioni differenti, il controllo del nostro sistema si farà più impegnativo; un punto fondamentale per non perdere la testa sarà quello di riconoscere la provenienza di ogni pacchetto relativa alla versione del repository. Si darà per sottinteso che si conosce la struttura dei repository di Debian.
Alcune applicazioni quali Apt-show-versions già permettono di reperire questo tipo di informazioni. Inoltre strumenti quali "apt-cache policy" e "aptitude versions" possono fornirci la stessa informazione a partire dalla versione dei pacchetti installati.
Dei test effettuati nel thread del forum citato all'inizio di questa introduzione hanno però dato dei risultati diversi in base al metodo utilizzato. Nasce così il progetto debuctio (gioco di parole fra deductio, derivazione, e deb, pacchetto per Debian; ossia, derivazione/provenienza di un pacchetto Debian, ovviamente posto come domanda ;-)) per carpire queste differenze ed eventualmente riscrivere un metodo per classificare i pacchetti in Debian, rispettivamente integrarlo in uno dei metodi già esistenti.
Chiunque fosse interessato al progetto non ha che da aggiungersi alla discussione qui o nel forum e riempire gli spazi di questa pagina wiki.
Roadmap
- Capire il funzionamento degli strumenti attualmente in grado di carpire la versione e dunque la provenienza dei pacchetti:
- apt-show-versions [In Elaborazione]
- apt-cache policy [Da incominciare]
- aptitude versions [Da incominciare]
- Stabilire le differenze fra i vari comportamenti degli strumenti sopra citati (ammesso che ce ne siano) e scegliere quale potrebbe essere la soluzione più "logica" e dunque precisa per ottenere l'informazione ricercata [Da incominciare]
- Costruire uno script/strumento che permetta in modo semplice di giungere all'informazione voluta [Da incominciare]
- Pacchettizare lo script/strumento e/o [Da incominciare]
- integrarlo in uno degli strumenti già esistenti se possibile (magari aptitude...) [Da incominciare]
- proporlo nei repository di Debian come pacchetto a se stante [Da incominciare]
[] : Status
: da incominciare
: in elaborazione
: completato
1. Funzionamento strumenti attuali
Apt-show-versions
Per ottenere il sorgente possiamo utilizzare "apt-get source" (aggiornando però il "sources.list" con il repository "deb-src") oppure scaricarlo dal sito -> http://www.debian.org/distrib/packages dopo averlo cercato.
Attualmente direi di basarci sulla versione 0.16 presente sia in testing che in unstable.
Dopo aver scaricato il sorgente potremo notare come lo script "apt-show-versions" sia uno script in perl che praticamente rappresenta l'intero programma; cerchiamo dunque di analizzarlo per capirne il funzionamento base.
Status pacchetti
Dopo il "bla bla bla" iniziale sembrerebbe che apt-show-versions peschi lo stato dei pacchetti direttamente da dpkg
# Path to dpkg status file my $status_file = $opts{'status-file'} || "/var/lib/dpkg/status";
per vedere dunque qual è la versione installata del pacchetto in causa. In una seconda fase (v. punto 2. della roadmap) bisognerà vedere se prelevare l'informazione della versione tramite dunque lo status del pacchetto definito da dpkg o usufruendo di uno strumento quale aptitude o apt-cache.
Nome release (versione)
Dando un'occhiata alla funzione "determine_releasenames()" e all'esempio quando viene utilizzata
# Determine the release names currently used by this host. # %releasenames structure example: # ('ftp.de.debian.org_debian_dists_unstable' => {'Suite' => 'unstable', # 'Name' => 'unstable', # 'Codename' => 'sid'}, # 'debian.udsorg.ru_dists_unstable' => {'Suite' => 'unknown', # 'Name' => 'unknown', # 'Codename' => 'unknown'}, # ...)
sembrerebbe che la versione del pacchetto (e il nome della versione) viene prelevata dai release files presenti in "/var/lib/apt/lists"; la domanda è se non basterebbe prelevare il nome della versione direttamente da "/etc/apt/sources.list" che dovrebbe essere la stessa cosa. Forse il primo metodo è vantaggioso nel caso si cambi il "sources.list", mantenendo teoricamente i release files in relazione ai pacchetti installati. In ogni caso, queste liste si potranno poi utilizzare per verificare la provenienza di un pacchetto; ad esempio:
- Ottengo la lista dei pacchetti installati via dpkg
- Ottengo la versione dei pacchetti installati via lo status di dpkg (o ev. altri strumenti)
- Ottengo il nome delle versioni dei repository consultando le liste /var/lib/apt/lists (in questo caso si potrebbe già migliorare apt-show-versions eliminando "unknown" e dando invece il nome del repository "sconosciuto")
===> per ogni pacchetto installato alla versione X cerco la sua presenza nelle varie liste; quando trovo quella con il pacchetto in questione, la lista rappresenta la versione del pacchetto. Dando una breve occhiata alle liste, alcune di lunghezza infinita, ci si domanda però se la ricerca del pacchetto non sarebbe troppo dispendiosa in termine di tempo; bisognerebbe dunque filtrare la ricerca in lista, incominciando ad esempio dal fondo o da una determinata posizione a seconda ad esempio alle iniziali del pacchetto stesso.
NOTA INTERMEDIA
Dopo questa discussione sul forum (http://forum.debianizzati.org/viewtopic.php?f=42&t=42131) c'è da segnalare un ulteriore progresso nella comprensione della gestione dei pacchetti. Le liste presenti in /var/lib/apt/lists sono unicamente relative ai pacchetti presenti nei repository che si hanno nel sources.list; anche senza ancora una certezza assoluta, questi pacchetti vengono aggiornati quando si fa il classico "update" con il gestore di pacchetti preferito e sono riferiti a tutto il repository. Facendo l'esempio con un pacchetto come "nano" troveremo i seguenti risultati:
$ find /var/lib/apt/lists/ -iname "*Packages" | xargs grep -x "Package: nano" /var/lib/apt/lists/ftp.ch.debian.org_debian_dists_squeeze_main_binary-amd64_Packages:Package: nano /var/lib/apt/lists/ftp.ch.debian.org_debian_dists_sid_main_binary-amd64_Packages:Package: nano
trovando appunto il pacchetto sia nel repository di squeeze e in quello di sid (entrambi i repository sono nel mio sources.list); per capire da dove proviene il pacchetto installato sul nostro sistema bisogna sapere la sua versione. Quest'ultima la troviamo scrutando appunto lo status dei pacchetti (v. apt-show-versions) in /var/lib/dpkg/status. Sempre riferito a nano, in questa discussione (http://forum.debianizzati.org/viewtopic.php?f=13&t=42135) abbiamo maturato le seguenti idee per ottenere la versione di un pacchetto installato. Facendo sempre un esempio con nano:
- Metodo 1
$ sed -n -e '/nano$/,/^Version/{/nano$/p;/^Version/{p;q}}' /var/lib/dpkg/status
- Metodo 2
$ awk '/nano$/,/Version/' /var/lib/dpkg/status | awk '/nano/||/Version/'
- Metodo 3 (script awk)
BEGIN { RS="\n\n"; FS="\n"; } { split($1, data, ": ") ; if( data[2] == "nano" ) print $1"\n"$8; }
da applicare poi al file /var/lib/dpkg/status
ATTENZIONE Questo terzo metodo non funziona, in quanto "Version" non si trova sempre sull'ottava linea del "blocco" dello status del pacchetto! |