Repository 32bit  Forum
Repository 64bit  Wiki

Find external SlackPkg files: differenze tra le versioni

Da Slacky.eu.
(find_external_SlackPkg_files.sh. Uno script per scovare i file estranei ai pacchetti installati nella Slackware.)
 
m (Modificati i caratteri accentati con i relativi HTML)
Riga 3: Riga 3:
[[Category:Script]]
[[Category:Script]]
= Introduzione =
= Introduzione =
I "maniaci delle pulizie" - come me - a volte hanno la necessità di
+
I "maniaci delle pulizie" - come me - a volte hanno la
scovare quei file, presenti nella root directory, che non
+
necessità di scovare quei file, presenti nella root directory,
appartengono a nessun pacchetto installato. Questo infatti permette di
+
che non appartengono a nessun pacchetto installato. Questo infatti
stabilire se quei file sono vecchi e vanno rimossi oppure sono file di
+
permette di stabilire se quei file sono vecchi e vanno rimossi oppure
configurazione (o altro) creati dai programmi a run-time.
+
sono file di configurazione (o altro) creati dai programmi a run-time.
Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge
Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge
che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella
che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella
mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema è
+
mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema
ritornato come se il pacchetto non fosse mai stato
+
è ritornato come se il pacchetto non fosse mai stato
installato?". Generalmente i dubbi sono infondati, quasi tutti i
installato?". Generalmente i dubbi sono infondati, quasi tutti i
pacchetti vengono rimossi completamente e non lasciano tracce, ma è
+
pacchetti vengono rimossi completamente e non lasciano tracce, ma
proprio quel 'quasi tutti' che non fa dormire sonno tranquilli :).
+
è proprio quel 'quasi tutti' che non fa dormire sonno
  +
