Commit d21be1c5 authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor diag_traceroute.php

parent 68477040
<?php <?php
/* /*
Copyright (C) 2014 Deciso B.V. Copyright (C) 2016 Deciso B.V.
Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>. Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
All rights reserved. All rights reserved.
...@@ -31,186 +31,173 @@ require_once("guiconfig.inc"); ...@@ -31,186 +31,173 @@ require_once("guiconfig.inc");
require_once("system.inc"); require_once("system.inc");
require_once("interfaces.inc"); require_once("interfaces.inc");
include("head.inc");
?>
<body>
<?php include("fbegin.inc"); ?>
<?php
define('MAX_TTL', 64); define('MAX_TTL', 64);
define('DEFAULT_TTL', 18);
if ($_POST || $_REQUEST['host']) { $cmd_output = false;
unset($input_errors); if ($_SERVER['REQUEST_METHOD'] === 'GET') {
unset($do_traceroute); // set form defaults
$pconfig = array();
$pconfig['ipproto'] = 'ipv4';
$pconfig['sourceip'] = null;
$pconfig['useicmp'] = null;
$pconfig['resolve'] = null;
$pconfig['ttl'] = isset($_GET['ttl']) ? $_GET['ttl'] : 18;
$pconfig['host'] = isset($_GET['host']) ? $_GET['host'] : null;
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validate input / execute traceroute
$input_errors = array();
$pconfig = $_POST;
/* input validation */ /* input validation */
$reqdfields = explode(" ", "host ttl"); $reqdfields = explode(" ", "host ttl");
$reqdfieldsn = array(gettext("Host"),gettext("ttl")); $reqdfieldsn = array(gettext("Host"),gettext("ttl"));
do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors); do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if (($_REQUEST['ttl'] < 1) || ($_REQUEST['ttl'] > MAX_TTL)) { if (!is_numeric($pconfig['ttl']) || $pconfig['ttl'] < 1 || $pconfig['ttl'] > MAX_TTL) {
$input_errors[] = sprintf(gettext("Maximum number of hops must be between 1 and %s"), MAX_TTL); $input_errors[] = sprintf(gettext("Maximum number of hops must be between 1 and %s"), MAX_TTL);
} }
$host = trim($_REQUEST['host']); $host = trim($pconfig['host']);
$ipproto = $_REQUEST['ipproto']; $ipproto = $pconfig['ipproto'];
if (($ipproto == "ipv4") && is_ipaddrv6($host)) if ($pconfig['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($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) {
$cmd_args = "-w 2";
$cmd_args .= !empty($pconfig['useicmp']) ? " -I " : "";
$cmd_args .= !empty($pconfig['resolve']) ? "" : " -n ";
$cmd_args .= " -m " . escapeshellarg($pconfig['ttl']);
if (!$input_errors) { $command = "/usr/sbin/traceroute";
$sourceip = $_REQUEST['sourceip']; if ($pconfig['ipproto'] == "ipv6") {
$do_traceroute = true; $command .= "6";
$ttl = $_REQUEST['ttl']; $ifaddr = is_ipaddr($pconfig['sourceip']) ? $pconfig['sourceip'] : get_interface_ipv6($pconfig['sourceip']);
$resolve = $_REQUEST['resolve']; } else {
$ifaddr = is_ipaddr($pconfig['sourceip']) ? $pconfig['sourceip'] : get_interface_ip($pconfig['sourceip']);
} }
} else
$resolve = true;
if (!isset($do_traceroute)) { if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
$do_traceroute = false; $cmd_args .= " -s " . escapeshellarg($ifaddr) . " ";
$host = ''; }
$ttl = DEFAULT_TTL;
$cmd_action = "{$command} {$cmd_args} " . " " . escapeshellarg($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[2]);
$cmd_output .= stream_get_contents($pipes[1]);
}
}
} }
legacy_html_escape_form_data($pconfig);
include("head.inc");
?> ?>
<body>
<?php include("fbegin.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("Traceroute");?></h3> <h3><?=gettext("Traceroute");?></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">
<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" class="form-control" id="host" 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('Any') ?></option> <option value=""><?= gettext('Any') ?></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("Maximum number of hops");?></td> <td><?=gettext("Maximum number of hops");?></td>
<td><select name="ttl" class="form-control" id="ttl"> <td>
<?php for ($i = 1; $i <= MAX_TTL; $i++): ?> <select name="ttl" class="form-control" id="ttl">
<option value="<?=$i;?>" <?php if ($i == $ttl) echo "selected=\"selected\""; ?>><?=$i;?></option> <?php
<?php endfor; ?> for ($i = 1; $i <= MAX_TTL; $i++): ?>
</select></td> <option value="<?=$i;?>" <?= $i == $pconfig['ttl'] ? "selected=\"selected\"" : "" ;?>>
<?=$i;?>
</option>
<?php
endfor; ?>
</select>
</td>
</tr> </tr>
<tr> <tr>
<td><?=gettext("Reverse Address Lookup");?></td> <td><?=gettext("Reverse Address Lookup");?></td>
<td><input name="resolve" type="checkbox"<?php echo (!isset($resolve) ? "" : " checked=\"checked\""); ?> /></td> <td>
<input name="resolve" type="checkbox"<?=!empty($pconfig['resolve']) ? " checked=\"checked\"" : ""; ?> />
</td>
</tr> </tr>
<tr> <tr>
<td><?=gettext("Use ICMP");?></td> <td><?=gettext("Use ICMP");?></td>
<td><input name="useicmp" type="checkbox"<?php if($_REQUEST['useicmp']) echo " checked=\"checked\""; ?> /></td> <td>
<input name="useicmp" type="checkbox" <?=!empty($pconfig['useicmp']) ? " checked=\"checked\"" : ""; ?> />
</td>
</tr> </tr>
<tr> <tr>
<td>&nbsp;</td> <td>&nbsp;</td>
<td><input name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Traceroute"); ?>" /></td> <td>
<input name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Traceroute"); ?>" />
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="container-fluid"> <div class="container-fluid">
<p><span class="text-danger"><b><?=gettext("Note: ");?></b></span> <p>
<span class="text-danger"><b><?=gettext("Note: ");?></b></span>
<?=gettext("Traceroute may take a while to complete. You may hit the Stop button on your browser at any time to see the progress of failed traceroutes.");?> <?=gettext("Traceroute may take a while to complete. You may hit the Stop button on your browser at any time to see the progress of failed traceroutes.");?>
<br /><br /> <br /><br />
<?=gettext("Using a source interface/IP address that does not match selected type (IPv4, IPv6) will result in an error or empty output.");?> <?=gettext("Using a source interface/IP address that does not match selected type (IPv4, IPv6) will result in an error or empty output.");?>
</p> </p>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</section> </section>
<?php
<?php if ($do_traceroute): ob_end_flush(); ?> if ( $cmd_output !== false):?>
<section class="col-xs-12"> <section class="col-xs-12">
<script type="text/javascript">
//<![CDATA[
window.onload=function(){
document.getElementById("tracerouteCaptured").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("Traceroute output"); ?></h3> <h3><?=gettext("Traceroute output"); ?></h3>
</header> </header>
<div class="content-box-main col-xs-12"> <div class="content-box-main col-xs-12">
<pre> <pre><?=$cmd_output;?></pre>
<?php
$useicmp = isset($_REQUEST['useicmp']) ? "-I" : "";
$n = isset($resolve) ? "" : "-n";
$command = "/usr/sbin/traceroute";
if ($ipproto == "ipv6") {
$command .= "6";
$ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
} else {
$ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
}
if ($ifaddr && (is_ipaddr($host) || is_hostname($host)))
$srcip = "-s " . escapeshellarg($ifaddr);
$cmd = "{$command} {$n} {$srcip} -w 2 {$useicmp} -m " . escapeshellarg($ttl) . " " . escapeshellarg($host);
//echo "Traceroute command: {$cmd}\n";
system($cmd);
?>
</pre>
</div> </div>
</div> </div>
</section> </section>
<?php endif; ?> <?php
endif;?>
</div> </div>
</div> </div>
</section> </section>
......
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