Skip to content

Commit

Permalink
+ add support of duplicates
Browse files Browse the repository at this point in the history
+ update rst doc

* update testdata
  • Loading branch information
shell-autonomic-sh committed Jul 2, 2019
1 parent d88a969 commit 92beb0c
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 7 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ a dictionary containing the parsed fields::
... 2 packets transmitted, 2 received, 0% packet loss, time 5072ms
... rtt min/avg/max/mdev = 13.946/17.682/21.418/3.736 ms''')
>>> OrderedDict(sorted(results.items()))
OrderedDict([('avgping', '17.682'), ('host', 'www.l.google.com'), ('jitter', '3.736'), ('maxping', '21.418'), ('minping', '13.946'), ('packet_loss', '0'), ('received', '2'), ('sent', '2')])
OrderedDict([('avgping', '17.682'), ('duplicates', '0'), ('host', 'www.l.google.com'), ('jitter', '3.736'), ('maxping', '21.418'), ('minping', '13.946'), ('packet_loss', '0'), ('received', '2'), ('sent', '2')])


Installing
Expand Down
15 changes: 12 additions & 3 deletions pingparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@

# This one works on OS X output which includes the percentage in 0.0% format
# https://regex101.com/r/nmjQzI/2
rslt_matcher = re.compile(r'(\d+) packets transmitted, (\d+) (?:packets )?received, (\d+\.?\d*)% packet loss')
rslt_matcher = re.compile(r'(\d+) packets transmitted, (\d+) (?:packets )?received')
dups_matcher = re.compile(r'\+(\d+) duplicates')
loss_matcher = re.compile(r'(\d+\.?\d*)% packet loss')

# Pull out round-trip min/avg/max/stddev = 49.042/49.042/49.042/0.000 ms
minmax_matcher = re.compile(r'(\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)')
Expand All @@ -36,6 +38,7 @@
format_replacements = [('%h', 'host'),
('%s', 'sent'),
('%r', 'received'),
('%d', 'duplicates'),
('%p', 'packet_loss'),
('%m', 'minping'),
('%a', 'avgping'),
Expand All @@ -46,12 +49,14 @@
default_format = ','.join([fmt for fmt, field in format_replacements])


def _get_match_groups(ping_output, regex):
def _get_match_groups(ping_output, regex, default=None):
"""
Get groups by matching regex in output from ping command.
"""
match = regex.search(ping_output)
if not match:
if default is not None:
return default
raise Exception('Invalid PING output:\n' + ping_output)
return match.groups()

Expand All @@ -74,7 +79,9 @@ def parse(ping_output):
in milliseconds
"""
host = _get_match_groups(ping_output, host_matcher)[0]
sent, received, packet_loss = _get_match_groups(ping_output, rslt_matcher)
sent, received = _get_match_groups(ping_output, rslt_matcher)
duplicates, = _get_match_groups(ping_output, dups_matcher, default=('0',))
packet_loss, = _get_match_groups(ping_output, loss_matcher)

try:
minping, avgping, maxping, jitter = _get_match_groups(ping_output,
Expand All @@ -85,6 +92,7 @@ def parse(ping_output):
return {'host' : host,
'sent' : sent,
'received' : received,
'duplicates' : duplicates,
'packet_loss' : packet_loss,
'minping' : minping,
'avgping' : avgping,
Expand Down Expand Up @@ -129,6 +137,7 @@ def main(argv=sys.argv):
\t%h host name or IP address
\t%s packets sent
\t%r packets received
\t%d duplicates
\t%p packet_loss
\t%m minimum ping in milliseconds
\t%a average ping in milliseconds
Expand Down
6 changes: 6 additions & 0 deletions test/data/dup.testdata
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
172.17.100.10,61,61,167,0,143.743,167.150,197.045,22.298
PING 172.17.100.10 (172.17.100.10) 56(84) bytes of data.

--- 172.17.100.10 ping statistics ---
61 packets transmitted, 61 received, +167 duplicates, 0% packet loss, time 119997ms
rtt min/avg/max/mdev = 143.743/167.150/197.045/22.298 ms
2 changes: 1 addition & 1 deletion test/data/original.testdata
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
www.l.google.com,2,2,0,13.946,17.682,21.418,3.736
www.l.google.com,2,2,0,0,13.946,17.682,21.418,3.736
PING www.l.google.com (74.125.225.84) 56(84) bytes of data.
64 bytes from 74.125.225.84: icmp_req=1 ttl=55 time=13.9 ms
64 bytes from 74.125.225.84: icmp_req=2 ttl=55 time=21.4 ms
Expand Down
2 changes: 1 addition & 1 deletion test/data/yahoo.ping.testdata.debian
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
yahoo.com,1,1,0,0.557,0.557,0.557,0.000
yahoo.com,1,1,0,0,0.557,0.557,0.557,0.000
PING yahoo.com (98.138.253.109): 56 data bytes
64 bytes from 98.138.253.109: icmp_seq=0 ttl=37 time=0.557 ms
--- yahoo.com ping statistics ---
Expand Down
2 changes: 1 addition & 1 deletion test/data/yahoo.ping.testdata.osx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
yahoo.com,1,1,0.0,27.409,27.409,27.409,0.000
yahoo.com,1,1,0,0.0,27.409,27.409,27.409,0.000
PING yahoo.com (98.139.183.24): 56 data bytes
64 bytes from 98.139.183.24: icmp_seq=0 ttl=48 time=27.409 ms

Expand Down

0 comments on commit 92beb0c

Please sign in to comment.