3 import logging as _logging
6 from . import LOG as _LOG
7 from . import common as _common
8 from . import error as _error
11 class AssuanClient (object):
12 """A single-threaded Assuan client based on the `devolpment suggestions`_
14 .. _development suggestions:
15 http://www.gnupg.org/documentation/manuals/assuan/Client-code.html
17 def __init__(self, name, logger=_LOG, use_sublogger=True,
18 close_on_disconnect=False):
21 logger = _logging.getLogger('{}.{}'.format(logger.name, self.name))
23 self.close_on_disconnect = close_on_disconnect
24 self.input = self.output = None
28 self.logger.info('read from stdin')
29 self.input = _sys.stdin
31 self.logger.info('write to stdout')
32 self.output = _sys.stdout
35 if self.close_on_disconnect:
36 self.logger.info('disconnecting')
40 def raise_error(self, error):
41 self.logger.error(str(error))
44 def read_response(self):
45 line = self.input.readline()
48 _error.AssuanError(message='IPC accept call failed'))
49 if not line.endswith('\n'):
51 _error.AssuanError(message='Invalid response'))
52 line = line[:-1] # remove trailing newline
54 response = _common.Response()
56 response.from_string(line)
57 except _error.AssuanError as e:
58 self.logger.error(str(e))
60 self.logger.info('S: {}'.format(response))
63 def make_request(self, request):
64 rstring = str(request)
65 self.logger.info('C: {}'.format(rstring))
66 self.output.write(rstring)
67 self.output.write('\n')
72 responses = list(self.responses())
73 if responses[-1].type == 'ERR':
74 eresponse = responses[-1]
75 fields = eresponse.parameters.split(' ', 1)
78 message = fields[1].strip()
81 error = _error.AssuanError(code=code, message=message)
82 error.request = request
83 error.responses = responses
89 response = self.read_response()
91 if response.type in ['OK', 'ERR']: