Script pulizia del sistema

Bash, Perl, Python, Ruby, ...
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Script pulizia del sistema

Messaggio da mirko.pagliai »

Sulla base di questa discussione sul forum di Ubuntu, sto cercando di realizzare uno script bash interattivo per la pulizia di Debian, pur immaginando che in rete ne siano già disponibili diversi (lo faccio anche a scopo didattico, per intenderci).

Posto qui quanto fatto sin'ora, se qualcuno si volesse aggiungere in questo esperimento/lavoro :-)

http://pastebin.com/NNvcDpTn

Appunti vari ed eventuali:
  • ho ignorato i vari apt-get update, apt-get upgrade e via dicendo (incluso il -f install) semplicemente perché da una parte nulla hanno a che vedere con la pulizia del sistema, dall'altra preferisco evitare di lanciare simili comandi senza poterne verificare manualmente l'output e senza poter operare una scelta precisa sulla base di questo (mentre questo script vorrebbe evitare quanto più output possibile, includendo quindi comandi che sono sicuri al 100%);
  • la riga

    Codice: Seleziona tutto

    	if [[ `COLUMNS=300 dpkg -l "*" | egrep "^rc" | cut -d\  -f3 | wc -l` = 0 ]]
    controlla, semplicemente, che ci siano pacchetti obsoleti o file di configurazione residui prima di lanciare il relativo comando per la loro cancellazione. È necessario, perché altrimenti, in loro assenza, il comando di cancellazione genera errore;
  • lo script può utilizzare strumenti (pacchetti) opzionali, come in questo caso accade per deborphan (vorrei aggiungere anche localepurge, ad esempio). Qui, ovviamente, bisognerebbe prima controllare che certi strumenti siano installati e disponibili nel sistema e (nell'eventualità) diversamente segnalarne l'assenza all'utente e magari anche consigliarne l'installazione. Non so come sia possibile integrare un simile controllo, probabilmente si può fare a partire dalla lettura dell'output di whereis;
  • sarebbe carino implementare, da qualche parte, un file di log, almeno per segnalare i file che lo script ha cancellato;
  • ho inserito la cancellazione della cache di Firefox/Iceweasel, ma vorrei estenderla anche agli altri browser e a vari file-spazzatura accumulati con la navigazione sul web (es., i cookie di flash);
  • ho notato che non pone distinzione (case sensitive) tra "s" minuscola e "S" maiuscola. Bisognerebbe implementare un OR oppure, se esiste, una funzione che trasforma in minuscolo l'input dell'utente;
  • si potrebbero raccogliere parti di codice in funzioni, anche per migliorarne la leggibilità.
EDIT:
manca un -y dove apt-get si appoggia a deborphan.
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Ho apportato qualche modifica:
http://pastebin.com/QC5n2SqL

In altri termini, ho sistemato l'opzione -y come sopra descritto, ho raggruppato un po' di codice e aggiunto la pulitura per Chrome, Empathy e Skype (che sono quelli che, in genere, utilizza il sottoscritto).
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Altre modifiche:
http://paste.debian.net/110531/

E precisamente:
1) ho colorato un po' l'output, a seconda dell'esito delle operazioni compiute (ma il controllo degli esiti va un po' migliorato, ad esempio quando va a rimuovere roba di firefox, chrome, empathy e skype dovrebbe prima controllare che le cartelle che contengono quei file esistono, e quindi che siano installati);
2) ho aggiunto localepurge;
3) ho aggiunto il controllo del software esterno (per ora deborphan e localepurge), che deve essere installato;
4) log del tutto, alla fine viene segnalato il nome del file di log creato. Le operazioni di logging sono molto, molto, troppo "spartane", cioè arrangiate così alla buona, visto che non ho una buona conoscenza (anzi...) della scrittura su file, o meglio del re-indirizzamento dell'output su file. Ad ogni modo, per ora funziona, il file creato è ridicolo ma le informazioni ci sono tutte, anche se è una cosa da rivedere.

