diff --git a/src/www/diag_ping.php b/src/www/diag_ping.php index c343106dc..3387c6322 100644 --- a/src/www/diag_ping.php +++ b/src/www/diag_ping.php @@ -1,40 +1,38 @@ - Copyright (C) 2003-2005 Manuel Kasper - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ + * Copyright (C) 2018 Franco Fichtner + * Copyright (C) 2016 Deciso B.V. + * Copyright (C) 2003-2005 Bob Zoller + * Copyright (C) 2003-2005 Manuel Kasper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ require_once("guiconfig.inc"); require_once("system.inc"); require_once("interfaces.inc"); -define('MAX_COUNT', 10); -define('DEFAULT_COUNT', 3); - $cmd_output = false; if ($_SERVER['REQUEST_METHOD'] === 'GET') { // set form defaults @@ -51,39 +49,32 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $reqdfieldsn = array(gettext("Host"),gettext("Count")); do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors); - if (!is_numeric($pconfig['count']) || $pconfig['count'] < 1 || $pconfig['count'] > MAX_COUNT) { - $input_errors[] = sprintf(gettext("Count must be between 1 and %s"), MAX_COUNT); - } - if ($pconfig['ipproto'] == "ipv4" && is_ipaddrv6(trim($pconfig['host']))) { - $input_errors[] = gettext("When using IPv4, the target host must be an IPv4 address or hostname."); - } elseif ($pconfig['ipproto'] == "ipv6" && is_ipaddrv4(trim($pconfig['host']))) { - $input_errors[] = gettext("When using IPv6, the target host must be an IPv6 address or hostname."); - } if (count($input_errors) == 0) { - $ifscope = ''; - $command = "/sbin/ping"; - if ($pconfig['ipproto'] == "ipv6") { - $command .= "6"; - $ifaddr = is_ipaddr($pconfig['sourceip']) ? $pconfig['sourceip'] : get_interface_ipv6($pconfig['sourceip']); - if (is_linklocal($ifaddr)) { - $ifscope = get_ll_scope($ifaddr); - } - } else { - $ifaddr = is_ipaddr($pconfig['sourceip']) ? $pconfig['sourceip'] : get_interface_ip($pconfig['sourceip']); + $command = '/sbin/ping'; + switch ($pconfig['ipproto']) { + case 'ipv6': + $command .= '6'; + $ifaddr = find_interface_ipv6(get_real_interface($pconfig['interface'], 'inet6')); + break; + case 'ipv6-ll': + $command .= '6'; + $realif = get_real_interface($pconfig['interface'], 'inet6'); + $ifaddr = find_interface_ipv6_ll($realif) . "%{$realif}"; + break; + default: + $ifaddr = find_interface_ip(get_real_interface($pconfig['interface'])); + break; } - $host = trim($pconfig['host']); - $srcip = ""; - if (!empty($ifaddr) && (is_ipaddr($pconfig['host']) || is_hostname($pconfig['host']))) { - $srcip = "-S" . escapeshellarg($ifaddr); - if (is_linklocal($pconfig['host']) && !strstr($pconfig['host'], "%") && !empty($ifscope)) { - $host .= "%{$ifscope}"; - } + $srcip = ''; + if (!empty($ifaddr)) { + $srcip = exec_safe('-S %s ', $ifaddr); } // execute ping command and catch both stdout and stderr - $cmd_action = "{$command} {$srcip} -c" . escapeshellarg($pconfig['count']) . " " . escapeshellarg($host); + $cmd_action = "{$command} {$srcip}" . exec_safe('-c %s %s', array($pconfig['count'], $pconfig['host'])); $process = proc_open($cmd_action, array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $pipes); if (is_resource($process)) { - $cmd_output = stream_get_contents($pipes[1]); + $cmd_output = "# $cmd_action\n"; + $cmd_output .= stream_get_contents($pipes[1]); $cmd_output .= stream_get_contents($pipes[2]); } } @@ -100,14 +91,9 @@ include("head.inc"); ?>
0) print_input_errors($input_errors); ?>
-
-

-
-
- @@ -118,21 +104,20 @@ include("head.inc"); ?> @@ -141,7 +126,7 @@ include("head.inc"); ?> - + -
- - - - +
 " />
-
- +
-
-
-

-
-
-
-
-
+
- + - +