Quellcode durchsuchen

wic: 'wic cp' to copy from image

currently 'wic cp' only works for copy file from local storage to
wic image.

enhance 'wic cp' to copy file/directory from wic image to local storage.

include selftest and 'wic help' updates.

[YOCTO#12169]

Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Chee Yang Lee vor 4 Jahren
Ursprung
Commit
bd669c1809
4 geänderte Dateien mit 76 neuen und 21 gelöschten Zeilen
  1. 17 0
      meta/lib/oeqa/selftest/cases/wic.py
  2. 27 8
      scripts/lib/wic/engine.py
  3. 19 10
      scripts/lib/wic/help.py
  4. 13 3
      scripts/wic

+ 17 - 0
meta/lib/oeqa/selftest/cases/wic.py

@@ -866,6 +866,13 @@ class Wic2(WicTestCase):
             self.assertEqual(8, len(result.output.split('\n')))
             self.assertEqual(8, len(result.output.split('\n')))
             self.assertTrue(os.path.basename(testdir) in result.output)
             self.assertTrue(os.path.basename(testdir) in result.output)
 
 
+            # copy the file from the partition and check if it success
+            dest = '%s-cp' % testfile.name
+            runCmd("wic cp %s:1/%s %s -n %s" % (images[0],
+                    os.path.basename(testfile.name), dest, sysroot))
+            self.assertTrue(os.path.exists(dest))
+
+
     def test_wic_rm(self):
     def test_wic_rm(self):
         """Test removing files and directories from the the wic image."""
         """Test removing files and directories from the the wic image."""
         runCmd("wic create mkefidisk "
         runCmd("wic create mkefidisk "
@@ -1005,6 +1012,16 @@ class Wic2(WicTestCase):
             newdirs = set(line.split()[-1] for line in result.output.split('\n') if line)
             newdirs = set(line.split()[-1] for line in result.output.split('\n') if line)
             self.assertEqual(newdirs.difference(dirs), set([os.path.basename(testfile.name)]))
             self.assertEqual(newdirs.difference(dirs), set([os.path.basename(testfile.name)]))
 
 
+            # check if the file to copy is in the partition
+            result = runCmd("wic ls %s:2/etc/ -n %s" % (images[0], sysroot))
+            self.assertTrue('fstab' in [line.split()[-1] for line in result.output.split('\n') if line])
+
+            # copy file from the partition, replace the temporary file content with it and
+            # check for the file size to validate the copy
+            runCmd("wic cp %s:2/etc/fstab %s -n %s" % (images[0], testfile.name, sysroot))
+            self.assertTrue(os.stat(testfile.name).st_size > 0)
+
+
     def test_wic_rm_ext(self):
     def test_wic_rm_ext(self):
         """Test removing files from the ext partition."""
         """Test removing files from the ext partition."""
         runCmd("wic create mkefidisk "
         runCmd("wic create mkefidisk "

+ 27 - 8
scripts/lib/wic/engine.py

@@ -323,16 +323,31 @@ class Disk:
                                                    self._get_part_image(pnum),
                                                    self._get_part_image(pnum),
                                                    path))
                                                    path))
 
 
-    def copy(self, src, pnum, path):
+    def copy(self, src, dest):
         """Copy partition image into wic image."""
         """Copy partition image into wic image."""
+        pnum =  dest.part if isinstance(src, str) else src.part
+
         if self.partitions[pnum].fstype.startswith('ext'):
         if self.partitions[pnum].fstype.startswith('ext'):
-            cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
-                      format(path, src, os.path.basename(src),
+            if isinstance(src, str):
+                cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
+                      format(os.path.dirname(dest.path), src, os.path.basename(src),
                              self.debugfs, self._get_part_image(pnum))
                              self.debugfs, self._get_part_image(pnum))
+            else: # copy from wic
+                # run both dump and rdump to support both files and directory
+                cmd = "printf 'cd {}\ndump /{} {}\nrdump /{} {}\n' | {} {}".\
+                      format(os.path.dirname(src.path), src.path,
+                             dest, src.path, dest, self.debugfs,
+                             self._get_part_image(pnum))
         else: # fat
         else: # fat
-            cmd = "{} -i {} -snop {} ::{}".format(self.mcopy,
+            if isinstance(src, str):
+                cmd = "{} -i {} -snop {} ::{}".format(self.mcopy,
+                                                  self._get_part_image(pnum),
+                                                  src, dest.path)
+            else:
+                cmd = "{} -i {} -snop ::{} {}".format(self.mcopy,
                                                   self._get_part_image(pnum),
                                                   self._get_part_image(pnum),
-                                                  src, path)
+                                                  src.path, dest)
+
         exec_cmd(cmd, as_shell=True)
         exec_cmd(cmd, as_shell=True)
         self._put_part_image(pnum)
         self._put_part_image(pnum)
 
 
@@ -551,11 +566,15 @@ def wic_ls(args, native_sysroot):
 
 
 def wic_cp(args, native_sysroot):
 def wic_cp(args, native_sysroot):
     """
     """
-    Copy local file or directory to the vfat partition of
+    Copy file or directory to/from the vfat/ext partition of
     partitioned image.
     partitioned image.
     """
     """
-    disk = Disk(args.dest.image, native_sysroot)
-    disk.copy(args.src, args.dest.part, args.dest.path)
+    if isinstance(args.dest, str):
+        disk = Disk(args.src.image, native_sysroot)
+    else:
+        disk = Disk(args.dest.image, native_sysroot)
+    disk.copy(args.src, args.dest)
+
 
 
 def wic_rm(args, native_sysroot):
 def wic_rm(args, native_sysroot):
     """
     """

+ 19 - 10
scripts/lib/wic/help.py

@@ -341,12 +341,15 @@ DESCRIPTION
 
 
 wic_cp_usage = """
 wic_cp_usage = """
 
 
- Copy files and directories to the vfat or ext* partition
+ Copy files and directories to/from the vfat or ext* partition
 
 
- usage: wic cp <src> <image>:<partition>[<path>] [--native-sysroot <path>]
+ usage: wic cp <src> <dest> [--native-sysroot <path>]
 
 
- This command  copies local files or directories to the vfat or ext* partitions
-of partitioned  image.
+ source/destination image in format <image>:<partition>[<path>]
+
+ This command copies files or directories either
+  - from local to vfat or ext* partitions of partitioned image
+  - from vfat or ext* partitions of partitioned image to local
 
 
  See 'wic help cp' for more detailed instructions.
  See 'wic help cp' for more detailed instructions.
 
 
@@ -355,16 +358,18 @@ of partitioned  image.
 wic_cp_help = """
 wic_cp_help = """
 
 
 NAME
 NAME
-    wic cp - copy files and directories to the vfat or ext* partitions
+    wic cp - copy files and directories to/from the vfat or ext* partitions
 
 
 SYNOPSIS
 SYNOPSIS
-    wic cp <src> <image>:<partition>
-    wic cp <src> <image>:<partition><path>
-    wic cp <src> <image>:<partition><path> --native-sysroot <path>
+    wic cp <src> <dest>:<partition>
+    wic cp <src>:<partition> <dest>
+    wic cp <src> <dest-image>:<partition><path>
+    wic cp <src> <dest-image>:<partition><path> --native-sysroot <path>
 
 
 DESCRIPTION
 DESCRIPTION
-    This command copies files and directories to the vfat or ext* partition of
-    the partitioned image.
+    This command copies files or directories either
+      - from local to vfat or ext* partitions of partitioned image
+      - from vfat or ext* partitions of partitioned image to local
 
 
     The first form of it copies file or directory to the root directory of
     The first form of it copies file or directory to the root directory of
     the partition:
     the partition:
@@ -397,6 +402,10 @@ DESCRIPTION
                4 files                   0 bytes
                4 files                   0 bytes
                                 15 675 392 bytes free
                                 15 675 392 bytes free
 
 
+    The third form of the command copies file or directory from the specified directory
+    on the partition to local:
+       $ wic cp tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic:1/vmlinuz test
+
     The -n option is used to specify the path to the native sysroot
     The -n option is used to specify the path to the native sysroot
     containing the tools(parted and mtools) to use.
     containing the tools(parted and mtools) to use.
 """
 """

+ 13 - 3
scripts/wic

@@ -392,9 +392,9 @@ def imgpathtype(arg):
 
 
 def wic_init_parser_cp(subparser):
 def wic_init_parser_cp(subparser):
     subparser.add_argument("src",
     subparser.add_argument("src",
-                        help="source spec")
-    subparser.add_argument("dest", type=imgpathtype,
-                        help="image spec: <image>:<vfat partition>[<path>]")
+                        help="image spec: <image>:<vfat partition>[<path>] or <file>")
+    subparser.add_argument("dest",
+                        help="image spec: <image>:<vfat partition>[<path>] or <file>")
     subparser.add_argument("-n", "--native-sysroot",
     subparser.add_argument("-n", "--native-sysroot",
                         help="path to the native sysroot containing the tools")
                         help="path to the native sysroot containing the tools")
 
 
@@ -522,6 +522,16 @@ def main(argv):
                 hlpt[0](hlpt[1], hlpt[2])
                 hlpt[0](hlpt[1], hlpt[2])
             return 0
             return 0
 
 
+    # validate wic cp src and dest parameter to identify which one of it is
+    # image and cast it into imgtype
+    if args.command == "cp":
+        if ":" in args.dest:
+            args.dest = imgtype(args.dest)
+        elif ":" in args.src:
+            args.src = imgtype(args.src)
+        else:
+            raise argparse.ArgumentTypeError("no image or partition number specified.")
+
     return hlp.invoke_subcommand(args, parser, hlp.wic_help_usage, subcommands)
     return hlp.invoke_subcommand(args, parser, hlp.wic_help_usage, subcommands)