Repository 32bit  Forum
Repository 64bit  Wiki

Find external SlackPkg files

Da Slacky.eu.

Indice

Introduzione

I "maniaci delle pulizie" - come me - a volte hanno la necessità di scovare quei file, presenti nella root directory, che non appartengono a nessun pacchetto installato. Questo infatti permette di stabilire se quei file sono vecchi e vanno rimossi oppure sono file di configurazione (o altro) creati dai programmi a run-time.

Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema è ritornato come se il pacchetto non fosse mai stato installato?". Generalmente i dubbi sono infondati, quasi tutti i pacchetti vengono rimossi completamente e non lasciano tracce, ma è proprio quel 'quasi tutti' che non fa dormire sonno tranquilli :).

Lo script find_external_SlackPkg_files.sh esegue una scansione di tutta la root directory e controlla, file per file, se esso è stato installato da un pacchetto Slackware oppure no. Quindi visualizza in output tutti quei file "estranei" ai pacchetti.

Lo script può essere eseguito sia come root che come utente normale. In quest'ultimo caso, ovviamente, lo script non potrà scandire quelle directory di proprietà di altri utenti, ma darà comunque dei buoni risultati.

L'algoritmo

L'algoritmo è molto semplice, lo script esegue un find sulla root directory filtrando alcuni path (si veda la sezione #Filtrare dei percorsi). Una volta creata questa 'file list', lo script individua anche tutti i link simbolici creati dagli script doinst.sh dei vari pacchetti. Quindi, controlla quali tra i file presenti nella 'file list' non appartiene ad un pacchetto e non è neanche un link simbolico creato da un doinst.sh.


Informazione:
Si capisce benissimo che l'algoritmo è semplice ma la sia esecuzione è bella lunga. Diciamo che la vostra CPU non vi ringraziera :).

Filtrare dei percorsi

Lo script non scandisce tutta la root directory, ma filtra i seguenti percorsi speciali:

  • /dev
  • /proc
  • /root
  • /sys
  • /var/log/packages
  • /var/log/scripts
  • /var/log/removed_packages
  • /var/log/removed_scripts

Si possono inoltre (ed è consigliato farlo) impostare dei filtri utente semplicemente creando il file ~/.find_external_SlackPkg_files. Il formato del file è il seguente:

  • tutte le righe vuote e le righe che iniziano con un '#' sono ignorate.
  • ogni riga non ignorata deve contenere esattamente un percorso e, opzionalmente, un comando da controllare. In quest'ultimo caso, il comando deve essere separato dal percorso da almeno un carattere di spaziatura; il percorso associato sarà filtrato se, e solo se, il comando esiste nel PATH.

Quindi ad esempio, se il file contiene le seguenti righe:

# My comment

/home
/mnt
/media
/usr/share/fonts/*.dir
/usr/share/mime                 update-mime-database

Allora lo script ignorerà:

  • la directory /home
  • le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (/mnt e /media).
  • tutti i file generati dal comando mkfontdir
  • la directory /usr/share/mime se, e solo se, esiste il comando update-mime-database


Nota:
Se il path da filtrare contiene uno spazio, allora lo script penserà che ciò che si trova dopo lo spazia sia un comando da controllare. In questo caso, affinché tutto funzioni, bisogna aggiungere un altro spazio e poi un comando sicuramente esistente (ad esempio la bash, visto che lo script è interpretato proprio da questa shell).


Nota:
I percorsi sono passati al comando find tramite l'uso della sua opzione -path. Si veda il manuale di find per conoscere il formato accettato.

Le opzioni

-h

Questa opzione ha il solo scopo di mostrare l'help.

-f

Mostra in output i percorsi filtrati ed esce.

Bug

Ci sono un po' di note sull'algoritmo che vale la pena segnalare:

  • alcuni doinst.sh sono scritti in maniera particolare e fanno ben altro che creare semplici link simbolici. Un caso per tutti è il doinst.sh della bash dove il file installato dal pacchetto non si chiama bash ma, ad esempio bash4.new. Sarà poi lo script di post-installazione a rinominare il file installato come bash. Quindi per lo script, paradossalmente, l'interprete che lo esegue (la shell bash, appunto) non è stato installato da nessun pacchetto.
  • il comando [ crea problemi con grep. Quest'ultimo comando viene usato per controllare se i file nella 'file list' appartengono o meno ad un pacchetto o ad un link creato da i doinst.sh. Il problema è che il carattere '[' ha un significato particolare per grep e quindi viene sollevato un errore. Si consiglia di filtrare il comando [ aggiungengo nel file di filtro la seguente riga:
    */bin/[

Le glibc

Le librerie glibc non sono installate in maniera canonica. Il pacchetto installa queste librerie in una directory temporanea chiamata incoming e poi lo script di post-installazione sposta tutte le librerie nella locazione opportuna. Questo viene fatto proprio per impedire che le librerie vengano eliminate insieme al pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo' delle glibc farebbe sì che tutti i comandi linkati con le vecchie librerie non funzionino più. Questo vorrebbe dire un blocco del sistema poiché non si avrebbero più a disposizione i comandi basilari come rm, ls, etc...

C'è da dire però che lo script, oltre alle glibc attualmente installate segnala anche le glibc vecchie. Queste ultime si possono tranquillamente eliminare se tutto il sistema è aggiornato, ma si vada comunque con i piedi di piombo.


Attenzione:
Le glibc rappresentano un altro classico caso di doinst.sh non banale . Si faccia quindi attenzione ad eliminare 'a priori' tutti i file segnalati dallo script.

Lo script

Bene, è ora giunto il momento di scaricare e provare lo script, che può essere trovato a questo link: find_external_SlackPkg_files.sh

Vedere anche

unused_SlackPkg.sh

Copyright - License

Autore (ultima modifica): spina 23:32, 3 set 2011 (CEST)

GNU Free Documentation Licence
This article is released under the GNU Free Documentation Licence. You are welcome to copy and redistribute it (subject to certain conditions).
Strumenti personali
Namespace

Varianti