From f67196e626cde2c2bc55aa33038ff12a87b2502d Mon Sep 17 00:00:00 2001 From: Per Cederqvist <ceder@lysator.liu.se> Date: Sun, 8 Feb 2004 21:58:56 +0000 Subject: [PATCH] New file. --- verify-disk.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100755 verify-disk.py diff --git a/verify-disk.py b/verify-disk.py new file mode 100755 index 0000000..61dbe43 --- /dev/null +++ b/verify-disk.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# Verify the existing files in the filesystems. + +import os +import sys +import md5 +import sha +import time +import errno + +import MySQLdb + +class file_hash: + def __init__(self, filename): + fp = file(filename, "rb") + + md = md5.new() + sh = sha.new() + + while 1: + chunk = fp.read() + if chunk == "": + break + md.update(chunk) + sh.update(chunk) + + fp.close() + + self.md5 = md.hexdigest() + self.sha1 = sh.hexdigest() + +def verify(DBH, dir_id): + cursor = DBH.cursor() + update = DBH.cursor() + + cursor.execute("SELECT COUNT(*) FROM file WHERE dir_id = %d" % (dir_id,) ) + total = cursor.fetchone()[0] + done = 0 + bad = [] + + cursor.execute("SELECT dir_name FROM base" + " WHERE dir_id = %d" % (dir_id, )) + dir_name = cursor.fetchone()[0] + + cursor.execute("SELECT file_id, filename, size, unix_timestamp(mtime)," + " md5sum, sha1sum" + " FROM file" + " WHERE file.dir_id = %d" + " ORDER BY verified" % (dir_id,)) + while 1: + res = cursor.fetchmany() + if len(res) == 0: + break + for [file_id, filename, size, mtime, md5sum, sha1sum] in res: + fn = os.path.join(dir_name, filename) + try: + st = os.stat(fn) + except OSError, e: + if e.errno == errno.ENOENT: + print "Nu such file:", fn + bad.append((file_id, fn)) + continue + raise + if st.st_size != size: + print "Wrong size:", fn + bad.append((file_id, fn)) + continue + h = file_hash(fn) + if h.md5 != md5sum or h.sha1 != sha1sum: + print "Checksum error:", fn + bad.append((file_id, fn)) + continue + if st.st_mtime != mtime: + print "Wrong mtime:", fn + # print mtime - st.st_mtime, st.st_mtime, mtime, fn + # The next line restores the mtime of the file from + # the database. + # os.utime(fn, (time.time(), mtime)) + bad.append((file_id, fn)) + continue + update.execute("UPDATE file SET verified = NOW()" + " WHERE file_id = %s", (file_id)) + done += 1 + print "\r%s: Checked %s/%s (%s bad)" % (dir_id, done, total, + len(bad)), + sys.stdout.flush() + + print + cursor.close() + return bad + +def scan_all(DBH): + outer = DBH.cursor() + outer.execute("SELECT dir_id, first_scanned FROM base" + " WHERE active = 1") + for [dir_id, first_scanned] in outer.fetchall(): + verify(DBH, dir_id) + outer.close() + + +def main(): + DBH = MySQLdb.connect(db='isoonline', user='ceder') + scan_all(DBH) + +if __name__ == '__main__': + main() -- GitLab