aboutsummaryrefslogtreecommitdiffstats
path: root/minidinstall
diff options
context:
space:
mode:
authorLibravatarChristoph Goehre <christoph.goehre@gmx.de>2008-02-02 21:41:12 +0100
committerLibravatarChristoph Goehre <christoph.goehre@gmx.de>2008-02-02 21:41:12 +0100
commit32151d49d0ec5f9f4f392a15b0de177a1d87e3e5 (patch)
tree9f220d70b06468253d624a5471f508a129903446 /minidinstall
parent35fb5e0bdaec1df5ded6b3da8ac48c2160657eaf (diff)
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.
Diffstat (limited to 'minidinstall')
-rw-r--r--minidinstall/ChangeFile.py37
-rw-r--r--minidinstall/misc.py59
2 files changed, 61 insertions, 35 deletions
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