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")