summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2012-06-08 18:02:45 -0700
committerJoshua Harlow <harlowja@yahoo-inc.com>2012-06-08 18:02:45 -0700
commit5b99f3b79dfab917a1672b8c5a882fd51351964c (patch)
tree696d6284016c7954ca57a2b152ecffe05a937806
parent1173fdf9e5cc6ae931a2001e1bb2b56ee2981157 (diff)
downloadvyos-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.py51
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