Project

General

Profile

Download (8.3 KB) Statistics
| Branch: | Tag: | Revision:
1 737ed7d1 jim-p
<?php
2
/*
3
	diag_dns.php
4
5
	Copyright (C) 2009 Jim Pingle (jpingle@gmail.com)
6
	All rights reserved.
7
8
	Redistribution and use in source and binary forms, with or without
9
	modification, are permitted provided that the following conditions are met:
10
11
	1. Redistributions of source code must retain the above copyright notice,
12
	this list of conditions and the following disclaimer.
13
14
	2. Redistributions in binary form must reproduce the above copyright
15
	notice, this list of conditions and the following disclaimer in the
16
	documentation and/or other materials provided with the distribution.
17
18
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
22
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
	POSSIBILITY OF SUCH DAMAGE.
28
*/
29
30 13d193c2 Scott Ullrich
/*
31
	pfSense_MODULE:	dns
32
*/
33
34 09128488 Vinicius Coque
$pgtitle = array(gettext("Diagnostics"),gettext("DNS Lookup"));
35 737ed7d1 jim-p
require("guiconfig.inc");
36
37
/* Cheap hack to support both $_GET and $_POST */
38
if ($_GET['host'])
39
	$_POST = $_GET;
40
41 e55d4b3c Scott Ullrich
if($_GET['createalias'] == "true") {
42
	$host = trim($_POST['host']);
43
	if($_GET['override'])
44
		$override = true;
45
	$a_aliases = &$config['aliases']['alias'];
46
	$type = "hostname";
47
	$resolved = gethostbyname($host);
48
	if($resolved) {
49
		$host = trim($_POST['host']);
50
		$dig=`dig "$host" A | grep "$host" | grep -v ";" | awk '{ print $5 }'`;
51 cfbfd941 smos
		$resolved = explode("\n", $dig);
52 e55d4b3c Scott Ullrich
		$isfirst = true;
53
		foreach($resolved as $re) {
54 7a87cb97 Scott Ullrich
			if($re <> "") {
55
				if(!$isfirst) 
56
					$addresses .= " ";
57
				$addresses .= $re . "/32";
58
				$isfirst = false;
59
			}
60 e55d4b3c Scott Ullrich
		}
61
		$newalias = array();
62
		$aliasname = str_replace(array(".","-"), "_", $host);
63
		$alias_exists = false;
64
		$counter=0;
65
		foreach($a_aliases as $a) {
66
			if($a['name'] == $aliasname) {
67
				$alias_exists = true;
68
				$id=$counter;
69
			}
70
			$counter++;
71
		}
72
		if($override) 
73
			$alias_exists = false;
74
		if($alias_exists == false) {
75 705c72ea Scott Ullrich
			$newalias['name'] = $aliasname;
76 e1f6a0d9 Scott Ullrich
			$newalias['type'] = "network";
77 e55d4b3c Scott Ullrich
			$newalias['address'] = $addresses;
78
			$newalias['descr'] = "Created from Diagnostics-> DNS Lookup";
79
			if($override) 
80
				$a_aliases[$id] = $newalias;
81
			else
82
				$a_aliases[] = $newalias;
83
			write_config();
84
			$createdalias = true;
85
		}
86
	}
87
}
88
89 737ed7d1 jim-p
if ($_POST) {
90
	unset($input_errors);
91
92
	$reqdfields = explode(" ", "host");
93
	$reqdfieldsn = explode(",", "Host");
94
95
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
96 72cd706b bcyrill
	$host = trim($_POST['host'], " \t\n\r\0\x0B[]");
97
	$host_esc = escapeshellarg($host);
98 b97c5ed6 sullrich
	
99 72cd706b bcyrill
	if (!is_hostname($host) && !is_ipaddr($host)) {
100 ee91ae30 jean.feltrin
		$input_errors[] = gettext("Host must be a valid hostname or IP address.");
101 72cd706b bcyrill
	} else {
102
		// Test resolution speed of each DNS server.
103 86ab47ff sullrich
		$dns_speeds = array();
104 40af551f jim-p
		$resolvconf_servers = `grep nameserver /etc/resolv.conf | cut -f2 -d' '`;
105 360ed9fa jim-p
		$dns_servers = explode("\n", trim($resolvconf_servers));
106 40af551f jim-p
		foreach ($dns_servers as $dns_server) {
107 b97c5ed6 sullrich
			$query_time = `dig {$host_esc} @{$dns_server} | grep Query | cut -d':' -f2`;
108 77f87165 sullrich
			if($query_time == "")
109 ee91ae30 jean.feltrin
				$query_time = gettext("No response");
110 86ab47ff sullrich
			$new_qt = array();
111
			$new_qt['dns_server'] = $dns_server;
112 77f87165 sullrich
			$new_qt['query_time'] = $query_time;			
113 86ab47ff sullrich
			$dns_speeds[] = $new_qt;
114
			unset($new_qt);
115
		}
116 737ed7d1 jim-p
	}
117
118 da652a46 Vinicius Coque
	$type = "unknown";
119 737ed7d1 jim-p
	$resolved = "";
120 2312b0eb jim-p
	$ipaddr = "";
121
	$hostname = "";
122 737ed7d1 jim-p
	if (!$input_errors) {
123
		if (is_ipaddr($host)) {
124
			$type = "ip";
125
			$resolved = gethostbyaddr($host);
126 2312b0eb jim-p
			$ipaddr = $host;
127
			if ($host != $resolved)
128
				$hostname = $resolved;
129 737ed7d1 jim-p
		} elseif (is_hostname($host)) {
130
			$type = "hostname";
131
			$resolved = gethostbyname($host);
132 c43f732a Scott Ullrich
			if($resolved) {
133 5aaae0e3 Scott Ullrich
				$dig=`dig $host_esc A | grep $host_esc | grep -v ";" | awk '{ print $5 }'`;
134 cfbfd941 smos
				$resolved = explode("\n", $dig);
135 c43f732a Scott Ullrich
			}
136 2312b0eb jim-p
			$hostname = $host;
137
			if ($host != $resolved)
138 3e85ac2b Scott Ullrich
				$ipaddr = $resolved[0];
139 737ed7d1 jim-p
		}
140
141
		if ($host == $resolved) {
142 ee91ae30 jean.feltrin
			$resolved = gettext("No record found");
143 737ed7d1 jim-p
		}
144
	}
145
}
146
147 fe74228f N0YB
if( ($_POST['host']) && ($_POST['dialog_output']) ) {
148
	display_host_results ($host,$resolved,$dns_speeds);
149
	exit;
150
}
151
152
function display_host_results ($address,$hostname,$dns_speeds) {
153
	echo gettext("IP Address") . ": {$address} \n";
154
	echo gettext("Host Name") . ": {$hostname} \n";
155
	echo "\n";
156
	echo gettext("Server") . "\t" . gettext("Query Time") . "\n";
157
	if(is_array($dns_speeds)) 
158
		foreach($dns_speeds as $qt){
159
			echo trim($qt['dns_server']) . "\t" . trim($qt['query_time']);
160
			echo "\n";
161
		}
162
}
163
164 737ed7d1 jim-p
include("head.inc"); ?>
165
<body link="#000000" vlink="#000000" alink="#000000">
166 a3381369 Colin Fleming
<?php include("fbegin.inc"); ?>
167 737ed7d1 jim-p
<table width="100%" border="0" cellpadding="0" cellspacing="0">
168
        <tr>
