disinstallare tutti i pacchetti di un repository

Ottimizzazione, pulizia, gestione e manutenzione di una Debian Box

disinstallare tutti i pacchetti di un repository

Messaggioda The_Noise » 18/04/2005, 9:09

Salve ragazzi!

Capita a volte di inserire un repository per provare del software specifico. Ma se poi si vogliono disinstallare in blocco tutti i pacchetti di un particolare repository?

Vediamo se qualcuno ha una bella soluzione a portata di apt-... ehm mano.

Altrimenti sarò costretto a buttare giù uno script :-P

La parola a voi,
- The_Noise
Avatar utente
The_Noise
Administrator
Administrator
 
Messaggi: 884
Iscritto il: 29/03/2005, 8:00

Re: disinstallare tutti i pacchetti di un repository

Messaggioda MaXeR » 18/04/2005, 18:18

in /var/lib/apt/list/ sembrerebbero esserci le liste dei pacchetti presenti in ogni mirror..

con questo semplice comando, riesci ad ottenere la lista dei pacchetti presenti in quel mirror..

Codice: Seleziona tutto
cat FILE | egrep "^Package" | cut -d\  -f 2


Dove, ovviamente, a FILE va sostituito il nome del file contenente i dati (normalmente finisce con la parola 'Packages', e contiene anceh la parolina magina 'binary' :-D )!

fammi sapere se fa al caso tuo ed, eventualmente, come lo utilizzi :-D

ciauuu
http://leevee.it - Leevee Soluzioni Informatiche
Avatar utente
MaXeR
Administrator
Administrator
 
Messaggi: 3576
Iscritto il: 22/12/2004, 17:01
Località: Garda - VR

Re: disinstallare tutti i pacchetti di un repository

Messaggioda The_Noise » 18/04/2005, 23:00

Grazie MaXer!

Non sapevo che in /var/lib/dpkg vi fossero le liste dei pacchetti, sicuramente è utile.

Pensavo di ottenere la lista dei pacchetti installati con

dpkg --get-selection

e poi togliere dalla lista i pacchetti che sono elencati nella lista del repository incriminato. Dato che questa "sottrazione" sarebbe banale in python grazie alle operazioni sugli insiemi stavo pensando di cogliere l'occasione per fare il mio primo script in python. Oltretutto non mi sovvengono ora come ora altri metodi abbastanza immediati (cioè senza un ciclo che confronta ogni pacchetto installato con la lista del repository incriminato). Questo perchè nelle liste in cui sono descritti i pacchetti non è presente l'informazione sui repository.

Ci sono altri problemi un pò subdoli. Alcuni pacchetti del repository da rimuovere potrebbero aver sostituito dei pacchetti core del sistema, e se si cerca di disinstallarli apt cerca di rimuovere magari mezzo sistema. Quindi su ogni pacchetto da rimuovere si dovrebbe stare attenti e se il caso sostituirlo con l'analogo di un altro repository.

E col python si preserva facilmente questa l'espandibilità, insomma m'è venuto il pallino :-P

Domani provo e ti dico...

Ciao!
Avatar utente
The_Noise
Administrator
Administrator
 
Messaggi: 884
Iscritto il: 29/03/2005, 8:00

Re: disinstallare tutti i pacchetti di un repository

Messaggioda MaXeR » 18/04/2005, 23:29

ok!
io sono un 'bashista' (bleh, come suona male), e come avrai capito faccio tutto in bash :s6:

Riguardo il capire se un pacchetto è già installato o no, ci sono molti metodi:

1) dpkg -l
che ti genererebbe una lista di tutti i pacchetti installati (resta il fatto che la lista è lunga)

2) /var/lib/dpkg/available (nome inserito a memoria) e confrontare con il resto..

3) controllare con gli altri file contenuti insieme a quello in esame (e qui mi viene paura :-D )

cmq, fammi sapere =)
http://leevee.it - Leevee Soluzioni Informatiche
Avatar utente
MaXeR
Administrator
Administrator
 
