mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-26 01:37:04 +00:00
Added cp-R, added support for devtmpfs
This commit is contained in:
@@ -177,6 +177,27 @@ class SubprocessMixin:
|
||||
# don't believe it
|
||||
self.check_call(cmd, vmode=self.V1)
|
||||
|
||||
def cpR(self, srcRoot, dstRoot):
|
||||
srcRoot = os.path.abspath(srcRoot)
|
||||
dstRoot = os.path.abspath(dstRoot)
|
||||
dstRoot = os.path.join(dstRoot, os.path.split(srcRoot)[1])
|
||||
for r, dl, fl in os.walk(srcRoot):
|
||||
|
||||
for de in dl:
|
||||
src = os.path.join(r, de)
|
||||
subdir = src[len(srcRoot)+1:]
|
||||
dst = os.path.join(dstRoot, subdir)
|
||||
if not os.path.exists(dst):
|
||||
self.log.debug("+ /bin/mkdir -p %s", dst)
|
||||
os.mkdirs(dst)
|
||||
|
||||
for fe in fl:
|
||||
src = os.path.join(r, de)
|
||||
subdir = src[len(srcRoot)+1:]
|
||||
dst = os.path.join(dstRoot, subdir)
|
||||
self.log.debug("+ /bin/cp -a %s %s", src, dst)
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
class TempdirContext(SubprocessMixin):
|
||||
|
||||
def __init__(self, prefix=None, suffix=None, chroot=None, log=None):
|
||||
@@ -678,6 +699,7 @@ class InitrdContext(SubprocessMixin):
|
||||
self.ilog.setLevel(logging.INFO)
|
||||
self.log = self.hlog
|
||||
|
||||
self._hasDevTmpfs = False
|
||||
self._detachInitrd = None
|
||||
|
||||
def _unpack(self):
|
||||
@@ -739,27 +761,28 @@ class InitrdContext(SubprocessMixin):
|
||||
else:
|
||||
self.unlink(dst)
|
||||
|
||||
for e in os.listdir("/dev"):
|
||||
src = os.path.join("/dev", e)
|
||||
dst = os.path.join(dev2, e)
|
||||
if os.path.islink(src):
|
||||
self.symlink(os.readlink(src), dst)
|
||||
elif os.path.isdir(src):
|
||||
self.mkdir(dst)
|
||||
elif os.path.isfile(src):
|
||||
self.copy2(src, dst)
|
||||
else:
|
||||
st = os.stat(src)
|
||||
if stat.S_ISBLK(st.st_mode):
|
||||
maj, min = os.major(st.st_rdev), os.minor(st.st_rdev)
|
||||
self.log.debug("+ mknod %s b %d %d", dst, maj, min)
|
||||
os.mknod(dst, st.st_mode, st.st_rdev)
|
||||
elif stat.S_ISCHR(st.st_mode):
|
||||
maj, min = os.major(st.st_rdev), os.minor(st.st_rdev)
|
||||
self.log.debug("+ mknod %s c %d %d", dst, maj, min)
|
||||
os.mknod(dst, st.st_mode, st.st_rdev)
|
||||
if not self._hasDevTmpfs:
|
||||
for e in os.listdir("/dev"):
|
||||
src = os.path.join("/dev", e)
|
||||
dst = os.path.join(dev2, e)
|
||||
if os.path.islink(src):
|
||||
self.symlink(os.readlink(src), dst)
|
||||
elif os.path.isdir(src):
|
||||
self.mkdir(dst)
|
||||
elif os.path.isfile(src):
|
||||
self.copy2(src, dst)
|
||||
else:
|
||||
self.log.debug("skipping device %s", src)
|
||||
st = os.stat(src)
|
||||
if stat.S_ISBLK(st.st_mode):
|
||||
maj, min = os.major(st.st_rdev), os.minor(st.st_rdev)
|
||||
self.log.debug("+ mknod %s b %d %d", dst, maj, min)
|
||||
os.mknod(dst, st.st_mode, st.st_rdev)
|
||||
elif stat.S_ISCHR(st.st_mode):
|
||||
maj, min = os.major(st.st_rdev), os.minor(st.st_rdev)
|
||||
self.log.debug("+ mknod %s c %d %d", dst, maj, min)
|
||||
os.mknod(dst, st.st_mode, st.st_rdev)
|
||||
else:
|
||||
self.log.debug("skipping device %s", src)
|
||||
|
||||
dst = os.path.join(self.dir, "dev/pts")
|
||||
if not os.path.exists(dst):
|
||||
@@ -772,6 +795,11 @@ class InitrdContext(SubprocessMixin):
|
||||
|
||||
def __enter__(self):
|
||||
|
||||
with open("/proc/filesystems") as fd:
|
||||
buf = fd.read()
|
||||
if "devtmpfs" in buf:
|
||||
self._hasDevTmpfs = True
|
||||
|
||||
if self.initrd is not None:
|
||||
|
||||
self.log.debug("extracting initrd %s", self.initrd)
|
||||
@@ -792,6 +820,16 @@ class InitrdContext(SubprocessMixin):
|
||||
cmd = ('mount', '-t', 'sysfs', 'sysfs', dst,)
|
||||
self.check_call(cmd, vmode=self.V1)
|
||||
|
||||
# maybe mount devtmpfs
|
||||
if self._hasDevTmpfs:
|
||||
dst = os.path.join(self.dir, "dev")
|
||||
cmd = ('mount', '-t', 'devtmpfs', 'devtmpfs', dst,)
|
||||
self.check_call(cmd, vmode=self.V1)
|
||||
|
||||
dst = os.path.join(self.dir, "dev/pts")
|
||||
if not os.path.exists(dst):
|
||||
self.mkdir(dst)
|
||||
|
||||
dst = os.path.join(self.dir, "dev/pts")
|
||||
cmd = ('mount', '-t', 'devpts', 'devpts', dst,)
|
||||
self.check_call(cmd, vmode=self.V1)
|
||||
|
||||
Reference in New Issue
Block a user