Skip to contentSkip to conversation

wic: fix for #11633 and code cleanup

PATCH New Ed Bartosh 1 participant 5 messages Jun 16, 2017

lore
Share & tools
lore

Ed Bartosh

author
#0 lore raw

cover wic: fix for #11633 and code cleanup

Hi,

This patchset contains a fix for long standing wic bug: in some cases wic can leave updated fstab in a rootfs directory and produce duplicate fstab entries.

A bit of code cleanup is also included into the patchset.

The following changes since commit 27917fa9e14c1f0b0c3ed20c504772cf7d07b9df:

image.bbclass: use prependVarFlag for postfuncs (2017-06-16 15:11:22 +0300)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib ed/wip
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=ed/wip

Ed Bartosh (4):
runner.py: move runtool API to misc.py
wic: flatten directory structure
wic: code cleanup
wic: fix restoring of original fstab

 scripts/lib/wic/engine.py                          |  2 +-
 scripts/lib/wic/filemap.py                         |  8 +---
 scripts/lib/wic/{utils => }/misc.py                | 43 +++++++++++++++---
 scripts/lib/wic/partition.py                       |  3 +-
 scripts/lib/wic/pluginbase.py                      |  3 +-
 scripts/lib/wic/plugins/imager/direct.py           | 11 ++---
 scripts/lib/wic/plugins/source/bootimg-efi.py      |  4 +-
 .../lib/wic/plugins/source/bootimg-partition.py    |  2 +-
 scripts/lib/wic/plugins/source/bootimg-pcbios.py   |  5 +--
 .../lib/wic/plugins/source/isoimage-isohybrid.py   |  2 +-
 scripts/lib/wic/plugins/source/rawcopy.py          |  2 +-
 scripts/lib/wic/plugins/source/rootfs.py           |  2 +-
 scripts/lib/wic/utils/__init__.py                  |  0
 scripts/lib/wic/utils/runner.py                    | 52 ----------------------
 scripts/wic                                        |  2 +-
 15 files changed, 58 insertions(+), 83 deletions(-)
 rename scripts/lib/wic/{utils => }/misc.py (86%)
 delete mode 100644 scripts/lib/wic/utils/__init__.py
 delete mode 100644 scripts/lib/wic/utils/runner.py

--
Regards,
Ed

author
#1 lore raw

PATCH 1/4 runner.py: move runtool API to misc.py

Moved remaining API to misc.py.
Removed runner.py.

Now misc.py is ready to be moved to the scripts/lib/wic and utils directory can be removed.

---
 scripts/lib/wic/utils/misc.py   | 39 ++++++++++++++++++++++++++++---
 scripts/lib/wic/utils/runner.py | 52 -----------------------------------------
 2 files changed, 36 insertions(+), 55 deletions(-)
 delete mode 100644 scripts/lib/wic/utils/runner.py
scripts/lib/wic/utils/misc.py +36 -3
index 4609984..e1df824 100644
@@ -29,12 +29,12 @@
 import logging
 import os
 import re
+import subprocess
 
 from collections import defaultdict
 from distutils import spawn
 
 from wic import WicError
-from wic.utils import runner
 
 logger = logging.getLogger('wic')
 
@@ -59,6 +59,39 @@ NATIVE_RECIPES = {"bmaptool": "bmap-tools",
                   "syslinux": "syslinux"
                  }
 
