5
from twisted.internet.utils import getProcessOutput
7
from landscape.package.store import PackageStore
8
from landscape.package.reporter import find_reporter_command
9
from landscape.monitor.monitor import MonitorPlugin
12
class PackageMonitor(MonitorPlugin):
16
def __init__(self, package_store_filename=None):
17
super(PackageMonitor, self).__init__()
18
if package_store_filename:
19
self._package_store = PackageStore(package_store_filename)
21
self._package_store = None
22
self._reporter_command = find_reporter_command()
24
def register(self, registry):
25
self.config = registry.config
26
super(PackageMonitor, self).register(registry)
28
if not self._package_store:
29
filename = os.path.join(registry.config.data_path,
31
self._package_store = PackageStore(filename)
33
registry.register_message("package-ids",
34
self._enqueue_message_as_reporter_task)
35
registry.reactor.call_on("resynchronize", self._resynchronize)
36
self.call_on_accepted("packages", self.spawn_reporter)
39
def _enqueue_message_as_reporter_task(self, message):
40
self._package_store.add_task("reporter", message)
44
result = self.registry.broker.get_accepted_message_types()
45
result.addCallback(self._got_message_types)
48
def _got_message_types(self, message_types):
49
if "packages" in message_types:
52
def spawn_reporter(self):
54
if self.config.config:
55
args.extend(["-c", self.config.config])
57
# path is set to None so that getProcessOutput does not
58
# chdir to "." see bug #211373
59
result = getProcessOutput(self._reporter_command,
60
args=args, env=os.environ,
63
result.addCallback(self._got_reporter_output)
66
def _got_reporter_output(self, output):
68
logging.warning("Package reporter output:\n%s" % output)
70
def _resynchronize(self):
72
Remove all tasks *except* the resynchronize task. This is
73
because if we clear all tasks, then add the resynchronize,
74
it's possible that the reporter may be running a task at this
75
time and when it finishes, it will unknowningly remove the
76
resynchronize task because sqlite resets its serial primary
77
keys when you delete an entire table. This problem is avoided
78
by adding the task first and removing them all *except* the
79
resynchronize task and not causing sqlite to reset the serial
82
task = self._package_store.add_task("reporter",
83
{"type" : "resynchronize"})
84
self._package_store.clear_tasks(except_tasks=(task,))