169
                <td>
170
<?php if ($input_errors) print_input_errors($input_errors); ?>
171
	<form action="diag_dns.php" method="post" name="iform" id="iform">
172
	  <table width="100%" border="0" cellpadding="6" cellspacing="0">
173 4c7e2f4e sullrich
		<tr>
174 ee91ae30 jean.feltrin
			<td colspan="2" valign="top" class="listtopic"> <?=gettext("Resolve DNS hostname or IP");?></td>
175 4c7e2f4e sullrich
		</tr>
176 737ed7d1 jim-p
        <tr>
177 da652a46 Vinicius Coque
		  <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP");?></td>
178 737ed7d1 jim-p
		  <td width="78%" class="vtable">
179 a812abb3 Scott Ullrich
            <?=$mandfldhtml;?>
180
			<table>
181
				<tr><td valign="top">
182
			<input name="host" type="text" class="formfld" id="host" size="20" value="<?=htmlspecialchars($host);?>">
183
			</td>
184
			<td>
185 a3381369 Colin Fleming
			<?php if ($resolved && $type) { ?>
186 a812abb3 Scott Ullrich
			=  <font size="+1">
187
<?php
188 3a6dc294 Scott Ullrich
				$found = 0;
189 a812abb3 Scott Ullrich
				if(is_array($resolved)) { 
190
					foreach($resolved as $hostitem) {
191 3a6dc294 Scott Ullrich
						if($hostitem <> "") {
192
							echo $hostitem . "<br/>";
193
							$found++;
194
						}
195 a812abb3 Scott Ullrich
					}
196
				} else {
197
					echo $resolved; 
198
				} 
199 3a6dc294 Scott Ullrich
				if($found > 0) {
200
					if($alias_exists) {
201 0f08affe Scott Ullrich
						echo "<br/><font size='-2'>An alias already exists for the hostname " . htmlspecialchars($host) . ".  To overwrite, click <a href='diag_dns.php?host=" . trim(urlencode(htmlspecialchars($host))) . "&createalias=true&override=true'>here</a>.";
202 3a6dc294 Scott Ullrich
					} else { 
203
						if(!$createdalias) {
204 0f08affe Scott Ullrich
							echo "<br/><font size='-2'><a href='diag_dns.php?host=" . trim(urlencode(htmlspecialchars($host))) . "&createalias=true'>Create alias</a> out of these entries.";
205 3a6dc294 Scott Ullrich
						} else {
206 0f08affe Scott Ullrich
							echo "<br/><font size='-2'>Alias created with name " . htmlspecialchars($newalias['name']);
207 3a6dc294 Scott Ullrich
						}
208 e55d4b3c Scott Ullrich
					}
209
				}
210 a812abb3 Scott Ullrich
?>
211
				<font size="-1>">
212 e55d4b3c Scott Ullrich
213 737ed7d1 jim-p
			<?	} ?>
