Move sessioncontroller from previous chaind-eth to session module
This commit is contained in:
parent
b77aafc7bc
commit
8c2905b801
@ -1,2 +1,18 @@
|
|||||||
class TxSourceError(Exception):
|
class TxSourceError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NothingToDoError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClientGoneError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClientBlockError(BlockingIOError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClientInputError(ValueError):
|
||||||
|
pass
|
||||||
|
108
chaind/session.py
Normal file
108
chaind/session.py
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import socket
|
||||||
|
import logging
|
||||||
|
import stat
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
from hexathon import strip_0x
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from chaind.error import (
|
||||||
|
NothingToDoError,
|
||||||
|
ClientGoneError,
|
||||||
|
ClientBlockError,
|
||||||
|
ClientInputError,
|
||||||
|
)
|
||||||
|
|
||||||
|
logg = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class SessionController:
|
||||||
|
|
||||||
|
def __init__(self, config, adapter, processor):
|
||||||
|
self.dead = False
|
||||||
|
os.makedirs(os.path.dirname(config.get('SESSION_SOCKET_PATH')), exist_ok=True)
|
||||||
|
try:
|
||||||
|
os.unlink(config.get('SESSION_SOCKET_PATH'))
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
self.socket_path = config.get('SESSION_SOCKET_PATH')
|
||||||
|
|
||||||
|
self.srv = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)
|
||||||
|
self.srv.bind(config.get('SESSION_SOCKET_PATH'))
|
||||||
|
self.srv.listen(2)
|
||||||
|
self.srv.settimeout(float(config.get('SESSION_DISPATCH_DELAY')))
|
||||||
|
self.processor = processor
|
||||||
|
self.chain_spec = config.get('CHAIN_SPEC')
|
||||||
|
self.adapter = adapter
|
||||||
|
|
||||||
|
|
||||||
|
def shutdown(self, signo, frame):
|
||||||
|
if self.dead:
|
||||||
|
return
|
||||||
|
self.dead = True
|
||||||
|
if signo != None:
|
||||||
|
logg.info('closing on {}'.format(signo))
|
||||||
|
else:
|
||||||
|
logg.info('explicit shutdown')
|
||||||
|
sockname = self.srv.getsockname()
|
||||||
|
self.srv.close()
|
||||||
|
try:
|
||||||
|
os.unlink(sockname)
|
||||||
|
except FileNotFoundError:
|
||||||
|
logg.warning('socket file {} already gone'.format(sockname))
|
||||||
|
|
||||||
|
|
||||||
|
def get_connection(self):
|
||||||
|
return self.srv.accept()
|
||||||
|
|
||||||
|
|
||||||
|
def process(self, conn):
|
||||||
|
r = self.processor(self.chain_spec, self.adapter, conn)
|
||||||
|
if r > 0:
|
||||||
|
self.srv.settimeout(0.1)
|
||||||
|
else:
|
||||||
|
self.srv.settimeout(4.0)
|
||||||
|
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
srvs = None
|
||||||
|
try:
|
||||||
|
logg.debug('getting connection')
|
||||||
|
(srvs, srvs_addr) = self.get_connection()
|
||||||
|
except OSError as e:
|
||||||
|
try:
|
||||||
|
fi = os.stat(self.socket_path)
|
||||||
|
except FileNotFoundError:
|
||||||
|
logg.error('socket is gone')
|
||||||
|
raise ClientGoneError()
|
||||||
|
if not stat.S_ISSOCK(fi.st_mode):
|
||||||
|
logg.error('entity on socket path is not a socket')
|
||||||
|
raise ClientGoneError()
|
||||||
|
if srvs == None:
|
||||||
|
logg.debug('timeout (remote socket is none)')
|
||||||
|
raise NothingToDoError()
|
||||||
|
|
||||||
|
self.srv.settimeout(0.1)
|
||||||
|
srvs.settimeout(0.1)
|
||||||
|
data_in = None
|
||||||
|
try:
|
||||||
|
data_in = srvs.recv(1048576)
|
||||||
|
except BlockingIOError as e:
|
||||||
|
logg.debug('block io error: {}'.format(e))
|
||||||
|
|
||||||
|
if data_in == None:
|
||||||
|
raise ClientBlockError()
|
||||||
|
|
||||||
|
data = None
|
||||||
|
try:
|
||||||
|
data_in_str = data_in.decode('utf-8')
|
||||||
|
data_hex = strip_0x(data_in_str.rstrip())
|
||||||
|
data = bytes.fromhex(data_hex)
|
||||||
|
except ValueError:
|
||||||
|
logg.error('invalid input "{}"'.format(data_in_str))
|
||||||
|
raise ClientInputError()
|
||||||
|
|
||||||
|
logg.info('recv {} bytes'.format(len(data)))
|
||||||
|
return data
|
@ -12,7 +12,6 @@ from xdg.BaseDirectory import (
|
|||||||
save_config_path,
|
save_config_path,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Environment:
|
class Environment:
|
||||||
|
|
||||||
def __init__(self, domain=None, session=None, env={}):
|
def __init__(self, domain=None, session=None, env={}):
|
||||||
|
Loading…
Reference in New Issue
Block a user