author | Tero Marttila <terom@paivola.fi> |
Sat, 16 Feb 2013 21:41:42 +0200 | |
changeset 69 | 468704db09c4 |
parent 33 | 2de09042414f |
child 78 | 5698225aab66 |
permissions | -rw-r--r-- |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
Mount filesystems. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
5 |
from pvl.backup.invoke import invoke, optargs, command |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
import contextlib |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
8 |
import os, os.path |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
import logging |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
10 |
import tempfile |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
log = logging.getLogger('pvl.backup.mount') |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
class MountError (Exception) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
pass |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
class Mount (object) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
Trivial filesystem mounting |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
MOUNT = '/bin/mount' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
UMOUNT = '/bin/umount' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
|
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
27 |
def __init__ (self, dev, mnt, readonly=False, sudo=None) : |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
dev - device path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
mnt - mount path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
readonly - mount readonly |
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
32 |
sudo - invoke sudo |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
self.dev = dev |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
self.mnt = mnt |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
self.readonly = readonly |
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
38 |
self.sudo = sudo |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
@property |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
def path (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
return self.mnt |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
def options (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
Mount options as a comma-separated string. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
options = [ |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
('ro' if self.readonly else None), |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
] |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
return ','.join(option for option in options if option) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
def open (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
Mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
# check |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
if not os.path.isdir(self.mnt) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
raise MountError("Mountpoint is not a directory: {mnt}".format(mnt=self.mnt)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
if os.path.ismount(self.mnt) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
raise MountError("Mountpoint is already mounted: {mnt}".format(mnt=self.mnt)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
if not os.path.exists(self.dev) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
raise MountError("Device does not exist: {dev}".format(dev=self.dev)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
# mount |
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
71 |
invoke(self.MOUNT, optargs(self.dev, self.mnt, options=self.options()), sudo=self.sudo) |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
def close (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
Un-mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
# check |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
if not os.path.ismount(self.mnt): |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
raise MountError("Mountpoint is not mounted: {mnt}".format(mnt=self.mnt)) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
# umount |
69
468704db09c4
pvl.backup.mount/lvm: implement optional sudo invoke
Tero Marttila <terom@paivola.fi>
parents:
33
diff
changeset
|
83 |
invoke(self.UMOUNT, optargs(self.mnt), sudo=self.sudo) |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
|
10 | 85 |
def __repr__ (self) : |
86 |
return "Mount(dev={dev}, mnt={mnt})".format( |
|
87 |
dev = repr(self.dev), |
|
88 |
mnt = repr(self.mnt), |
|
89 |
) |
|
90 |
||
91 |
def __str__ (self) : |
|
92 |
return self.mnt |
|
93 |
||
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
94 |
@contextlib.contextmanager |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
95 |
def mount (dev, mnt=None, name_hint='tmp', **kwargs) : |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
Use a temporary mount: |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
|
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
99 |
with mount('/dev/...', readonly=True) as mount: |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
... |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
101 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
102 |
Mounts at the given mountpoint path, or a tempdir |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
|
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
105 |
if mnt is None : |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
106 |
mnt = tmpdir = tempfile.mkdtemp(suffix='.mnt', prefix=name_hint) |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
|
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
108 |
log.debug("using tmp mnt: %s", tmpdir) |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
|
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
110 |
else : |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
111 |
tmpdir = None |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
112 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
113 |
log.debug("mount: %s -> %s", dev, mnt) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
114 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
115 |
# with tempdir |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
116 |
try : |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
117 |
mount = Mount(dev, mnt, **kwargs) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
118 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
119 |
# open |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
120 |
log.debug("open: %s", mount) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
121 |
mount.open() |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
122 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
123 |
try : |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
124 |
log.debug("got: %s", mount) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
125 |
yield mount |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
126 |
|
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
127 |
finally: |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
128 |
# cleanup |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
129 |
log.debug("cleanup: %s", mount) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
130 |
mount.close() |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
131 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
132 |
finally: |
33
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
133 |
if tmpdir : |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
134 |
# cleanup |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
135 |
log.debug("cleanup tmp mnt: %s", tmpdir) |
2de09042414f
mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents:
10
diff
changeset
|
136 |
os.rmdir(tmpdir) |
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |