@@ -345,29 +345,64 @@ class Disk:
path))
def copy(self, src, dest):
- """Copy partition image into wic image."""
- pnum = dest.part if isinstance(src, str) else src.part
+ """Copy files or directories to/from the vfat or ext* partition."""
+ pnum = dest.part if isinstance(src, str) else src.part
+ partimg = self._get_part_image(pnum)
if self.partitions[pnum].fstype.startswith('ext'):
- 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))
- else: # copy from wic
- # run both dump and rdump to support both files and directory
+ if isinstance(src, str): # host to image case
+ if os.path.isdir(src):
+ base = os.path.abspath(src)
+ base_parent = os.path.dirname(base)
+ cmds = []
+ made = set()
+
+ for root, dirs, files in os.walk(base):
+ for fname in files:
+ host_file = os.path.join(root, fname)
+ rel = os.path.relpath(host_file, base_parent)
+ dest_file = os.path.join(dest.path, rel)
+ dest_dir = os.path.dirname(dest_file)
+
+ # create dir structure (mkdir -p)
+ parts = dest_dir.strip('/').split('/')
+ cur = ''
+ for p in parts:
+ cur = cur + '/' + p
+ if cur not in made:
+ cmds.append(f'mkdir "{cur}"')
+ made.add(cur)
+
+ cmds.append(f'write "{host_file}" "{dest_file}"')
+
+ # write script to a temp file
+ with tempfile.NamedTemporaryFile(mode='w', delete=False,
+ prefix='wic-debugfs-') as tf:
+ for line in cmds:
+ tf.write(line + '\n')
+ scriptname = tf.name
+
+ cmd = f"{self.debugfs} -w -f {scriptname} {partimg}"
+
+ else: # single file
+ cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
+ format(os.path.dirname(dest.path), src,
+ os.path.basename(src), self.debugfs, partimg)
+
+ else: # image to host case
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))
+ dest, src.path, dest, self.debugfs, partimg)
+
else: # fat
if isinstance(src, str):
cmd = "{} -i {} -snop {} ::{}".format(self.mcopy,
- self._get_part_image(pnum),
- src, dest.path)
+ partimg,
+ src, dest.path)
else:
cmd = "{} -i {} -snop ::{} {}".format(self.mcopy,
- self._get_part_image(pnum),
- src.path, dest)
+ partimg,
+ src.path, dest)
exec_cmd(cmd, as_shell=True)
self._put_part_image(pnum)
wic uses debugfs to write on ext* partitions, but debugfs can only write to the current working directory and it cannot copy complete directory trees. Running 'wic ls' on a copied directory show this: -l: Ext2 inode is not a directory Fix this by creating a command list for debugfs (-f parameter) when recursive parsing the host directory in order to create a similar directory structure (mkdir) and copy files (write) on each level into the destination directory from the wic's ext* partition. Signed-off-by: Daniel Dragomir <daniel.dragomir@windriver.com> --- scripts/lib/wic/engine.py | 63 ++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 14 deletions(-)