Project

General

Profile

Download (11.7 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/* Run various commands and collect their output into HTML tables.
4
 * Jim McBeath <jimmc@macrovision.com> Nov 2003
5
 *
6
 * (modified for m0n0wall by Manuel Kasper <mk@neon1.net>)
7
 * (modified for pfSense by Scott Ullrich geekgod@pfsense.com)
8
 *
9
 */
10
/*
11
        Copyright (C) 2013-2015 Electric Sheep Fencing, LP
12
	All rights reserved.
13

    
14
	Redistribution and use in source and binary forms, with or without
15
	modification, are permitted provided that the following conditions are met:
16

    
17
	1.	Redistributions of source code must retain the above copyright notice,
18
		this list of conditions and the following disclaimer.
19

    
20
	2.	Redistributions in binary form must reproduce the above copyright
21
		notice, this list of conditions and the following disclaimer in the
22
		documentation and/or other materials provided with the distribution.
23

    
24
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
25
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
26
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
28
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
	POSSIBILITY OF SUCH DAMAGE.
34
*/
35
/*
36
	pfSense_BUILDER_BINARIES:	/usr/bin/vmstat	/usr/bin/netstat	/sbin/dmesg	/sbin/mount	/sbin/setkey	/usr/local/sbin/pftop	
37
	pfSense_BUILDER_BINARIES:	/sbin/pfctl	/sbin/sysctl	/usr/bin/top	/usr/bin/netstat	/sbin/pfctl	/sbin/ifconfig
38
	pfSense_MODULE:	support
39
*/
40

    
41
##|+PRIV
42
##|*IDENT=page-hidden-detailedstatus
43
##|*NAME=Hidden: Detailed Status page
44
##|*DESCR=Allow access to the 'Hidden: Detailed Status' page.
45
##|*MATCH=status.php*
46
##|-PRIV
47

    
48
/* Execute a command, with a title, and generate an HTML table
49
 * showing the results.
50
 */
51

    
52
/* include all configuration functions */
53
require_once("guiconfig.inc");
54
require_once("functions.inc");
55
$output_path = "/tmp/status_output/";
56
$output_file = "/tmp/status_output.tgz";
57

    
58
if (is_dir($output_path)) {
59
	unlink_if_exists("{$output_path}/*");
60
	@rmdir($output_path);
61
}
62
unlink_if_exists($output_file);
63
mkdir($output_path);
64

    
65
function doCmdT($title, $command) {
66
	global $output_path, $output_file;
67
	/* Fixup output directory */
68

    
69
	$rubbish = array('|', '-', '/', '.', ' ');  /* fixes the <a> tag to be W3C compliant */
70
	echo "\n<a name=\"" . str_replace($rubbish,'',$title) . "\" id=\"" . str_replace($rubbish,'',$title) . "\"></a>\n";
71
	echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"" . $title . "\">\n";
72
	echo "\t<tr><td class=\"listtopic\">" . $title . "</td></tr>\n";
73
	echo "\t<tr>\n\t\t<td class=\"listlr\">\n\t\t\t<pre>";		/* no newline after pre */
74

    
75
	if ($command == "dumpconfigxml") {
76
		$ofd = @fopen("{$output_path}/config-sanitized.xml", "w");
77
		$fd = @fopen("/conf/config.xml", "r");
78
		if ($fd) {
79
			while (!feof($fd)) {
80
				$line = fgets($fd);
81
				/* remove sensitive contents */
82
				$line = preg_replace("/<password>.*?<\\/password>/", "<password>xxxxx</password>", $line);
83
				$line = preg_replace("/<pre-shared-key>.*?<\\/pre-shared-key>/", "<pre-shared-key>xxxxx</pre-shared-key>", $line);
84
				$line = preg_replace("/<rocommunity>.*?<\\/rocommunity>/", "<rocommunity>xxxxx</rocommunity>", $line);
85
				$line = preg_replace("/<prv>.*?<\\/prv>/", "<prv>xxxxx</prv>", $line);
86
				$line = preg_replace("/<shared_key>.*?<\\/shared_key>/", "<shared_key>xxxxx</shared_key>", $line);
87
				$line = preg_replace("/<tls>.*?<\\/tls>/", "<tls>xxxxx</tls>", $line);
88
				$line = preg_replace("/<ipsecpsk>.*?<\\/ipsecpsk>/", "<ipsecpsk>xxxxx</ipsecpsk>", $line);
89
				$line = preg_replace("/<md5-hash>.*?<\\/md5-hash>/", "<md5-hash>xxxxx</md5-hash>", $line);
90
				$line = preg_replace("/<md5password>.*?<\\/md5password>/", "<md5password>xxxxx</md5password>", $line);
91
				$line = preg_replace("/<nt-hash>.*?<\\/nt-hash>/", "<nt-hash>xxxxx</nt-hash>", $line);
92
				$line = preg_replace("/<radius_secret>.*?<\\/radius_secret>/", "<radius_secret>xxxxx</radius_secret>", $line);
93
				$line = preg_replace("/<ldap_bindpw>.*?<\\/ldap_bindpw>/", "<ldap_bindpw>xxxxx</ldap_bindpw>", $line);
94
				$line = preg_replace("/<passwordagain>.*?<\\/passwordagain>/", "<passwordagain>xxxxx</passwordagain>", $line);
95
				$line = preg_replace("/<crypto_password>.*?<\\/crypto_password>/", "<crypto_password>xxxxx</crypto_password>", $line);
96
				$line = preg_replace("/<crypto_password2>.*?<\\/crypto_password2>/", "<crypto_password2>xxxxx</crypto_password2>", $line);
97
				$line = str_replace("\t", "    ", $line);
98
				echo htmlspecialchars($line,ENT_NOQUOTES);
99
				fwrite($ofd, $line);
100
			}
101
		}
102
		fclose($fd);
103
		fclose($ofd);
104
	} else {
105
		$ofd = @fopen("{$output_path}/{$title}.txt", "w");
106
		$execOutput = "";
107
		$execStatus = "";
108
		exec ($command . " 2>&1", $execOutput, $execStatus);
109
		for ($i = 0; isset($execOutput[$i]); $i++) {
110
			if ($i > 0) {
111
				echo "\n";
112
			}
113
			echo htmlspecialchars($execOutput[$i],ENT_NOQUOTES);
114
			fwrite($ofd, $execOutput[$i] . "\n");
115
		}
116
		fclose($ofd);
117
	}
118
    echo "\n\t\t\t</pre>\n\t\t</td>\n\t</tr>\n";
119
    echo "</table>\n";
120
}
121

    
122
/* Define a command, with a title, to be executed later. */
123
function defCmdT($title, $command) {
124
	global $commands;
125
	$title = htmlspecialchars($title,ENT_NOQUOTES);
126
	$commands[] = array($title, $command);
127
}
128

    
129
/* List all of the commands as an index. */
130
function listCmds() {
131
	global $commands;
132
	$rubbish = array('|', '-', '/', '.', ' ');  /* fixes the <a> tag to be W3C compliant */
133
	echo "\n<p>" . gettext("This status page includes the following information") . ":\n";
134
	echo "<ul>\n";
135
	for ($i = 0; isset($commands[$i]); $i++ ) {
136
		echo "\t<li><strong><a href=\"#" . str_replace($rubbish,'',$commands[$i][0]) . "\">" . $commands[$i][0] . "</a></strong></li>\n";
137
	}
138
	echo "</ul>\n";
139
}
140

    
141
/* Execute all of the commands which were defined by a call to defCmd. */
142
function execCmds() {
143
	global $commands;
144
	for ($i = 0; isset($commands[$i]); $i++ ) {
145
		doCmdT($commands[$i][0], $commands[$i][1]);
146
	}
147
}
148

    
149
global $g, $config;
150

    
151
/* Set up all of the commands we want to execute. */
152

    
153
/* System stats/info */
154
defCmdT("System uptime","/usr/bin/uptime");
155
defCmdT("Interfaces","/sbin/ifconfig -a");
156
defCmdT("Interface Statistics","/usr/bin/netstat -ni");
157
defCmdT("Top Process Info", "/usr/bin/top | /usr/bin/head -n5");
158
defCmdT("Processes","/bin/ps xauww");
159
defCmdT("Mounted Filesystems", "/sbin/mount");
160
defCmdT("Free Disk Space","/bin/df -hi");
161
defCmdT("Routing tables","/usr/bin/netstat -nWr");
162
defCmdT("Mbuf Usage","/usr/bin/netstat -mb");
163
defCmdT("VMStat", "/usr/bin/vmstat -afimsz");
164
defCmdT("Sockets", "/usr/bin/sockstat");
165

    
166
/* Firewall rules and info */
167
defCmdT("Generated Ruleset","/bin/cat {$g['tmp_path']}/rules.debug");
168
defCmdT("Generated Ruleset Limiters","/bin/cat {$g['tmp_path']}/rules.limiter");
169
defCmdT("Generated Ruleset Limits","/bin/cat {$g['tmp_path']}/rules.limits");
170
defCmdT("pf NAT Rules", "/sbin/pfctl -vvsn");
171
defCmdT("pf Firewall Rules", "/sbin/pfctl -vvsr");
172
defCmdT("pf Tables","/sbin/pfctl -vs Tables");
173
defCmdT("pf State Table Contents", "/sbin/pfctl -ss");
174
defCmdT("pf Info", "/sbin/pfctl -si");
175
defCmdT("pf Show All", "/sbin/pfctl -sa");
176
defCmdT("pf Queues","/sbin/pfctl -s queue -v");
177
defCmdT("pf OSFP","/sbin/pfctl -s osfp");
178
defCmdT("pfsync stats","/usr/bin/netstat -s -ppfsync");
179
defCmdT("pftop Default","/usr/local/sbin/pftop -a -b");
180
defCmdT("pftop Long","/usr/local/sbin/pftop -w 150 -a -b -v long");
181
defCmdT("pftop Queue","/usr/local/sbin/pftop -w 150 -a -b -v queue");
182
defCmdT("pftop Rules","/usr/local/sbin/pftop -w 150 -a -b -v rules");
183
defCmdT("pftop Size","/usr/local/sbin/pftop -w 150 -a -b -v size");
184
defCmdT("pftop Speed","/usr/local/sbin/pftop -w 150 -a -b -v speed");
185
if (isset($config['captiveportal']) && is_array($config['captiveportal'])) {
186
	foreach ($config['captiveportal'] as $cpZone => $cpdata) {
187
		if (isset($cpdata['enable']))
188
			defCmdT("IPFW rules for {$cpdata['zone']}", "/sbin/ipfw -x " . escapeshellarg($cpdata['zoneid']) . " show");
189
	}
190
}
191

    
192
/* Configuration Files */
193
defCmdT("Contents of var run", "/bin/ls /var/run");
194
defCmdT("Contents of conf", "/bin/ls /conf");
195
defCmdT("config.xml","dumpconfigxml");
196
defCmdT("resolv.conf","/bin/cat /etc/resolv.conf");
197
defCmdT("DHCP Configuration","/bin/cat /var/dhcpd/etc/dhcpd.conf");
198
defCmdT("DHCPv6 Configuration","/bin/cat /var/dhcpd/etc/dhcpdv6.conf");
199
defCmdT("strongSwan config","/bin/cat /var/etc/ipsec/strongswan.conf");
200
defCmdT("IPsec config","/bin/cat /var/etc/ipsec/ipsec.conf");
201
defCmdT("IPsec Status","/usr/local/sbin/ipsec statusall");
202
defCmdT("SPD","/sbin/setkey -DP");
203
defCmdT("SAD","/sbin/setkey -D");
204
if (file_exists("/cf/conf/upgrade_log.txt")) {
205
	defCmdT("Upgrade Log", "/bin/cat /cf/conf/upgrade_log.txt");
206
}
207
if (file_exists("/boot/loader.conf")) {
208
	defCmdT("Loader Configuration", "/bin/cat /boot/loader.conf");
209
}
210
if (file_exists("/boot/loader.conf.local")) {
211
	defCmdT("Loader Configuration (Local)", "/bin/cat /boot/loader.conf.local");
212
}
213
if (file_exists("/var/run/apinger.status")) {
214
	defCmdT("Gateway Status", "/bin/cat /var/run/apinger.status");
215
}
216
if (file_exists("/var/etc/apinger.conf")) {
217
	defCmdT("Gateway Monitoring Config", "/bin/cat /var/etc/apinger.conf");
218
}
219
if (file_exists("/var/etc/filterdns.conf")) {
220
	defCmdT("Filter DNS Daemon Config", "/bin/cat /var/etc/filterdns.conf");
221
}
222
if(isset($config['system']['usefifolog']))  {
223
	defCmdT("last 500 system log entries","/usr/sbin/fifolog_reader /var/log/system.log 2>&1 | tail -n 500");
224
	defCmdT("last 50 filter log entries","/usr/sbin/fifolog_reader /var/log/filter.log 2>&1 | tail -n 50");
225
	defCmdT("last 100 IPsec log entries","/usr/sbin/fifolog_reader /var/log/ipsec.log 2>&1 | tail -n 100");
226
} else {
227
	defCmdT("last 500 system log entries","/usr/local/sbin/clog /var/log/system.log 2>&1 | tail -n 500");
228
	defCmdT("last 50 filter log entries","/usr/local/sbin/clog /var/log/filter.log 2>&1 | tail -n 50");
229
	defCmdT("last 100 IPsec log entries","/usr/local/sbin/clog /var/log/ipsec.log 2>&1 | tail -n 100");
230
}
231
if (file_exists("/tmp/PHP_errors.log")) {
232
	defCmdT("PHP Error Log", "/bin/cat /tmp/PHP_errors.log");
233
}
234
defCmdT("System Message Buffer","/sbin/dmesg -a");
235
defCmdT("System Message Buffer (Boot)","/bin/cat /var/log/dmesg.boot");
236
defCmdT("sysctl values","/sbin/sysctl -a");
237

    
238
exec("/bin/date", $dateOutput, $dateStatus);
239
$currentDate = $dateOutput[0];
240

    
241
$pgtitle = array("{$g['product_name']}","status");
242
include("head.inc");
243

    
244
?>
245
<style type="text/css">
246
/*<![CDATA[*/
247
pre {
248
	margin: 0px;
249
	font-family: courier new, courier;
250
	font-weight: normal;
251
	font-size: 9pt;
252
}
253
/*]]>*/
254
</style>
255

    
256
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
257
<?php include("fbegin.inc"); ?>
258
<strong><?=$currentDate;?></strong>
259
<p><span class="red"><strong><?=gettext("Note: make sure to remove any sensitive information " .
260
"(passwords, maybe also IP addresses) before posting " .
261
"information from this page in public places (like mailing lists)"); ?>!</strong></span><br />
262
<?=gettext("Passwords in config.xml have been automatically removed"); ?>.<br /><br />
263
<?=gettext("When the page has finished loading, the output will be stored in {$output_file}. It may be downloaded via scp or "); ?>
264
<a href="/exec.php?dlPath=<?= $output_file ?>"><?=gettext("Diagnostics > Command Prompt")?></a>
265

    
266
<div id="cmdspace" style="width:700px">
267
<?php listCmds(); ?>
268

    
269
<?php execCmds(); ?>
270
</div>
271
<br />
272
<?=gettext("Saving output to archive...");?>
273
<?php
274
if (is_dir($output_path)) {
275
	mwexec("/usr/bin/tar czpf " . escapeshellarg($output_file) . " -C " . escapeshellarg(dirname($output_path))  . " " . escapeshellarg(basename($output_path)));
276
	unlink_if_exists("{$output_path}/*");
277
	@rmdir($output_path);
278
}
279
?>
280
<?=gettext("Done.");?>
281

    
282
<?php include("fend.inc"); ?>
283
</body>
284
</html>
(175-175/252)