mirror of
				https://github.com/Telecominfraproject/OpenNetworkLinux.git
				synced 2025-11-03 19:58:20 +00:00 
			
		
		
		
	RFS Management Enhancements
This is a baby step in reorganizing the RFS tools to support arbitrary automation and modification after
the initial multistrap configuration has been performed.
- All RFS modifications are now done under the new OnlRfsContext object.
  - This object mounts/unmounts /dev and /proc
  - This object installs and removes the local resolv.conf so network operations
    can be performed in the chroot context.
			
			
This commit is contained in:
		@@ -243,6 +243,37 @@ class OnlMultistrapConfig(object):
 | 
			
		||||
        return handle.getvalue()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OnlRfsContext(object):
 | 
			
		||||
    def __init__(self, directory):
 | 
			
		||||
        self.directory = directory
 | 
			
		||||
        self.dev = os.path.join(self.directory, "dev")
 | 
			
		||||
        self.proc = os.path.join(self.directory, "proc")
 | 
			
		||||
        self.resolv = os.path.join(self.directory, "etc", "resolv.conf")
 | 
			
		||||
        self.resolvb = "%s.backup" % self.resolv
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        onlu.execute("sudo mount -t devtmpfs dev %s" % self.dev,
 | 
			
		||||
                     ex=OnlRfsError("Could not mount dev in rfs."))
 | 
			
		||||
        onlu.execute("sudo mount -t proc proc %s" % self.proc,
 | 
			
		||||
                     ex=OnlRfsError("Could not mount proc in rfs."))
 | 
			
		||||
        if os.path.islink(self.resolv) or os.path.exists(self.resolv):
 | 
			
		||||
            onlu.execute("sudo mv %s %s" % (self.resolv, self.resolvb),
 | 
			
		||||
                         ex=OnlRfsError("Could not backup %s" % (self.resolv)))
 | 
			
		||||
        onlu.execute("sudo cp /etc/resolv.conf %s" % (self.resolv),
 | 
			
		||||
                     ex=OnlRfsError("Could not copy resolv.conf"))
 | 
			
		||||
        return self
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, eType, eValue, eTrace):
 | 
			
		||||
        onlu.execute("sudo umount -l %s %s" % (self.dev, self.proc),
 | 
			
		||||
                     ex=OnlRfsError("Could not unmount dev and proc"))
 | 
			
		||||
        onlu.execute("sudo rm %s" % (self.resolv),
 | 
			
		||||
                     ex=OnlRfsError("Could not remove resolv.conf"))
 | 
			
		||||
 | 
			
		||||
        if os.path.islink("%s" % self.resolvb) or os.path.exists(resolvb):
 | 
			
		||||
            onlu.execute("sudo mv %s %s" % (self.resolvb, self.resolv),
 | 
			
		||||
                         ex=OnlRfsError("Could not restore the resolv.conf backup"))
 | 
			
		||||
 | 
			
		||||
class OnlRfsBuilder(object):
 | 
			
		||||
 | 
			
		||||
    DEFAULTS = dict(
 | 
			
		||||
@@ -368,13 +399,7 @@ rm -f /usr/sbin/policy-rc.d
 | 
			
		||||
 | 
			
		||||
    def configure(self, dir_):
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t devtmpfs dev %s" % os.path.join(dir_, "dev"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount dev in new filesystem."))
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t proc proc %s" % os.path.join(dir_, "proc"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount proc in new filesystem."))
 | 
			
		||||
        with OnlRfsContext(dir_):
 | 
			
		||||
 | 
			
		||||
            if not os.getenv('NO_DPKG_CONFIGURE'):
 | 
			
		||||
                self.dpkg_configure(dir_)
 | 
			
		||||
@@ -393,6 +418,11 @@ rm -f /usr/sbin/policy-rc.d
 | 
			
		||||
 | 
			
		||||
            Configure = self.config.get('Configure', None)
 | 
			
		||||
            if Configure:
 | 
			
		||||
 | 
			
		||||
                for cmd in Configure.get('run', []):
 | 
			
		||||
                    onlu.execute("sudo chroot %s %s" % (dir_, cmd),
 | 
			
		||||
                                 ex=OnlRfsError("run command '%s' failed" % cmd))
 | 
			
		||||
 | 
			
		||||
                for overlay in Configure.get('overlays', []):
 | 
			
		||||
                    logger.info("Overlay %s..." % overlay)
 | 
			
		||||
                    onlu.execute('tar -C %s -c --exclude "*~" . | sudo tar -C %s -x -v --no-same-owner' % (overlay, dir_),
 | 
			
		||||
@@ -552,22 +582,11 @@ rm -f /usr/sbin/policy-rc.d
 | 
			
		||||
                    onlu.execute("sudo chmod a-w %s" % fn)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        finally:
 | 
			
		||||
            onlu.execute("sudo umount -l %s %s" % (os.path.join(dir_, "dev"), os.path.join(dir_, "proc")))
 | 
			
		||||
 | 
			
		||||
    def update(self, dir_, packages):
 | 
			
		||||
 | 
			
		||||
        ONLPM = "%s/tools/onlpm.py" % os.getenv('ONL')
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t devtmpfs dev %s" % os.path.join(dir_, "dev"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount dev in new filesystem."))
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t proc proc %s" % os.path.join(dir_, "proc"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount proc in new filesystem."))
 | 
			
		||||
 | 
			
		||||
        with OnlRfsContext(dir_):
 | 
			
		||||
            for pspec in packages:
 | 
			
		||||
                for pkg in pspec.split(','):
 | 
			
		||||
                    logger.info("updating %s into %s", pkg, dir_)
 | 
			
		||||
@@ -577,21 +596,11 @@ rm -f /usr/sbin/policy-rc.d
 | 
			
		||||
                    onlu.execute(cmd,
 | 
			
		||||
                                 ex=OnlRfsError("update of %s failed" % pkg))
 | 
			
		||||
 | 
			
		||||
        finally:
 | 
			
		||||
            onlu.execute("sudo umount -l %s %s" % (os.path.join(dir_, "dev"), os.path.join(dir_, "proc")))
 | 
			
		||||
 | 
			
		||||
    def install(self, dir_, packages):
 | 
			
		||||
 | 
			
		||||
        ONLPM = "%s/tools/onlpm.py" % os.getenv('ONL')
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t devtmpfs dev %s" % os.path.join(dir_, "dev"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount dev in new filesystem."))
 | 
			
		||||
 | 
			
		||||
            onlu.execute("sudo mount -t proc proc %s" % os.path.join(dir_, "proc"),
 | 
			
		||||
                         ex=OnlRfsError("Could not mount proc in new filesystem."))
 | 
			
		||||
 | 
			
		||||
        with OnlRfsContext(dir_):
 | 
			
		||||
            for pspec in packages:
 | 
			
		||||
                for pkg in pspec.split(','):
 | 
			
		||||
 | 
			
		||||
@@ -623,9 +632,6 @@ rm -f /usr/sbin/policy-rc.d
 | 
			
		||||
                                 chroot=dir_,
 | 
			
		||||
                                 ex=OnlRfsError("install of %s failed" % pkg))
 | 
			
		||||
 | 
			
		||||
        finally:
 | 
			
		||||
            onlu.execute("sudo umount -l %s %s" % (os.path.join(dir_, "dev"), os.path.join(dir_, "proc")))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user