+def runtool(cmdln_or_args):
+    """ wrapper for most of the subprocess calls
+    input:
+        cmdln_or_args: can be both args and cmdln str (shell=True)
+    return:
+        rc, output
+    """
+    if isinstance(cmdln_or_args, list):
+        cmd = cmdln_or_args[0]
+        shell = False
+    else:
+        import shlex
+        cmd = shlex.split(cmdln_or_args)[0]
+        shell = True
+
+    sout = subprocess.PIPE
+    serr = subprocess.STDOUT
+
+    try:
+        process = subprocess.Popen(cmdln_or_args, stdout=sout,
+                                   stderr=serr, shell=shell)
+        sout, serr = process.communicate()
+        # combine stdout and stderr, filter None out and decode
+        out = ''.join([out.decode('utf-8') for out in [sout, serr] if out])
+    except OSError as err:
+        if err.errno == 2:
+            # [Errno 2] No such file or directory
+            raise WicError('Cannot run command: %s, lost dependency?' % cmd)
+        else:
+            raise # relay
+
+    return process.returncode, out
+
 def _exec_cmd(cmd_and_args, as_shell=False):
     """
     Execute command, catching stderr, stdout
@@ -70,9 +103,9 @@ def _exec_cmd(cmd_and_args, as_shell=False):
     logger.debug(args)
 
     if as_shell:
-        ret, out = runner.runtool(cmd_and_args)
+        ret, out = runtool(cmd_and_args)
     else:
-        ret, out = runner.runtool(args)
+        ret, out = runtool(args)
     out = out.strip()
     if ret != 0:
         raise WicError("_exec_cmd: %s returned '%s' instead of 0\noutput: %s" % \
scripts/lib/wic/utils/runner.py deleted +0 -52

52 lines not on this page · raw message

Signature · 1 line
2.1.4
author
#2 lore raw

PATCH 2/4 wic: flatten directory structure

In reply to Ed Bartosh

Moved misc.py from wic/utils/ to wic/
Removed wic/utils directory

---
 scripts/lib/wic/engine.py                            | 2 +-
 scripts/lib/wic/{utils => }/misc.py                  | 0
 scripts/lib/wic/partition.py                         | 2 +-
 scripts/lib/wic/pluginbase.py                        | 2 +-
 scripts/lib/wic/plugins/imager/direct.py             | 2 +-
 scripts/lib/wic/plugins/source/bootimg-efi.py        | 4 ++--
 scripts/lib/wic/plugins/source/bootimg-partition.py  | 2 +-
 scripts/lib/wic/plugins/source/bootimg-pcbios.py     | 5 ++---
 scripts/lib/wic/plugins/source/isoimage-isohybrid.py | 2 +-
 scripts/lib/wic/plugins/source/rawcopy.py            | 2 +-
 scripts/lib/wic/plugins/source/rootfs.py             | 2 +-
 scripts/lib/wic/utils/__init__.py                    | 0
 scripts/wic                                          | 2 +-
 13 files changed, 13 insertions(+), 14 deletions(-)
 rename scripts/lib/wic/{utils => }/misc.py (100%)
 delete mode 100644 scripts/lib/wic/utils/__init__.py
scripts/lib/wic/engine.py +1 -1
index 2c899dd..2dc2fd5 100644
@@ -38,7 +38,7 @@ from distutils.spawn import find_executable
 from wic import WicError
 from wic.filemap import sparse_copy
 from wic.pluginbase import PluginMgr
-from wic.utils.misc import get_bitbake_var, exec_cmd
+from wic.misc import get_bitbake_var, exec_cmd
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/misc.py renamed from scripts/lib/wic/utils/misc.py +0 -0
similarity index 100%
rename from scripts/lib/wic/utils/misc.py
rename to scripts/lib/wic/misc.py
scripts/lib/wic/partition.py +1 -1
index 939e667..1851c4a 100644
@@ -29,7 +29,7 @@ import os
 import tempfile
 
 from wic import WicError
-from wic.utils.misc import exec_cmd, exec_native_cmd, get_bitbake_var
+from wic.misc import exec_cmd, exec_native_cmd, get_bitbake_var
 from wic.pluginbase import PluginMgr
 
 logger = logging.getLogger('wic')
scripts/lib/wic/pluginbase.py +1 -1
index fb3d179..08f9979 100644
@@ -24,7 +24,7 @@ from collections import defaultdict
 from importlib.machinery import SourceFileLoader
 
 from wic import WicError
-from wic.utils.misc import get_bitbake_var
+from wic.misc import get_bitbake_var
 
 PLUGIN_TYPES = ["imager", "source"]
 
scripts/lib/wic/plugins/imager/direct.py +1 -1
index f252697..e09350b 100644
@@ -36,7 +36,7 @@ from wic import WicError
 from wic.filemap import sparse_copy
 from wic.ksparser import KickStart, KickStartError
 from wic.pluginbase import PluginMgr, ImagerPlugin
-from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd
+from wic.misc import get_bitbake_var, exec_cmd, exec_native_cmd
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/plugins/source/bootimg-efi.py +2 -2
index 9879cb9..4c4f36a 100644
@@ -31,8 +31,8 @@ import shutil
 from wic import WicError
 from wic.engine import get_custom_config
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import (exec_cmd, exec_native_cmd, get_bitbake_var,
-                            BOOTDD_EXTRA_SPACE)
+from wic.misc import (exec_cmd, exec_native_cmd,
+                      get_bitbake_var, BOOTDD_EXTRA_SPACE)
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/plugins/source/bootimg-partition.py +1 -1
index 13fddbd..ca074a3 100644
@@ -31,7 +31,7 @@ from glob import glob
 
 from wic import WicError
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import exec_cmd, get_bitbake_var
+from wic.misc import exec_cmd, get_bitbake_var
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/plugins/source/bootimg-pcbios.py +2 -3
index 98ad88b..e3518d2 100644
@@ -29,10 +29,9 @@ import os
 
 from wic import WicError
 from wic.engine import get_custom_config
-from wic.utils import runner
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import (exec_cmd, exec_native_cmd,
-                            get_bitbake_var, BOOTDD_EXTRA_SPACE)
+from wic.misc import (exec_cmd, exec_native_cmd,
+                      get_bitbake_var, BOOTDD_EXTRA_SPACE)
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/plugins/source/isoimage-isohybrid.py +1 -1
index b464263..db77113 100644
@@ -29,7 +29,7 @@ import shutil
 from wic import WicError
 from wic.engine import get_custom_config
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import exec_cmd, exec_native_cmd, get_bitbake_var
+from wic.misc import exec_cmd, exec_native_cmd, get_bitbake_var
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/plugins/source/rawcopy.py +1 -1
index e1c4f5e..424ed26 100644
@@ -20,7 +20,7 @@ import os
 
 from wic import WicError
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import exec_cmd, get_bitbake_var
+from wic.misc import exec_cmd, get_bitbake_var
 from wic.filemap import sparse_copy
 
 logger = logging.getLogger('wic')
scripts/lib/wic/plugins/source/rootfs.py +1 -1
index 944ec5f..1b9f68b 100644
@@ -34,7 +34,7 @@ from oe.path import copyhardlinktree
 
 from wic import WicError
 from wic.pluginbase import SourcePlugin
-from wic.utils.misc import get_bitbake_var, exec_cmd
+from wic.misc import get_bitbake_var, exec_cmd
 
 logger = logging.getLogger('wic')
 
scripts/lib/wic/utils/__init__.py deleted +0 -0
deleted file mode 100644
index e69de29..0000000
scripts/wic +1 -1
index da14f47..81fc85d 100755
@@ -56,7 +56,7 @@ else:
     bitbake_main = None
 
 from wic import WicError
-from wic.utils.misc import get_bitbake_var, BB_VARS
+from wic.misc import get_bitbake_var, BB_VARS
 from wic import engine
 from wic import help as hlp
 
Signature · 1 line
2.1.4
author
#3 lore raw

PATCH 3/4 wic: code cleanup

In reply to Ed Bartosh

Split long lines.
Removed unused imports.

---
 scripts/lib/wic/filemap.py               | 8 ++------
 scripts/lib/wic/misc.py                  | 4 ++--
 scripts/lib/wic/partition.py             | 1 -
 scripts/lib/wic/pluginbase.py            | 1 -
 scripts/lib/wic/plugins/source/rootfs.py | 2 +-
 5 files changed, 5 insertions(+), 11 deletions(-)
scripts/lib/wic/filemap.py +2 -6
index 6d11355..77e32b9 100644
@@ -34,13 +34,9 @@ def get_block_size(file_obj):
     Returns block size for file object 'file_obj'. Errors are indicated by the
     'IOError' exception.
     """
