示例#1
0
 def open(self):
   # file obj?
   if self.fobj is not None:
     self.fh = self.fobj
     # get size via seek
     self.fobj.seek(0,2) # end of file
     self.size = self.fobj.tell()
     self.fobj.seek(0,0) # return to begin
     self.num_blocks = self.size / self.block_bytes
   # file name given
   else:
     # is readable?
     if not os.access(self.file_name, os.R_OK):
       raise IOError("Can't read from image file")
     # is writeable?
     if not os.access(self.file_name, os.W_OK):
       self.read_only = True
     # is it a block/char device?
     st = os.stat(self.file_name)
     mode = st.st_mode
     if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
       self.size = BlkDevTools.getblkdevsize(self.file_name)
     else:
       # get size and make sure its not empty
       self.size = os.path.getsize(self.file_name)
     if self.size == 0:
       raise IOError("Empty image file detected!")
     self.num_blocks = self.size / self.block_bytes
     # open raw file
     if self.read_only:
       flags = "rb"
     else:
       flags = "r+b"
     self.fh = io.open(self.file_name, flags)
示例#2
0
 def open(self):
     # file obj?
     if self.fobj:
         # get size via seek
         self.fobj.seek(0, 2)  # end of file
         self.size = self.fobj.tell()
         self.fobj.seek(0, 0)  # return to begin
         self.num_blocks = self.size // self.block_bytes
     # file name given
     else:
         # is readable?
         if not os.access(self.file_name, os.R_OK):
             raise IOError("Can't read from image file")
         # is writeable?
         if not os.access(self.file_name, os.W_OK):
             self.read_only = True
         # is it a block/char device?
         st = os.stat(self.file_name)
         mode = st.st_mode
         if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
             self.size = BlkDevTools.getblkdevsize(self.file_name)
         else:
             # get size and make sure its not empty
             self.size = os.path.getsize(self.file_name)
         if self.size == 0:
             raise IOError("Empty image file detected!")
         self.num_blocks = self.size // self.block_bytes
         # open raw file
         if self.read_only:
             flags = "rb"
         else:
             flags = "r+b"
         self.fobj = open(self.file_name, flags)
 def open(self, img_file, read_only=False, options=None, fobj=None):
   """open an existing image file"""
   # file base check
   if fobj is None:
     # make sure image file exists
     if not os.path.exists(img_file):
       raise IOError("image file not found")
     # is readable?
     if not os.access(img_file, os.R_OK):
       raise IOError("can't read from image file")
     # is writeable? -> no: enforce read_only
     if not os.access(img_file, os.W_OK):
       read_only = True
     # check size
     st = os.stat(img_file)
     mode = st.st_mode
     if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
       size = BlkDevTools.getblkdevsize(img_file)
     else:
       size = os.path.getsize(img_file)
     if size == 0:
       raise IOError("image file is empty")
   # fobj
   else:
     fobj.seek(0,2)
     size = fobj.tell()
     fobj.seek(0,0)
   # detect type
   t = self.detect_type(img_file, fobj, options)
   if t == None:
     raise IOError("can't detect type of image file")
   # create blkdev
   if t == self.TYPE_ADF:
     blkdev = ADFBlockDevice(img_file, read_only, fobj=fobj)
     blkdev.open()
   elif t == self.TYPE_HDF:
     # detect geometry
     geo = DiskGeometry()
     if not geo.detect(size, options):
       raise IOError("can't detect geometry of HDF image file")
     blkdev = HDFBlockDevice(img_file, read_only, fobj=fobj)
     blkdev.open(geo)
   else:
     rawdev = RawBlockDevice(img_file, read_only, fobj=fobj)
     rawdev.open()
     # create rdisk instance
     rdisk = RDisk(rawdev)
     if not rdisk.open():
       raise IOError("can't open rdisk of image file")
     # determine partition
     p = "0"
     if options != None and options.has_key('part'):
       p = str(options['part'])
     part = rdisk.find_partition_by_string(p)
     if part == None:
       raise IOError("can't find partition in image file")
     blkdev = part.create_blkdev(True) # auto_close rdisk
     blkdev.open()
   return blkdev
示例#4
0
 def open(self, img_file, read_only=False, options=None, fobj=None):
     """open an existing image file"""
     # file base check
     if fobj is None:
         # make sure image file exists
         if not os.path.exists(img_file):
             raise IOError("image file not found")
         # is readable?
         if not os.access(img_file, os.R_OK):
             raise IOError("can't read from image file")
         # is writeable? -> no: enforce read_only
         if not os.access(img_file, os.W_OK):
             read_only = True
         # check size
         st = os.stat(img_file)
         mode = st.st_mode
         if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
             size = BlkDevTools.getblkdevsize(img_file)
         else:
             size = os.path.getsize(img_file)
         if size == 0:
             raise IOError("image file is empty")
     # fobj
     else:
         fobj.seek(0, 2)
         size = fobj.tell()
         fobj.seek(0, 0)
     # detect type
     t = self.detect_type(img_file, fobj, options)
     if t == None:
         raise IOError("can't detect type of image file")
     # create blkdev
     if t == self.TYPE_ADF:
         blkdev = ADFBlockDevice(img_file, read_only, fobj=fobj)
         blkdev.open()
     elif t == self.TYPE_HDF:
         # detect geometry
         geo = DiskGeometry()
         if not geo.detect(size, options):
             raise IOError("can't detect geometry of HDF image file")
         blkdev = HDFBlockDevice(img_file, read_only, fobj=fobj)
         blkdev.open(geo)
     else:
         rawdev = RawBlockDevice(img_file, read_only, fobj=fobj)
         rawdev.open()
         # create rdisk instance
         rdisk = RDisk(rawdev)
         if not rdisk.open():
             raise IOError("can't open rdisk of image file")
         # determine partition
         p = "0"
         if options != None and options.has_key('part'):
             p = str(options['part'])
         part = rdisk.find_partition_by_string(p)
         if part == None:
             raise IOError("can't find partition in image file")
         blkdev = part.create_blkdev(True)  # auto_close rdisk
         blkdev.open()
     return blkdev
