Project

General

Profile

Feature #12963 » nmap-complete.patch

Phil Wardt, 03/21/2022 07:51 AM

View differences:

src/usr/local/pkg/nmap.inc
39 39
}
40 40

  
41 41
function nmap_custom_add_php_command() {
42
	$fp = "/root/";
43
	$fn = "nmap.result";
44
	/* check if nmap scan is already running */
45
	$processcheck = (trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep 'tee {$fp}{$fn}' | /usr/bin/egrep -v '(pflog|grep)'")));
46

  
47
	$processisrunning = ($processcheck != "");
48

  
49
	if ($processisrunning) {
50
		echo "<strong>NMap is already running. Please wait for current scan to complete</strong><br />";
51
		echo '<br /><br /><button class="btn btn-info" type="button" value="' . gettext("Back to NMap") . '" onclick="history.back()"><i class="fa fa-undo icon-embed-btn"></i> ' . gettext("Back to NMap") . '</button>';
52
	} else {
42 53
		$nmap_options = "";
43 54

  
44 55
		if (is_ipaddrv6($_POST['hostname']) || is_subnetv6($_POST['hostname'])) {
......
77 88
	}
78 89

  
79 90
	$nmap_options .= " " . escapeshellarg($_POST['hostname']);
80
	echo "<strong>Running: /usr/local/bin/nmap {$nmap_options}</strong><br />";
81
	system("/usr/local/bin/nmap" . $nmap_options);
91
		$cmd = "/usr/local/bin/nmap {$nmap_options} | /usr/bin/tee {$fp}{$fn}";
92
		echo "<strong>Running: {$cmd}</strong><br />";
93
		mwexec_bg($cmd);
94
		echo "<strong>Check results in Results log TAB</strong><br />";
82 95
		echo '<br /><br /><button class="btn btn-info" type="button" value="' . gettext("Back to NMap") . '" onclick="history.back()"><i class="fa fa-undo icon-embed-btn"></i> ' . gettext("Back to NMap") . '</button>';
96
	}
83 97
}
84 98

  
85 99
function nmap_get_interfaces() {
86
-- a/src/usr/local/pkg/nmap.xml
100
++ b/src/usr/local/pkg/nmap.xml
......
39 39
		<section>Diagnostics</section>
40 40
		<configfile>nmap.xml</configfile>
41 41
	</menu>
42
	<tabs>
43
		<tab>
44
			<text>Scan</text>
45
			<url>/pkg_edit.php?xml=nmap.xml&amp;id=0</url>
46
			<active/>
47
		</tab>
48
		<tab>
49
			<text>Results log</text>
50
			<url>/nmap_view_results.php</url>
51
		</tab>
52
	</tabs>
42 53
	<fields>
43 54
		<field>
44 55
			<fielddescr>IP or Hostname</fielddescr>
45
-- a/src/usr/local/www/nmap_view_results.php
56
++ b/src/usr/local/www/nmap_view_results.php
......
1
<?php
2
/*
3
 * nmap_view_results.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2022-2022 Rubicon Communications, LLC (Netgate)
7
 * Copyright (C) 2022 Phil Wart <phytowardt@gmail.com>
8
 * All rights reserved.
9
 *
10
 * Licensed under the Apache License, Version 2.0 (the "License");
11
 * you may not use this file except in compliance with the License.
12
 * You may obtain a copy of the License at
13
 *
14
 * http://www.apache.org/licenses/LICENSE-2.0
15
 *
16
 * Unless required by applicable law or agreed to in writing, software
17
 * distributed under the License is distributed on an "AS IS" BASIS,
18
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
 * See the License for the specific language governing permissions and
20
 * limitations under the License.
21
 */
22

  
23
require("guiconfig.inc");
24
#require_once("pfsense-utils.inc");
25
require("/usr/local/pkg/nmap.inc");
26

  
27
$pgtitle = array("Package", "Diagnostics: NMap", "NMap Results");
28

  
29
require_once("head.inc");
30

  
31
$tab_array = array();
32
$tab_array[] = array("Scan", false, "/pkg_edit.php?xml=nmap.xml&amp;id=0");
33
$tab_array[] = array("Results log", true, "/nmap_view_results.php");
34
display_top_tabs($tab_array);
35

  
36
$fp = "/root/";
37
$fn = "nmap.result";
38

  
39
$form = new Form(false);
40
$section = new Form_Section('NMap Scan Results:');
41
if (file_exists($fp.$fn)) {
42
	$section->addInput(new Form_StaticText(
43
		'Last scan completed on:',
44
		date("F jS, Y g:i:s a.", filemtime($fp.$fn))
45
	));
46
} else {
47
	$section->addInput(new Form_StaticText(
48
		'Last scan completed on:',
49
		'none'
50
	));
51
}
52

  
53
$form->add($section);
54
?>
55

  
56
<div class="panel panel-default">
57
	<div class="panel-heading"><h2 class="panel-title"><?=gettext('Last scan log')?></h2></div>
58
	<div class="panel-body">
59
		<div class="form-group">
60
<?php
61
		print('<textarea class="form-control" rows="20" style="font-size: 13px; font-family: consolas,monaco,roboto mono,liberation mono,courier;">');
62
		$max_display_size = 50*1024*1024; // 50MB limit on GUI capture display. See https://redmine.pfsense.org/issues/9239
63
		if (file_exists($fp.$fn) && (filesize($fp.$fn) > $max_display_size)) {
64
			print(gettext("Nmap scan results file is too large to display in the GUI.") .
65
				"\n" .
66
				gettext("Download the file, or view it in the console or ssh shell.") .
67
				"\n" .
68
				gettext("Results file: {$fp}{$fn}"));
69
		} elseif (!file_exists($fp.$fn) || (filesize($fp.$fn) === 0)) {
70
			print(gettext("No nmap scan results to display."));
71
		} else {
72
			system("/bin/cat {$fp}{$fn}");
73
		}
74
		print('</textarea>');
75

  
76
?>
77
		</div>
78
	</div>
79
</div>
80
<?php
81

  
82
/* check if nmap scan is already running */
83
$processcheck = (trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep 'tee {$fp}{$fn}' | /usr/bin/egrep -v '(pflog|grep)'")));
84

  
85
$processisrunning = ($processcheck != "");
86

  
87
if ($_POST) {
88
	if ($_POST['clearbtn'] != "") {
89
		$action = gettext("Clear log");
90

  
91
		//delete previous scan result if it exists
92
		if (file_exists($fp.$fn) and $processisrunning != true) {
93
			unlink ($fp.$fn);
94
			header("Refresh: 0");
95
		}
96
	} else if ($_POST['refreshbtn'] != "") {
97
		$action = gettext("Refresh results");
98
		header("Refresh: 0");
99
	}
100
}
101

  
102
if (file_exists($fp.$fn) and $processisrunning != true) {
103
	$group = new Form_Group('');
104
	$group->add(new Form_Button(
105
		'clearbtn',
106
		'Clear log',
107
		null,
108
		'fa-undo'
109
	))->setHelp('Clear scan results file.')->addClass('btn-danger restore');
110

  
111
	$section->add($group);
112

  
113
} else if ($processisrunning) {
114
		$group = new Form_Group('');
115
		$group->add(new Form_Button(
116
			'refreshbtn',
117
			' Refresh results',
118
			null,
119
			'fa-retweet'
120
		))->setHelp('Reload scan results.')->addClass('btn-success');
121

  
122
	$section->add($group);
123
}
124

  
125
print($form);
126

  
127
include("foot.inc");
128

  
(6-6/30)