Commit fb148730 authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor diag_ping.php

parent 56ced221
<?php <?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>. Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
All rights reserved. All rights reserved.
...@@ -34,27 +34,64 @@ require_once("interfaces.inc"); ...@@ -34,27 +34,64 @@ require_once("interfaces.inc");
define('MAX_COUNT', 10); define('MAX_COUNT', 10);
define('DEFAULT_COUNT', 3); define('DEFAULT_COUNT', 3);
if ($_POST || $_REQUEST['host']) { $cmd_action = false;
unset($input_errors); if ($_SERVER['REQUEST_METHOD'] === 'GET') {
unset($do_ping); // 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 */ /* input validation */
$reqdfields = explode(" ", "host count"); $reqdfields = explode(" ", "host count");
$reqdfieldsn = array(gettext("Host"),gettext("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); $input_errors[] = sprintf(gettext("Count must be between 1 and %s"), MAX_COUNT);
} }
if ($pconfig['ipproto'] == "ipv4" && is_ipaddrv6(trim($pconfig['host']))) {
$host = trim($_REQUEST['host']);
$ipproto = $_REQUEST['ipproto'];
if (($ipproto == "ipv4") && is_ipaddrv6($host))
$input_errors[] = gettext("When using IPv4, the target host must be an IPv4 address or hostname."); $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."); $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; $do_ping = true;
$sourceip = $_REQUEST['sourceip']; $sourceip = $_REQUEST['sourceip'];
$count = $_POST['count']; $count = $_POST['count'];
...@@ -68,6 +105,7 @@ if (!isset($do_ping)) { ...@@ -68,6 +105,7 @@ if (!isset($do_ping)) {
$count = DEFAULT_COUNT; $count = DEFAULT_COUNT;
} }
legacy_html_escape_form_data($pconfig);
include("head.inc"); ?> include("head.inc"); ?>
<body> <body>
<?php include("fbegin.inc"); ?> <?php include("fbegin.inc"); ?>
...@@ -75,56 +113,58 @@ include("head.inc"); ?> ...@@ -75,56 +113,58 @@ include("head.inc"); ?>
<section class="page-content-main"> <section class="page-content-main">
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<section class="col-xs-12"> <section class="col-xs-12">
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?> <?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<div class="content-box"> <div class="content-box">
<header class="content-box-head container-fluid"> <header class="content-box-head container-fluid">
<h3><?=gettext("Ping"); ?></h3> <h3><?=gettext("Ping"); ?></h3>
</header> </header>
<div class="content-box-main"> <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"> <div class="table-responsive">
<table class="table table-striped __nomb"> <table class="table table-striped __nomb">
<tbody> <tbody>
<tr> <tr>
<td><?=gettext("Host"); ?></td> <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>
<tr> <tr>
<td><?=gettext("IP Protocol"); ?></td> <td><?=gettext("IP Protocol"); ?></td>
<td><select name="ipproto" class="form-control"> <td>
<option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>><?= gettext('IPv4') ?></option> <select name="ipproto" class="form-control">
<option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>><?= gettext('IPv6') ?></option> <option value="ipv4" <?=$pconfig['ipproto'] == "ipv4" ? "selected=\"selected\"" : "";?>><?= gettext('IPv4') ?></option>
</select></td> <option value="ipv6" <?=$pconfig['ipproto'] == "ipv6" ? "selected=\"selected\"" : "";?>><?= gettext('IPv6') ?></option>
</select>
</td>
</tr> </tr>
<tr> <tr>
<td><?=gettext("Source Address"); ?></td> <td><?=gettext("Source Address"); ?></td>
<td><select name="sourceip" class="form-control"> <td>
<select name="sourceip" class="selectpicker">
<option value=""><?= gettext('Default') ?></option> <option value=""><?= gettext('Default') ?></option>
<?php $sourceips = get_possible_traffic_source_addresses(true); <?php
foreach ($sourceips as $sip): foreach (get_possible_traffic_source_addresses(true) as $sip):?>
$selected = ""; <option value="<?=$sip['value'];?>" <?=!link_interface_to_bridge($sip['value']) && ($sip['value'] == $pconfig['sourceip']) ? "selected=\"selected\"" : "";?>>
if (!link_interface_to_bridge($sip['value']) && ($sip['value'] == $sourceip))
$selected = "selected=\"selected\"";
?>
<option value="<?=$sip['value'];?>" <?=$selected;?>>
<?=htmlspecialchars($sip['name']);?> <?=htmlspecialchars($sip['name']);?>
</option> </option>
<?php endforeach; ?> <?php
</select></td> endforeach; ?>
</select>
</td>
</tr> </tr>
<tr> <tr>
<td><?= gettext("Count"); ?></td> <td><?= gettext("Count"); ?></td>
<td><select name="count" class="form-control" id="count"> <td>
<?php for ($i = 1; $i <= MAX_COUNT; $i++): ?> <select name="count" class="form-control" id="count">
<option value="<?=$i;?>" <?php if ($i == $count) echo "selected=\"selected\""; ?>><?=$i;?></option> <?php
<?php endfor; ?> for ($i = 1; $i <= MAX_COUNT; $i++): ?>
</select></td> <option value="<?=$i;?>" <?=$i == $pconfig['count'] ? "selected=\"selected\"" : ""; ?>>
<?=$i;?>
</option>
<?php
endfor; ?>
</select>
</td>
</tr> </tr>
<tr> <tr>
<td>&nbsp;</td> <td>&nbsp;</td>
...@@ -135,59 +175,34 @@ include("head.inc"); ?> ...@@ -135,59 +175,34 @@ include("head.inc"); ?>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</section> </section>
<?php
<?php if ($do_ping): ?> if ( $cmd_action !== false):?>
<section class="col-xs-12"> <section class="col-xs-12">
<script type="text/javascript">
//<![CDATA[
window.onload=function(){
document.getElementById("pingCaptured").wrap='off';
}
//]]>
</script>
<div class="content-box"> <div class="content-box">
<header class="content-box-head container-fluid"> <header class="content-box-head container-fluid">
<h3><?=gettext("Ping output"); ?></h3> <h3><?=gettext("Ping output"); ?></h3>
</header> </header>
<div class="content-box-main col-xs-12"> <div class="content-box-main col-xs-12">
<pre> <pre>
<?php <?php
// execute ping command and catch both stdout and stderr
$ifscope = ''; $process = proc_open($cmd_action, array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $pipes);
$command = "/sbin/ping"; if (is_resource($process)) {
if ($ipproto == "ipv6") { $result = stream_get_contents($pipes[1]);
$command .= "6"; $result .= stream_get_contents($pipes[2]);
$ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip); echo $result;
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}";
} }
$cmd = "{$command} {$srcip} -c" . escapeshellarg($count) . " " . escapeshellarg($host);
//echo "Ping command: {$cmd}\n";
system($cmd);
?> ?>
</pre> </pre>
</div> </div>
</div> </div>
</section> </section>
<?php endif; ?> <?php
endif;?>
</div> </div>
</div> </div>
</section> </section>
<?php include('foot.inc'); ?> <?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