3
from landscape.lib.log import log_failure
5
from landscape.lib.dbus_util import method, get_object, Object
6
from landscape.monitor.monitor import (MonitorPlugin, BUS_NAME, OBJECT_PATH,
8
from landscape.user.changes import UserChanges
9
from landscape.user.provider import UserProvider
12
class UserMonitorDBusObject(Object):
14
A DBUS object which exposes an API for getting the monitor to detect user
15
changes and upload them to the Landscape server.
17
object_path = OBJECT_PATH + "/UserMonitor"
18
iface_name = IFACE_NAME + ".UserMonitor"
21
def __init__(self, bus, plugin):
22
super(UserMonitorDBusObject, self).__init__(bus)
26
def detect_changes(self, operation_id=None):
27
return self._plugin.run(operation_id)
30
class UserMonitor(MonitorPlugin):
32
A plugin which monitors the system user databases.
35
persist_name = "users"
36
run_interval = 3600 # 1 hour
38
def __init__(self, provider=None):
40
provider = UserProvider()
41
self._provider = provider
43
def register(self, registry):
44
super(UserMonitor, self).register(registry)
45
self.registry.reactor.call_on("resynchronize", self._resynchronize)
46
self.call_on_accepted("users", self._run_detect_changes, None)
47
self._dbus_object = UserMonitorDBusObject(registry.bus, self)
49
def _resynchronize(self):
50
"""Resynchronize user and group data."""
51
changes = UserChanges(self._persist, self._provider)
54
def run(self, operation_id=None):
55
return self.registry.broker.call_if_accepted(
56
"users", self._run_detect_changes, operation_id)
58
def _run_detect_changes(self, operation_id=None):
60
If changes are detected an C{urgent-exchange} is fired to send
61
updates to the server immediately.
63
@param operation_id: When present it will be included in the
64
C{operation-id} field.
66
from landscape.manager.usermanager import UserManagerDBusObject
67
remote_service = get_object(self.registry.bus,
68
UserManagerDBusObject.bus_name, UserManagerDBusObject.object_path)
70
result = remote_service.get_locked_usernames()
71
result.addCallback(self._detect_changes, operation_id)
74
def _detect_changes(self, result, operation_id=None):
75
def update_snapshot(result):
79
def log_error(result):
80
log_failure(result, "Error occured calling send_message in "
83
self._provider.locked_users = result
84
changes = UserChanges(self._persist, self._provider)
85
message = changes.create_diff()
87
message["type"] = "users"
89
message["operation-id"] = operation_id
90
result = self.registry.broker.send_message(message, urgent=True)
91
result.addCallback(update_snapshot)
92
result.addErrback(log_error)