214 a812abb3 Scott Ullrich
			</td></tr></table>
215 737ed7d1 jim-p
		  </td>
216
		</tr>
217 37d98ce7 sullrich
<?php		if($_POST): ?>
218 86ab47ff sullrich
		<tr>
219 ee91ae30 jean.feltrin
		  <td width="22%" valign="top" class="vncell"><?=gettext("Resolution time per server");?></td>
220 86ab47ff sullrich
		  <td width="78%" class="vtable">
221 87fa30ba sullrich
				<table width="170" border="1" cellpadding="2" style="border-width: 1px 1px 1px 1px; border-collapse: collapse;">
222 86ab47ff sullrich
					<tr>
223
						<td>
224 ee91ae30 jean.feltrin
							<b><?=gettext("Server");?></b>
225 86ab47ff sullrich
						</td>
226
						<td>
227 da652a46 Vinicius Coque
							<b><?=gettext("Query time");?></b>
228 86ab47ff sullrich
						</td>
229
					</tr>
230
<?php
231
					if(is_array($dns_speeds)) 
232
						foreach($dns_speeds as $qt):
233
?>
234
					<tr>
235
						<td>
236
							<?=$qt['dns_server']?>
237
						</td>
238
						<td>
239
							<?=$qt['query_time']?>
240
						</td>
241
					</tr>
242
<?php
243
					endforeach;
244
?>
245
				</table>
246
		  </td>
247
		</tr>
248 37d98ce7 sullrich
		<?php endif; ?>
249 2312b0eb jim-p
		<?php if (!$input_errors && $ipaddr) { ?>
250
		<tr>
251 ee91ae30 jean.feltrin
			<td width="22%" valign="top"  class="vncell"><?=gettext("More Information:");?></td>
252 2312b0eb jim-p
			<td width="78%" class="vtable">
253 0f08affe Scott Ullrich
				<a target="_new" href ="/diag_ping.php?host=<?=htmlspecialchars($host)?>&interface=wan&count=3"><?=gettext("Ping");?></a> <br/>
254
				<a target="_new" href ="/diag_traceroute.php?host=<?=htmlspecialchars($host)?>&ttl=18"><?=gettext("Traceroute");?></a>
255 b8cc74ed sullrich
				<p/>
256 ee91ae30 jean.feltrin
				<?=gettext("NOTE: The following links are to external services, so their reliability cannot be guaranteed.");?><br/><br/>
257
				<a target="_new" href="http://private.dnsstuff.com/tools/whois.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP WHOIS @ DNS Stuff");?></a><br />
258 09128488 Vinicius Coque
				<a target="_new" href="http://private.dnsstuff.com/tools/ipall.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP Info @ DNS Stuff");?></a>
259 2312b0eb jim-p
			</td>
260
		</tr>
261
		<?php } ?>
262 737ed7d1 jim-p
		<tr>
263
		  <td width="22%" valign="top">&nbsp;</td>
264
		  <td width="78%">
265 b97c5ed6 sullrich
			<br/>&nbsp;
266 ee91ae30 jean.feltrin
            <input name="Submit" type="submit" class="formbtn" value="<?=gettext("DNS Lookup");?>">
267 737ed7d1 jim-p
		</td>
268
		</tr>
269
	</table>
270
</form>
271
</td></tr></table>
272
<?php include("fend.inc"); ?>