From: Michael Fritch Date: Sun, 24 Nov 2019 00:02:24 +0000 (-0700) Subject: ceph-daemon: Fix handling for symlinks on python2 X-Git-Tag: v15.1.0~725^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f876fe35dae3328cb63146ef8885e692dd621e83;p=ceph.git ceph-daemon: Fix handling for symlinks on python2 Signed-off-by: Michael Fritch --- diff --git a/src/ceph-daemon/ceph-daemon b/src/ceph-daemon/ceph-daemon index 380c144cadd6..dabfd6a85222 100755 --- a/src/ceph-daemon/ceph-daemon +++ b/src/ceph-daemon/ceph-daemon @@ -280,6 +280,25 @@ def make_log_dir(fsid, uid=None, gid=None): makedirs(log_dir, uid, gid, LOG_DIR_MODE) return log_dir +def move_file(src, dst): + """ + Move a file from src to dst + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + + if os.path.islink(src): + # shutil.move() in python2 does not handle symlinks correctly + src_rl = os.readlink(src) + logger.debug('symlink \'%s\' -> \'%s\'' % (dst, src_rl)) + os.symlink(src_rl, dst) + os.unlink(src) + else: + logger.debug('Move \'%s\' -> \'%s\'' % (src, dst)) + shutil.move(src, dst) + + return dst + def find_program(filename): # type: (str) -> str name = find_executable(filename) @@ -1497,8 +1516,7 @@ def command_adopt(): data_dir_src = os.path.abspath(args.legacy_dir + data_dir_src) data_dir_dst = make_data_dir(fsid, daemon_type, daemon_id) for data_file in glob(os.path.join(data_dir_src, '*')): - logger.debug('Move \'%s\' -> \'%s\'' % (data_file, data_dir_dst)) - shutil.move(data_file, data_dir_dst) + move_file(data_file, data_dir_dst) logger.debug('Remove dir \'%s\'' % (data_dir_src)) if os.path.ismount(data_dir_src): call_throws(['umount', data_dir_src]) @@ -1518,8 +1536,7 @@ def command_adopt(): log_dir_src = os.path.abspath(args.legacy_dir + log_dir_src) log_dir_dst = make_log_dir(fsid, uid=uid, gid=gid) for log_file in glob(log_dir_src): - logger.debug('Move \'%s\' -> \'%s\'' % (log_file, log_dir_dst)) - shutil.move(log_file, log_dir_dst) + move_file(log_file, log_dir_dst) logger.info('Creating new units...') c = get_container(fsid, daemon_type, daemon_id)