Messaggi: 3576
Iscritto il: 22/12/2004, 17:01
Località: Garda - VR

Re: disinstallare tutti i pacchetti di un repository

Messaggioda The_Noise » 19/04/2005, 16:28

Eh eh, anch'io sono un bashettaro e egrepparo, ma in quanto amatore di espressioni regolari ho imparato ad apprezzare il perl.

Tornando ai pacchetti, il problema era fare l'intersezione tra due liste di pacchetti:

- pachetti installati: la ottengo da /var/lib/dpkg/available dandogli una passata di grep

- pacchetti del repository incriminato: da /var/lib/apt/list/

quindi le strutture dati del python fanno comodo,anche se ora penso che forse in perl era meglio.

Comunque, ora come ora ho lo script che mi da solo la lista dei pachetti da disinstallare, senza dirmi se devo sostituire qualche pacchetto con un altra versione per evitare di disinstallare pacchetti di altri repository.

Vedrò se trovo il tempo di migliorarlo.

Ciao,
- The_Noise
Avatar utente
The_Noise
Administrator
Administrator
 
Messaggi: 884
Iscritto il: 29/03/2005, 8:00

Re: disinstallare tutti i pacchetti di un repository

Messaggioda The_Noise » 19/04/2005, 17:13

Se può interessare, posto lo script. Adesso segnala anche se dei pacchetti potrebbero (_potrebbero_) creare problemi con la disinstallazione. E' abbastanza grezzo ma facilmente espandibile.

Eccolo:
Codice: Seleziona tutto
#!/usr/bin/python

import os

# Repository da eliminare
to_remove = '/var/lib/apt/lists/linuxrepos.info__sarge-mono_binary_Packages'

# Repository di debian, quello da quale non si volgliono rimuovere pacchetti
debian = '/var/lib/apt/lists/ftp.it.debian.org_debian_dists_testing_main_binary-i386_Packages'

available = '/var/lib/dpkg/available'
installed = '/var/lib/dpkg/status'

class pkg:
    def __init__(self, name, version):
   self.name = name
   self.version = version

    def __str__(self):
   return self.name +'-'+ self.version

    def __eq__(self, pkg2):
   return self.name == pkg2.name and self.version == pkg2.version
   
    def __ne__(self, pkg2):
   return self.name != pkg2.name or self.version != pkg2.version

def generate_list (file_name):
# Legge la lista dei pacchetti e la inserisce in una lista di dizionari
# un dizionario per ogni pacchetto
    pkg_list = []
    new = True
    for line in open(file_name):
   if new:
       pkg_list.append( pkg(line.replace('Package:','').strip(), '') )
       new = False
       continue
   
   pkg_list[-1].version = line.replace('Version:','').strip()
   new = True
    return pkg_list

# Sfoltisco i file di partenza con egrep
os.system('egrep "^Package|^Version|^Status" '+ installed +\
   ' |grep -1 "install ok"| egrep "^Package|^Version" > installed')
os.system('egrep "^Package|^Version" '+ to_remove +' > to_remove')
os.system('egrep "^Package|^Version" '+ debian +' > debian')

# Carico in memoria le liste dei pacchetti
pkg_installed = generate_list ('installed')
pkg_to_remove = generate_list ('to_remove')
pkg_debian = generate_list ('debian')

# Creo la lista di pacchetti da rimuovere
l = []
for p in pkg_installed:
    if p in pkg_to_remove: l.append(p)

# Stampo la lista
print '\n  Pacchetti da eliminare:'
for p in l: print p.name

# Controllo che nessun pacchetto da eliminare stia anche nel main di debian
print '\n  I seguenti pacchetti potrebbero creare problemi:'

for p in l:
    # Controllo solo nomi e non le versioni
    if p.name in [ x.name for x in pkg_debian ]: print p
     


Ciao,
- The_Noise
Avatar utente
The_Noise
Administrator
Administrator
 
Messaggi: 884
Iscritto il: 29/03/2005, 8:00


Torna a Tuning

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti