Skip to content

Commit

Permalink
issue #85 async client/server enhancements
Browse files Browse the repository at this point in the history
  • Loading branch information
gic authored and geaaru committed Jul 30, 2018
1 parent 23bb1eb commit bc14a4c
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 157 deletions.
2 changes: 1 addition & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Changelog
=========

* Add async client and server implementation for python >=3.5.
* Add experimental async client and server implementation for python >=3.5.

* Add IPv6 bind support for client and server.

Expand Down
68 changes: 23 additions & 45 deletions pyrad/client_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,7 @@ async def __timeout_handler__(self):
secs = (req['send_date'] - now).seconds
if secs > self.timeout:
if req['retries'] == self.retries:
self.logger.debug(
'[%s:%d] For request %d execute all retries.' % (
self.server, self.port, id
)
)
self.logger.debug('[%s:%d] For request %d execute all retries', self.server, self.port, id)
req['future'].set_exception(
TimeoutError('Timeout on Reply')
)
Expand All @@ -72,6 +68,7 @@ async def __timeout_handler__(self):
req['retries']
)
)

self.transport.sendto(req['packet'].RequestPacket())
elif next_weak_up > secs:
next_weak_up = secs
Expand All @@ -88,9 +85,7 @@ async def __timeout_handler__(self):

def send_packet(self, packet, future):
if packet.id in self.pending_requests:
raise Exception('Packet with id %d already present' % (
packet.id
))
raise Exception('Packet with id %d already present' % packet.id)

# Store packet on pending requests map
self.pending_requests[packet.id] = {
Expand All @@ -108,11 +103,10 @@ def connection_made(self, transport):
self.transport = transport
socket = transport.get_extra_info('socket')
self.logger.info(
'[%s:%d] Transport created with binding in %s:%d.' % (
self.server, self.port,
socket.getsockname()[0],
socket.getsockname()[1]
)
'[%s:%d] Transport created with binding in %s:%d',
self.server, self.port,
socket.getsockname()[0],
socket.getsockname()[1]
)

pre_loop = asyncio.get_event_loop()
Expand All @@ -124,23 +118,13 @@ def connection_made(self, transport):
asyncio.set_event_loop(loop=pre_loop)

def error_received(self, exc):
self.logger.error(
'[%s:%d] Error received: %s.' % (
self.server, self.port, exc
)
)
self.logger.error('[%s:%d] Error received: %s', self.server, self.port, exc)

def connection_lost(self, exc):
if exc:
self.logger.warn(
'[%s:%d] Connection lost: %s.' % (
self.server, self.port, str(exc)
)
)
self.logger.warn('[%s:%d] Connection lost: %s', self.server, self.port, str(exc))
else:
self.logger.info(
'[%s:%d] Transport closed.' % (self.server, self.port)
)
self.logger.info('[%s:%d] Transport closed', self.server, self.port)

# noinspection PyUnusedLocal
def datagram_received(self, data, addr):
Expand Down Expand Up @@ -185,13 +169,10 @@ def datagram_received(self, data, addr):
]
)
)
pass

async def close_transport(self):
if self.transport:
self.logger.debug(
'[%s:%d] Closing transport...' % (self.server, self.port)
)
self.logger.debug('[%s:%d] Closing transport...', self.server, self.port)
self.transport.close()
self.transport = None
if self.timeout_future:
Expand All @@ -204,10 +185,7 @@ def create_id(self):
return self.packet_id

def __str__(self):
return 'DatagramProtocolClient: { server: %s, port: %d }' % (
self.server,
self.port
)
return 'DatagramProtocolClient(server?=%s, port=%d)' % (self.server, self.port)

# Used as protocol_factory
def __call__(self):
Expand All @@ -233,20 +211,20 @@ def __init__(self, server, auth_port=1812, acct_port=1813,

"""Constructor.
:param server: hostname or IP address of RADIUS server
:type server: string
:param server: hostname or IP address of RADIUS server
:type server: string
:param auth_port: port to use for authentication packets
:type auth_port: integer
:param acct_port: port to use for accounting packets
:type acct_port: integer
:param coa_port: port to use for CoA packets
:type coa_port: integer
:param secret: RADIUS secret
:type secret: string
:param dict: RADIUS dictionary
:type dict: pyrad.dictionary.Dictionary
:param loop: Python loop handler
:type loop: asyncio event loop
:param coa_port: port to use for CoA packets
:type coa_port: integer
:param secret: RADIUS secret
:type secret: string
:param dict: RADIUS dictionary
:type dict: pyrad.dictionary.Dictionary
:param loop: Python loop handler
:type loop: asyncio event loop
"""
if not loop:
self.loop = asyncio.get_event_loop()
Expand Down Expand Up @@ -435,7 +413,7 @@ def SendPacket(self, pkt):
"""Send a packet to a RADIUS server.
:param pkt: the packet to send
:type pkt: pyrad.packet.Packet
:type pkt: pyrad.packet.Packet
:return: Future related with packet to send
:rtype: asyncio.Future
"""
Expand Down
Loading

0 comments on commit bc14a4c

Please sign in to comment.