diff --git a/jc/parsers/ping.py b/jc/parsers/ping.py index f216616c..06401c1d 100644 --- a/jc/parsers/ping.py +++ b/jc/parsers/ping.py @@ -35,7 +35,7 @@ Schema: "round_trip_ms_stddev": float, "responses": [ { - "type": string, # 'reply', 'timeout', etc. See type_map for all options + "type": string, # 'reply', 'timeout', 'unparsable_line', etc. See `_error_type.type_map` for all options "timestamp": float, "bytes": integer, "response_ip": string, @@ -364,35 +364,39 @@ def _linux_parse(data): # normal responses else: + try: + line = line.replace('(', ' ').replace(')', ' ').replace('=', ' ') - line = line.replace('(', ' ').replace(')', ' ').replace('=', ' ') + # positions of items depend on whether ipv4/ipv6 and/or ip/hostname is used + if ipv4 and not hostname: + bts, rip, iseq, t2l, tms = (0, 3, 5, 7, 9) + elif ipv4 and hostname: + bts, rip, iseq, t2l, tms = (0, 4, 7, 9, 11) + elif not ipv4 and not hostname: + bts, rip, iseq, t2l, tms = (0, 3, 5, 7, 9) + elif not ipv4 and hostname: + bts, rip, iseq, t2l, tms = (0, 4, 7, 9, 11) - # positions of items depend on whether ipv4/ipv6 and/or ip/hostname is used - if ipv4 and not hostname: - bts, rip, iseq, t2l, tms = (0, 3, 5, 7, 9) - elif ipv4 and hostname: - bts, rip, iseq, t2l, tms = (0, 4, 7, 9, 11) - elif not ipv4 and not hostname: - bts, rip, iseq, t2l, tms = (0, 3, 5, 7, 9) - elif not ipv4 and hostname: - bts, rip, iseq, t2l, tms = (0, 4, 7, 9, 11) + # if timestamp option is specified, then shift everything right by one + timestamp = False + if line[0] == '[': + timestamp = True + bts, rip, iseq, t2l, tms = (bts + 1, rip + 1, iseq + 1, t2l + 1, tms + 1) - # if timestamp option is specified, then shift everything right by one - timestamp = False - if line[0] == '[': - timestamp = True - bts, rip, iseq, t2l, tms = (bts + 1, rip + 1, iseq + 1, t2l + 1, tms + 1) - - response = { - 'type': 'reply', - 'timestamp': line.split()[0].lstrip('[').rstrip(']') if timestamp else None, - 'bytes': line.split()[bts], - 'response_ip': line.split()[rip].rstrip(':'), - 'icmp_seq': line.split()[iseq], - 'ttl': line.split()[t2l], - 'time_ms': line.split()[tms], - 'duplicate': True if 'DUP!' in line else False - } + response = { + 'type': 'reply', + 'timestamp': line.split()[0].lstrip('[').rstrip(']') if timestamp else None, + 'bytes': line.split()[bts], + 'response_ip': line.split()[rip].rstrip(':'), + 'icmp_seq': line.split()[iseq], + 'ttl': line.split()[t2l], + 'time_ms': line.split()[tms], + 'duplicate': True if 'DUP!' in line else False + } + except Exception: + response = { + 'type': 'unparsable_line' + } ping_responses.append(response) continue @@ -542,7 +546,28 @@ def _bsd_parse(data): # normal response else: - line = line.replace(':', ' ').replace('=', ' ') + try: + line = line.replace(':', ' ').replace('=', ' ') + response = { + 'type': 'reply', + 'bytes': line.split()[0], + 'response_ip': line.split()[3], + 'icmp_seq': line.split()[5], + 'ttl': line.split()[7], + 'time_ms': line.split()[9] + } + except Exception: + response = { + 'type': 'unparsable_line' + } + + ping_responses.append(response) + continue + + # ipv6 lines + else: + try: + line = line.replace(',', ' ').replace('=', ' ') response = { 'type': 'reply', 'bytes': line.split()[0], @@ -551,20 +576,11 @@ def _bsd_parse(data): 'ttl': line.split()[7], 'time_ms': line.split()[9] } - ping_responses.append(response) - continue + except Exception: + response = { + 'type': 'unparsable_line' + } - # ipv6 lines - else: - line = line.replace(',', ' ').replace('=', ' ') - response = { - 'type': 'reply', - 'bytes': line.split()[0], - 'response_ip': line.split()[3], - 'icmp_seq': line.split()[5], - 'ttl': line.split()[7], - 'time_ms': line.split()[9] - } ping_responses.append(response) continue