Better integrated into the Disk class and runs when a Disk object is created
Cole Robinson wrote:
Joey Boggs wrote:
Cole Robinson wrote:
Joey Boggs wrote:
This adds a new function to the virtinst.ImageParser.Disk class to
verify disk signatures and runs by default when using virt-image.
The next patch will wrap up loose ends in the ImageParser.Disk class
to weed out unsupported checksum types. For now, if the checksum
type is not matched it skips the check process.
diff -r db5d9aeca590 virt-image
--- a/virt-image Fri Oct 10 10:32:50 2008 -0400
+++ b/virt-image Tue Oct 14 22:25:21 2008 -0400
@@ -197,6 +197,8 @@
get_graphics(image.domain, options.vnc, options.vncport,
options.nographics, options.sdl, options.keymap,
guest)
+ checksum = virtinst.ImageParser.Disk
+ checksum.check_disk_signature(image)
I don't really like this interface of having a method
of the Disk class that receives an Image object and
pulls disks from that. Doesn't really fit the whole
class dichotomy.
The way to do it is to have the Disk method calculate
the checksum for that particular disk. Then you can
add a convenience method to the Image class that will
calculate the checksums for every Disk object associated
with that Image.
Made all the corrections. I understand calculating for just one disk,
which will be more reusable for other code than just this case, but
why create separate method to check all the disks as well?
It's certainly not required, it would just be a convenience
function. I'm not attached to the idea if you want to skip
it.
Not sure if you intended to or not, but the patch wasn't
attached to this email.
Thanks,
Cole
diff -r db5d9aeca590 virtinst/ImageParser.py
--- a/virtinst/ImageParser.py Fri Oct 10 10:32:50 2008 -0400
+++ b/virtinst/ImageParser.py Thu Oct 16 09:41:22 2008 -0400
@@ -23,6 +23,8 @@
import libxml2
import CapabilitiesParser
from virtinst import _virtinst as _
+import logging
+import urlgrabber.progress as progress
class ParserException(Exception):
def __init__(self, msg):
@@ -207,6 +209,7 @@
self.csum = {}
if not node is None:
self.parseXML(node)
+ self.check_disk_signature()
def parseXML(self, node):
self.file = xpathString(node, "@file")
@@ -224,6 +227,47 @@
_("The format for disk %s must be one of %s") %
(self.file, ",".join(formats)))
+ def check_disk_signature(self):
+ try:
+ import hashlib
+ has_hashlib = True
+ except:
+ import sha
+ has_hashlib = False
+
+ meter_ct = 0
+ m = None
+ disk_size = os.path.getsize(self.file)
+ meter = progress.TextMeter()
+ meter.start(size=disk_size, text=_("Checking disk signature for %s" % self.file))
+
+ if has_hashlib is True:
+ if self.csum.has_key("sha256"):
+ csumvalue = self.csum["sha256"]
+ m = hashlib.sha256()
+ elif self.csum.has_key("sha1"):
+ csumvalue = self.csum["sha1"]
+ m = hashlib.sha1()
+ else:
+ if self.csum.has_key("sha1"):
+ csumvalue = self.csum["sha1"]
+ m = sha.new()
+ if not m:
+ return
+ f = open(self.file,"r")
+ while 1:
+ chunk = f.read(65536)
+ if not chunk:
+ break
+ meter.update(meter_ct)
+ meter_ct = meter_ct + 65536
+ m.update(chunk)
+ checksum = m.hexdigest()
+ if checksum != csumvalue:
+ logging.debug(_("Disk signature for %s does not match Expected: %s Received: %s"
+ % (self.file,csumvalue,checksum)))
+ raise ValueError (_("Disk signature for %s does not match" % self.file))
+
def validate(cond, msg):
if not cond:
raise ParserException(msg)
_______________________________________________
et-mgmt-tools mailing list
et-mgmt-tools@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/et-mgmt-tools