~ahasenack/landscape-client/landscape-client-11.02-0ubuntu0.8.04.1

« back to all changes in this revision

Viewing changes to landscape/monitor/computerinfo.py

  • Committer: Andreas Hasenack
  • Date: 2011-05-05 14:12:15 UTC
  • Revision ID: andreas@canonical.com-20110505141215-5ymuyyh5es9pwa6p
Added hardy files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import logging
 
2
import socket
 
3
 
 
4
from landscape.lib.lsb_release import LSB_RELEASE_FILENAME, parse_lsb_release
 
5
from landscape.monitor.plugin import MonitorPlugin
 
6
 
 
7
 
 
8
class DistributionInfoError(Exception):
 
9
    pass
 
10
 
 
11
 
 
12
class ComputerInfo(MonitorPlugin):
 
13
    """Plugin captures and reports basic computer information."""
 
14
 
 
15
    persist_name = "computer-info"
 
16
 
 
17
    def __init__(self, get_fqdn=socket.getfqdn,
 
18
                 meminfo_file="/proc/meminfo",
 
19
                 lsb_release_filename=LSB_RELEASE_FILENAME):
 
20
        self._get_fqdn = get_fqdn
 
21
        self._meminfo_file = meminfo_file
 
22
        self._lsb_release_filename = lsb_release_filename
 
23
 
 
24
    def register(self, registry):
 
25
        super(ComputerInfo, self).register(registry)
 
26
        self.registry.reactor.call_on("resynchronize", self._resynchronize)
 
27
        self.call_on_accepted("computer-info",
 
28
                              self.send_computer_message, True)
 
29
        self.call_on_accepted("distribution-info",
 
30
                              self.send_distribution_message, True)
 
31
 
 
32
    def _resynchronize(self):
 
33
        self.registry.persist.remove(self.persist_name)
 
34
 
 
35
    def send_computer_message(self, urgent=False):
 
36
        message = self._create_computer_info_message()
 
37
        if message:
 
38
            message["type"] = "computer-info"
 
39
            logging.info("Queueing message with updated computer info.")
 
40
            self.registry.broker.send_message(message, urgent=urgent)
 
41
 
 
42
    def send_distribution_message(self, urgent=False):
 
43
        message = self._create_distribution_info_message()
 
44
        if message:
 
45
            message["type"] = "distribution-info"
 
46
            logging.info("Queueing message with updated distribution info.")
 
47
            self.registry.broker.send_message(message, urgent=urgent)
 
48
 
 
49
    def exchange(self, urgent=False):
 
50
        broker = self.registry.broker
 
51
        broker.call_if_accepted("computer-info",
 
52
                                self.send_computer_message, urgent)
 
53
        broker.call_if_accepted("distribution-info",
 
54
                                self.send_distribution_message, urgent)
 
55
 
 
56
    def _create_computer_info_message(self):
 
57
        message = {}
 
58
        self._add_if_new(message, "hostname",
 
59
                         self._get_fqdn())
 
60
        total_memory, total_swap = self._get_memory_info()
 
61
        self._add_if_new(message, "total-memory",
 
62
                         total_memory)
 
63
        self._add_if_new(message, "total-swap", total_swap)
 
64
        return message
 
65
 
 
66
    def _add_if_new(self, message, key, value):
 
67
        if value != self._persist.get(key):
 
68
            self._persist.set(key, value)
 
69
            message[key] = value
 
70
 
 
71
    def _create_distribution_info_message(self):
 
72
        message = self._get_distribution_info()
 
73
        if message != self._persist.get("distribution-info"):
 
74
            self._persist.set("distribution-info", message)
 
75
            return message
 
76
        return None
 
77
 
 
78
    def _get_memory_info(self):
 
79
        """Get details in megabytes and return a C{(memory, swap)} tuple."""
 
80
        message = {}
 
81
        file = open(self._meminfo_file)
 
82
        for line in file:
 
83
            if line != '\n':
 
84
                parts = line.split(":")
 
85
                key = parts[0]
 
86
                if key in ["MemTotal", "SwapTotal"]:
 
87
                    value = int(parts[1].strip().split(" ")[0])
 
88
                    message[key] = value
 
89
        file.close()
 
90
        return (message["MemTotal"] // 1024, message["SwapTotal"] // 1024)
 
91
 
 
92
    def _get_distribution_info(self):
 
93
        """Get details about the distribution."""
 
94
        message = {}
 
95
        message.update(parse_lsb_release(self._lsb_release_filename))
 
96
        return message