import os import socket import logging as log import config as conf from networkers import NetworkReader,NetworkWriter from hashtree import HashTree lockFile = os.path.join(conf.directory,"dirty.lock") class FailedConnection(Exception): pass class LockedException(Exception): pass class IncompatibleException(Exception): pass class BaseConnection: # abstract def __init__(self): self._socket = None self.incoming = None self.outcoming = None def createNetworkers(self): fr = self._socket.makefile(mode="rb") fw = self._socket.makefile(mode="wb") self.incoming = NetworkReader(fr) self.outcoming = NetworkWriter(fw) def __enter__(self): return self.incoming, self.outcoming def __exit__(self, exc_type, exc_val, exc_tb): try: self._socket.shutdown(socket.SHUT_RDWR) self._socket.close() except OSError: log.warning("broken connection") class NetNode: def __init__(self, filename, treeFile=""): self._incoming = None self._outcoming = None self._filename = filename self._treeFile = treeFile if treeFile: self._tree = HashTree.load(treeFile) else: self._tree = HashTree.fromFile(filename) self._newLeaves = dict() def isLocked(self): return os.path.isfile(lockFile) def _lock(self): try: f = open(lockFile,"x") f.close() except FileExistsError: raise LockedException() def _unlock(self): os.remove(lockFile) def _updateTree(self): log.info("updating hash tree...") self._tree.batchUpdate(self._newLeaves.items()) self._tree.save(self._treeFile) log.info("tree updated")