summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-01-26 08:58:13 -0500
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-01-26 08:58:13 -0500
commit1781ba4ec2ec749d9a5773adf202322381fd8bff (patch)
tree504bcddd536c813399e2bfc729e8a0cc17d71d86 /src
parent89b2d85439be439b427a575d5b89ed452e1e7248 (diff)
downloadbcfg2-1781ba4ec2ec749d9a5773adf202322381fd8bff.tar.gz
bcfg2-1781ba4ec2ec749d9a5773adf202322381fd8bff.tar.bz2
bcfg2-1781ba4ec2ec749d9a5773adf202322381fd8bff.zip
made GroupSpool more forgiving of changed events on files it doesn't know about (#992)
Diffstat (limited to 'src')
-rw-r--r--src/lib/Server/Plugin.py59
1 files changed, 39 insertions, 20 deletions
diff --git a/src/lib/Server/Plugin.py b/src/lib/Server/Plugin.py
index 82b23d21f..4dab79765 100644
--- a/src/lib/Server/Plugin.py
+++ b/src/lib/Server/Plugin.py
@@ -1105,33 +1105,52 @@ class GroupSpool(Plugin, Generator):
self.AddDirectoryMonitor('')
self.encoding = core.encoding
+ def add_entry(self, event):
+ epath = self.event_path(event)
+ ident = self.event_id(event)
+ if posixpath.isdir(epath):
+ self.AddDirectoryMonitor(epath[len(self.data):])
+ if ident not in self.entries and posixpath.isfile(epath):
+ dirpath = "".join([self.data, ident])
+ self.entries[ident] = self.es_cls(self.filename_pattern,
+ dirpath,
+ self.es_child_cls,
+ self.encoding)
+ self.Entries['Path'][ident] = self.entries[ident].bind_entry
+ if not posixpath.isdir(epath):
+ # do not pass through directory events
+ self.entries[ident].handle_event(event)
+
+ def event_path(self, event):
+ return "".join([self.data, self.handles[event.requestID],
+ event.filename])
+
+ def event_id(self, event):
+ epath = self.event_path(event)
+ if posixpath.isdir(epath):
+ return self.handles[event.requestID] + event.filename
+ else:
+ return self.handles[event.requestID][:-1]
+
def HandleEvent(self, event):
- """Unified FAM event handler for DirShadow."""
+ """Unified FAM event handler for GroupSpool."""
action = event.code2str()
if event.filename[0] == '/':
return
- epath = "".join([self.data, self.handles[event.requestID],
- event.filename])
- if posixpath.isdir(epath):
- ident = self.handles[event.requestID] + event.filename
- else:
- ident = self.handles[event.requestID][:-1]
+ ident = self.event_id(event)
if action in ['exists', 'created']:
- if posixpath.isdir(epath):
- self.AddDirectoryMonitor(epath[len(self.data):])
- if ident not in self.entries and posixpath.isfile(epath):
- dirpath = "".join([self.data, ident])
- self.entries[ident] = self.es_cls(self.filename_pattern,
- dirpath,
- self.es_child_cls,
- self.encoding)
- self.Entries['Path'][ident] = self.entries[ident].bind_entry
- if not posixpath.isdir(epath):
- # do not pass through directory events
+ self.add_entry(event)
+ if action == 'changed':
+ if ident in self.entries:
self.entries[ident].handle_event(event)
- if action == 'changed' and ident in self.entries:
- self.entries[ident].handle_event(event)
+ else:
+ # got a changed event for a file we didn't know
+ # about. go ahead and process this as a 'created', but
+ # warn
+ self.logger.warning("Got changed event for unknown file %s" %
+ ident)
+ self.add_entry(event)
elif action == 'deleted':
fbase = self.handles[event.requestID] + event.filename
if fbase in self.entries: