4
from landscape.monitor.monitor import MonitorPlugin
7
class DistributionInfoError(Exception):
11
class ComputerInfo(MonitorPlugin):
12
"""Plugin captures and reports basic computer information."""
14
persist_name = "computer-info"
16
def __init__(self, get_hostname=socket.gethostname,
17
meminfo_file="/proc/meminfo",
18
lsb_release_filename="/etc/lsb-release"):
19
self._get_hostname = get_hostname
20
self._meminfo_file = meminfo_file
21
self._lsb_release_filename = lsb_release_filename
23
def register(self, registry):
24
super(ComputerInfo, self).register(registry)
25
self.registry.reactor.call_on("resynchronize", self._resynchronize)
26
self.call_on_accepted("computer-info",
27
self.send_computer_message, True)
28
self.call_on_accepted("distribution-info",
29
self.send_distribution_message, True)
31
def _resynchronize(self):
32
self.registry.persist.remove(self.persist_name)
34
def send_computer_message(self, urgent=False):
35
message = self._create_computer_info_message()
37
message["type"] = "computer-info"
38
logging.info("Queueing message with updated computer info.")
39
self.registry.broker.send_message(message, urgent=urgent)
41
def send_distribution_message(self, urgent=False):
42
message = self._create_distribution_info_message()
44
message["type"] = "distribution-info"
45
logging.info("Queueing message with updated distribution info.")
46
self.registry.broker.send_message(message, urgent=urgent)
48
def exchange(self, urgent=False):
49
broker = self.registry.broker
50
broker.call_if_accepted("computer-info",
51
self.send_computer_message, urgent)
52
broker.call_if_accepted("distribution-info",
53
self.send_distribution_message, urgent)
55
def _create_computer_info_message(self):
57
self._add_if_new(message, "hostname",
59
total_memory, total_swap = self._get_memory_info()
60
self._add_if_new(message, "total-memory",
62
self._add_if_new(message, "total-swap", total_swap)
65
def _add_if_new(self, message, key, value):
66
if value != self._persist.get(key):
67
self._persist.set(key, value)
70
def _create_distribution_info_message(self):
71
message = self._get_distribution_info()
72
if message != self._persist.get("distribution-info"):
73
self._persist.set("distribution-info", message)
77
def _get_memory_info(self):
78
"""Get details in megabytes and return a C{(memory, swap)} tuple."""
80
file = open(self._meminfo_file)
83
parts = line.split(":")
85
if key in ["MemTotal", "SwapTotal"]:
86
value = int(parts[1].strip().split(" ")[0])
89
return (message["MemTotal"] // 1024, message["SwapTotal"] // 1024)
91
lsb_release_keys = {"DISTRIB_ID": "distributor-id",
92
"DISTRIB_DESCRIPTION": "description",
93
"DISTRIB_RELEASE": "release",
94
"DISTRIB_CODENAME": "code-name"}
96
def _get_distribution_info(self):
97
"""Get details about the distribution."""
99
file = open(self._lsb_release_filename, "r")
101
key, value = line.split("=")
102
if key in self.lsb_release_keys:
103
key = self.lsb_release_keys[key.strip()]
104
value = value.strip().strip('"')