4
from landscape.lib.lsb_release import LSB_RELEASE_FILENAME, parse_lsb_release
5
from landscape.monitor.plugin import MonitorPlugin
8
class DistributionInfoError(Exception):
12
class ComputerInfo(MonitorPlugin):
13
"""Plugin captures and reports basic computer information."""
15
persist_name = "computer-info"
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
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)
32
def _resynchronize(self):
33
self.registry.persist.remove(self.persist_name)
35
def send_computer_message(self, urgent=False):
36
message = self._create_computer_info_message()
38
message["type"] = "computer-info"
39
logging.info("Queueing message with updated computer info.")
40
self.registry.broker.send_message(message, urgent=urgent)
42
def send_distribution_message(self, urgent=False):
43
message = self._create_distribution_info_message()
45
message["type"] = "distribution-info"
46
logging.info("Queueing message with updated distribution info.")
47
self.registry.broker.send_message(message, urgent=urgent)
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)
56
def _create_computer_info_message(self):
58
self._add_if_new(message, "hostname",
60
total_memory, total_swap = self._get_memory_info()
61
self._add_if_new(message, "total-memory",
63
self._add_if_new(message, "total-swap", total_swap)
66
def _add_if_new(self, message, key, value):
67
if value != self._persist.get(key):
68
self._persist.set(key, value)
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)
78
def _get_memory_info(self):
79
"""Get details in megabytes and return a C{(memory, swap)} tuple."""
81
file = open(self._meminfo_file)
84
parts = line.split(":")
86
if key in ["MemTotal", "SwapTotal"]:
87
value = int(parts[1].strip().split(" ")[0])
90
return (message["MemTotal"] // 1024, message["SwapTotal"] // 1024)
92
def _get_distribution_info(self):
93
"""Get details about the distribution."""
95
message.update(parse_lsb_release(self._lsb_release_filename))