Commit 68477040 authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor diag_testport.php

parent 708a14bc
<?php <?php
/* /*
Copyright (C) 2014 Deciso B.V. Copyright (C) 2016 Deciso B.V.
Copyright (C) 2013 Jim Pingle <jimp@pfsense.org> Copyright (C) 2013 Jim Pingle <jimp@pfsense.org>
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.
...@@ -32,133 +32,168 @@ require_once("guiconfig.inc"); ...@@ -32,133 +32,168 @@ require_once("guiconfig.inc");
require_once("system.inc"); require_once("system.inc");
require_once("interfaces.inc"); require_once("interfaces.inc");
define('NC_TIMEOUT', 10); $cmd_output = false;
$do_testport = false; if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// set form defaults
if ($_POST || $_REQUEST['host']) { $pconfig = array();
unset($input_errors); $pconfig['ipprotocol'] = 'ipv4';
$pconfig['host'] = null;
$pconfig['port'] = null;
$pconfig['showtext'] = null;
$pconfig['sourceip'] = null;
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pconfig = $_POST;
$input_errors = array();
/* input validation */ /* input validation */
$reqdfields = explode(" ", "host port"); $reqdfields = explode(" ", "host port");
$reqdfieldsn = array(gettext("Host"),gettext("Port")); $reqdfieldsn = array(gettext("Host"),gettext("Port"));
do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors); do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if (!is_ipaddr($_REQUEST['host']) && !is_hostname($_REQUEST['host'])) { if (!is_ipaddr($pconfig['host']) && !is_hostname($pconfig['host'])) {
$input_errors[] = gettext("Please enter a valid IP or hostname."); $input_errors[] = gettext("Please enter a valid IP or hostname.");
} }
if (!is_port($_REQUEST['port'])) { if (!is_port($pconfig['port'])) {
$input_errors[] = gettext("Please enter a valid port number."); $input_errors[] = gettext("Please enter a valid port number.");
} }
if (($_REQUEST['srcport'] != "") && (!is_numeric($_REQUEST['srcport']) || !is_port($_REQUEST['srcport']))) { if (($pconfig['srcport'] != "") && (!is_numeric($pconfig['srcport']) || !is_port($pconfig['srcport']))) {
$input_errors[] = gettext("Please enter a valid source port number, or leave the field blank."); $input_errors[] = gettext("Please enter a valid source port number, or leave the field blank.");
} }
if (is_ipaddrv4($_REQUEST['host']) && ($_REQUEST['ipprotocol'] == "ipv6")) { if (is_ipaddrv4($pconfig['host']) && ($pconfig['ipprotocol'] == "ipv6")) {
$input_errors[] = gettext("You cannot connect to an IPv4 address using IPv6."); $input_errors[] = gettext("You cannot connect to an IPv4 address using IPv6.");
} }
if (is_ipaddrv6($_REQUEST['host']) && ($_REQUEST['ipprotocol'] == "ipv4")) { if (is_ipaddrv6($pconfig['host']) && ($pconfig['ipprotocol'] == "ipv4")) {
$input_errors[] = gettext("You cannot connect to an IPv6 address using IPv4."); $input_errors[] = gettext("You cannot connect to an IPv6 address using IPv4.");
} }
if (!$input_errors) { if (count($input_errors) == 0) {
$do_testport = true; $nc_args = "-w 10" ;
$timeout = NC_TIMEOUT; if (empty($pconfig['showtext'])) {
$nc_args .= " -z ";
}
if (!empty($pconfig['srcport'])) {
$nc_args .= " -p " . escapeshellarg($pconfig['srcport']) . " ";
}
switch ($pconfig['ipprotocol']) {
case "ipv4":
$ifaddr = ($pconfig['sourceip'] == "any") ? "" : get_interface_ip($pconfig['sourceip']);
$nc_args .= " -4";
break;
case "ipv6":
$ifaddr = (is_linklocal($pconfig['sourceip']) ? $pconfig['sourceip'] : get_interface_ipv6($pconfig['sourceip']));
$nc_args .= " -6";
break;
}
if (!empty($ifaddr)) {
$nc_args .= " -s " . escapeshellarg($ifaddr) . " ";
$scope = get_ll_scope($ifaddr);
if (!empty($scope) && !strstr($host, "%")) {
$host .= "%{$scope}";
}
} }
/* Save these request vars even if there were input errors. Then the fields are refilled for the user to correct. */ $cmd_action = "/usr/bin/nc {$nc_args} " . escapeshellarg($pconfig['host']) . " " . escapeshellarg($pconfig['port']) . " 2>&1";
$host = $_REQUEST['host']; $process = proc_open($cmd_action, array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $pipes);
$sourceip = $_REQUEST['sourceip']; if (is_resource($process)) {
$port = $_REQUEST['port']; $cmd_output = stream_get_contents($pipes[1]);
$srcport = $_REQUEST['srcport']; $cmd_output .= stream_get_contents($pipes[2]);
$showtext = isset($_REQUEST['showtext']); }
$ipprotocol = $_REQUEST['ipprotocol']; }
} }
legacy_html_escape_form_data($pconfig);
include("head.inc"); ?> include("head.inc"); ?>
<body> <body>
<?php include("fbegin.inc"); ?> <?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">
<div id="message" style="" class="alert alert-warning" role="alert">
<?php echo gettext("This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port. This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner."); ?> <?php echo gettext("This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port. This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner."); ?>
<br /><br /> <br /><br />
<?php echo gettext("No data is transmitted to the remote host during this test, it will only attempt to open a connection and optionally display the data sent back from the server."); ?> <?php echo gettext("No data is transmitted to the remote host during this test, it will only attempt to open a connection and optionally display the data sent back from the server."); ?>
<br /><br /><br /> </div>
<?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">
<h3><?=gettext("Test Port"); ?></h3>
</header>
<div class="content-box-main "> <div class="content-box-main ">
<form action="<?=$_SERVER['REQUEST_URI'];?>" method="post" name="iform" id="iform"> <?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<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">
<thead>
<tr>
<td width="22%"><strong><?=gettext("Test Port"); ?></strong></td>
<td width="78%" align="right">
<small><?=gettext("full help"); ?> </small>
<i class="fa fa-toggle-off text-danger" style="cursor: pointer;" id="show_all_help_page" type="button"></i></a>
&nbsp;
</td>
</tr>
</thead>
<tbody> <tbody>
<tr> <tr>
<td><?=gettext("Host"); ?></td> <td><a id="help_for_ipprotocol" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("IP Protocol"); ?></td>
<td><input name="host" type="text" class="form-control" id="host" value="<?=htmlspecialchars($host);?>" /></td> <td>
<select name="ipprotocol" class="form-control">
<option value="ipv4" <?= $pconfig['ipprotocol'] == "ipv4" ? "selected=\"selected\"" : ""; ?>>
<?=gettext("IPv4");?>
</option>
<option value="ipv6" <?= $pconfig['ipprotocol'] == "ipv6" ? "selected=\"selected\"" : ""; ?>>
<?=gettext("IPv6");?>
</option>
</select>
<div class="hidden" for="help_for_ipprotocol">
<?=gettext("If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, <br />it will result in an error. For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work."); ?>
</div>
</td>
</tr> </tr>
<tr> <tr>
<td><?= gettext("Port"); ?></td> <td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Host"); ?></td>
<td><input name="port" type="text" class="form-control" id="port" size="10" value="<?=htmlspecialchars($port);?>" /></td> <td>
<input name="host" type="text" value="<?=$pconfig['host'];?>" />
</td>
</tr> </tr>
<tr> <tr>
<td><?= gettext("Source Port"); ?></td> <td><i class="fa fa-info-circle text-muted"></i> <?= gettext("Port"); ?></td>
<td><input name="srcport" type="text" class="form-control" id="srcport" size="10" value="<?=htmlspecialchars($srcport);?>" /> <td>
<p class="text-muted"><em><small><?php echo gettext("This should typically be left blank."); ?></small></em></p> <input name="port" type="text" value="<?=$pconfig['port'];?>" />
</td> </td>
</tr> </tr>
<tr> <tr>
<td><?= gettext("Show Remote Text"); ?></td> <td><a id="help_for_srcport" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?= gettext("Source Port"); ?></td>
<td><input name="showtext" type="checkbox" id="showtext" <?php if ($showtext) echo "checked=\"checked\"" ?> /> <td>
<p class="text-muted"><em><small><?php echo gettext("Shows the text given by the server when connecting to the port. Will take 10+ seconds to display if checked."); ?></small></em></p> <input name="srcport" type="text" value="<?=$pconfig['srcport'];?>" />
<div class="hidden" for="help_for_srcport">
<?=gettext("This should typically be left blank."); ?>
</div>
</td> </td>
</tr> </tr>
<tr> <tr>
<td><?=gettext("Source Address"); ?></td> <td><a id="help_for_showtext" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?= gettext("Show Remote Text"); ?></td>
<td><select name="sourceip" class="form-control"> <td>
<option value=""><?= gettext('Any') ?></option> <input name="showtext" type="checkbox" id="showtext" <?= !empty($pconfig['showtext']) ? "checked=\"checked\"" : "";?> />
<?php $sourceips = get_possible_traffic_source_addresses(true); <div class="hidden" for="help_for_showtext">
foreach ($sourceips as $sip): <?=gettext("Shows the text given by the server when connecting to the port. Will take 10+ seconds to display if checked."); ?>
$selected = ""; </div>
if (!link_interface_to_bridge($sip['value']) && ($sip['value'] == $sourceip))
$selected = "selected=\"selected\"";
?>
<option value="<?=$sip['value'];?>" <?=$selected;?>>
<?=htmlspecialchars($sip['name']);?>
</option>
<?php endforeach; ?>
</select>
</td> </td>
</tr> </tr>
<tr> <tr>
<td><?=gettext("IP Protocol"); ?></td> <td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Source Address"); ?></td>
<td> <td>
<select name="ipprotocol" class="form-control"> <select name="sourceip" class="selectpicker" data-size="5" data-live-search="true">
<option value="any" <?php if ("any" == $ipprotocol) echo "selected=\"selected\""; ?>> <option value=""><?= gettext('Any') ?></option>
<?= gettext('Any') ?> <?php
</option> foreach (get_possible_traffic_source_addresses(true) as $sip):?>
<option value="ipv4" <?php if ($ipprotocol == "ipv4") echo "selected=\"selected\""; ?>> <option value="<?=$sip['value'];?>" <?=!link_interface_to_bridge($sip['value']) && ($sip['value'] == $sourceip) ? "selected=\"selected\"" : "";?>>
<?=gettext("IPv4");?> <?=htmlspecialchars($sip['name']);?>
</option>
<option value="ipv6" <?php if ($ipprotocol == "ipv6") echo "selected=\"selected\""; ?>>
<?=gettext("IPv6");?>
</option> </option>
<?php
endforeach;?>
</select> </select>
<p class="text-muted"><em><small><?php echo gettext("If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, <br />it will result in an error. For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work."); ?></small></em></p>
</td> </td>
</tr> </tr>
<tr> <tr>
...@@ -170,122 +205,34 @@ include("head.inc"); ?> ...@@ -170,122 +205,34 @@ include("head.inc"); ?>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</section> </section>
<?php
if ($cmd_output !== false): ?>
<?php if ($do_testport): ?>
<section class="col-xs-12"> <section class="col-xs-12">
<script type="text/javascript">
//<![CDATA[
window.onload=function(){
document.getElementById("testportCaptured").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("Port Test Results"); ?></h3> <h3><?=gettext("Port Test Results"); ?></h3>
</header> </header>
<div class="content-box-main col-xs-12"> <div class="content-box-main col-xs-12">
<pre>
<?php <?php
if (empty($cmd_output) && !empty($pconfig['showtext'])):?>
<pre><?= gettext("No output received, or connection failed. Try with \"Show Remote Text\" unchecked first.");?></pre>
<?php
elseif (empty($cmd_output)):?>
<pre><?=gettext("Connection failed (Refused/Timeout)");?></pre>
<?php
else:?>
<pre><?=$cmd_output;?></pre>
<?php
endif;?>
$result = "";
$nc_base_cmd = "/usr/bin/nc";
$nc_args = "-w " . escapeshellarg($timeout);
if (!$showtext)
$nc_args .= " -z ";
if (!empty($srcport))
$nc_args .= " -p " . escapeshellarg($srcport) . " ";
/* Attempt to determine the interface address, if possible. Else try both. */
if (is_ipaddrv4($host)) {
$ifaddr = ($sourceip == "any") ? "" : get_interface_ip($sourceip);
$nc_args .= " -4";
} elseif (is_ipaddrv6($host)) {
if ($sourceip == "any")
$ifaddr = "";
else if (is_linklocal($sourceip))
$ifaddr = $sourceip;
else
$ifaddr = get_interface_ipv6($sourceip);
$nc_args .= " -6";
} else {
switch ($ipprotocol) {
case "ipv4":
$ifaddr = get_interface_ip($sourceip);
$nc_ipproto = " -4";
break;
case "ipv6":
$ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
$nc_ipproto = " -6";
break;
case "any":
$ifaddr = get_interface_ip($sourceip);
$nc_ipproto = (!empty($ifaddr)) ? " -4" : "";
if (empty($ifaddr)) {
$ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
$nc_ipproto = (!empty($ifaddr)) ? " -6" : "";
}
break;
}
/* Netcat doesn't like it if we try to connect using a certain type of IP without specifying the family. */
if (!empty($ifaddr)) {
$nc_args .= $nc_ipproto;
} elseif ($sourceip == "any") {
switch ($ipprotocol) {
case "ipv4":
$nc_ipproto = " -4";
break;
case "ipv6":
$nc_ipproto = " -6";
break;
}
$nc_args .= $nc_ipproto;
}
}
/* Only add on the interface IP if we managed to find one. */
if (!empty($ifaddr)) {
$nc_args .= " -s " . escapeshellarg($ifaddr) . " ";
$scope = get_ll_scope($ifaddr);
if (!empty($scope) && !strstr($host, "%"))
$host .= "%{$scope}";
}
$nc_cmd = "{$nc_base_cmd} {$nc_args} " . escapeshellarg($host) . " " . escapeshellarg($port) . " 2>&1";
exec($nc_cmd, $result, $retval);
//echo "NC CMD: {$nc_cmd}\n\n";
if (empty($result)) {
if ($showtext)
echo gettext("No output received, or connection failed. Try with \"Show Remote Text\" unchecked first.");
else
echo gettext("Connection failed (Refused/Timeout)");
} else {
if (is_array($result)) {
foreach ($result as $resline) {
echo htmlspecialchars($resline) . "\n";
}
} else {
echo htmlspecialchars($result);
}
}
?>
</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