~ahasenack/landscape-client/landscape-client-1.5.5-0ubuntu0.9.04.0

« back to all changes in this revision

Viewing changes to landscape/monitor/packagemonitor.py

  • Committer: Bazaar Package Importer
  • Author(s): Rick Clark
  • Date: 2008-09-08 16:35:57 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080908163557-l3ixzj5dxz37wnw2
Tags: 1.0.18-0ubuntu1
New upstream release 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import logging
 
2
import sys
 
3
import os
 
4
 
 
5
from twisted.internet.utils import getProcessOutput
 
6
 
 
7
from landscape.package.store import PackageStore
 
8
from landscape.package.reporter import find_reporter_command
 
9
from landscape.monitor.monitor import MonitorPlugin
 
10
 
 
11
 
 
12
class PackageMonitor(MonitorPlugin):
 
13
 
 
14
    run_interval = 1800
 
15
 
 
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)
 
20
        else:
 
21
            self._package_store = None
 
22
        self._reporter_command = find_reporter_command()
 
23
 
 
24
    def register(self, registry):
 
25
        self.config = registry.config
 
26
        super(PackageMonitor, self).register(registry)
 
27
 
 
28
        if not self._package_store:
 
29
            filename = os.path.join(registry.config.data_path,
 
30
                                    "package/database")
 
31
            self._package_store = PackageStore(filename)
 
32
 
 
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)
 
37
        self.run()
 
38
 
 
39
    def _enqueue_message_as_reporter_task(self, message):
 
40
        self._package_store.add_task("reporter", message)
 
41
        self.spawn_reporter()
 
42
 
 
43
    def run(self):
 
44
        result = self.registry.broker.get_accepted_message_types()
 
45
        result.addCallback(self._got_message_types)
 
46
        return result
 
47
 
 
48
    def _got_message_types(self, message_types):
 
49
        if "packages" in message_types:
 
50
            self.spawn_reporter()
 
51
 
 
52
    def spawn_reporter(self):
 
53
        args = ["--quiet"]
 
54
        if self.config.config:
 
55
            args.extend(["-c", self.config.config])
 
56
 
 
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,
 
61
                                  errortoo=1,
 
62
                                  path=None)
 
63
        result.addCallback(self._got_reporter_output)
 
64
        return result
 
65
 
 
66
    def _got_reporter_output(self, output):
 
67
        if output:
 
68
            logging.warning("Package reporter output:\n%s" % output)
 
69
 
 
70
    def _resynchronize(self):
 
71
        """
 
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
 
80
        key.
 
81
        """
 
82
        task = self._package_store.add_task("reporter",
 
83
                                            {"type" : "resynchronize"})
 
84
        self._package_store.clear_tasks(except_tasks=(task,))
 
85