#!/usr/bin/env python# -*- coding: utf-8 -*-# Version 0.2 2009.01.25# Copyright (c) 2009, Taoufik El Aoumari# Released under the GPL license http://www.gnu.org/licenses/gpl-3.0.txt""" ESTE PROGRAMA HA SIDO _REEDITADO POR -- NEKMO.COM -- email: contacto@nekmo.com La licencia de este programa es: - GPL 3.0 - Versión del programa: # 09/07/2010 (0.3) Feature añadida a programa original: - Dar CRC32 a archivos - Pythonización - Corrección bug size == 0 - Uso de logs - Uso de argumentos en consola """# Módulos requeridosimport sys, re, zlib, os# Parseador de entrada de consola (retrocompatibilidad)try: import argparse parser2use = 'argparse'except ImportError: from optparse import OptionParser parser2use = 'optparse'# Módulo para generar logsimport logging#Coloresc_null = "\x1b[00;00m"c_red = "\x1b[31;01m"c_green = "\x1b[32;01m"p_reset = "\x08"*8# modelo de nuevos archivosbase = '%s[%s]'def crc32_checksum(filename): """Generador del CRC del archivo filename: string Ruta al archivo""" # Variables para comprobación crc = 0 file = open(filename, "rb") buff_size = 65536 size = os.path.getsize(filename) done = 0 if not size: # El archivo no tiene tamaño, salir logging.error('El archivo %s no tiene datos' % filename) return try: while True: # Mientras haya datos... data = file.read(buff_size) done += buff_size # informar de situación actual de conteo sys.stdout.write("%7d"%(done*100/size) + "%" + p_reset) if not data: # Ya no hay más datos, salir break crc = zlib.crc32(data, crc) except KeyboardInterrupt: # Detectada excepción de interrupción por teclado sys.stdout.write(p_reset) # !!!Cerrar el archivo file.close() sys.exit(1) sys.stdout.write("") # !!!Cerrar el archivo file.close() # Cálculo if crc < 0: crc &= 2**32-1 return "%.8X" %(crc)def check(files): """Comprobador del CRC del archivo files: tuple or list listado de nombres de archivos""" for file in files: try: # Generar CRC32 crc = crc32_checksum(file) if not crc: return # Encontrar CRC32 en el nombre de archivo dest_sum = re.split("([a-fA-F0-9]{8})", file)[-2] # CRC32 del nombre de archivo == CRC32 generado if crc == dest_sum.upper(): c_in = c_green else: c_in = c_red sfile = file.split(dest_sum) logging.info("%s%s%s %s%s%s%s%s" % (c_in,crc, c_null, sfile[0], c_in, dest_sum, c_null, sfile[1])) except(IndexError, ValueError): logging.error(crc + " " + file) except IOError, e: logging.error(e) continuedef putcrc32(files): """Generador del CRC del archivo files: tuple or list listado de nombres de archivos""" for file in files: try: # Generar CRC32 crc = crc32_checksum(file) if not crc: return # Si hay un punto... (extensión) if '.' in file: # hay un punto (por tanto extensión) file_split = file.split('.') ext = '.' + file_split[-1] new_file = base % ('.'.join(file_split[0:-1]), crc) else: # no hay extensión ext = '' new_file = base % (file, crc) # Informar del cambio de nombre de archivo logging.info('%s -> %s' % (file, new_file + ext)) # Renombrar archivo os.rename(file, new_file + ext) except(IndexError, ValueError): print(crc+" "+file) except IOError, e: print(e) continueif __name__ == '__main__': # Configuración de los logs logging.basicConfig(level=20, format='%(levelname)-8s %(message)s') # Retrocompatibilidad de sistema de argumentos de entrada en consola if parser2use == 'argparse': # Description parser = argparse.ArgumentParser(description= 'Generador y comprobador de CRC32\'s') # putcrc32 parser.add_argument('-p', '--putcrc32', dest='putcrc32', nargs='+', help='Generar CRC32\'s de archivos y cambiar los nombres con ellos.') # check parser.add_argument('-c', dest='check', nargs='+', help='Comprobar el CRC32 de los archivos.') args = parser.parse_args() files = args.putcrc32 elif parser2use == 'optparse': # Object parser = OptionParser() # putcrc32 parser.add_option('-p', '--putcrc32', action='store_true', dest='putcrc32', help='Generar CRC32\'s de archivos y cambiar los nombres con ellos.') # check parser.add_option('-c', '--check', action='store_true', dest='check', help='Comprobar el CRC32 de los archivos.') args, files = parser.parse_args() files = files if args.putcrc32: # Generar CRC32 de los archivos putcrc32(files) else: # Comprobar los CRC32 de los archivos check(sys.argv[2:])