示例#5
0
 def get_image_size(file_name):
     # is it a block/char device?
     st = os.stat(file_name)
     mode = st.st_mode
     if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
         return BlkDevTools.getblkdevsize(file_name)
     else:
         # get size and make sure its not empty
         return os.path.getsize(file_name)
示例#6
0
 def open(self):
   # is readable?
   if not os.access(self.file_name, os.R_OK):
     raise IOError("Can't read from image file")
   # is writeable?
   if not os.access(self.file_name, os.W_OK):
     self.read_only = True
   # is it a block/char device?
   st = os.stat(self.file_name)
   mode = st.st_mode
   if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
     self.size = BlkDevTools.getblkdevsize(self.file_name)
   else:
     # get size and make sure its not empty
     self.size = os.path.getsize(self.file_name)
   if self.size == 0:
     raise IOError("Empty image file detected!")
   self.num_blocks = self.size / self.block_bytes
   # open raw file 
   if self.read_only:
     flags = "rb"
   else:
     flags = "r+b"
   self.fh = file(self.file_name, flags)
示例#7
0
    def open(self,
             img_file,
             read_only=False,
             options=None,
             fobj=None,
             none_if_missing=False):
        """open an existing image file"""
        # file base check
        if not fobj:
            # make sure image file exists
            if not os.path.exists(img_file):
                if none_if_missing:
                    return None
                raise IOError("image file not found")
            # is readable?
            if not os.access(img_file, os.R_OK):
                raise IOError("can't read from image file")
            # is writeable? -> no: enforce read_only
            if not os.access(img_file, os.W_OK):
                read_only = True

        # detect type
        t = self.detect_type(img_file, fobj, options)
        if t is None:
            raise IOError("can't detect type of image file")

        # is gzipped?
        if t & self.GZIP_MASK:
            # only supported for read access for now
            if not read_only:
                raise IOError("can't write gzip'ed image files!")
            # automatically wrap a fobj to unzip
            fobj = gzip.GzipFile(img_file, "rb", fileobj=fobj)
            # remove gzip flag from type
            t = t & self.TYPE_MASK

        # retrieve size
        if fobj:
            # get size from fobj
            fobj.seek(0, 2)
            size = fobj.tell()
            fobj.seek(0, 0)
        else:
            # get size from file/blk dev/char dev
            st = os.stat(img_file)
            mode = st.st_mode
            if stat.S_ISBLK(mode) or stat.S_ISCHR(mode):
                size = BlkDevTools.getblkdevsize(img_file)
            else:
                size = os.path.getsize(img_file)
            if size == 0:
                raise IOError("image file is empty")

        # get block size
        bs = self._get_block_size(options)

        # now create blkdev
        if t in (self.TYPE_ADF, self.TYPE_ADF_HD):
            # check sizes
            if size in ADFBlockDevice.DD_IMG_SIZES:
                hd = False
            elif size in ADFBlockDevice.HD_IMG_SIZES:
                hd = True
            else:
                raise IOError("invalid ADF images size: %d" % size)
            blkdev = ADFBlockDevice(img_file, read_only, fobj=fobj, hd=hd)
            blkdev.open()
        elif t == self.TYPE_HDF:
            # detect geometry
            geo = DiskGeometry(block_bytes=bs)
            if not geo.detect(size, options):
                raise IOError("can't detect geometry of HDF image file")
            blkdev = HDFBlockDevice(img_file,
                                    read_only,
                                    fobj=fobj,
                                    block_size=bs)
            blkdev.open(geo)
        else:
            rawdev = RawBlockDevice(img_file,
                                    read_only,
                                    fobj=fobj,
                                    block_bytes=bs)
            rawdev.open()
            # check block size stored in rdb
            rdisk = RDisk(rawdev)
            rdb_bs = rdisk.peek_block_size()
            if rdb_bs != bs:
                # adjust block size and re-open
                rawdev.close()
                bs = rdb_bs
                rawdev = RawBlockDevice(img_file,
                                        read_only,
                                        fobj=fobj,
                                        block_bytes=bs)
                rawdev.open()
                rdisk = RDisk(rawdev)
            if not rdisk.open():
                raise IOError("can't open rdisk of image file")
            # determine partition
            p = "0"
            if options != None and "part" in options:
                p = str(options["part"])
            part = rdisk.find_partition_by_string(p)
            if part == None:
                raise IOError("can't find partition in image file")
            blkdev = part.create_blkdev(True)  # auto_close rdisk
            blkdev.open()
        return blkdev