Esempio n. 1
0
    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
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
 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
Esempio n. 8
0
 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
Esempio n. 9
0
 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
Esempio n. 10
0
 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
Esempio n. 11
0
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
Esempio n. 12
0
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))