Exemplo n.º 1
0
def move_system_dataset(dispatcher, dsid, services, src_pool, dst_pool):
    logger.warning('Migrating system dataset from pool {0} to {1}'.format(
        src_pool, dst_pool))
    tmpath = tempfile.mkdtemp()
    create_system_dataset(dispatcher, dsid, dst_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, tmpath)

    for s in services:
        try:
            dispatcher.call_sync('service.ensure_stopped', s)
        except RpcException as err:
            logger.warning('Failed to stop {0} service: {1}'.format(s, err))

    dispatcher.call_sync('management.stop_logdb')

    try:
        copytree(SYSTEM_DIR, tmpath)
    except shutil.Error as err:
        logger.warning('Following errors were encountered during migration:')
        for i in err.args[0]:
            logger.warning('{0} -> {1}: {2}'.format(*i[0]))

    umount_system_dataset(dispatcher, dsid, dst_pool)
    umount_system_dataset(dispatcher, dsid, src_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, SYSTEM_DIR)
    remove_system_dataset(dispatcher, dsid, src_pool)

    dispatcher.call_sync('management.start_logdb')

    for s in services:
        try:
            dispatcher.call_sync('service.ensure_started', s, timeout=20)
        except RpcException as err:
            logger.warning('Failed to start {0} service: {1}'.format(s, err))
Exemplo n.º 2
0
def move_system_dataset(dispatcher, dsid, services, src_pool, dst_pool):
    logger.warning('Migrating system dataset from pool {0} to {1}'.format(src_pool, dst_pool))
    tmpath = tempfile.mkdtemp()
    create_system_dataset(dispatcher, dsid, dst_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, tmpath)

    for s in services:
        try:
            dispatcher.call_sync('service.ensure_stopped', s)
        except RpcException as err:
            logger.warning('Failed to stop {0} service: {1}'.format(s, err))

    dispatcher.call_sync('management.stop_logdb')

    try:
        copytree(SYSTEM_DIR, tmpath)
    except shutil.Error as err:
        logger.warning('Following errors were encountered during migration:')
        for i in err.args[0]:
            logger.warning('{0} -> {1}: {2}'.format(*i[0]))

    umount_system_dataset(dispatcher, dsid, dst_pool)
    umount_system_dataset(dispatcher, dsid, src_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, SYSTEM_DIR)
    remove_system_dataset(dispatcher, dsid, src_pool)

    dispatcher.call_sync('management.start_logdb')

    for s in services:
        try:
            dispatcher.call_sync('service.ensure_started', s, timeout=20)
        except RpcException as err:
            logger.warning('Failed to start {0} service: {1}'.format(s, err))
Exemplo n.º 3
0
    def run(self, src, dest_path, fstype=None):
        if not fstype:
            try:
                fstype, _ = system('/usr/sbin/fstyp', src)
            except SubprocessException:
                raise TaskException(errno.EINVAL, 'Cannot figure out filesystem type')

        if fstype == 'ntfs':
            try:
                bsd.kld.kldload('/boot/kernel/fuse.ko')
            except OSError as err:
                raise TaskException(err.errno, str(err))

        src_mount = tempfile.mkdtemp()

        try:
            bsd.nmount(source=src, fspath=src_mount, fstype=fstype)
        except OSError as err:
            raise TaskException(err.errno, "Cannot mount disk: {0}".format(str(err)))

        def callback(srcfile, dstfile):
            self.set_progress(self.copied / self.nfiles * 100, "Copying {0}".format(os.path.basename(srcfile)))

        self.set_progress(0, "Counting files...")
        self.nfiles = count_files(src_mount)
        self.copied = 0
        failures = []

        try:
            copytree(src_mount, dest_path, progress_callback=callback)
        except shutil.Error as err:
            failures = list(err)

        try:
            bsd.unmount(src_mount, bsd.MountFlags.FORCE)
        except OSError:
            pass

        bsd.kld.kldunload('fuse')
        os.rmdir(src_mount)
        return failures
Exemplo n.º 4
0
def move_system_dataset(dispatcher, dsid, services, src_pool, dst_pool):
    logger.warning('Migrating system dataset from pool {0} to {1}'.format(src_pool, dst_pool))
    tmpath = os.tempnam('/tmp')
    create_system_dataset(dispatcher, dsid, dst_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, tmpath)

    for s in services:
        dispatcher.call_sync('services.ensure_stopped', s)

    try:
        copytree(SYSTEM_DIR, tmpath)
    except shutil.Error as err:
        logger.warning('Following errors were encountered during migration:')
        for i in err:
            logger.warning('{0} -> {1}: {2}'.format(*i[0]))

    umount_system_dataset(dispatcher, dsid, dst_pool)
    umount_system_dataset(dispatcher, dsid, src_pool)
    mount_system_dataset(dispatcher, dsid, dst_pool, SYSTEM_DIR)
    remove_system_dataset(dispatcher, dsid, src_pool)

    for s in services:
        dispatcher.call_sync('services.ensure_started', s, timeout=20)