#!/usr/bin/env python #-*- coding: iso8859-15 -*- # limpiar_distfiles 0.2 # Autor: Rafael Antonio Porras Samaniego # rafa (en) distrobit (punto) net # # Testeo y pruebas: Daniel Plaza # Cargar los paquetes necesarios try: import os,sys,bz2,getopt from bz2 import BZ2File except: print "Error al cargar los paquetes necesarios. No se pudo continuar." # Los colores sys.path = ["/usr/lib/portage/pym"]+sys.path try: import portage,output except: print "Error al cargar los paquetes necesarios. No se pudo continuar." # Constantes DIR = "/var/db/pkg" distfiles = "/usr/portage/distfiles" # Localiza los ficheros a proteger def ficheros_programa (dir): total = [] # Primero se buscan todos los ebuilds instalados for categoria in os.listdir(dir): ruta_categoria = dir + "/" + categoria if os.path.isdir(ruta_categoria): for programa in os.listdir(ruta_categoria): ruta_programa = ruta_categoria + "/" + programa if os.path.isdir(ruta_programa) and os.path.isfile(ruta_programa + "/environment.bz2"): ebz2 = BZ2File (ruta_programa + "/environment.bz2",'r') temp = ebz2.readline()[2:] if temp[0] == "'": for i in temp[1:-2].split(): total.append(i) else: total.append(temp[:-1]) return total # Muestra una lista por pantalla def muestra(lista): lista.sort() for i in lista: print i # Busca los ficheros que se van a borrar def lista_borrar (protegidos, ruta): a_borrar = [] for fichero in os.listdir(ruta): if fichero not in protegidos and not os.path.isdir(ruta + "/" + fichero): a_borrar.append(fichero) return a_borrar # Borra los ficheros que no estén en la lista en la ruta indicada def borrar (ruta,a_borrar): for i in a_borrar: try: os.remove (ruta + "/" + i) except: print "No se pudo eliminar: " + i continue print "Se ha eliminado: " + i # Comenzamos opts, args = getopt.getopt(sys.argv[1:], "f") borrado = False for o, a in opts: if o == "-f": borrado = True # Mensaje de bienvenida print "\n\t" + output.green ("limpiar_distfiles 0.2") print "\nDudas y errores a: rafa (en) distrobit (punto) net" print "\nEste script localiza ficheros en " + output.red(distfiles) + " que no son necesarios para ningún ebuild que esté instalado. Use este script bajo su propia responsabilidad. Espere mientras se localizan los ficheros que se borrarán..." # Localizamos los ficheros total = ficheros_programa(DIR) # Mostramos los ficheros a borrar a_borrar = lista_borrar (total, distfiles) if not a_borrar: print "\nNo hay archivos que eliminar." sys.exit(0) print "\nLos siguiente ficheros se eliminarán:\n" muestra(a_borrar) # Informar de como borrar if not borrado: print "\nSi desea borrar esos ficheros, ejecute este script con el parámetro: " + output.red("-f") + "." sys.exit(0) # Borrar los ficheros print "\nA continuación procederá a limpiarse el directorio " + output.red(distfiles) + " de ficheros obsoletos." + \ " Es decir, se eliminarán todos aquellos que estén en la lista previamente mostrada." res = raw_input(output.red("¿Desea continuar? (si / no) ")) if res == 's' or res == 'S' or res =='si' or res == 'Si': print "Borrando ficheros:" borrar(distfiles,a_borrar) else: print "No se ha borrado ningún fichero."