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

« back to all changes in this revision

Viewing changes to landscape/monitor/usermonitor.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
 
 
3
from landscape.lib.log import log_failure
 
4
 
 
5
from landscape.lib.dbus_util import method, get_object, Object
 
6
from landscape.monitor.monitor import (MonitorPlugin, BUS_NAME, OBJECT_PATH,
 
7
                                       IFACE_NAME)
 
8
from landscape.user.changes import UserChanges
 
9
from landscape.user.provider import UserProvider
 
10
 
 
11
 
 
12
class UserMonitorDBusObject(Object):
 
13
    """
 
14
    A DBUS object which exposes an API for getting the monitor to detect user
 
15
    changes and upload them to the Landscape server.
 
16
    """
 
17
    object_path = OBJECT_PATH + "/UserMonitor"
 
18
    iface_name = IFACE_NAME + ".UserMonitor"
 
19
    bus_name = BUS_NAME
 
20
 
 
21
    def __init__(self, bus, plugin):
 
22
        super(UserMonitorDBusObject, self).__init__(bus)
 
23
        self._plugin = plugin
 
24
 
 
25
    @method(iface_name)
 
26
    def detect_changes(self, operation_id=None):
 
27
        return self._plugin.run(operation_id)
 
28
 
 
29
 
 
30
class UserMonitor(MonitorPlugin):
 
31
    """
 
32
    A plugin which monitors the system user databases.
 
33
    """
 
34
 
 
35
    persist_name = "users"
 
36
    run_interval = 3600 # 1 hour
 
37
 
 
38
    def __init__(self, provider=None):
 
39
        if provider is None:
 
40
            provider = UserProvider()
 
41
        self._provider = provider
 
42
 
 
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)
 
48
 
 
49
    def _resynchronize(self):
 
50
        """Resynchronize user and group data."""
 
51
        changes = UserChanges(self._persist, self._provider)
 
52
        changes.clear()
 
53
 
 
54
    def run(self, operation_id=None):
 
55
        return self.registry.broker.call_if_accepted(
 
56
            "users", self._run_detect_changes, operation_id)
 
57
 
 
58
    def _run_detect_changes(self, operation_id=None):
 
59
        """
 
60
        If changes are detected an C{urgent-exchange} is fired to send
 
61
        updates to the server immediately.
 
62
 
 
63
        @param operation_id: When present it will be included in the
 
64
            C{operation-id} field.
 
65
        """
 
66
        from landscape.manager.usermanager import UserManagerDBusObject
 
67
        remote_service = get_object(self.registry.bus,
 
68
            UserManagerDBusObject.bus_name, UserManagerDBusObject.object_path)
 
69
 
 
70
        result = remote_service.get_locked_usernames()
 
71
        result.addCallback(self._detect_changes, operation_id)
 
72
        return result
 
73
 
 
74
    def _detect_changes(self, result, operation_id=None):
 
75
        def update_snapshot(result):
 
76
            changes.snapshot()
 
77
            return result
 
78
 
 
79
        def log_error(result):
 
80
            log_failure(result, "Error occured calling send_message in "
 
81
                        "_detect_changes")
 
82
 
 
83
        self._provider.locked_users = result
 
84
        changes = UserChanges(self._persist, self._provider)
 
85
        message = changes.create_diff()
 
86
        if message:
 
87
            message["type"] = "users"
 
88
            if operation_id:
 
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)
 
93
            return result