aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2019-06-19 17:16:17 +0200
committerDaniel Willmann <dwillmann@sysmocom.de>2019-06-26 14:44:46 +0200
commitee9f2e211b8eadeff69c89f19ee624559202ea42 (patch)
tree6d74baed69b06eb641dd60622d362d7b26363ea1
parentf52d4a63d9c25c9e0bbff00b4bb1809944850c34 (diff)
osmo_trap2cgi.py: Don't recurse in ctrl_client()
Use a loop instead. Without it the script will eventually crash with a RecursionError. File "/usr/bin/osmo_trap2cgi.py", line 211, in conn_client await ctrl_client(proxy, reader, writer) File "/usr/bin/osmo_trap2cgi.py", line 202, in ctrl_client proxy.dispatch(wr, data) [...] File "/usr/bin/osmo_trap2cgi.py", line 202, in ctrl_client proxy.dispatch(wr, data) File "/usr/bin/osmo_trap2cgi.py", line 201, in ctrl_client [...] RecursionError: maximum recursion depth exceeded in comparison Change-Id: Ic909e371771f3056cb87e18793fd4225ffb90a2c Related: SYS#4399
-rwxr-xr-xscripts/osmo_trap2cgi.py33
1 files changed, 18 insertions, 15 deletions
diff --git a/scripts/osmo_trap2cgi.py b/scripts/osmo_trap2cgi.py
index ad66e7b..ca73fa8 100755
--- a/scripts/osmo_trap2cgi.py
+++ b/scripts/osmo_trap2cgi.py
@@ -22,7 +22,7 @@
*/
"""
-__version__ = "0.0.1" # bump this on every non-trivial change
+__version__ = "0.0.2" # bump this on every non-trivial change
from functools import partial
import configparser, argparse, time, os, asyncio, aiohttp
@@ -190,29 +190,32 @@ async def recon_reader(proxy, reader, num_bytes):
return await reader.readexactly(num_bytes)
except asyncio.IncompleteReadError:
proxy.log.info('Failed to read %d bytes reconnecting to %s:%d...', num_bytes, proxy.ctrl_addr, proxy.ctrl_port)
- await conn_client(proxy)
+ raise
async def ctrl_client(proxy, rd, wr):
"""
- Recursively read CTRL stream and handle selected messages.
+ Read CTRL stream and handle selected messages.
"""
- header = await recon_reader(proxy, rd, 4)
- data = await recon_reader(proxy, rd, get_ctrl_len(proxy, header))
- proxy.dispatch(wr, data)
- await ctrl_client(proxy, rd, wr)
+ while True:
+ header = await recon_reader(proxy, rd, 4)
+ data = await recon_reader(proxy, rd, get_ctrl_len(proxy, header))
+ proxy.dispatch(wr, data)
async def conn_client(proxy):
"""
(Re)establish connection with CTRL server and pass Reader/Writer to CTRL handler.
"""
- try:
- reader, writer = await asyncio.open_connection(proxy.ctrl_addr, proxy.ctrl_port)
- proxy.log.info('Connected to %s:%d', proxy.ctrl_addr, proxy.ctrl_port)
- await ctrl_client(proxy, reader, writer)
- except OSError as e:
- proxy.log.info('%s: %d seconds delayed retrying...', e, proxy.timeout)
- await asyncio.sleep(proxy.timeout)
- await conn_client(proxy)
+ while True:
+ try:
+ reader, writer = await asyncio.open_connection(proxy.ctrl_addr, proxy.ctrl_port)
+ proxy.log.info('Connected to %s:%d', proxy.ctrl_addr, proxy.ctrl_port)
+ await ctrl_client(proxy, reader, writer)
+ except OSError as e:
+ proxy.log.info('%s: %d seconds delayed retrying...', e, proxy.timeout)
+ await asyncio.sleep(proxy.timeout)
+ except asyncio.IncompleteReadError:
+ pass
+ proxy.log.info('Reconnecting...')
if __name__ == '__main__':