~free.ekanayaka/landscape-client/karmic-1.5.4-0ubuntu0.9.10.0

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from __future__ import division

import os

from twisted.internet.defer import succeed

from landscape.lib.disk import get_mount_info, get_filesystem_for_path


# List of filesystem types authorized when generating disk use statistics.
STABLE_FILESYSTEMS = set(
    ["ext", "ext2", "ext3", "ext4", "reiserfs", "ntfs", "msdos", "dos", "vfat",
     "xfs", "hpfs", "jfs", "ufs", "hfs", "hfsplus"])


def format_megabytes(megabytes):
    if megabytes >= 1024*1024:
        return "%.2fTB" % (megabytes/(1024*1024))
    elif megabytes >= 1024:
        return "%.2fGB" % (megabytes/1024)
    else:
        return "%dMB" % (megabytes)


def usage(info):
    total = info["total-space"]
    used = total - info["free-space"]
    return "%0.1f%% of %s" % ((used / total) * 100, format_megabytes(total))


class Disk(object):

    def __init__(self, mounts_file="/proc/mounts", statvfs=os.statvfs):
        self._mounts_file = mounts_file
        self._statvfs = statvfs

    def register(self, sysinfo):
        self._sysinfo = sysinfo

    def run(self):
        main_info = get_filesystem_for_path("/home", self._mounts_file,
                                            self._statvfs, STABLE_FILESYSTEMS)
        if main_info is not None:
            total = main_info["total-space"]
            if total <= 0:
                root_main_info = get_filesystem_for_path(
                    "/", self._mounts_file, self._statvfs, STABLE_FILESYSTEMS)
                if root_main_info is not None:
                    total = root_main_info["total-space"]
                    main_info = root_main_info
            if total <= 0:
                main_usage = "unknown"
            else:
                main_usage = usage(main_info)
            self._sysinfo.add_header("Usage of " + main_info["mount-point"],
                                     main_usage)
        else:
            self._sysinfo.add_header("Usage of /home", "unknown")

        seen_mounts = set()
        seen_devices = set()
        infos = list(get_mount_info(self._mounts_file, self._statvfs,
                                    STABLE_FILESYSTEMS))
        infos.sort(key=lambda i: len(i["mount-point"]))
        for info in infos:
            total = info["total-space"]
            mount_seen = info["mount-point"] in seen_mounts
            device_seen = info["device"] in seen_devices
            seen_mounts.add(info["mount-point"])
            seen_devices.add(info["device"])
            if mount_seen or device_seen:
                continue

            if total <= 0:
                # Some "virtual" filesystems have 0 total space. ignore them.
                continue

            used = ((total - info["free-space"]) / total) * 100
            if used >= 85:
                self._sysinfo.add_note("%s is using %s"
                                       % (info["mount-point"], usage(info)))
        return succeed(None)