1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
from __future__ import division
import os
import statvfs
def get_mount_info(mounts_file, statvfs_, filesystems_whitelist=None):
"""
Given a mounts file (e.g., /proc/mounts), generate dicts with the following
keys:
@param filesystems_whitelist: if provided, the list of file systems which
we're allowed to stat.
- device: The device file which is mounted.
- mount-point: The path at which the filesystem is mounted.
- filesystem: The filesystem type.
- total-space: The capacity of the filesystem in megabytes.
- free-space: The amount of space available in megabytes.
"""
for line in open(mounts_file):
try:
device, mount_point, filesystem = line.split()[:3]
mount_point = mount_point.decode("string-escape")
except ValueError:
continue
if (filesystems_whitelist is not None and
filesystem not in filesystems_whitelist):
continue
megabytes = 1024 * 1024
stats = statvfs_(mount_point)
block_size = stats[statvfs.F_BSIZE]
total_space = (stats[statvfs.F_BLOCKS] * block_size) // megabytes
free_space = (stats[statvfs.F_BFREE] * block_size) // megabytes
yield {"device": device, "mount-point": mount_point,
"filesystem": filesystem, "total-space": total_space,
"free-space": free_space}
def get_filesystem_for_path(path, mounts_file, statvfs_,
filesystems_whitelist=None):
candidate = None
path = os.path.realpath(path)
path_segments = path.split("/")
for info in get_mount_info(mounts_file, statvfs_, filesystems_whitelist):
mount_segments = info["mount-point"].split("/")
if path.startswith(info["mount-point"]):
if ((not candidate)
or path_segments[:len(mount_segments)] == mount_segments):
candidate = info
return candidate
|