Commit fb148730 authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor diag_ping.php

parent 56ced221
<?php
/*
Copyright (C) 2014 Deciso B.V.
Copyright (C) 2016 Deciso B.V.
Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
All rights reserved.
......@@ -34,27 +34,64 @@ require_once("interfaces.inc");
define('MAX_COUNT', 10);
define('DEFAULT_COUNT', 3);
if ($_POST || $_REQUEST['host']) {
unset($input_errors);
unset($do_ping);
$cmd_action = false;
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// set form defaults
$pconfig = array();
$pconfig['count'] = 3;
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validate formdata and schedule action
$pconfig = $_POST;
$input_errors = array();
/* input validation */
$reqdfields = explode(" ", "host count");
$reqdfieldsn = array(gettext("Host"),gettext("Count"));
do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors);
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if (($_REQUEST['count'] < 1) || ($_REQUEST['count'] > MAX_COUNT)) {
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);
}
$host = trim($_REQUEST['host']);
$ipproto = $_REQUEST['ipproto'];
if (($ipproto == "ipv4") && is_ipaddrv6($host))
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.");
if (($ipproto == "ipv6") && is_ipaddrv4($host))
} 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']);
}
$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}";
}
}
$cmd_action = "{$command} {$srcip} -c" . escapeshellarg($pconfig['count']) . " " . escapeshellarg($host);
}
}
if ($_POST || $_REQUEST['host']) {
if (!$input_errors) {
$host = trim($pconfig['host']);
$ipproto = $pconfig['ipproto'];
if (count($input_errors)) {
$do_ping = true;
$sourceip = $_REQUEST['sourceip'];
$count = $_POST['count'];
......@@ -68,6 +105,7 @@ if (!isset($do_ping)) {
$count = DEFAULT_COUNT;
}
legacy_html_escape_form_data($pconfig);
include("head.inc"); ?>
<body>
<?php include("fbegin.inc"); ?>
......@@ -75,56 +113,58 @@ include("head.inc"); ?>
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<section class="col-xs-12">
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<div class="content-box">
<header class="content-box-head container-fluid">
<h3><?=gettext("Ping"); ?></h3>
</header>
<div class="content-box-main">
<form action="<?=$_SERVER['REQUEST_URI'];?>" method="post" name="iform" id="iform">
<form method="post" name="iform" id="iform">
<div class="table-responsive">
<table class="table table-striped __nomb">
<tbody>
<tr>
<td><?=gettext("Host"); ?></td>
<td><input name="host" type="text" class="form-control" id="host" value="<?=htmlspecialchars($host);?>" /></td>
<td><input name="host" type="text" value="<?=$pconfig['host'];?>" /></td>
</tr>
<tr>
<td><?=gettext("IP Protocol"); ?></td>
<td><select name="ipproto" class="form-control">
<option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>><?= gettext('IPv4') ?></option>
<option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>><?= gettext('IPv6') ?></option>
</select></td>
<td>
<select name="ipproto" class="form-control">
<option value="ipv4" <?=$pconfig['ipproto'] == "ipv4" ? "selected=\"selected\"" : "";?>><?= gettext('IPv4') ?></option>
<option value="ipv6" <?=$pconfig['ipproto'] == "ipv6" ? "selected=\"selected\"" : "";?>><?= gettext('IPv6') ?></option>
</select>
</td>
</tr>
<tr>
<td><?=gettext("Source Address"); ?></td>
<td><select name="sourceip" class="form-control">
<td>
<select name="sourceip" class="selectpicker">
<option value=""><?= gettext('Default') ?></option>
<?php $sourceips = get_possible_traffic_source_addresses(true);
foreach ($sourceips as $sip):
$selected = "";
if (!link_interface_to_bridge($sip['value']) && ($sip['value'] == $sourceip))
$selected = "selected=\"selected\"";
?>
<option value="<?=$sip['value'];?>" <?=$selected;?>>
<?php
foreach (get_possible_traffic_source_addresses(true) as $sip):?>
<option value="<?=$sip['value'];?>" <?=!link_interface_to_bridge($sip['value']) && ($sip['value'] == $pconfig['sourceip']) ? "selected=\"selected\"" : "";?>>
<?=htmlspecialchars($sip['name']);?>
</option>
<?php endforeach; ?>
</select></td>
<?php
endforeach; ?>
</select>
</td>
</tr>
<tr>
<td><?= gettext("Count"); ?></td>
<td><select name="count" class="form-control" id="count">
<?php for ($i = 1; $i <= MAX_COUNT; $i++): ?>
<option value="<?=$i;?>" <?php if ($i == $count) echo "selected=\"selected\""; ?>><?=$i;?></option>
<?php endfor; ?>
</select></td>
<td>
<select name="count" class="form-control" id="count">
<?php
for ($i = 1; $i <= MAX_COUNT; $i++): ?>
<option value="<?=$i;?>" <?=$i == $pconfig['count'] ? "selected=\"selected\"" : ""; ?>>
<?=$i;?>
</option>
<?php
endfor; ?>
</select>
</td>
</tr>
<tr>
<td>&nbsp;</td>
......@@ -135,59 +175,34 @@ include("head.inc"); ?>
</div>
</form>
</div>
</div>
</section>
<?php if ($do_ping): ?>
<?php
if ( $cmd_action !== false):?>
<section class="col-xs-12">
<script type="text/javascript">
//<![CDATA[
window.onload=function(){
document.getElementById("pingCaptured").wrap='off';
}
//]]>
</script>
<div class="content-box">
<header class="content-box-head container-fluid">
<h3><?=gettext("Ping output"); ?></h3>
</header>
<div class="content-box-main col-xs-12">
<pre>
<?php
$ifscope = '';
$command = "/sbin/ping";
if ($ipproto == "ipv6") {
$command .= "6";
$ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
if (is_linklocal($ifaddr))
$ifscope = get_ll_scope($ifaddr);
} else {
$ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
}
if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
$srcip = "-S" . escapeshellarg($ifaddr);
if (is_linklocal($host) && !strstr($host, "%") && !empty($ifscope))
$host .= "%{$ifscope}";
// execute ping command and catch both stdout and stderr
$process = proc_open($cmd_action, array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $pipes);
if (is_resource($process)) {
$result = stream_get_contents($pipes[1]);
$result .= stream_get_contents($pipes[2]);
echo $result;
}
$cmd = "{$command} {$srcip} -c" . escapeshellarg($count) . " " . escapeshellarg($host);
//echo "Ping command: {$cmd}\n";
system($cmd);
?>
</pre>
</div>
</div>
</section>
<?php endif; ?>
<?php
endif;?>
</div>
</div>
</section>
<?php include('foot.inc'); ?>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment