def readblock(name, offset, size): ''' Read (direct IO) the content of device 'name' at offset, size bytes ''' # direct io must be aligned on block size boundaries if (size % 512) or (offset % 512): raise se.MiscBlockReadException(name, offset, size) left = size ret = "" baseoffset = offset while left > 0: (iounit, count, iooffset) = _alignData(left, offset) cmd = [constants.EXT_DD] if fileUtils.pathRequiresFlagForDirectIO(name): cmd.append("iflag=%s" % DIRECTFLAG) cmd.extend(["skip=%d" % iooffset, "bs=%d" % iounit, "if=%s" % name, "count=%s" % count]) (rc, out, err) = execCmd(cmd, raw=True) if rc: raise se.MiscBlockReadException(name, offset, size) if not validateDDBytes(err.splitlines(), iounit * count): raise se.MiscBlockReadIncomplete(name, offset, size) ret += out left = left % iounit offset = baseoffset + size - left return ret.splitlines()
def ddWatchCopy(src, dst, stop, size, offset=0, recoveryCallback=None): """ Copy src to dst using dd command with stop abilities """ try: size = int(size) except ValueError: raise se.InvalidParameterException("size", "size = %s" % (size,)) try: offset = int(offset) except ValueError: raise se.InvalidParameterException("offset", "offset = %s" % (offset,)) left = size baseoffset = offset while left > 0: (iounit, count, iooffset) = _alignData(left, offset) oflag = None conv = "notrunc" if (iounit % 512) == 0: if fileUtils.pathRequiresFlagForDirectIO(dst): oflag = DIRECTFLAG else: conv += ",%s" % DATASYNCFLAG cmd = [constants.EXT_DD, "if=%s" % src, "of=%s" % dst, "bs=%d" % iounit, "seek=%s" % iooffset, "skip=%s" % iooffset, "conv=%s" % conv, 'count=%s' % count] if oflag: cmd.append("oflag=%s" % oflag) if not stop: (rc, out, err) = execCmd(cmd, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE, deathSignal=signal.SIGKILL) else: (rc, out, err) = watchCmd(cmd, stop=stop, recoveryCallback=recoveryCallback, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE) if rc: raise se.MiscBlockWriteException(dst, offset, size) if not validateDDBytes(err, iounit * count): raise se.MiscBlockWriteIncomplete(dst, offset, size) left = left % iounit offset = baseoffset + size - left return (rc, out, err)
def ddWatchCopy(src, dst, stop, size, offset=0, recoveryCallback=None): """ Copy src to dst using dd command with stop abilities """ try: size = int(size) except ValueError: raise se.InvalidParameterException("size", "size = %s" % (size,)) try: offset = int(offset) except ValueError: raise se.InvalidParameterException("offset", "offset = %s" % (offset,)) left = size baseoffset = offset while left > 0: (iounit, count, iooffset) = _alignData(left, offset) oflag = None conv = "notrunc" if (iounit % 512) == 0: if fileUtils.pathRequiresFlagForDirectIO(dst): oflag = DIRECTFLAG else: conv += ",%s" % DATASYNCFLAG cmd = [constants.EXT_DD, "if=%s" % src, "of=%s" % dst, "bs=%d" % iounit, "seek=%s" % iooffset, "skip=%s" % iooffset, "conv=%s" % conv, 'count=%s' % count] if oflag: cmd.append("oflag=%s" % oflag) if not stop: (rc, out, err) = execCmd(cmd, sudo=False, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE) else: (rc, out, err) = watchCmd(cmd, stop=stop, recoveryCallback=recoveryCallback, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE) if rc: raise se.MiscBlockWriteException(dst, offset, size) if not validateDDBytes(err, iounit * count): raise se.MiscBlockWriteIncomplete(dst, offset, size) left = left % iounit offset = baseoffset + size - left return (rc, out, err)
def _readfile(name, buffersize=None): cmd = [constants.EXT_DD] if fileUtils.pathRequiresFlagForDirectIO(name): cmd.append("iflag=%s" % DIRECTFLAG) cmd.append("if=%s" % name) if buffersize: cmd.extend(["bs=%d" % buffersize, "count=1"]) (rc, out, err) = execCmd(cmd) if rc: raise se.MiscFileReadException(name) return rc, out, err
def _readfile(name, buffersize=None): cmd = [constants.EXT_DD] if fileUtils.pathRequiresFlagForDirectIO(name): cmd.append("iflag=%s" % DIRECTFLAG) cmd.append("if=%s" % name) if buffersize: cmd.extend(["bs=%d" % buffersize, "count=1"]) (rc, out, err) = execCmd(cmd, sudo=False) if rc: raise se.MiscFileReadException(name) return rc, out, err