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