Per ora il risultato è questo:
Immagine

Mentre invece un log "tipo" è questo:
http://pastebin.com/eFWTFbww

Per suggerimenti, critiche, offese, integrazioni... prego! :-)

p.s. ho trovato questo splendido manuale con cui sto lavorando
Avatar utente
Brunitika
wiki member
wiki member
Messaggi: 3004
Iscritto il: 06/12/2007, 13:13
Località: Losone
Contatta:

Re: Script pulizia del sistema

Messaggio da Brunitika »

Ammetto di avergli dato un'occhiata veloce e poco esaustiva. In ogni caso passo i primi commenti:

- bisognerebbe specificare che serve aver installato sudo e averlo configurato in modo da poter permettere alcune operazioni particolari all'utente in questione, in quanto "normalmente" in Debian non lo si utilizza.

- utilizzi sudo per delle funzioni che non lo necessiterebbero, come la ricerca di pacchetti e la loro rimozione all'interno della $HOME

- utilizzare deborphan alla "ceca" (ossia eliminare tutti i pacchetti che esso individua come orfani) mi sembra pericoloso: è un po' che non lo utilizzo più, ma ai tempi mi riconsoceva ad esempio le libc6 come orfane e non è che lo siano poi così tanto.

Come detto, commenti "a caldo" dopo breve lettura. Ogni commento è ben accetto ;).
[url=http://e-zine.debianizzati.org/][img]http://e-zine.debianizzati.org/banner.png[/img][/url]
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Invece le tue sono tutte osservazioni molto corrette, segno evidente che anche con un'occhiata veloce e poco esaustiva sei riuscito a cogliere correttamente i limiti del mio lavoro.

Provo a risponderti nel merito:
1) sì, forse è necessario integrare un controllo su sudo a inizio script. D'altronde è necessario, visto che lo script svolge sia compiti di root (e che richiedono appunto o l'account di root o sudo), sia compiti sui file nella home dell'utente (e che richiedono che sia l'utente a eseguire lo script);

2) per il resto (cioè per il fatto che ho utilizzato sudo indiscriminatamente ovunque), avevo pensato di cominciare così per scrivere più velocemente lo script e poi, solo alla file, correggere dove opportuno. Mi rendo però conto, riflettendoci ora per bene, che è un approccio incorretto il mio. Vado a correggere;

3) hai ragione. Però non mi va di toglierlo, perché comunque lo considero come uno strumento utile e come uno strumento di pulizia, quindi utile nel contesto dello script. Il fatto che sia pericoloso (e lo è, io lo utilizzo spesso) non mi sembra, al contrario, motivo per escluderlo. Io stesso lo uso ogni tanto "alla cieca", ben sapendo di essere capace di risolvere dei problemi che potrebbe causare, in questa eventualità.
Ovviamente ci si aspetta che ci utilizzi un simile script conosca certe funzioni e che si comporti di conseguenza (rispondo no a deborphan, o meglio rispondo no e poi lo lancio per fatti miei, così mi leggo per bene cosa vuole rimuovere). Aggiungerei invece un qualche warning, e lo stesso per localepurge (magari qualcuno usa più di una lingua, fa delle attività di traduzioni... o che so io).

Ti ringrazio.


Mi piacerebbe se qualcuno giudicasse il modo in cui ho organizzato le attività di logging delle operazioni, che secondo me sono fatte molto male.
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

C'è evidentemente un problema con Firefox. Ovvero dopo aver eseguito questo script, al successo riavvio appare un popup così titolato:
Si è verificato un errore nel caricare o nel salvare le informazioni di configurazione per firefox-bin. È possibile che alcune impostazioni della propria configurazione non funzionino correttamente.
E che riporta questa informazione (ripetuta più volte):
Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information. (Details - 1: Errore eseguendo il ping al server: IDL:omg.org/CORBA/COMM_FAILURE:1.0)
Attualmente non riesco a capire da cosa possa dipendere. Dal log del mio script, sembra tutto in ordine, cioè vengono rimossi solo e soltanto i file nella cartella Cache.
Ecco la parte del log relativa a Firefox (ma, ripeto, mi sembra tutto in ordine): http://pastebin.com/T41588qx

