From 32151d49d0ec5f9f4f392a15b0de177a1d87e3e5 Mon Sep 17 00:00:00 2001 From: Christoph Goehre Date: Sat, 2 Feb 2008 21:41:12 +0100 Subject: merge hash generation for Release files _get_file_sum() in mini-dinstall and _get_file_md5sum() in ChangeFile.py are really the same code. So I strip it together into get_file_sum() in misc.py. --- minidinstall/ChangeFile.py | 37 +++-------------------------- minidinstall/misc.py | 59 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 35 deletions(-) (limited to 'minidinstall') diff --git a/minidinstall/ChangeFile.py b/minidinstall/ChangeFile.py index b74e623..969ae09 100644 --- a/minidinstall/ChangeFile.py +++ b/minidinstall/ChangeFile.py @@ -18,10 +18,11 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import os, re, sys, string, stat, popen2 +import os, re, sys, string, stat import threading, Queue import logging from minidinstall import DpkgControl, SignedFile +from minidinstall import misc class ChangeFileException(Exception): def __init__(self, value): @@ -70,40 +71,8 @@ class ChangeFile(DpkgControl.DpkgParagraph): raise ChangeFileException("Can't stat %s: %s" % (filename,e.strerror)) if size != expected_size: raise ChangeFileException("File size for %s does not match that specified in .dsc" % (filename,)) - if (self._get_file_md5sum(filename) != expected_md5sum): + if (misc.get_file_sum(self, 'md5', filename) != expected_md5sum): raise ChangeFileException("md5sum for %s does not match that specified in .dsc" % (filename,)) self._logger.debug('Verified md5sum %s and size %s for %s' % (expected_md5sum, expected_size, filename)) - def _get_file_md5sum(self, filename): - if os.access('/usr/bin/md5sum', os.X_OK): - cmd = '/usr/bin/md5sum %s' % (filename,) - self._logger.debug("Running: %s" % (cmd,)) - child = popen2.Popen3(cmd, 1) - child.tochild.close() - erroutput = child.childerr.read() - child.childerr.close() - if erroutput != '': - child.fromchild.close() - raise ChangeFileException("md5sum returned error output \"%s\"" % (erroutput,)) - (md5sum, filename) = string.split(child.fromchild.read(), None, 1) - child.fromchild.close() - status = child.wait() - if not (status is None or (os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0)): - if os.WIFEXITED(status): - msg = "md5sum exited with error code %d" % (os.WEXITSTATUS(status),) - elif os.WIFSTOPPED(status): - msg = "md5sum stopped unexpectedly with signal %d" % (os.WSTOPSIG(status),) - elif os.WIFSIGNALED(status): - msg = "md5sum died with signal %d" % (os.WTERMSIG(status),) - raise ChangeFileException(msg) - return md5sum.strip() - import md5 - f = open(filename) - md5sum = md5.new() - buf = f.read(8192) - while buf != '': - md5sum.update(buf) - buf = f.read(8192) - return md5sum.hexdigest() - # vim:ts=4:sw=4:et: diff --git a/minidinstall/misc.py b/minidinstall/misc.py index e88f5a9..a3c9489 100644 --- a/minidinstall/misc.py +++ b/minidinstall/misc.py @@ -18,7 +18,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import os, errno, time, string, re +import os, errno, time, string, re, popen2 def dup2(fd,fd2): # dup2 with EBUSY retries (cf. dup2(2) and Debian bug #265513) @@ -45,3 +45,60 @@ def format_changes(L): L1.append(dotmatch.sub('', x)) return "\n".join(L1) + +def get_file_sum(self, type, filename): + """ generate hash sums for file """ + ret = _get_external_file_sum(self, type, filename) + if not ret: + ret = _get_internal_file_sum(type, filename) + return ret + +def _get_internal_file_sum(type, filename): + """ generate hash sums for file with python modules """ + if type == 'md5': + import md5 + sum = md5.new() + elif type == 'sha1': + import sha + sum = sha.new() + elif type == 'sha256': + from Crypto.Hash import SHA256 + sum = SHA256.new() + f = open(filename) + buf = f.read(8192) + while buf != '': + sum.update(buf) + buf = f.read(8192) + return sum.hexdigest() + +def _get_external_file_sum(self, type, filename): + """ generate hash sums for file with external programs """ + ret = None + if os.access('/usr/bin/%ssum' % (type,), os.X_OK): + cmd = '/usr/bin/%ssum %s' % (type, filename,) + self._logger.debug("Running: %s" % (cmd,)) + child = popen2.Popen3(cmd, 1) + child.tochild.close() + erroutput = child.childerr.read() + child.childerr.close() + if erroutput != '': + child.fromchild.close() + raise DinstallException("%ssum returned error output \"%s\"" % (type, erroutput,)) + (sum, filename) = string.split(child.fromchild.read(), None, 1) + child.fromchild.close() + try: + status = child.wait() + except OSError, (errnum, err): + if errnum == 10: + logger.warn("Ignoring missing child proccess") + status = 0 + if not (status is None or (os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0)): + if os.WIFEXITED(status): + msg = "%ssum exited with error code %d" % (type, os.WEXITSTATUS(status),) + elif os.WIFSTOPPED(status): + msg = "%ssum stopped unexpectedly with signal %d" % (type, os.WSTOPSIG(status),) + elif os.WIFSIGNALED(status): + msg = "%ssum died with signal %d" % (type, os.WTERMSIG(status),) + raise DinstallException(msg) + ret = sum.strip() + return ret -- cgit v1.2.3