summaryrefslogtreecommitdiff
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
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.
-rw-r--r--Makefile.am2
-rwxr-xr-xscripts/ping105
-rw-r--r--scripts/vyatta-ping28
-rw-r--r--templates/ping/ipv4/node.def4
-rw-r--r--templates/ping/ipv4/node.tag/node.def8
-rw-r--r--templates/ping/ipv4/node.tag/options/node.def8
-rw-r--r--templates/ping/ipv4/node.tag/options/node.tag/node.def8
-rw-r--r--templates/ping/ipv6/node.def4
-rw-r--r--templates/ping/ipv6/node.tag/node.def8
-rw-r--r--templates/ping/ipv6/node.tag/options/node.def8
-rw-r--r--templates/ping/ipv6/node.tag/options/node.tag/node.def8
-rw-r--r--templates/ping/node.def5
-rw-r--r--templates/ping/node.tag/node.def8
-rw-r--r--templates/ping/node.tag/options/node.def8
-rw-r--r--templates/ping/node.tag/options/node.tag/node.def8
15 files changed, 106 insertions, 114 deletions
diff --git a/Makefile.am b/Makefile.am
index 14e4253..99f5da6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -40,7 +40,7 @@ bin_SCRIPTS += scripts/vyatta-remote-copy.pl
bin_SCRIPTS += scripts/vyatta-show-current-user
bin_SCRIPTS += scripts/tech-support-archive
bin_SCRIPTS += scripts/vyatta-op-cmd-wrapper
-bin_SCRIPTS += scripts/vyatta-ping
+bin_SCRIPTS += scripts/ping
bin_SCRIPTS += scripts/vyatta-traceroute
bin_SCRIPTS += scripts/vyatta-monitor
bin_SCRIPTS += scripts/vyatta-monitor-list
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
-
diff --git a/templates/ping/ipv4/node.def b/templates/ping/ipv4/node.def
deleted file mode 100644
index 500ee3a..0000000
--- a/templates/ping/ipv4/node.def
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# Operational mode template for the "ping" command
-#
-help: Send IPv4 Internet Control Message Protocol (ICMP) echo request
diff --git a/templates/ping/ipv4/node.tag/node.def b/templates/ping/ipv4/node.tag/node.def
deleted file mode 100644
index 960c0aa..0000000
--- a/templates/ping/ipv4/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Send IPv4 ICMP echo request to specified <hostname|IPv4 address>
-allowed: echo -n '<hostname> <x.x.x.x>'
-
-run: /bin/ping $3
diff --git a/templates/ping/ipv4/node.tag/options/node.def b/templates/ping/ipv4/node.tag/options/node.def
deleted file mode 100644
index 90b225d..0000000
--- a/templates/ping/ipv4/node.tag/options/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n 'option text'
-
-
diff --git a/templates/ping/ipv4/node.tag/options/node.tag/node.def b/templates/ping/ipv4/node.tag/options/node.tag/node.def
deleted file mode 100644
index 9d4fdca..0000000
--- a/templates/ping/ipv4/node.tag/options/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n '<ping-options>'
-
-run: /bin/ping ${*:5} $3
diff --git a/templates/ping/ipv6/node.def b/templates/ping/ipv6/node.def
deleted file mode 100644
index 20cc018..0000000
--- a/templates/ping/ipv6/node.def
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# Operational mode template for the "ping" command
-#
-help: Send IPv6 Internet Control Message Protocol (ICMP) echo request
diff --git a/templates/ping/ipv6/node.tag/node.def b/templates/ping/ipv6/node.tag/node.def
deleted file mode 100644
index 4a107f7..0000000
--- a/templates/ping/ipv6/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Send IPv6 ICMP echo request to specified <hostname|IPv6 address>
-allowed: echo -n '<hostname> <h:h:h:h:h:h:h:h>'
-
-run: /bin/ping6 $3
diff --git a/templates/ping/ipv6/node.tag/options/node.def b/templates/ping/ipv6/node.tag/options/node.def
deleted file mode 100644
index 90b225d..0000000
--- a/templates/ping/ipv6/node.tag/options/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n 'option text'
-
-
diff --git a/templates/ping/ipv6/node.tag/options/node.tag/node.def b/templates/ping/ipv6/node.tag/options/node.tag/node.def
deleted file mode 100644
index 10c13a5..0000000
--- a/templates/ping/ipv6/node.tag/options/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n '<ping-options>'
-
-run: /bin/ping6 ${*:5} $3
diff --git a/templates/ping/node.def b/templates/ping/node.def
deleted file mode 100644
index a1bac16..0000000
--- a/templates/ping/node.def
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Operational mode template for the "ping" command
-#
-help: Send Internet Control Message Protocol (ICMP) echo request
-allowed: echo -n '<hostname> <x.x.x.x> <h:h:h:h:h:h:h:h>'
diff --git a/templates/ping/node.tag/node.def b/templates/ping/node.tag/node.def
deleted file mode 100644
index fe6dbce..0000000
--- a/templates/ping/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Send ICMP echo request to specified node
-allowed: echo -n '<hostname> <x.x.x.x> <h:h:h:h:h:h:h:h>'
-
-run: /opt/vyatta/bin/vyatta-ping $2
diff --git a/templates/ping/node.tag/options/node.def b/templates/ping/node.tag/options/node.def
deleted file mode 100644
index 90b225d..0000000
--- a/templates/ping/node.tag/options/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n 'option text'
-
-
diff --git a/templates/ping/node.tag/options/node.tag/node.def b/templates/ping/node.tag/options/node.tag/node.def
deleted file mode 100644
index cd1efa8..0000000
--- a/templates/ping/node.tag/options/node.tag/node.def
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Operational mode front-end for "ping" command
-#
-
-help: Supply advanced options to ping
-allowed: echo -n '<ping-options>'
-
-run: /opt/vyatta/bin/vyatta-ping $2 "${@:4}"