-
-    from fcntl import ioctl
-    import struct
-
     # Get the block size of the host file-system for the image file by calling
     # the FIGETBSZ ioctl (number 2).
-    binary_data = ioctl(file_obj, 2, struct.pack('I', 0))
+    binary_data = fcntl.ioctl(file_obj, 2, struct.pack('I', 0))
     return struct.unpack('I', binary_data)[0]
 
 class ErrorNotSupp(Exception):
@@ -228,7 +224,7 @@ class FilemapSeek(_FilemapBase):
         try:
             tmp_obj = tempfile.TemporaryFile("w+", dir=directory)
         except IOError as err:
-            raise ErrorNotSupp("cannot create a temporary in \"%s\": %s"
+            raise ErrorNotSupp("cannot create a temporary in \"%s\": %s" \
                               % (directory, err))
 
         try:
scripts/lib/wic/misc.py +2 -2
index e1df824..3ebae0a 100644
@@ -164,8 +164,8 @@ def exec_native_cmd(cmd_and_args, native_sysroot, pseudo=""):
               "was not found (see details above).\n\n" % prog
         recipe = NATIVE_RECIPES.get(prog)
         if recipe:
-            msg += "Please make sure wic-tools have %s-native in its DEPENDS, bake it with 'bitbake wic-tools' "\
-                   "and try again.\n" % recipe
+            msg += "Please make sure wic-tools have %s-native in its DEPENDS, "\
+                   "build it with 'bitbake wic-tools' and try again.\n" % recipe
         else:
             msg += "Wic failed to find a recipe to build native %s. Please "\
                    "file a bug against wic.\n" % prog
scripts/lib/wic/partition.py +0 -1
index 1851c4a..5aa68c9 100644
@@ -26,7 +26,6 @@
 
 import logging
 import os
-import tempfile
 
 from wic import WicError
 from wic.misc import exec_cmd, exec_native_cmd, get_bitbake_var
scripts/lib/wic/pluginbase.py +0 -1
index 08f9979..c009820 100644
@@ -137,4 +137,3 @@ class SourcePlugin(metaclass=PluginMeta):
         'prepares' the partition to be incorporated into the image.
         """
         logger.debug("SourcePlugin: do_prepare_partition: part: %s", part)
-
scripts/lib/wic/plugins/source/rootfs.py +1 -1
index 1b9f68b..4dc4cb8 100644
@@ -34,7 +34,7 @@ from oe.path import copyhardlinktree
 
 from wic import WicError
 from wic.pluginbase import SourcePlugin
-from wic.misc import get_bitbake_var, exec_cmd
+from wic.misc import get_bitbake_var
 
 logger = logging.getLogger('wic')
 
Signature · 1 line
2.1.4
author
#4 lore raw

PATCH 4/4 wic: fix restoring of original fstab

In reply to Ed Bartosh

Wic updates fstab if mount points are specified in .wks. After partition images are created the original fstab is restored. However, if exception is raised when partition image being prepared wic doesn't restore original fstab. This can cause duplication of added lines in fstab when 'wic create' runs next time.

Wrapping call of 'prepare' method and restoring original fstab even if exception occurs should fix this.

[YOCTO #11633]

---
 scripts/lib/wic/plugins/imager/direct.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
scripts/lib/wic/plugins/imager/direct.py +5 -4
index e09350b..e26defb 100644
@@ -172,10 +172,11 @@ class DirectPlugin(ImagerPlugin):
                     if rsize_bb:
                         part.size = int(round(float(rsize_bb)))
 
-        self._image.prepare(self)
-
-        if fstab_path:
-            shutil.move(fstab_path + ".orig", fstab_path)
+        try:
+            self._image.prepare(self)
+        finally:
+            if fstab_path:
+                shutil.move(fstab_path + ".orig", fstab_path)
 
         self._image.layout_partitions()
         self._image.create()
Signature · 1 line
2.1.4