diff options
| author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2017-06-13 14:21:56 +0300 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-06-14 10:18:29 +0100 |
| commit | 6f1b89c224f0ea4ecf45cf0ef7a8927c5c88d763 (patch) | |
| tree | b37d2a863bd016da6cbdc610795966234f23bc81 /scripts/lib/wic/engine.py | |
| parent | 746351100ef860d3438e93683dc2ed4ba8d213e8 (diff) | |
| download | poky-6f1b89c224f0ea4ecf45cf0ef7a8927c5c88d763.tar.gz | |
engine: implement listing wic images
Implemented 'wic ls' functionality:
- list image partitions
- list directory content of vfat partitions
[YOCTO #11283]
(From OE-Core rev: 61667fabd5746caf773f73b3aeb2a04db13cba38)
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/wic/engine.py')
| -rw-r--r-- | scripts/lib/wic/engine.py | 84 |
1 files changed, 82 insertions, 2 deletions
diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py index e58beb7dce..95c8d1cc22 100644 --- a/scripts/lib/wic/engine.py +++ b/scripts/lib/wic/engine.py | |||
| @@ -30,10 +30,15 @@ | |||
| 30 | 30 | ||
| 31 | import logging | 31 | import logging |
| 32 | import os | 32 | import os |
| 33 | import tempfile | ||
| 34 | |||
| 35 | from collections import namedtuple, OrderedDict | ||
| 36 | from distutils.spawn import find_executable | ||
| 33 | 37 | ||
| 34 | from wic import WicError | 38 | from wic import WicError |
| 39 | from wic.filemap import sparse_copy | ||
| 35 | from wic.pluginbase import PluginMgr | 40 | from wic.pluginbase import PluginMgr |
| 36 | from wic.utils.misc import get_bitbake_var | 41 | from wic.utils.misc import get_bitbake_var, exec_cmd |
| 37 | 42 | ||
| 38 | logger = logging.getLogger('wic') | 43 | logger = logging.getLogger('wic') |
| 39 | 44 | ||
| @@ -225,9 +230,84 @@ def wic_list(args, scripts_path): | |||
| 225 | 230 | ||
| 226 | return False | 231 | return False |
| 227 | 232 | ||
| 233 | |||
| 234 | class Disk: | ||
| 235 | def __init__(self, imagepath, native_sysroot): | ||
| 236 | self.imagepath = imagepath | ||
| 237 | self.native_sysroot = native_sysroot | ||
| 238 | self._partitions = None | ||
| 239 | self._mdir = None | ||
| 240 | self._partimages = {} | ||
| 241 | |||
| 242 | # find parted | ||
| 243 | self.paths = "/bin:/usr/bin:/usr/sbin:/sbin/" | ||
| 244 | if native_sysroot: | ||
| 245 | for path in self.paths.split(':'): | ||
| 246 | self.paths = "%s%s:%s" % (native_sysroot, path, self.paths) | ||
| 247 | |||
| 248 | self.parted = find_executable("parted", self.paths) | ||
| 249 | if not self.parted: | ||
| 250 | raise WicError("Can't find executable parted") | ||
| 251 | |||
| 252 | def __del__(self): | ||
| 253 | for path in self._partimages.values(): | ||
| 254 | os.unlink(path) | ||
| 255 | |||
| 256 | @property | ||
| 257 | def partitions(self): | ||
| 258 | if self._partitions is None: | ||
| 259 | self._partitions = OrderedDict() | ||
| 260 | out = exec_cmd("%s -sm %s unit B print" % (self.parted, self.imagepath)) | ||
| 261 | parttype = namedtuple("Part", "pnum start end size fstype") | ||
| 262 | for line in out.splitlines()[2:]: | ||
| 263 | pnum, start, end, size, fstype = line.split(':')[:5] | ||
| 264 | partition = parttype(pnum, int(start[:-1]), int(end[:-1]), | ||
| 265 | int(size[:-1]), fstype) | ||
| 266 | self._partitions[pnum] = partition | ||
| 267 | |||
| 268 | return self._partitions | ||
| 269 | |||
| 270 | @property | ||
| 271 | def mdir(self): | ||
| 272 | if self._mdir is None: | ||
| 273 | self._mdir = find_executable("mdir", self.paths) | ||
| 274 | if not self._mdir: | ||
| 275 | raise WicError("Can't find executable mdir") | ||
| 276 | return self._mdir | ||
| 277 | |||
| 278 | def _get_part_image(self, pnum): | ||
| 279 | if pnum not in self.partitions: | ||
| 280 | raise WicError("Partition %s is not in the image") | ||
| 281 | part = self.partitions[pnum] | ||
| 282 | if not part.fstype.startswith("fat"): | ||
| 283 | raise WicError("Not supported fstype: {}".format(part.fstype)) | ||
| 284 | if pnum not in self._partimages: | ||
| 285 | tmpf = tempfile.NamedTemporaryFile(prefix="wic-part") | ||
| 286 | dst_fname = tmpf.name | ||
| 287 | tmpf.close() | ||
| 288 | sparse_copy(self.imagepath, dst_fname, skip=part.start, length=part.size) | ||
| 289 | self._partimages[pnum] = dst_fname | ||
| 290 | |||
| 291 | return self._partimages[pnum] | ||
| 292 | |||
| 293 | def dir(self, pnum, path): | ||
| 294 | return exec_cmd("{} -i {} ::{}".format(self.mdir, | ||
| 295 | self._get_part_image(pnum), | ||
| 296 | path)) | ||
| 297 | |||
| 228 | def wic_ls(args, native_sysroot): | 298 | def wic_ls(args, native_sysroot): |
| 229 | """List contents of partitioned image or vfat partition.""" | 299 | """List contents of partitioned image or vfat partition.""" |
| 230 | pass | 300 | disk = Disk(args.path.image, native_sysroot) |
| 301 | if not args.path.part: | ||
| 302 | if disk.partitions: | ||
| 303 | print('Num Start End Size Fstype') | ||
| 304 | for part in disk.partitions.values(): | ||
| 305 | print("{:2s} {:12d} {:12d} {:12d} {}".format(\ | ||
| 306 | part.pnum, part.start, part.end, | ||
| 307 | part.size, part.fstype)) | ||
| 308 | else: | ||
| 309 | path = args.path.path or '/' | ||
| 310 | print(disk.dir(args.path.part, path)) | ||
| 231 | 311 | ||
| 232 | def find_canned(scripts_path, file_name): | 312 | def find_canned(scripts_path, file_name): |
| 233 | """ | 313 | """ |
