summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2012-03-10 11:56:31 -0800
committerStephen Hemminger <shemminger@vyatta.com>2012-03-10 11:56:31 -0800
commit5c87a29d59330dce77628a36a23b37b078b6810b (patch)
tree7615aa31087a3ea2b8cc26b548cf89f62905697d /scripts
parent6d2b81c30523c9ac60d0696359a8a196361f29b3 (diff)
downloadvyatta-op-5c87a29d59330dce77628a36a23b37b078b6810b.tar.gz
vyatta-op-5c87a29d59330dce77628a36a23b37b078b6810b.zip
Add new ping command script
Bug 3052 Rather than having a ping an op-mode command which has no flexibility about arguments. Make it a wrapper script that accepts Juniper style arguments and turns them into Unix style flags.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/ping105
-rw-r--r--scripts/vyatta-ping28
2 files changed, 105 insertions, 28 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;
+
diff --git a/scripts/vyatta-ping b/scripts/vyatta-ping
deleted file mode 100644
index 393c0ab..0000000
--- a/scripts/vyatta-ping
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-ADDR=$1
-# Regular expressions for matching an ipv4 and ipv6 address
-# simple ipv4 matcher
-ip4regex="^(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$"
-# based on IPv6 regex from here: http://forums.dartware.com/viewtopic.php?t=452
-ip6regex="^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$"
-
-# Main logic
-if [[ "$ADDR" =~ $ip4regex ]]; then
- /bin/ping ${@:2} $ADDR
-elif [[ "$ADDR" =~ $ip6regex ]]; then
- /bin/ping6 ${@:2} $ADDR
-else
- echo "Resolving Address: $ADDR"
- if host $ADDR | awk {' print $4 '} \
- | grep -m1 -E "$ip4regex">/dev/null; then
- # resolve address and check if it is ipv4 or other
- /bin/ping ${@:2} $ADDR
- elif host $ADDR | awk {' print $5 '} \
- | grep -m1 -E "$ip6regex">/dev/null; then
- # if ipv6 resolution then ping6
- /bin/ping6 ${@:2} $ADDR
- else
- echo -e "\n Unknown address: [$ADDR]\n"
- fi
-fi
-