author | Tero Marttila <terom@paivola.fi> |
Tue, 14 Feb 2012 19:38:32 +0200 | |
changeset 10 | 724a90bd77b5 |
parent 5 | 23371d26fdd0 |
child 33 | 2de09042414f |
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 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
from pvl.backup.invoke import command |
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 |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
import os.path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
import logging |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
log = logging.getLogger('pvl.backup.mount') |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
|
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 |
class MountError (Exception) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
pass |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
class Mount (object) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
Trivial filesystem mounting |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
""" |
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 |
MOUNT = '/bin/mount' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
UMOUNT = '/bin/umount' |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
|
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 |
def __init__ (self, dev, mnt, readonly=False) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
dev - device path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
mnt - mount path |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
readonly - mount readonly |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
self.dev = dev |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
self.mnt = mnt |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
self.readonly = readonly |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
@property |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
def path (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
return self.mnt |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
def options (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
Mount options as a comma-separated string. |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
""" |
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 |
options = [ |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
('ro' if self.readonly else None), |
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 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
return ','.join(option for option in options if option) |
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 |
def open (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
Mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
""" |
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 |
# check |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
if not os.path.isdir(self.mnt) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
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
|
60 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
if os.path.ismount(self.mnt) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
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
|
63 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
if not os.path.exists(self.dev) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
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
|
66 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
# mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
command(self.MOUNT, self.dev, self.mnt, options=self.options()) |
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 |
def close (self) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
Un-mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
""" |
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 |
# check |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
if not os.path.ismount(self.mnt): |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
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
|
78 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
# umount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
command(self.UMOUNT, self.mnt) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
|
10 | 82 |
def __repr__ (self) : |
83 |
return "Mount(dev={dev}, mnt={mnt})".format( |
|
84 |
dev = repr(self.dev), |
|
85 |
mnt = repr(self.mnt), |
|
86 |
) |
|
87 |
||
88 |
def __str__ (self) : |
|
89 |
return self.mnt |
|
90 |
||
5
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
@contextlib.contextmanager |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
92 |
def mount (dev, mnt, **kwargs) : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
93 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
94 |
Use a temporary mount: |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
95 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
with mount('/dev/...', '/mnt', readonly=True) as mount: |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
... |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
""" |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
99 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
mount = Mount(dev, mnt, **kwargs) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
101 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
102 |
# open |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
log.debug("open: %s", mount) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
mount.open() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
105 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
106 |
try : |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
log.debug("got: %s", mount) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
108 |
yield mount |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
finally: |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
# cleanup |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
112 |
log.debug("cleanup: %s", mount) |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
113 |
mount.close() |
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
114 |
|
23371d26fdd0
split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
115 |