Skip to content

Commit 9e4a90d

Browse files
committed
New option -J / --json for the JSON output
1 parent 913982a commit 9e4a90d

File tree

3 files changed

+398
-26
lines changed

3 files changed

+398
-26
lines changed

ci/test-16-json-output.pl

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#!/usr/bin/perl -w
2+
3+
use Test::Command tests => 33;
4+
use Test::More;
5+
6+
# fping -J -c 2 127.0.0.1
7+
{
8+
my $cmd = Test::Command->new(cmd => "fping -J -c 2 127.0.0.1");
9+
$cmd->exit_is_num(0);
10+
$cmd->stdout_like(qr/^\{"resp":\s\{"host":\s"127\.0\.0\.1",\s"seq":\s0,\s"size":\s\d+,\s"rtt":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"loss":\s\d+\}\}
11+
\{"resp":\s\{"host":\s"127\.0\.0\.1",\s"seq":\s1,\s"size":\s\d+,\s"rtt":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"loss":\s\d+\}\}
12+
\{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}\n?$/);
13+
$cmd->stderr_is_eq("");
14+
}
15+
16+
# fping -J -c 1 192.0.2.47
17+
{
18+
my $cmd = Test::Command->new(cmd => "fping -J -c 1 192.0.2.47");
19+
$cmd->exit_is_num(1);
20+
$cmd->stdout_like(qr/^\{"resp":\s\{"host":\s"192\.0\.2\.47",\s"seq":\s\d+,\s"rttAvg":\s"NaN",\s"loss":\s\d+\}\}
21+
\{"summary":\s\{"host":\s"192\.0\.2\.47",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+\}\}\n?$/);
22+
$cmd->stderr_is_eq("");
23+
}
24+
25+
# fping -J -c 1 -q 127.0.0.1
26+
{
27+
my $cmd = Test::Command->new(cmd => "fping -J -c 1 -q 127.0.0.1");
28+
$cmd->exit_is_num(0);
29+
$cmd->stdout_like(qr/^\{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}\n?$/);
30+
$cmd->stderr_is_eq("");
31+
}
32+
33+
# fping -J -C 1 -q 127.0.0.1
34+
{
35+
my $cmd = Test::Command->new(cmd => "fping -J -C 1 -q 127.0.0.1");
36+
$cmd->exit_is_num(0);
37+
$cmd->stdout_like(qr/^\{"vSum":\s\{"host":\s"\d+\.\d+\.\d+\.\d+",\s"values":\s\[\d+\.\d+\]\}\}\n?$/);
38+
$cmd->stderr_is_eq("");
39+
}
40+
41+
# fping -J -C 1 -q 127.0.0.1 127.0.0.2
42+
{
43+
my $cmd = Test::Command->new(cmd => "fping -J -C 1 -q 127.0.0.1 127.0.0.2");
44+
$cmd->exit_is_num(0); # Both hosts are reachable in this test
45+
$cmd->stdout_like(qr/^\{"vSum":\s\{"host":\s"\d+\.\d+\.\d+\.\d+",\s"values":\s\[\d+\.\d+\]}}
46+
\{"vSum":\s\{"host":\s"\d+\.\d+\.\d+\.\d+",\s"values":\s\[\d+\.\d+\]\}\}\n?$/);
47+
$cmd->stderr_is_eq("");
48+
}
49+
50+
# fping -J -C3 -p 100 -q 127.0.0.1
51+
{
52+
my $cmd = Test::Command->new(cmd => "fping -J -C3 -p 100 -q 127.0.0.1");
53+
$cmd->exit_is_num(0);
54+
$cmd->stdout_like(qr/^\{"vSum":\s\{"host":\s"\d+\.\d+\.\d+\.\d+",\s"values":\s\[\d+\.\d+\,\s\d+\.\d+,\s\d+\.\d+\]\}\}\n?$/);
55+
$cmd->stderr_is_eq("");
56+
}
57+
58+
# fping -J -c 1 -q host.invalid
59+
{
60+
my $cmd = Test::Command->new(cmd => "fping -J -c 1 -q host.invalid");
61+
$cmd->exit_is_num(2); # Exit code 2 indicates name resolution error
62+
$cmd->stdout_is_eq("");
63+
$cmd->stderr_like(qr/^\{"host":\s"host\.invalid", "error":\s"(?:Name or service not known|Temporary failure in name resolution|nodename nor servname provided, or not known)"\}$/);
64+
}
65+
66+
# fping -J -c 1 -q -g 127.0.0.1/30
67+
{
68+
my $cmd = Test::Command->new(cmd => "fping -J -c 1 -q -g 127.0.0.1/30");
69+
$cmd->exit_is_num(0);
70+
$cmd->stdout_like(qr/^\{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}
71+
\{"summary":\s\{"host":\s"127\.0\.0\.2",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}?$/);
72+
$cmd->stderr_is_eq("");
73+
}
74+
75+
# fping -J -c 2 -Q 1 127.0.0.1
76+
{
77+
my $cmd = Test::Command->new(cmd => "fping -J -c 2 -Q 1 127.0.0.1");
78+
$cmd->exit_is_num(0);
79+
$cmd->stdout_like(qr/^\{"intSum":\s\{"time":\s\d+,"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}
80+
\{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}?$/);
81+
$cmd->stderr_is_eq("");
82+
}
83+
84+
# fping -J -s -q -c 2 127.0.0.1
85+
{
86+
my $cmd = Test::Command->new(cmd => "fping -J -s -q -c 2 127.0.0.1");
87+
$cmd->exit_is_num(0);
88+
$cmd->stdout_like(qr/^\{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}
89+
\{"globalSum":\s\{"targets":\s\d+,\s"alive":\s\d+,\s"unreachable":\s\d+,\s"unknown\saddresses":\s\d+,\s"timeouts\s\(waiting\sfor\sresponse\)":\s\d+,\s"ICMP\sEchos\ssent":\s\d+,\s"ICMP\sEcho\sReplies\sreceived":\s\d+,\s"other\sICMP\sreceived":\s0,\s"ms\s\(min\sround\strip\stime\)":\s\d+\.\d+,\s"ms\s\(avg\sround\strip\stime\)":\s\d+\.\d+,\s"ms\s\(max\sround\strip\stime\)":\s\d+\.\d+,\s"sec\s\(elapsed\sreal\stime\)":\s\d+\.\d+\}\}?$/);
90+
$cmd->stderr_is_eq("");
91+
}
92+
93+
# fping -J 127.0.0.1
94+
{
95+
my $cmd = Test::Command->new(cmd => "fping -J 127.0.0.1");
96+
$cmd->exit_is_num(1);
97+
$cmd->stdout_is_eq("");
98+
$cmd->stderr_is_eq("fping: with -J or --json required -c or -C\n");
99+
}

doc/fping.pod

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,18 @@ the local receive time in the same format, in addition to normal output.
165165
Cannot be used together with B<-b> because ICMP timestamp messages have a fixed size.
166166
IPv4 only, requires root privileges or cap_net_raw.
167167

168+
=item B<-J>, B<--json>
169+
170+
Format output JSON (-c or -C required)
171+
172+
Example usage:
173+
174+
$ fping -J -c 1 127.0.0.1
175+
176+
or
177+
178+
$ fping -J -s -c 1 -q 127.0.0.1
179+
168180
=item B<-k>, B<--fwmark>=I<FWMARK>
169181

170182
Set FWMARK on ping packets for policy-based routing. Requires Linux kernel

0 commit comments

Comments
 (0)