def _runFitShell(self, device): with UbootInitrdContext(path=device, log=self.log) as ctx: return self._runInitrdShell(ctx.initrd)
def __enter__(self): self.pm = ProcMountsParser() self.blkid = BlkidParser(log=self.log.getChild("blkid")) self.mtd = ProcMtdParser(log=self.log.getChild("mtd")) def _g(d): pat = os.path.join(d, "onie/initrd.img*") l = glob.glob(pat) if l: return l[0] return None # try to find a mounted, labeled partition try: dev = self.blkid['ONIE-BOOT'].device except IndexError: dev = None if dev is not None: self.log.debug("found ONIE boot device %s", dev) parts = [p for p in self.pm.mounts if p.device == dev] if parts: self.log.debug("found ONIE boot mounted at %s", parts[0].dir) initrd = _g(parts[0].dir) if initrd is None: raise ValueError("cannot find ONIE initrd on %s" % parts[0].dir) self.onieDir = parts[0].dir self.log.debug("found ONIE initrd at %s", initrd) with InitrdContext(initrd=initrd, log=self.log) as self.ictx: self.initrd = initrd self.initrdDir = self.ictx.dir self.ictx.detach() return self # else, try to mount the directory containing the initrd with MountContext(dev, log=self.log) as self.dctx: initrd = _g(self.dctx.dir) if initrd is None: raise ValueError("cannot find ONIE initrd on %s" % dev) self.onieDir = self.dctx.dir self.dctx.detach() self.log.debug("found ONIE initrd at %s", initrd) with InitrdContext(initrd=initrd, log=self.log) as self.ictx: self.initrd = initrd self.initrdDir = self.ictx.dir self.ictx.detach() return self raise ValueError("cannot find an ONIE initrd") # try to find onie initrd on a mounted fs (GRUB); # for ONIE images this is usually /mnt/onie-boot for part in self.pm.mounts: if not part.device.startswith('/dev/'): continue initrd = _g(part.dir) if initrd is None: self.log.debug("cannot find ONIE initrd on %s (%s)", part.device, part.dir) else: self.onieDir = part.dir self.log.debug("found ONIE initrd at %s", initrd) with InitrdContext(initrd=initrd, log=self.log) as self.ictx: self.initrd = initrd self.initrdDir = self.ictx.dir self.ictx.detach() return self # grovel through MTD devices (u-boot) parts = [p for p in self.mtd.parts if p.label == "onie"] if parts: part = parts[0] self.log.debug("found ONIE MTD device %s", part.charDevice or part.blockDevice) 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() self.initrdDir = self.ictx.dir self.ictx.detach() return self if self.mtd.mounts: raise ValueError("cannot find ONIE MTD device") raise ValueError("cannot find ONIE initrd")