summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--combox/events.py32
-rw-r--r--tests/events_test.py34
2 files changed, 64 insertions, 2 deletions
diff --git a/combox/events.py b/combox/events.py
index 779b6f6..3692adc 100644
--- a/combox/events.py
+++ b/combox/events.py
@@ -26,7 +26,7 @@ from watchdog.events import LoggingEventHandler
from combox.crypto import split_and_encrypt, decrypt_and_glue
from combox.file import (mk_nodedir, rm_nodedir, rm_shards,
relative_path, move_shards, move_nodedir,
- cb_path, node_path)
+ cb_path, node_path, hash_file)
from combox.silo import ComboxSilo
@@ -179,6 +179,13 @@ class NodeDirMonitor(LoggingEventHandler):
self.silo = ComboxSilo(self.config)
+ def silo_update(self):
+ """
+ Re-reads the silo from disk.
+ """
+ self.silo = ComboxSilo(self.config)
+
+
def housekeep(self):
"""Recursively traverses node directory, discovers changes and updates silo and combox directory.
@@ -230,4 +237,25 @@ class NodeDirMonitor(LoggingEventHandler):
def on_modified(self, event):
super(NodeDirMonitor, self).on_modified(event)
- pass
+ self.silo_update()
+
+ file_cb_path = cb_path(event.src_path, self.config)
+
+ if event.is_directory:
+ # do nothing
+ pass
+ elif (not event.is_directory):
+ file_content = decrypt_and_glue(file_cb_path,
+ self.config,
+ write=False)
+ file_content_hash = hash_file(file_cb_path, file_content)
+
+ if self.silo.stale(file_cb_path, file_content_hash):
+ # shard modified
+
+ # means, file was modified on another computer (also
+ # running combox). so, reconstruct the file and put it
+ # in the combox directory.
+ decrypt_and_glue(file_cb_path, self.config)
+ # update db.
+ self.silo.update(file_cb_path)
diff --git a/tests/events_test.py b/tests/events_test.py
index c62d3f2..f645e75 100644
--- a/tests/events_test.py
+++ b/tests/events_test.py
@@ -266,6 +266,40 @@ class TestEvents(object):
self.purge_list.append(self.TEST_FILE_MUTANT)
self.purge_list.append(self.FOO_DIR)
+ # Test - shard modification
+ self.lorem_file = path.join(self.FILES_DIR, 'lorem.txt')
+ lorem_content = read_file(self.lorem_file)
+ self.lorem_file_copy = "%s.copy" % self.lorem_file
+
+ copyfile(self.lorem_file, self.lorem_file_copy)
+ split_and_encrypt(self.lorem_file_copy, self.config,
+ lorem_content)
+
+ silo = ComboxSilo(self.config)
+ silo.update(self.lorem_file_copy)
+ shardedp(self.lorem_file_copy)
+
+ silo = ComboxSilo(self.config)
+ lorem_file_copy_hash = silo.db.get(self.lorem_file_copy)
+
+ self.ipsum_file = path.join(self.FILES_DIR, 'ipsum.txt')
+ ipsum_content = read_file(self.ipsum_file)
+ lorem_copy_content = "%s\n%s" % (lorem_content, ipsum_content)
+
+ split_and_encrypt(self.lorem_file_copy, self.config,
+ lorem_copy_content)
+ time.sleep(1)
+ ## check if the lorem_file_copy's info is updated in silo
+ silo = ComboxSilo(self.config)
+
+ assert lorem_copy_content == read_file(self.lorem_file_copy)
+ assert lorem_file_copy_hash != silo.db.get(self.lorem_file_copy)
+
+ self.purge_list.append(self.lorem_file_copy)
+
+ observer.stop()
+ observer.join()
+
def teardown(self):
"""Cleans up things after each test in this class"""