]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-daemon: don't deref symlinks during chown 32137/head
authorMichael Fritch <mfritch@suse.com>
Tue, 10 Dec 2019 04:42:43 +0000 (21:42 -0700)
committerMichael Fritch <mfritch@suse.com>
Tue, 10 Dec 2019 15:18:51 +0000 (08:18 -0700)
- consolidate move/copy loop logic
- chown the actual file and not the symlink

Signed-off-by: Michael Fritch <mfritch@suse.com>
src/ceph-daemon/ceph-daemon

index 30c164410284ccf5f75e950c20500da6cbf76b0c..6164b64ae0a5796366c05edeb67a2a1ef035e7c5 100755 (executable)
@@ -62,7 +62,7 @@ import uuid
 
 from distutils.spawn import find_executable
 from functools import wraps
-from glob import iglob
+from glob import glob
 
 
 container_path = None
@@ -311,46 +311,49 @@ def make_log_dir(fsid, uid=None, gid=None):
     makedirs(log_dir, uid, gid, LOG_DIR_MODE)
     return log_dir
 
-def copy_file(src, dst, uid=None, gid=None):
-    # type: (str, str, int, int) -> str
+def copy_files(src, dst, uid=None, gid=None):
+    # type: (List[str], str, int, int) -> None
     """
-    Copy a file from src to dst
+    Copy a files from src to dst
     """
     if not uid or not gid:
         (uid, gid) = extract_uid_gid()
 
-    if os.path.isdir(dst):
-        dst = os.path.join(dst, os.path.basename(src))
+    for src_file in src:
+        dst_file = dst
+        if os.path.isdir(dst):
+            dst_file = os.path.join(dst, os.path.basename(src_file))
 
-    logger.debug('Copy \'%s\' -> \'%s\'' % (src, dst))
-    shutil.copyfile(src, dst)
-    os.chown(dst, uid, gid)
+        logger.debug('copy file \'%s\' -> \'%s\'' % (src_file, dst_file))
+        shutil.copyfile(src_file, dst_file)
 
-    return dst
+        logger.debug('chown %s:%s \'%s\'' % (uid, gid, dst_file))
+        os.chown(dst_file, uid, gid)
 
-def move_file(src, dst, uid=None, gid=None):
-    # type: (str, str, int, int) -> str
+def move_files(src, dst, uid=None, gid=None):
+    # type: (List[str], str, int, int) -> None
     """
-    Move a file from src to dst
+    Move files from src to dst
     """
     if not uid or not gid:
         (uid, gid) = extract_uid_gid()
 
-    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)
-    os.chown(dst, uid, gid)
-
-    return dst
+    for src_file in src:
+        dst_file = dst
+        if os.path.isdir(dst):
+            dst_file = os.path.join(dst, os.path.basename(src_file))
+
+        if os.path.islink(src_file):
+            # shutil.move() in py2 does not handle symlinks correctly
+            src_rl = os.readlink(src_file)
+            logger.debug("symlink '%s' -> '%s'" % (dst_file, src_rl))
+            os.symlink(src_rl, dst_file)
+            os.unlink(src_file)
+        else:
+            logger.debug("move file '%s' -> '%s'" % (src_file, dst_file))
+            shutil.move(src_file, dst_file)
+            logger.debug('chown %s:%s \'%s\'' % (uid, gid, dst_file))
+            os.chown(dst_file, uid, gid)
 
 def find_program(filename):
     # type: (str) -> str
@@ -444,7 +447,7 @@ def get_daemon_args(fsid, daemon_type, daemon_id):
 def create_daemon_dirs(fsid, daemon_type, daemon_id, uid, gid,
                        config=None, keyring=None):
     # type: (str, str, Union[int, str], int, int, str, str) ->  None
-    data_dir = make_data_dir(fsid, daemon_type, daemon_id)
+    data_dir = make_data_dir(fsid, daemon_type, daemon_id, uid=uid, gid=gid)
     make_log_dir(fsid)
 
     if config:
@@ -1604,9 +1607,11 @@ def command_adopt():
         data_dir_src = ('/var/lib/ceph/%s/%s-%s' %
                         (daemon_type, args.cluster, daemon_id))
         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 iglob(os.path.join(data_dir_src, '*')):
-            move_file(data_file, data_dir_dst, uid=uid, gid=gid)
+        data_dir_dst = make_data_dir(fsid, daemon_type, daemon_id,
+                                     uid=uid, gid=gid)
+        move_files(glob(os.path.join(data_dir_src, '*')),
+                   data_dir_dst,
+                   uid=uid, gid=gid)
         logger.debug('Remove dir \'%s\'' % (data_dir_src))
         if os.path.ismount(data_dir_src):
             call_throws(['umount', data_dir_src])
@@ -1616,7 +1621,7 @@ def command_adopt():
         config_src = '/etc/ceph/%s.conf' % (args.cluster)
         config_src = os.path.abspath(args.legacy_dir + config_src)
         config_dst = os.path.join(data_dir_dst, 'config')
-        copy_file(config_src, config_dst, uid=uid, gid=gid)
+        copy_files([config_src], config_dst, uid=uid, gid=gid)
 
         # logs
         logger.info('Moving logs...')
@@ -1624,8 +1629,9 @@ def command_adopt():
                         (args.cluster, daemon_type, daemon_id))
         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 iglob(log_dir_src):
-            move_file(log_file, log_dir_dst, uid=uid, gid=gid)
+        move_files(glob(log_dir_src),
+                   log_dir_dst,
+                   uid=uid, gid=gid)
 
         logger.info('Creating new units...')
         c = get_container(fsid, daemon_type, daemon_id)