diff --git a/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py b/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py index a831d20b..ddf82f2a 100644 --- a/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py @@ -10,7 +10,7 @@ import tempfile import string import shutil -import Fit +import Fit, Legacy class SubprocessMixin: @@ -879,16 +879,16 @@ class InitrdContext(SubprocessMixin): # (it's inside this chroot anyway) return initrdDir -class FitInitrdContext(SubprocessMixin): +class UbootInitrdContext(SubprocessMixin): def __init__(self, path, log=None): - self.fitPath = path + self.path = path self.log = log or logging.getLogger(self.__class__.__name__) self.initrd = self.__initrd = None - def __enter__(self): - self.log.debug("parsing FIT image in %s", self.fitPath) - p = Fit.Parser(path=self.fitPath, log=self.log) + def _extractFit(self): + self.log.debug("parsing FIT image in %s", self.path) + p = Fit.Parser(path=self.path, log=self.log) node = p.getInitrdNode() if node is None: raise ValueError("cannot find initrd node in FDT") @@ -896,7 +896,7 @@ class FitInitrdContext(SubprocessMixin): if prop is None: raise ValueError("cannot find initrd data property in FDT") - with open(self.fitPath) as fd: + with open(self.path) as fd: self.log.debug("reading initrd at [%x:%x]", prop.offset, prop.offset+prop.sz) fd.seek(prop.offset, 0) @@ -907,7 +907,47 @@ class FitInitrdContext(SubprocessMixin): self.log.debug("+ cat > %s", self.initrd) with os.fdopen(fno, "w") as fd: fd.write(buf) - return self + + def _extractLegacy(self): + self.log.debug("parsing legacy U-Boot image in %s", self.path) + p = Legacy.Parser(path=self.path, log=self.log) + + if p.ih_type != Legacy.Parser.IH_TYPE_MULTI: + raise ValueError("not a multi-file image") + + if p.ih_os != Legacy.Parser.IH_OS_LINUX: + raise ValueError("invalid OS code") + + sz, off = p.images[1] + # assume the initrd is the second of three images + + with open(self.path) as fd: + self.log.debug("reading initrd at [%x:%x]", + off, off+sz) + fd.seek(off, 0) + buf = fd.read(sz) + + fno, self.initrd = tempfile.mkstemp(prefix="initrd-", + suffix=".img") + self.log.debug("+ cat > %s", self.initrd) + with os.fdopen(fno, "w") as fd: + fd.write(buf) + + def __enter__(self): + + with open(path=self.path) as fd: + isFit = Fit.Parser.isFit(fd) + isLegacy = Legacy.Parser.isLegacy(fd) + + if isFit: + self._extractFit() + return self + + if isLegacy: + self._extractLegacy() + return self + + raise ValueError("invalid U-Boot image %s" % self.path) def shutdown(self): initrd, self.initrd = self.initrd, None diff --git a/packages/base/all/vendor-config-onl/src/python/onl/install/ShellApp.py b/packages/base/all/vendor-config-onl/src/python/onl/install/ShellApp.py index fe534512..8490325d 100644 --- a/packages/base/all/vendor-config-onl/src/python/onl/install/ShellApp.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/install/ShellApp.py @@ -13,7 +13,7 @@ from InstallUtils import InitrdContext, MountContext from InstallUtils import SubprocessMixin from InstallUtils import ProcMountsParser, ProcMtdParser from InstallUtils import BlkidParser -from InstallUtils import FitInitrdContext +from InstallUtils import UbootInitrdContext import onl.platform.current from onl.sysconfig import sysconfig @@ -47,7 +47,7 @@ class AppBase(SubprocessMixin, object): return 0 def _runFitShell(self, device): - with FitInitrdContext(path=device, log=self.log) as ctx: + with UbootInitrdContext(path=device, log=self.log) as ctx: return self._runInitrdShell(ctx.initrd) def shutdown(self): @@ -174,7 +174,7 @@ class OnieBootContext: part = parts[0] self.log.debug("found ONIE MTD device %s", part.charDevice or part.blockDevice) - with FitInitrdContext(part.blockDevice, log=self.log) as self.fctx: + with UbootInitrdContext(part.blockDevice, log=self.log) as self.fctx: with InitrdContext(initrd=self.fctx.initrd, log=self.log) as self.ictx: self.initrd = self.fctx.initrd self.fctx.detach()