summaryrefslogtreecommitdiff
path: root/scripts/ping
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ping')
-rwxr-xr-xscripts/ping105
1 files changed, 105 insertions, 0 deletions
diff --git a/scripts/ping b/scripts/ping
new file mode 100755
index 0000000..6a1e9e8
--- /dev/null
+++ b/scripts/ping
@@ -0,0 +1,105 @@
+#! /usr/bin/perl
+# Wrapper around the base Linux ping command to provide
+# nicer API (ie no flag arguments)
+#
+# **** License ****
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# This code was originally developed by Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2012 Vyatta, Inc.
+# All Rights Reserved.
+#
+#
+# Syntax
+# ping HOST
+# [ audible ]
+# [ adaptive ]
+# [ allow-broadcast]
+# [ count REQUESTS ]
+# [ mark N ]
+# [ flow LABEL ]
+# [ flood ]
+# [ interval ]
+# [ pattern PATTERN ]
+# [ timestamp ]
+# [ tos VALUE ]
+# [ quiet ]
+# [ bypass-routing ]
+# [ size SIZE ]
+# [ ttl TTL ]
+# [ verbose ]
+
+use strict;
+use warnings;
+use NetAddr::IP;
+use feature ":5.10";
+
+# Table for translating options to arguments
+my %options = (
+ 'audible' => 'a',
+ 'adaptive' => 'A',
+ 'allow-broadcast' => 'b',
+ 'bypass-route' => 'r',
+ 'count' => 'c:',
+ 'deadline:' => 'w',
+ 'flood' => 'f',
+ 'interface' => 'I:',
+ 'interval' => 'i:',
+ 'mark' => 'm:',
+ 'numeric' => 'n',
+ 'no-loopback' => 'L',
+ 'pattern' => 'p:',
+ 'timestamp' => 'D',
+ 'tos' => 'Q:',
+ 'quiet' => 'q',
+ 'record-route' => 'R',
+ 'size' => 's:',
+ 'ttl' => 't:',
+ 'verbose' => 'v',
+);
+
+# First argument is host
+my $host = shift @ARGV;
+die "ping: Missing host\n"
+ unless defined($host);
+
+my $ip = new NetAddr::IP $host;
+die "ping: Unknown host: $host\n"
+ unless defined($ip);
+
+my $cmd;
+given ($ip->version) {
+ when (4) { $cmd = '/bin/ping'; }
+ when (6) { $cmd = '/bin/ping6' }
+ default {
+ die "Unknown address: $host\n";
+ }
+}
+
+my @cmdargs = ( 'ping' );
+
+while (my $arg = shift @ARGV) {
+ my $pingarg = $options{$arg};
+ die "ping: unknown option $arg\n"
+ unless $pingarg;
+
+ my $flag = "-" . substr($pingarg, 0, 1);
+ push @cmdargs, $flag;
+
+ if (rindex($pingarg, ':') != -1) {
+ my $optarg = pop @ARGV;
+ die "ping: missing argument for $arg option\n"
+ unless defined($optarg);
+ push @cmdargs, $optarg;
+ }
+}
+
+exec { $cmd } @cmdargs, $host;
+