diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2012-03-10 11:56:31 -0800 |
---|---|---|
committer | Stephen Hemminger <shemminger@vyatta.com> | 2012-03-10 11:56:31 -0800 |
commit | 5c87a29d59330dce77628a36a23b37b078b6810b (patch) | |
tree | 7615aa31087a3ea2b8cc26b548cf89f62905697d | |
parent | 6d2b81c30523c9ac60d0696359a8a196361f29b3 (diff) | |
download | vyatta-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.am | 2 | ||||
-rwxr-xr-x | scripts/ping | 105 | ||||
-rw-r--r-- | scripts/vyatta-ping | 28 | ||||
-rw-r--r-- | templates/ping/ipv4/node.def | 4 | ||||
-rw-r--r-- | templates/ping/ipv4/node.tag/node.def | 8 | ||||
-rw-r--r-- | templates/ping/ipv4/node.tag/options/node.def | 8 | ||||
-rw-r--r-- | templates/ping/ipv4/node.tag/options/node.tag/node.def | 8 | ||||
-rw-r--r-- | templates/ping/ipv6/node.def | 4 | ||||
-rw-r--r-- | templates/ping/ipv6/node.tag/node.def | 8 | ||||
-rw-r--r-- | templates/ping/ipv6/node.tag/options/node.def | 8 | ||||
-rw-r--r-- | templates/ping/ipv6/node.tag/options/node.tag/node.def | 8 | ||||
-rw-r--r-- | templates/ping/node.def | 5 | ||||
-rw-r--r-- | templates/ping/node.tag/node.def | 8 | ||||
-rw-r--r-- | templates/ping/node.tag/options/node.def | 8 | ||||
-rw-r--r-- | templates/ping/node.tag/options/node.tag/node.def | 8 |
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}" |