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))
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))
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
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)