def __format_filesystem(self): if self.skipformat: msger.debug("Skip filesystem format.") return msger.verbose("Formating %s filesystem on %s" % (self.fstype, self.disk.device)) cmdlist = [self.mkfscmd, "-F", "-L", self.fslabel, "-m", "1", "-b", str(self.blocksize)] if self.extopts: cmdlist.extend(self.extopts.split()) cmdlist.extend([self.disk.device]) rc, errout = runner.runtool(cmdlist, catch=2) if rc != 0: raise MountError("Error creating %s filesystem on disk %s:\n%s" % (self.fstype, self.disk.device, errout)) if not self.extopts: msger.debug("Tuning filesystem on %s" % self.disk.device) runner.show([self.tune2fs, "-c0", "-i0", "-Odir_index", "-ouser_xattr,acl", self.disk.device]) rc, errout = runner.runtool([self.dumpe2fs, '-h', self.disk.device], catch=2) if rc != 0: raise MountError("Error dumpe2fs %s filesystem on disk %s:\n%s" % (self.fstype, self.disk.device, errout)) # FIXME: specify uuid in mkfs parameter try: self.uuid = self.__parse_field(out, "Filesystem UUID") except: self.uuid = None
def get_file_size(filename): """ Return size in MB unit """ cmd = ['du', "-s", "-b", "-B", "1M", filename] rc, duOutput = runner.runtool(cmd) if rc != 0: raise CreatorError("Failed to run: %s" % ' '.join(cmd)) size1 = int(duOutput.split()[0]) cmd = ['du', "-s", "-B", "1M", filename] rc, duOutput = runner.runtool(cmd) if rc != 0: raise CreatorError("Failed to run: %s" % ' '.join(cmd)) size2 = int(duOutput.split()[0]) return max(size1, size2)
def get_loop_device(losetupcmd, lofile): import fcntl fp = open("/var/lock/__mic_loopdev.lock", 'w') fcntl.flock(fp, fcntl.LOCK_EX) try: devinst = LoopDevice() devinst.create() except: rc, out = runner.runtool([losetupcmd, "-f"]) if rc != 0: raise MountError("1-Failed to allocate loop device for '%s'" % lofile) loopdev = out.split()[0] else: loopdev = devinst.device finally: try: fcntl.flock(fp, fcntl.LOCK_UN) fp.close() os.unlink('/var/lock/__mic_loopdev.lock') except: pass rc = runner.show([losetupcmd, loopdev, lofile]) if rc != 0: raise MountError("2-Failed to allocate loop device for '%s'" % lofile) return loopdev
def get_file_size(file): """ Return size in MB unit, TODO: rewrite """ rc, duOutput = runner.runtool(['du', "-s", "-b", "-B", "1M", file]) if rc != 0: raise CreatorError("Failed to run %s" % du) size1 = int(duOutput.split()[0]) rc, duOutput = runner.runtool(['du', "-s", "-B", "1M", file]) if rc != 0: raise CreatorError("Failed to run %s" % du) size2 = int(duOutput.split()[0]) if size1 > size2: return size1 else: return size2
def get_file_size(file): """ Return size in MB unit """ rc, duOutput = runner.runtool(['du', "-s", "-b", "-B", "1M", file]) if rc != 0: raise CreatorError("Failed to run %s" % du) size1 = int(duOutput.split()[0]) rc, duOutput = runner.runtool(['du', "-s", "-B", "1M", file]) if rc != 0: raise CreatorError("Failed to run %s" % du) size2 = int(duOutput.split()[0]) if size1 > size2: return size1 else: return size2
def _kpseek(self, device): rc, out = runner.runtool([self.kpartxcmd, '-l', '-v', device]) if rc != 0: raise MountError("Can't query dm snapshot on %s" % device) for line in out.splitlines(): if line and line.startswith("loop"): return True return False
def _loseek(self, device): import re rc, out = runner.runtool([self.losetupcmd, '-a']) if rc != 0: raise MountError("Failed to run 'losetup -a'") for line in out.splitlines(): m = re.match("([^:]+): .*", line) if m and m.group(1) == device: return True return False
def get_loop_device(losetupcmd, lofile): """ Get a lock to synchronize getting a loopback device """ # internal class for simple lock class FileLock(object): def __init__(self, filename): self.filename = filename self.fd = None import atexit atexit.register(self.release) def acquire(self): try: self.fd = os.open(self.filename, os.O_CREAT | os.O_EXCL) return True except OSError: self.fd = None return False def release(self): try: if self.fd is not None: os.close(self.fd) os.remove(self.filename) except: pass lock = FileLock("/var/lock/._mic_loopdev.lock") timeout = 30 while not lock.acquire(): if timeout == 0: raise MountError("Timeout! Failed to find a free loop device") time.sleep(2) timeout -= 2 rc, losetupOutput = runner.runtool([losetupcmd, "-f"]) if rc != 0: lock.release() raise MountError("Failed to allocate loop device for '%s'" % lofile) loopdev = losetupOutput.split()[0] rc = runner.show([losetupcmd, loopdev, lofile]) lock.release() if rc != 0: raise MountError("Failed to allocate loop device for '%s'" % lofile) return loopdev
def get_loop_device(losetupcmd, lofile): import fcntl fp = open("/var/lock/__mic_loopdev.lock", 'w') fcntl.flock(fp, fcntl.LOCK_EX) try: loopdev = None devinst = LoopDevice() # clean up left loop device first clean_loop_devices() # provide an avaible loop device rc, out = runner.runtool([losetupcmd, "--find"]) if rc == 0: loopdev = out.split()[0] devinst.register(loopdev) if not loopdev or not os.path.exists(loopdev): devinst.create() loopdev = devinst.device # setup a loop device for image file rc = runner.show([losetupcmd, loopdev, lofile]) if rc != 0: raise MountError("Failed to setup loop device for '%s'" % lofile) devinst.reg_atexit() # try to save device and pid makedirs(DEVICE_PIDFILE_DIR) pidfile = os.path.join(DEVICE_PIDFILE_DIR, os.path.basename(loopdev)) if os.path.exists(pidfile): os.unlink(pidfile) with open(pidfile, 'w') as wf: wf.write(str(os.getpid())) except MountError, err: raise CreatorError("%s" % str(err))