Eh, I forgot the attachment.
#!/usr/bin/env python

import md5
from glob import glob
from optparse import OptionParser
from os import chdir, path, rename, remove
from sys import argv

def check(checksums):
    checksums = open(checksums, 'r')
    chgfiles = {}
    msngfiles = []
    for fline in checksums.readlines():
        line = fline.split(' *')
        orig = line[0].upper()
        try:
            file_ = open(line[1].strip(),'rb')
            chunk = 8196
            sum_ = md5.new()
            while(1):
                chunkdata = file_.read(chunk)
                if not chunkdata:
                    break
                sum_.update(chunkdata)
            new = sum_.hexdigest().upper()
            file_.close()
            if  new == orig:
                print '.',
            else:
                chgfiles[line[1]] = (orig, new)
        except IOError:
            msngfiles.append(line[1])
    checksums.close()
    chgfileskeys = chgfiles.keys()
    chgfileskeys.sort()
    msngfiles.sort()
    print '\n'
    if len(chgfiles) != 0:
        print 'Files changed:'
        for key in chgfileskeys:
            print key.strip('\n'), 'changed from:\n\t', chgfiles[key][0], \
              'to\n\t', chgfiles[key][1]
        print '\n\t', len(chgfiles), 'file(s) changed.\n'
    if len(msngfiles) != 0:
        print 'Files not found:'
        for x in range(len(msngfiles)):
            print '\t', msngfiles[x]
        print '\n\t', len(msngfiles), 'file(s) not found.\n'
    print "\n\tChecksums Verified\n"

def rename_md5(newdirname, checksums):
    dict_ = md5format(checksums)

    # David <[EMAIL PROTECTED]>:
    # What's going on here? Looks like you assume there are always
    # 4 files (001string 1, 0001string 2, etc), which you rename to
    # string1, string2, etc. This logic is unsafe because (1) those files
    # might not exist, and (2) if some files exist but not others then you
    # rename them from eg: 0001string 2 (if 0001string 1 does not exist) to
    # sting1. I don't know if this is ententional.

    dirlist = glob('./00[1-4]string [1-4]')
    dirlist.sort()
    for x in range(4):
        rename(dirlist[x], newdirname[x])
        print '\t', dirlist[x], 'renamed to:', newdirname[x]
        chdir('./%s' % newdirname[x])
        for oldfilename in glob('*.mp3'):
            newfilename = oldfilename[3:]
            rename(oldfilename, newfilename)
            print '\t\t', oldfilename, 'renamed to:', newfilename
        dict_ = md5fname_edit(dict_, dirlist[x], newdirname[x])
        chdir('..')
    md5write(dict_, checksums)
    replace('Webpage.htm', dirlist, newdirname)
    print '\n\tDirectories and Files renamed.'

def md5format(checksums):
    dict_ = {}
    checksums = open(checksums, 'r')
    for line in checksums.readlines():
        splitline = line.split(' *')
        dict_[splitline[1]] = (splitline[0], splitline[1].split('\\'))
    checksums.close()
    return dict_

def md5fname_edit(dict_, olddir, newdir):
    for x in dict_.keys():
        if dict_[x][1][0] == olddir[2:]:
            dict_[x] = (dict_[x][0], [newdir, dict_[x][1][1]])
            if dict_[x][1][1][0] == '0':
                dict_[x] = (dict_[x][0], [dict_[x][1][0], dict_[x][1][1][3:]])
    return dict_

def md5write(dict_, checksums):
    keys = dict_.keys()
    keys.sort()
    checksums = open(checksums, 'w')
    for x in keys:
        try:
            checksums.writelines('%s *%s/%s' % (dict_[x][0], dict_[x][1][0],
                                                dict_[x][1][1]))
        except IndexError:
            checksums.writelines('%s *%s' % (dict_[x][0], dict_[x][1][0]))

def replace(file_, oldlist, newlist):
    new = open(file_, 'r').read()
    for x in range(4):
        new = new.replace(oldlist[x][2:], newlist[x], 1)
    remove(file_)
    file_ = open(file_, 'w', len(new))
    file_.write(new)

def main():
    fullpath = path.abspath(path.dirname(argv[0]))

    # David <[EMAIL PROTECTED]>:
    # This is broken: what path are you trying to change to here?
    # - Assuming for the moment that you want to change to the same dir as
    #   the script.
    # TODO: Fix this.
    #chdir(fullpath[:-10])
    chdir(fullpath)
    checksums = path.join(fullpath, 'checksums.md5')
    newdirname = ('string1', 'string2', 'string3', 'string4')
    usage = "%prog [options]"
    parser = OptionParser(usage)
    parser.add_option('-c', '--check', action='store_true', dest='check',
                      help='verify checksums')
    parser.add_option('-r', '--rename', action='store_true', dest='rename',
                      help='rename files to a more usable form (write rights '
                           'needed)')

    (options, args) = parser.parse_args()

    # Generate an empty checksums file if one doesn't already exist. Otherwise
    # the logic has problems later:
    if not path.isfile(checksums):
        f = open(checksums, 'w')
        f.close()

    did_something = False # Set to true if some logic ran
    if options.check:
        check(checksums)
        chdir(fullpath)
        did_something = True

    if options.rename:
        chdir('..')
        rename_md5(newdirname, checksums)
        did_something = True

    if not did_something:
        parser.print_help()

if __name__ == '__main__':
    main()
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to