aboutsummaryrefslogtreecommitdiffstats
path: root/minidinstall/misc.py
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/misc.py
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/misc.py')
-rw-r--r--minidinstall/misc.py59
1 files changed, 58 insertions, 1 deletions
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