Ho anche provato con BleachBit, visto che anche questo può cancellare la cache e anche questo riporta il log: combaciano i file da rimuovere. Ma con BleachBit nessun problema.
Sto indagando.

Ad ogni modo, il problema si risolve da sé con login+logout.


EDIT:
forse ho trovato il problema. Cancellando Cache/* questo si verifica, cancellando Cache no. Non mi sembra un granché di comportamento da parte di Firefox, ma vabbè.

EDIT 2:
Brunitika, guarda un po' che succede:

Codice: Seleziona tutto

mirko@mirko:~$ which localepurge
mirko@mirko:~$ sudo which localepurge
/usr/sbin/localepurge
È un comportamento normale? Per ora, intanto, son costretto a ripristinare sudo almeno lì.
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Premetto che:
1) ho qualche difficoltà nel localizzare la cache di Midori e Epiphany. Se qualcuno dovesse sapere qualcosa... :-)
2) com'è ovvio, se ad esempio ho già il gestore dei pacchetti aperti o comunque un processo che ha a che vedere con dpkg, tutti i comandi riguardanti apg-get & co falliscono e nel log viene riportato l'ovvio errore:
E: Impossibile impostare il blocco /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
Come posso gestirlo? Vorrei evitare di mostrarlo così com'è nel mio script, che vorrei piuttosto interrompere a questo punto con un messaggio di errore in linea con il resto dell'output dello script.

Detto questo, sono arrivato qui:
http://paste.debian.net/110676/

1) a inizio script viene controllata la presenza di sudo, visto che è indispensabile per l'esecuzione dello script;
2) ho sistemato l'utilizzo generale di sudo, che è più razionale;
3) ho aggiunto localepurge;
4) per il software cosiddetto "esterno allo script" (per ora deborphan e localepurge) viene prima controllata la presenza dell'eseguibile. Visto che comunque sono passaggi opzionali, se assente c'è lo skip del passaggio;
5) per quanto riguarda la cancellazione di cartelle e file relative a programmi (tipo cache dei browser, log delle chat, ecc.) viene prima controllata che la cartella relativa sia esistente, anche per rendere più pulito e razionale l'output;
6) aggiunta cancellazione cache di chromium, opera, galeon e la cancellazione cache e log di pidgin, emesene, amsn e la cancellazione dei cookie e della cache di flash.
Ultima modifica di mirko.pagliai il 15/03/2011, 1:14, modificato 1 volta in totale.
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Altre modifiche:
http://paste.debian.net/110695/

In sostanza ho risolto il problema delle risposte case-sensitive ("s" e "S", per intenderci, vengono *ora* lette ugualmente, prima no) e, visto che c'ero, ho implementato delle risposte predefinite per le domande, che vengono scelte nel momento in cui non c'è risposta (pressione di invio e basta). Nelle domande le risposte predefinite sono segnate - come da prassi - in maiuscolo: ciò sta a significare, ad esempio, che "(s/N)" prevede "no" come risposta predefinita.

Il tutto è possibile prevedendo un simile if per le domande la cui risposta predefinita è sì (riconosce il "sì" se inserito "s", "S" o se premuto invio):

Codice: Seleziona tutto

if [[ $sure = "s" || $sure = "S" || $sure = "" ]]; then
e un simile if per le domande la cui risposta predefinita è no (riconosco il sì solo se inserito "s" o "S", quindi la pressione dell'invio vale come no):

Codice: Seleziona tutto

if [[ $sure = "s" || $sure = "S" ]]; then
p.s. segnalo ai mod affinché mi spostino la discussione nella sezione "Scripting", che a questo punto mi sembra molto più appropriata, visto che agli effetti sto sviluppando - rendendo partecipe il forum e nella speranza che qualcuno voglia aggregarsi - uno script :-)
mm-barabba

Re: Script pulizia del sistema

Messaggio da mm-barabba »

anche google-earth ha una sua cache piuttosto corposa ..........

Per Opera,Iceweasel e Firefox mi pare che l'opzioni rimuovi cache all'uscita funzioni bene

:o
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

mm-barabba ha scritto:anche google-earth ha una sua cache piuttosto corposa ..........
Vedrò di integrare anche questo!
mm-barabba ha scritto:Per Opera,Iceweasel e Firefox mi pare che l'opzioni rimuovi cache all'uscita funzioni bene

:o
Indubbiamente, ma io non uso opzioni, né sono interessato ad usarle, perché personalmente mi sembra che snaturino il concetto di cache. Preferisco la cancellazione una tantum :-) Che sì, è possibile anche questa tramite gli stessi browser, ma a questo punto se lo script può cancellare tutto assieme... :-)
Avatar utente
Brunitika
wiki member
wiki member
Messaggi: 3004
Iscritto il: 06/12/2007, 13:13
Località: Losone
Contatta:

Re: Script pulizia del sistema

Messaggio da Brunitika »

Mirko sei troppo veloce e non ce la faccio a seguirti ;) !

In ogni caso, riguardo a questo
mirko.pagliai ha scritto: Brunitika, guarda un po' che succede:

Codice: Seleziona tutto

mirko@mirko:~$ which localepurge
mirko@mirko:~$ sudo which localepurge
/usr/sbin/localepurge
È un comportamento normale? Per ora, intanto, son costretto a ripristinare sudo almeno lì.
sì, il comportamento è normale. Non è una questione di root, ma è una questione di path. Infatti se guardi la variabile d'ambiente PATH del tuo utente (è quella dove vengono considerate le locazioni degli eseguibili) sarà qualcosa di simile:

Codice: Seleziona tutto

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
mentre se guardi quella di root, sarà qualcos'altro:

Codice: Seleziona tutto

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
localepurge si trova appunto in /usr/sbin e come puoi vedere la PATH è definita solo per root. Puoi ovviare a questo problema ad esempio esportando le locazioni necessarie allo script nella PATH del tuo utente. In questo caso:

Codice: Seleziona tutto

$ export PATH=$PATH:/usr/sbin
$ which localepurge 
/usr/sbin/localepurge
e tutto funziona anche con il tuo utente :).

Ciao
[url=http://e-zine.debianizzati.org/][img]http://e-zine.debianizzati.org/banner.png[/img][/url]
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Ottima spiegazione. Conosco meccanismi e significati della path, ma ahimé non vi ero arrivato. Sistemerò lo script! ;-)
Avatar utente
Brunitika
wiki member
wiki member
Messaggi: 3004
Iscritto il: 06/12/2007, 13:13
Località: Losone
Contatta:

Re: Script pulizia del sistema

Messaggio da Brunitika »

Qualche altro appunto.
mirko.pagliai ha scritto: 2) com'è ovvio, se ad esempio ho già il gestore dei pacchetti aperti o comunque un processo che ha a che vedere con dpkg, tutti i comandi riguardanti apg-get & co falliscono e nel log viene riportato l'ovvio errore:
E: Impossibile impostare il blocco /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
Come posso gestirlo? Vorrei evitare di mostrarlo così com'è nel mio script, che vorrei piuttosto interrompere a questo punto con un messaggio di errore in linea con il resto dell'output dello script.
dal momento che un gestore dei pacchetti blocca il file /var/lib/dpkg/lock appunto, con fuser (man fuser) puoi vedere qual è il processo che occupa la risorsa; in questo caso non ci interessa il processo che lo impiega (o per lo meno, se non vogliamo far sfigheggiare lo script che ci indicherà anche il nome del "colpevole" ;D ), ma *se* esiste un processo che lo impiega. In questo caso possiamo bloccare lo script. Con fuser possiamo però fare ancora meglio: non solo vedere se c'è un processo legato a un file, ma possiamo addirittura poi killare il processo stesso per continuare con l'esecuzione dello script. Qui sotto un piccolo esempio per far capire come funzione fuser:

- fuser su /var/lib/dpkg/lock con nessun gestore dei pacchetti in funzione:

Codice: Seleziona tutto

# fuser /var/lib/dpkg/lock
#
- fuser su /var/lib/dpkg/lock con aptitude in funzione:

Codice: Seleziona tutto

# fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   8734
- fuser su /var/lib/dpkg/lock con l'opzione -v (verbose) e aptitude in funzione:

Codice: Seleziona tutto

# fuser -v /var/lib/dpkg/lock
                     USER        PID ACCESS COMMAND
/var/lib/dpkg/lock:  root       8734 F.... aptitude
qui si nota il nome della risorsa che è legata al processo che "occupa" il file. Con l'opzione -k potremo poi killare il processo stesso.
1) a inizio script viene controllata la presenza di sudo, visto che è indispensabile per l'esecuzione dello script;
l'ho già detto e lo ripeto: secondo me l'utilizzo di sudo è "scomodo" in questo caso. Personalmente farei due script: uno gestibile dall'utente e uno da lanciare da root per le operazioni in cui serve.
3) ho aggiunto localepurge;
localepurge "pulisce" i locale e i man di tutti i pacchetti quando lo si installa; poi ad ogni nuovo pacchetto installato agisce direttamente "al volo". Secondo me non ha senso nello script perché come detto, non avrebbe mai niente da fare.

Mi sembra di aver detto tutto. Resto sintonizzato ;).
[url=http://e-zine.debianizzati.org/][img]http://e-zine.debianizzati.org/banner.png[/img][/url]
mirko.pagliai
Hero Member
Hero Member
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Script pulizia del sistema

Messaggio da mirko.pagliai »

Brunitika ha scritto:dal momento che un gestore dei pacchetti blocca il file /var/lib/dpkg/lock appunto, con fuser (man fuser) puoi vedere qual è il processo che occupa la risorsa
Cavolacci! Tanto semplice, eppure non c'ero arrivato! :-(
Credo mi limiterò semplicemente a verificare se il file è bloccato, fornire ulteriori info non mi interessa (tanto l'utente dovrebbe saperlo), e credo che killare il processo che lo tiene occupato possa essere un'idea pericolosa.
Brunitika ha scritto:l'ho già detto e lo ripeto: secondo me l'utilizzo di sudo è "scomodo" in questo caso. Personalmente farei due script: uno gestibile dall'utente e uno da lanciare da root per le operazioni in cui serve.
E se invece controllassi l'utente che ha lanciato lo script e mi adeguassi di conseguenza?
Brunitika ha scritto:localepurge "pulisce" i locale e i man di tutti i pacchetti quando lo si installa; poi ad ogni nuovo pacchetto installato agisce direttamente "al volo". Secondo me non ha senso nello script perché come detto, non avrebbe mai niente da fare.
Giustissima osservazione.
Avatar utente
Brunitika
wiki member
wiki member
Messaggi: 3004
Iscritto il: 06/12/2007, 13:13
Località: Losone
Contatta:

Re: Script pulizia del sistema

Messaggio da Brunitika »

mirko.pagliai ha scritto:E se invece controllassi l'utente che ha lanciato lo script e mi adeguassi di conseguenza?
Perché no? Dopo la condizione user-non-è-root potresti mettere un testo del tipo "Come utente non amministratore hai diritto a xyz...". Con sudo potresti però avere un problema: dal momento che puoi "controllare" /etc/sudoers solo da root, non potresti sapere (senza root appunto) se un utente è in sudo e soprattutto che permessi ha relativi a quest'ultimo. La cosa sarebbe dunque molto più semplice utilizzando unicamente root o un utente qualsiasi (come descritto sopra).
[url=http://e-zine.debianizzati.org/][img]http://e-zine.debianizzati.org/banner.png[/img][/url]
Rispondi