diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-06-08 18:02:45 -0700 |
---|---|---|
committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-06-08 18:02:45 -0700 |
commit | 5b99f3b79dfab917a1672b8c5a882fd51351964c (patch) | |
tree | 696d6284016c7954ca57a2b152ecffe05a937806 | |
parent | 1173fdf9e5cc6ae931a2001e1bb2b56ee2981157 (diff) | |
download | vyos-cloud-init-5b99f3b79dfab917a1672b8c5a882fd51351964c.tar.gz vyos-cloud-init-5b99f3b79dfab917a1672b8c5a882fd51351964c.zip |
Moved some of the mounting logic here. Also introduced a context manager which will help unmount.
-rw-r--r-- | cloudinit/mounting.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/cloudinit/mounting.py b/cloudinit/mounting.py new file mode 100644 index 00000000..b72f729a --- /dev/null +++ b/cloudinit/mounting.py @@ -0,0 +1,51 @@ +import contextlib + +from cloudinit import util + + +class MountFailedError(Exception): + pass + + +@contextlib.contextmanager +def unmounter(umount): + try: + yield umount + finally: + if umount: + sh.subp(["umount", '-l', umount]) + + +def mount_callback_umount(device, callback, data=None): + """ + mount the device, call method 'callback' passing the directory + in which it was mounted, then unmount. Return whatever 'callback' + returned. If data != None, also pass data to callback. + """ + + # go through mounts to see if it was already mounted + mounts = sh.load_file("/proc/mounts").splitlines() + mounted = {} + for mpline in mounts: + (dev, mp, fstype, _opts, _freq, _passno) = mpline.split() + mp = mp.replace("\\040", " ") + mounted[dev] = (dev, fstype, mp, False) + + with util.tempdir() as tmpd: + umount = False + if device in mounted: + mountpoint = "%s/" % mounted[device][2] + else: + try: + mountcmd = ["mount", "-o", "ro", device, tmpd] + util.subp(mountcmd) + umount = tmpd + except IOError as exc: + raise MountFailedError("%s" % (exc)) + mountpoint = "%s/" % tmpd + with unmounter(umount): + if data is None: + ret = callback(mountpoint) + else: + ret = callback(mountpoint, data) + return ret |