summaryrefslogtreecommitdiffstats
path: root/src/usr/local/www/diag_dns.php
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2015-08-26 15:12:02 -0300
committerRenato Botelho <renato@netgate.com>2015-08-26 15:12:02 -0300
commit03b19a93f4d8d870507ee96121cee4acd748dd2a (patch)
tree71a34e9e7e73d13de21cb4ad831799fb10c30df4 /src/usr/local/www/diag_dns.php
parent7f410a121522c5d0e2660256ae50c1fde1df3645 (diff)
parent30ce58ac1ea27b758d5112cb5a3b190c9760f010 (diff)
downloadpfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.zip
pfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.tar.gz
Merge branch 'master' into bootstrap
Diffstat (limited to 'src/usr/local/www/diag_dns.php')
-rwxr-xr-xsrc/usr/local/www/diag_dns.php301
1 files changed, 301 insertions, 0 deletions
diff --git a/src/usr/local/www/diag_dns.php b/src/usr/local/www/diag_dns.php
new file mode 100755
index 0000000..a1267e2
--- /dev/null
+++ b/src/usr/local/www/diag_dns.php
@@ -0,0 +1,301 @@
+<?php
+/*
+ diag_dns.php
+*/
+ /* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2009 Jim Pingle (jpingle@gmail.com)
+ *
+ * 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.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution. (http://www.pfsense.org/).
+ *
+ * 4. The names "pfSense" and "pfSense Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * coreteam@pfsense.org.
+ *
+ * 5. Products derived from this software may not be called "pfSense"
+ * nor may "pfSense" appear in their names without prior written
+ * permission of the Electric Sheep Fencing, LLC.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ *
+ * "This product includes software developed by the pfSense Project
+ * for use in the pfSense software distribution (http://www.pfsense.org/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 pfSense PROJECT OR
+ * ITS CONTRIBUTORS 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.
+ *
+ * ====================================================================
+ *
+ */
+/*
+ pfSense_MODULE: dns
+*/
+
+$pgtitle = array(gettext("Diagnostics"), gettext("DNS Lookup"));
+require("guiconfig.inc");
+
+$host = trim($_REQUEST['host'], " \t\n\r\0\x0B[];\"'");
+$host_esc = escapeshellarg($host);
+
+/* If this section of config.xml has not been populated yet we need to set it up
+*/
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+$aliasname = str_replace(array(".", "-"), "_", $host);
+$alias_exists = false;
+$counter = 0;
+foreach ($a_aliases as $a) {
+ if ($a['name'] == $aliasname) {
+ $alias_exists = true;
+ $id = $counter;
+ }
+ $counter++;
+}
+
+if (isset($_POST['create_alias']) && (is_hostname($host) || is_ipaddr($host))) {
+ if ($_POST['override']) {
+ $override = true;
+ }
+ $resolved = gethostbyname($host);
+ $type = "hostname";
+ if ($resolved) {
+ $resolved = array();
+ exec("/usr/bin/drill {$host_esc} A | /usr/bin/grep {$host_esc} | /usr/bin/grep -v ';' | /usr/bin/awk '{ print $5 }'", $resolved);
+ $isfirst = true;
+ foreach($resolved as $re) {
+ if($re != "") {
+ if(!$isfirst)
+ $addresses .= " ";
+ $addresses .= rtrim($re) . "/32";
+ $isfirst = false;
+ }
+ }
+ $newalias = array();
+ if ($override) {
+ $alias_exists = false;
+ }
+ if ($alias_exists == false) {
+ $newalias['name'] = $aliasname;
+ $newalias['type'] = "network";
+ $newalias['address'] = $addresses;
+ $newalias['descr'] = "Created from Diagnostics-> DNS Lookup";
+ if ($override) {
+ $a_aliases[$id] = $newalias;
+ } else {
+ $a_aliases[] = $newalias;
+ }
+ write_config();
+ $createdalias = true;
+ }
+ }
+}
+
+if ($_POST) {
+ unset($input_errors);
+
+ $reqdfields = explode(" ", "host");
+ $reqdfieldsn = explode(",", "Host");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!is_hostname($host) && !is_ipaddr($host)) {
+ $input_errors[] = gettext("Host must be a valid hostname or IP address.");
+ } else {
+ // Test resolution speed of each DNS server.
+ $dns_speeds = array();
+ $dns_servers = array();
+ exec("/usr/bin/grep nameserver /etc/resolv.conf | /usr/bin/cut -f2 -d' '", $dns_servers);
+ foreach ($dns_servers as $dns_server) {
+ $query_time = exec("/usr/bin/drill {$host_esc} " . escapeshellarg("@" . trim($dns_server)) . " | /usr/bin/grep Query | /usr/bin/cut -d':' -f2");
+ if ($query_time == "") {
+ $query_time = gettext("No response");
+ }
+ $new_qt = array();
+ $new_qt['dns_server'] = $dns_server;
+ $new_qt['query_time'] = $query_time;
+ $dns_speeds[] = $new_qt;
+ unset($new_qt);
+ }
+ }
+
+ $type = "unknown";
+ $resolved = "";
+ $ipaddr = "";
+ $hostname = "";
+ if (!$input_errors) {
+ if (is_ipaddr($host)) {
+ $type = "ip";
+ $resolved = gethostbyaddr($host);
+ $ipaddr = $host;
+ if ($host != $resolved) {
+ $hostname = $resolved;
+ }
+ } elseif (is_hostname($host)) {
+ $type = "hostname";
+ $resolved = gethostbyname($host);
+ if ($resolved) {
+ $resolved = array();
+ exec("/usr/bin/drill {$host_esc} A | /usr/bin/grep {$host_esc} | /usr/bin/grep -v ';' | /usr/bin/awk '{ print $5 }'", $resolved);
+ }
+ $hostname = $host;
+ if ($host != $resolved) {
+ $ipaddr = $resolved[0];
+ }
+ }
+
+ if ($host == $resolved) {
+ $resolved = gettext("No record found");
+ }
+ }
+}
+
+if (($_POST['host']) && ($_POST['dialog_output'])) {
+ display_host_results ($host, $resolved, $dns_speeds);
+ exit;
+}
+
+function display_host_results ($address, $hostname, $dns_speeds) {
+ $map_lengths = function($element) { return strlen($element[0]); };
+
+ echo gettext("IP Address") . ": {$address} \n";
+ echo gettext("Host Name") . ": {$hostname} \n";
+ echo "\n";
+ $text_table = array();
+ $text_table[] = array(gettext("Server"), gettext("Query Time"));
+ if (is_array($dns_speeds)) {
+ foreach ($dns_speeds as $qt) {
+ $text_table[] = array(trim($qt['dns_server']), trim($qt['query_time']));
+ }
+ }
+ $col0_padlength = max(array_map($map_lengths, $text_table)) + 4;
+ foreach ($text_table as $text_row) {
+ echo str_pad($text_row[0], $col0_padlength) . $text_row[1] . "\n";
+ }
+}
+
+include("head.inc");
+
+/* Display any error messages resulting from user input */
+if ($input_errors)
+ print_input_errors($input_errors);
+else if (!$resolved && $type)
+ print('<div class="alert alert-warning" role="alert">' . gettext("Host") .' "'. $host .'" '. gettext("could not be resolved") . '</div>');
+
+if ($createdalias)
+ print('<div class="alert alert-success" role="alert">'.gettext("Alias was created/updated successfully").'</div>');
+
+require('classes/Form.class.php');
+
+$form = new Form('Lookup');
+$section = new Form_Section('DNS Lookup');
+
+$section->addInput(new Form_Input(
+ 'host',
+ 'Hostname',
+ 'text',
+ $host,
+ ['placeholder' => 'Hostname to look up.']
+));
+
+if (!empty($resolved)) {
+ $form->addGlobal(new Form_Button(
+ 'create_alias',
+ 'Add alias'
+ ))->removeClass('btn-primary')->addClass('btn-success');
+}
+
+$form->add($section);
+print $form;
+
+if (!$input_errors && $type) {
+ if ($resolved):
+?>
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Results</h2></div>
+ <div class="panel-body">
+ <ul class="list-group">
+<?
+ foreach ((array)$resolved as $hostitem) {
+?>
+ <li class="list-group-item"><?=$hostitem?></li>
+<?
+ if ($hostitem != "") {
+ $found++;
+ }
+ }
+?>
+ </ul>
+ </div>
+</div>
+<? endif?>
+
+<!-- Second table displays the server resolution times -->
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">Timings</h2></div>
+ <div class="panel-body">
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Name server</th>
+ <th>Query time</th>
+ </tr>
+ </thead>
+
+ <tbody>
+<? foreach ((array)$dns_speeds as $qt):?>
+ <tr>
+ <td><?=$qt['dns_server']?></td><td><?=$qt['query_time']?></td>
+ </tr>
+<? endforeach?>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<!-- Third table displays "More information" -->
+<div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title">More information</h2></div>
+ <div class="panel-body">
+ <ul class="list-group">
+ <li class="list-group-item"><a href="/diag_ping.php?host=<?=htmlspecialchars($host)?>&amp;interface=wan&amp;count=3"><?=gettext("Ping")?></a></li>
+ <li class="list-group-item"><a href="/diag_traceroute.php?host=<?=htmlspecialchars($host)?>&amp;ttl=18"><?=gettext("Traceroute")?></a></li>
+ </ul>
+ <p><?=gettext("NOTE: The following links are to external services, so their reliability cannot be guaranteed.");?></p>
+ <ul class="list-group">
+ <li class="list-group-item"><a target="_blank" href="http://private.dnsstuff.com/tools/whois.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP WHOIS @ DNS Stuff");?></a></li>
+ <li class="list-group-item"><a target="_blank" href="http://private.dnsstuff.com/tools/ipall.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP Info @ DNS Stuff");?></a></li>
+ </ul>
+ </div>
+</div>
+<?php
+}
+include("foot.inc"); \ No newline at end of file
OpenPOWER on IntegriCloud