1
from twisted.internet.defer import maybeDeferred
3
from landscape.lib.log import log_failure
4
from landscape.amp import ComponentPublisher, ComponentConnector, remote
6
from landscape.monitor.plugin import MonitorPlugin
7
from landscape.user.changes import UserChanges
8
from landscape.user.provider import UserProvider
11
class UserMonitor(MonitorPlugin):
13
A plugin which monitors the system user databases.
16
persist_name = "users"
18
run_interval = 3600 # 1 hour
21
def __init__(self, provider=None):
23
provider = UserProvider()
24
self._provider = provider
25
self._publisher = None
27
def register(self, registry):
28
super(UserMonitor, self).register(registry)
30
self.call_on_accepted("users", self._run_detect_changes, None)
32
self._publisher = ComponentPublisher(self, self.registry.reactor,
34
self._publisher.start()
37
"""Stop listening for incoming AMP connections."""
39
self._publisher.stop()
40
self._publisher = None
43
"""Reset user and group data."""
44
super(UserMonitor, self)._reset()
45
return self._run_detect_changes()
48
def detect_changes(self, operation_id=None):
49
return self.registry.broker.call_if_accepted(
50
"users", self._run_detect_changes, operation_id)
54
def _run_detect_changes(self, operation_id=None):
56
If changes are detected an C{urgent-exchange} is fired to send
57
updates to the server immediately.
59
@param operation_id: When present it will be included in the
60
C{operation-id} field.
62
from landscape.manager.usermanager import RemoteUserManagerConnector
63
user_manager_connector = RemoteUserManagerConnector(
64
self.registry.reactor, self.registry.config)
66
# We'll skip checking the locked users if we're in monitor-only mode.
67
if getattr(self.registry.config, "monitor_only", False):
68
result = maybeDeferred(self._detect_changes,
72
def get_locked_usernames(user_manager):
73
return user_manager.get_locked_usernames()
75
def disconnect(locked_usernames):
76
user_manager_connector.disconnect()
77
return locked_usernames
79
result = user_manager_connector.connect()
80
result.addCallback(get_locked_usernames)
81
result.addCallback(disconnect)
82
result.addCallback(self._detect_changes, operation_id)
83
result.addErrback(lambda f: self._detect_changes([], operation_id))
86
def _detect_changes(self, locked_users, operation_id=None):
88
def update_snapshot(result):
92
def log_error(result):
93
log_failure(result, "Error occured calling send_message in "
96
self._provider.locked_users = locked_users
97
changes = UserChanges(self._persist, self._provider)
98
message = changes.create_diff()
101
message["type"] = "users"
103
message["operation-id"] = operation_id
104
result = self.registry.broker.send_message(
105
message, self._session_id, urgent=True)
106
result.addCallback(update_snapshot)
107
result.addErrback(log_error)
111
class RemoteUserMonitorConnector(ComponentConnector):
113
component = UserMonitor