tranquilli :).
Lo script find_external_SlackPkg_files.sh esegue una scansione di
Lo script find_external_SlackPkg_files.sh esegue una scansione di
tutta la root directory e controlla, file per file, se esso è stato
+
tutta la root directory e controlla, file per file, se esso è
installato da un pacchetto Slackware oppure no. Quindi visualizza in
+
stato installato da un pacchetto Slackware oppure no. Quindi
output tutti quei file "estranei" ai pacchetti.
+
visualizza in output tutti quei file "estranei" ai pacchetti.
Lo script può essere eseguito sia come root che come utente
+
Lo script può essere eseguito sia come root che come utente
normale. In quest'ultimo caso, ovviamente, lo script non potrà
+
normale. In quest'ultimo caso, ovviamente, lo script non potrà
scandire quelle directory di proprietà di altri utenti, ma darà
+
scandire quelle directory di proprietà di altri utenti, ma
comunque dei buoni risultati.
+
darà comunque dei buoni risultati.
= L'algoritmo =
= L'algoritmo =
L'algoritmo è molto semplice, lo script esegue un '''find''' sulla
+
L'algoritmo è molto semplice, lo script esegue un '''find'''
root directory filtrando alcuni path (si veda la sezione [[#Filtrare dei percorsi]]).
+
sulla root directory filtrando alcuni path (si veda la sezione
Una volta creata questa 'file list', lo script individua anche tutti i
+
[[#Filtrare dei percorsi]]). Una volta creata questa 'file list', lo
link simbolici creati dagli script '''doinst.sh''' dei vari
+
script individua anche tutti i link simbolici creati dagli script
pacchetti. Quindi, controlla quali tra i file presenti nella 'file
+
'''doinst.sh''' dei vari pacchetti. Quindi, controlla quali tra i file
list' non appartiene ad un pacchetto e non è neanche un link simbolico
+
presenti nella 'file list' non appartiene ad un pacchetto e non
creato da un '''doinst.sh'''.
+
è neanche un link simbolico creato da un '''doinst.sh'''.
  +
  +
{{Information
  +
|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 ==
== Filtrare dei percorsi ==
Riga 48: Riga 48:
* /var/log/removed_scripts
* /var/log/removed_scripts
Si possono inoltre (ed è consigliato farlo) impostare dei filtri
+
Si possono inoltre (ed è consigliato farlo) impostare dei
utente semplicemente creando il file
+
filtri utente semplicemente creando il file
''~/.find_external_SlackPkg_files''. Il formato del file è il
+
''~/.find_external_SlackPkg_files''. Il formato del file è il
seguente:
seguente:
* tutte le righe vuote e le righe che iniziano con un '#' sono ignorate.
* 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.
+
* 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:
Quindi ad esempio, se il file contiene le seguenti righe:
Riga 65: Riga 65:
/usr/share/mime update-mime-database
/usr/share/mime update-mime-database
</pre>
</pre>
Allora lo script ignorerà:
+
Allora lo script ignorer&agrave;:
* la directory ''/home''
* la directory ''/home''
* le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (''/mnt'' e ''/media'').
* le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (''/mnt'' e ''/media'').
Riga 73: Riga 73:
{{Warning
{{Warning
|Nota:
|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).
+
|Se il path da filtrare contiene uno spazio, allora lo script penser&agrave; che ci&ograve; che si trova dopo lo spazia sia un comando da controllare. In questo caso, affinch&eacute; tutto funzioni, bisogna aggiungere un altro spazio e poi un comando sicuramente esistente (ad esempio la bash, visto che lo script &egrave; interpretato proprio da questa shell).
}}
}}
Riga 90: Riga 90:
= Bug =
= Bug =
Ci sono un po' di note sull'algoritmo che vale la pena segnalare:
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.
+
* alcuni '''doinst.sh''' sono scritti in maniera particolare e fanno ben altro che creare semplici link simbolici. Un caso per tutti &egrave; il '''doinst.sh''' della '''bash''' dove il file installato dal pacchetto non si chiama '''bash''' ma, ad esempio '''bash4.new'''. Sar&agrave; 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 &egrave; 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:<pre>*/bin/[</pre>
+
* 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 &egrave; 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:<pre>*/bin/[</pre>
== Le glibc ==
== Le glibc ==
Riga 100: Riga 100:
proprio per impedire che le librerie vengano eliminate insieme al
proprio per impedire che le librerie vengano eliminate insieme al
pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo'
pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo'
delle '''glibc''' farebbe che tutti i comandi linkati con le
+
delle '''glibc''' farebbe s&igrave; che tutti i comandi linkati con le
vecchie librerie non funzionino più. Questo vorrebbe dire un blocco
+
vecchie librerie non funzionino pi&ugrave;. Questo vorrebbe dire un
del sistema poiché non si avrebbero più a disposizione i comandi
+
blocco del sistema poich&eacute; non si avrebbero pi&ugrave; a
basilari come '''rm''', '''ls''', etc...
+
disposizione i comandi basilari come '''rm''', '''ls''', etc...
C'è da dire però che lo script, oltre alle '''glibc''' attualmente
+
C'&egrave; da dire per&ograve; che lo script, oltre alle '''glibc'''
installate segnala anche le '''glibc''' vecchie. Queste ultime si
+
attualmente installate segnala anche le '''glibc''' vecchie. Queste
possono tranquillamente eliminare se tutto il sistema è aggiornato, ma
+
ultime si possono tranquillamente eliminare se tutto il sistema
si vada comunque con i piedi di piombo.
+
&egrave; aggiornato, ma si vada comunque con i piedi di piombo.
{{Warning
{{Warning
Riga 124: Riga 124:
= Copyright - License =
= Copyright - License =
Autore (ultima modifica): [[Utente:Spina|spina]] 23:14, 3 set 2011 (CEST)
+
Autore (ultima modifica): [[Utente:Spina|spina]] 23:32, 3 set 2011 (CEST)
{{Information
{{Information
|GNU Free Documentation Licence
|GNU Free Documentation Licence

Versione delle 23:32, 3 set 2011

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