8
8
# This program is free software: you can redistribute it and/or modify
9
9
# it under the terms of the GNU Lesser General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
10
# the Free Software Foundation, either version 2.1 of the License, or
11
11
# (at your option) any later version.
13
13
# This program is distributed in the hope that it will be useful,
73
72
dbus.service.Object.__init__(self, dbus.SessionBus(),
74
73
REGISTRY_DBUS_OBJECT_PATH)
76
76
if os.path.exists(DATA_FILE):
78
self._registry = [DataSource.from_list(
79
datasource) for datasource in pickle.load(open(DATA_FILE))]
78
with open(DATA_FILE) as data_file:
79
for datasource in pickle.load(data_file):
80
ds = DataSource.from_list(datasource)
81
self._registry[ds[DataSource.UniqueId]] = ds
80
82
log.debug("Loaded data-source data from %s" % DATA_FILE)
81
83
except Exception, e:
82
84
log.warn("Failed to load data file %s: %s" % (DATA_FILE, e))
85
86
log.debug("No existing data-source data found.")
89
89
# Connect to client disconnection signals
96
96
def _write_to_disk(self):
97
data = [DataSource.get_plain(datasource) for datasource in self._registry]
97
data = [DataSource.get_plain(datasource) for datasource in
98
self._registry.itervalues()]
98
99
with open(DATA_FILE, "w") as data_file:
99
100
pickle.dump(data, data_file)
100
101
#log.debug("Data-source registry update written to disk.")
102
def _get_data_source(self, unique_id):
103
for datasource in self._registry:
104
if datasource[DataSource.UniqueId] == unique_id:
107
def insert_event_hook(self, event, sender):
103
def pre_insert_event(self, event, sender):
108
104
for (unique_id, bus_names) in self._running.iteritems():
109
105
if sender in bus_names:
110
datasource = self._get_data_source(unique_id)
106
datasource = self._registry[unique_id]
111
107
# Update LastSeen time
112
datasource[DataSource.LastSeen] = get_timestamp_for_now()
113
self._write_to_disk()
108
datasource.last_seen = get_timestamp_for_now()
114
109
# Check whether the data-source is allowed to insert events
115
if not [DataSource.Enabled]:
110
if not datasource.enabled:
115
self._write_to_disk()
120
118
def register_data_source(self, unique_id, name, description, templates):
121
119
source = DataSource(str(unique_id), unicode(name), unicode(description),
122
120
map(Event.new_for_struct, templates))
123
for datasource in self._registry:
124
if datasource == source:
125
datasource.update_from_data_source(source)
126
self.DataSourceRegistered(datasource)
127
return datasource[DataSource.Enabled]
128
self._registry.append(source)
121
if unique_id in self._registry:
122
datasource = self._registry[unique_id]
123
datasource.update_from_data_source(source)
125
datasource = self._registry[unique_id] = source
129
126
self._write_to_disk()
130
self.DataSourceRegistered(source)
127
self.DataSourceRegistered(datasource)
128
return datasource.enabled
134
131
def get_data_sources(self):
135
return self._registry
132
return self._registry.values()
138
135
def set_data_source_enabled(self, unique_id, enabled):
139
datasource = self._get_data_source(unique_id)
136
datasource = self._registry[unique_id]
140
137
if not datasource:
142
if datasource[DataSource.Enabled] != enabled:
143
datasource[DataSource.Enabled] = enabled
144
self.DataSourceEnabled(datasource[DataSource.UniqueId], enabled)
139
if datasource.enabled != enabled:
140
datasource.enabled = enabled
141
self.DataSourceEnabled(datasource.unique_id, enabled)
147
144
@dbus.service.method(REGISTRY_DBUS_INTERFACE,
248
datasource = self._get_data_source(uid)
245
datasource = self._registry[uid]
250
247
# Update LastSeen time
251
datasource[DataSource.LastSeen] = get_timestamp_for_now()
252
self._write_to_disk()
248
datasource.last_seen = get_timestamp_for_now()
254
strid = "%s (%s)" % (uid, datasource[DataSource.Name])
250
strid = "%s (%s)" % (uid, datasource.name)
255
251
log.debug("Client disconnected: %s" % strid)
256
252
if len(self._running[uid]) == 1:
257
253
log.debug("No remaining client running: %s" % strid)
258
254
del self._running[uid]
259
datasource[DataSource.Running] = False
255
datasource.running = False
260
256
self.DataSourceDisconnected(datasource)
262
258
self._running[uid].remove(owner)