4
from twisted.internet.utils import getProcessOutput
5
from twisted.internet.defer import succeed
7
from landscape.package.store import PackageStore
8
from landscape.package.changer import PackageChanger
9
from landscape.package.releaseupgrader import ReleaseUpgrader
10
from landscape.manager.plugin import ManagerPlugin
13
class PackageManager(ManagerPlugin):
18
def register(self, registry):
19
super(PackageManager, self).register(registry)
20
self.config = registry.config
22
if not self._package_store:
23
filename = os.path.join(registry.config.data_path,
25
self._package_store = PackageStore(filename)
27
registry.register_message("change-packages",
28
self.handle_change_packages)
29
registry.register_message("change-package-locks",
30
self.handle_change_package_locks)
31
registry.register_message("release-upgrade",
32
self.handle_release_upgrade)
34
# When the package reporter notifies us that something has changed,
35
# we want to run again to see if we can now fulfill tasks that were
37
registry.reactor.call_on("package-data-changed", self.run)
41
def _handle(self, cls, message):
42
"""Queue C{message} as a task, and spawn the proper handler."""
43
self._package_store.add_task(cls.queue_name, message)
44
self.spawn_handler(cls)
46
def handle_change_packages(self, message):
47
return self._handle(PackageChanger, message)
49
def handle_change_package_locks(self, message):
50
return self._handle(PackageChanger, message)
52
def handle_release_upgrade(self, message):
53
return self._handle(ReleaseUpgrader, message)
56
result = self.registry.broker.get_accepted_message_types()
57
result.addCallback(self._got_message_types)
60
def _got_message_types(self, message_types):
61
if "change-packages-result" in message_types:
62
self.spawn_handler(PackageChanger)
63
if "operation-result" in message_types:
64
self.spawn_handler(ReleaseUpgrader)
66
def spawn_handler(self, cls):
68
if self.config.config:
69
args.extend(["-c", self.config.config])
70
if self._package_store.get_next_task(cls.queue_name):
71
# path is set to None so that getProcessOutput does not
72
# chdir to "." see bug #211373
73
result = getProcessOutput(cls.find_command(),
74
args=args, env=os.environ,
77
result.addCallback(self._got_output, cls)
79
result = succeed(None)
82
def _got_output(self, output, cls):
84
logging.warning("Package %s output:\n%s" %
85
(cls.queue_name, output))