csv recon0

This commit is contained in:
fbsanchez 2020-03-30 19:44:44 +02:00
parent c2d81238d6
commit acabe543c4
9 changed files with 195 additions and 64 deletions

View File

@ -2,6 +2,8 @@ START TRANSACTION;
ALTER TABLE trecon_task MODIFY COLUMN `id_network_profile` TEXT; ALTER TABLE trecon_task MODIFY COLUMN `id_network_profile` TEXT;
ALTER TABLE `trecon_task` CHANGE COLUMN `create_incident` `review_mode` TINYINT(1) UNSIGNED DEFAULT 0; ALTER TABLE `trecon_task` CHANGE COLUMN `create_incident` `review_mode` TINYINT(1) UNSIGNED DEFAULT 0;
ALTER TABLE `trecon_task` ADD COLUMN `subnet_csv` TINYINT(1) UNSIGNED DEFAULT 0;
UPDATE `trecon_task` SET `review_mode` = 1; UPDATE `trecon_task` SET `review_mode` = 1;
ALTER TABLE trecon_task add column `auto_monitor` TINYINT(1) UNSIGNED DEFAULT 1 AFTER `auth_strings`; ALTER TABLE trecon_task add column `auto_monitor` TINYINT(1) UNSIGNED DEFAULT 1 AFTER `auth_strings`;
UPDATE `trecon_task` SET `auto_monitor` = 0; UPDATE `trecon_task` SET `auto_monitor` = 0;

View File

@ -1686,7 +1686,8 @@ ALTER TABLE `trecon_task` ADD COLUMN `type` int(11) NOT NULL DEFAULT '0',
MODIFY COLUMN `autoconfiguration_enabled` tinyint(1) unsigned NULL DEFAULT '0', MODIFY COLUMN `autoconfiguration_enabled` tinyint(1) unsigned NULL DEFAULT '0',
MODIFY COLUMN `summary` text NULL, MODIFY COLUMN `summary` text NULL,
MODIFY COLUMN `id_network_profile` text, MODIFY COLUMN `id_network_profile` text,
CHANGE COLUMN `create_incident` `review_mode` TINYINT(1) UNSIGNED DEFAULT 0; CHANGE COLUMN `create_incident` `review_mode` TINYINT(1) UNSIGNED DEFAULT 0,
ADD COLUMN `subnet_csv` TINYINT(1) UNSIGNED DEFAULT 0;
-- Old recon always report. -- Old recon always report.
UPDATE `trecon_task` SET `review_mode` = 1; UPDATE `trecon_task` SET `review_mode` = 1;

View File

@ -300,9 +300,50 @@ class HostDevices extends Wizard
$comment = get_parameter('comment', ''); $comment = get_parameter('comment', '');
$server_id = get_parameter('id_recon_server', ''); $server_id = get_parameter('id_recon_server', '');
$network = get_parameter('network', ''); $network = get_parameter('network', '');
$network_csv_enabled = (bool) get_parameter_switch(
'network_csv_enabled',
false
);
$id_group = get_parameter('id_group', ''); $id_group = get_parameter('id_group', '');
$interval = get_parameter('interval', 0); $interval = get_parameter('interval', 0);
if ($network_csv_enabled) {
if ($_FILES['network_csv']['type'] != 'text/csv') {
$this->msg = __(
'Invalid mimetype for csv file: %s',
$_FILES['network_csv']['type']
);
return false;
}
$network = preg_split(
"/\n|,|;/",
trim(
file_get_contents(
$_FILES['network_csv']['tmp_name']
)
)
);
unlink($_FILES['network_csv']['tmp_name']);
if (empty($network) || is_array($network) === false) {
$this->msg = __(
'Invalid content readed from csv file: %s',
$_FILES['network_csv']['name']
);
return false;
}
// Sanitize.
$network = array_unique($network);
$network = array_filter(
$network,
function ($item) {
return (!empty($item));
}
);
$network = join(',', $network);
}
if (isset($task_id) === true) { if (isset($task_id) === true) {
// We're updating this task. // We're updating this task.
$task = db_get_row( $task = db_get_row(
@ -338,6 +379,7 @@ class HostDevices extends Wizard
&& $server_id == null && $server_id == null
&& empty($id_group) === true && empty($id_group) === true
&& empty($network) === true && empty($network) === true
&& empty($network_csv) === true
&& $interval === 0 && $interval === 0
) { ) {
// Default values, no data received. // Default values, no data received.
@ -385,6 +427,7 @@ class HostDevices extends Wizard
$this->task['id_recon_server'] = $server_id; $this->task['id_recon_server'] = $server_id;
$this->task['id_group'] = $id_group; $this->task['id_group'] = $id_group;
$this->task['interval_sweep'] = $interval; $this->task['interval_sweep'] = $interval;
$this->task['subnet_csv'] = $network_csv_enabled;
if (isset($this->task['id_rt']) === false) { if (isset($this->task['id_rt']) === false) {
// Create. // Create.
@ -701,7 +744,7 @@ class HostDevices extends Wizard
$form['rows'][0]['columns'][0] = [ $form['rows'][0]['columns'][0] = [
'width' => '30%', 'width' => '30%',
'style' => 'padding: 9px;', 'style' => 'padding: 9px;min-width: 250px;',
'inputs' => [ 'inputs' => [
'0' => [ '0' => [
'arguments' => [ 'arguments' => [
@ -728,7 +771,10 @@ class HostDevices extends Wizard
'name' => 'interval_manual_defined', 'name' => 'interval_manual_defined',
'return' => true, 'return' => true,
], ],
'extra' => '<span id="interval_manual_container">'.html_print_extended_select_for_time( 'extra' => '<div id="interval_manual_container"><div class="time_selection_container">'.ui_print_help_tip(
__('The minimum recomended interval for Recon Task is 5 minutes'),
true
).html_print_extended_select_for_time(
'interval', 'interval',
$this->task['interval_sweep'], $this->task['interval_sweep'],
'', '',
@ -738,10 +784,7 @@ class HostDevices extends Wizard
true, true,
false, false,
false false
).ui_print_help_tip( ).'</div></div>',
__('The minimum recomended interval for Recon Task is 5 minutes'),
true
).'</span>',
], ],
], ],
@ -751,6 +794,7 @@ class HostDevices extends Wizard
'width' => '40%', 'width' => '40%',
'padding-right' => '12%', 'padding-right' => '12%',
'padding-left' => '5%', 'padding-left' => '5%',
'style' => 'min-width: 350px',
'inputs' => [ 'inputs' => [
'0' => [ '0' => [
'label' => '<b>'.__('Task name').':</b>', 'label' => '<b>'.__('Task name').':</b>',
@ -783,6 +827,54 @@ class HostDevices extends Wizard
], ],
], ],
'2' => [ '2' => [
'label' => '<b>'.__('Use CSV file definition').':</b>'.ui_print_help_tip(
__('Define targets using csv o network definition.'),
true
),
'class' => 'no-margin',
'arguments' => [
'name' => 'network_csv_enabled',
'value' => $this->task['subnet_csv'],
'type' => 'switch',
'inline' => true,
'class' => 'discovery_full_width_input',
'onclick' => 'toggleNetwork(this);',
],
],
'3' => [
'hidden' => (($this->task['subnet_csv'] == '1') ? 0 : 1),
'block_id' => 'csv_subnet',
'block_content' => [
[
'label' => '<b>'.__('Networks (csv)').':</b>'.ui_print_help_tip(
__('You can upload a CSV file. Each line must contain a network in IP/MASK format. For instance: 192.168.1.1/32'),
true
),
'arguments' => [
'name' => 'network_csv',
'type' => 'file',
'columns' => 25,
'rows' => 10,
'class' => 'discovery_full_width_input',
],
],
[
'label' => '<b>'.__('Networks (current)').':</b>'.ui_print_help_tip(
__('Plese upload a new file to overwrite this content.'),
true
),
'arguments' => [
'attributes' => 'readonly',
'type' => 'textarea',
'size' => 25,
'value' => $this->task['subnet'],
],
],
],
],
'4' => [
'hidden' => (($this->task['subnet_csv'] == '1') ? 1 : 0),
'id' => 'std_subnet',
'label' => '<b>'.__('Network').':</b>'.ui_print_help_tip( 'label' => '<b>'.__('Network').':</b>'.ui_print_help_tip(
__('You can specify several networks, separated by commas, for example: 192.168.50.0/24,192.168.60.0/24'), __('You can specify several networks, separated by commas, for example: 192.168.50.0/24,192.168.60.0/24'),
true true
@ -817,6 +909,7 @@ class HostDevices extends Wizard
$form['rows'][0]['columns'][2] = [ $form['rows'][0]['columns'][2] = [
'width' => '30%', 'width' => '30%',
'style' => 'min-width: 250px',
'inputs' => ['0' => $group_select], 'inputs' => ['0' => $group_select],
]; ];
@ -846,8 +939,9 @@ class HostDevices extends Wizard
} }
$form['form'] = [ $form['form'] = [
'method' => 'POST', 'method' => 'POST',
'action' => $this->url.'&mode=netscan&page='.($this->page + 1).$task_url, 'enctype' => 'multipart/form-data',
'action' => $this->url.'&mode=netscan&page='.($this->page + 1).$task_url,
]; ];
// Default. // Default.
@ -871,7 +965,19 @@ class HostDevices extends Wizard
$("#hidden-interval").val('.$interval.'); $("#hidden-interval").val('.$interval.');
$("#interval_units").val('.$unit.'); $("#interval_units").val('.$unit.');
} }
}).change();'; }).change();
function toggleNetwork(e) {
if (e.checked) {
$(\'#csv_subnet\').removeClass("hidden");
$(\'#std_subnet\').addClass("hidden");
} else {
$(\'#csv_subnet\').addClass("hidden");
$(\'#std_subnet\').removeClass("hidden");
}
};
';
$this->printFormAsGrid($form); $this->printFormAsGrid($form);
$this->printGoBackButton($this->url.'&page='.($this->page - 1)); $this->printGoBackButton($this->url.'&page='.($this->page - 1));

View File

@ -587,66 +587,40 @@ class Wizard
if (is_array($input['block_content']) === true) { if (is_array($input['block_content']) === true) {
// Print independent block of inputs. // Print independent block of inputs.
$output .= '<li id="'.$input['block_id'].'" class="'.$class.'">'; $output .= '<div id="'.$input['block_id'].'" class="wizard '.$class.'">';
$output .= '<ul class="wizard '.$input['block_class'].'">'; $output .= '<ul class="wizard '.$input['block_class'].'">';
foreach ($input['block_content'] as $input) { foreach ($input['block_content'] as $input) {
$output .= $this->printBlockAsGrid($input, $return); $output .= $this->printBlockAsGrid($input, $return);
} }
$output .= '</ul></li>'; $output .= '</ul></div>';
} else { } else {
if ($input['arguments']['type'] != 'hidden' if ($input['arguments']['type'] != 'hidden'
&& $input['arguments']['type'] != 'hidden_extended' && $input['arguments']['type'] != 'hidden_extended'
) { ) {
if ($input['arguments']['inline'] != 'true') { $id = '';
$output .= '<div class="edit_discovery_input">'; if ($input['id']) {
} else { $id = $input['id'];
$output .= '<div style="display: flex; margin-bottom: 25px; flex-wrap: wrap;">';
if (!isset($input['extra'])) {
$output .= '<div style="width: 50%;">';
}
if (isset($input['extra'])) {
$output .= '<div style="display: flex; margin-right:10px;">';
}
} }
if ($input['arguments']['inline'] == 'true' && isset($input['extra'])) { if ($input['arguments']['inline'] != 'true') {
$output .= '<div style="margin-right:10px;">'; $output .= '<div id="'.$id.'" class="std_input '.$class.'">';
} else {
$output .= '<div id="'.$id.'" class="inline_input '.$class.'">';
} }
$output .= '<div class="label_select">'; $output .= '<div class="label_select">';
$output .= $input['label']; $output .= $input['label'];
$output .= '</div>'; $output .= '</div>';
if ($input['arguments']['inline'] == 'true' && isset($input['extra'])) {
$output .= '</div>';
}
if ($input['arguments']['inline'] == 'true' && !isset($input['extra'])) {
$output .= '</div>';
}
if ($input['arguments']['type'] == 'text' || $input['arguments']['type'] == 'text_extended') { if ($input['arguments']['type'] == 'text' || $input['arguments']['type'] == 'text_extended') {
$output .= '<div class="discovery_text_input">'; $output .= '<div class="discovery_text_input">';
$output .= $this->printInput($input['arguments']); $output .= $this->printInput($input['arguments']);
$output .= '</div>'; $output .= '</div>';
} else if ($input['arguments']['inline'] == 'true') { } else if ($input['arguments']['inline'] == 'true') {
if (isset($input['extra'])) { $output .= '<div class="discovery_inline_input">';
$output .= '<div style="">';
$output .= '<div style="float: left;">';
} else {
$output .= '<div style="width:50%;">';
$output .= '<div style="float: right;">';
}
$output .= $this->printInput($input['arguments']); $output .= $this->printInput($input['arguments']);
$output .= '</div>'; $output .= '</div>';
$output .= '</div>';
if (isset($input['extra'])) {
$output .= '</div>';
}
} else { } else {
$output .= $this->printInput($input['arguments']); $output .= $this->printInput($input['arguments']);
} }
@ -821,7 +795,7 @@ class Wizard
$cb_function = $data['cb_function']; $cb_function = $data['cb_function'];
$cb_args = $data['cb_args']; $cb_args = $data['cb_args'];
$output_head = '<form class="discovery" onsubmit="'.$form['onsubmit'].'" enctype="'.$form['enctype'].'" action="'.$form['action'].'" method="'.$form['method']; $output_head = '<form class="discovery wizard" onsubmit="'.$form['onsubmit'].'" enctype="'.$form['enctype'].'" action="'.$form['action'].'" method="'.$form['method'];
$output_head .= '" '.$form['extra'].'>'; $output_head .= '" '.$form['extra'].'>';
if ($return === false) { if ($return === false) {

View File

@ -1087,7 +1087,7 @@ function html_print_extended_select_for_time(
ob_start(); ob_start();
// Use the no_meta parameter because this image is only in the base console // Use the no_meta parameter because this image is only in the base console
echo '<div id="'.$uniq_name.'_default" style="width:100%;display:inline;">'; echo '<div id="'.$uniq_name.'_default" style="width:100%;display:flex;align-items: baseline;">';
html_print_select( html_print_select(
$fields, $fields,
$uniq_name.'_select', $uniq_name.'_select',
@ -1121,7 +1121,7 @@ function html_print_extended_select_for_time(
echo '</div>'; echo '</div>';
echo '<div id="'.$uniq_name.'_manual" style="width:100%;display:inline;">'; echo '<div id="'.$uniq_name.'_manual" style="width:100%;display:flex;">';
html_print_input_text($uniq_name.'_text', $selected, '', $size, 255, false, $readonly, false, '', $class); html_print_input_text($uniq_name.'_text', $selected, '', $size, 255, false, $readonly, false, '', $class);
html_print_input_hidden($name, $selected, false, $uniq_name); html_print_input_hidden($name, $selected, false, $uniq_name);
@ -1159,8 +1159,8 @@ function html_print_extended_select_for_time(
$('#text-".$uniq_name."_text').val(seconds); $('#text-".$uniq_name."_text').val(seconds);
adjustTextUnits('".$uniq_name."'); adjustTextUnits('".$uniq_name."');
calculateSeconds('".$uniq_name."'); calculateSeconds('".$uniq_name."');
$('#".$uniq_name."_manual').show(); $('#".$uniq_name."_manual').css('display', 'flex');
$('#".$uniq_name."_default').hide(); $('#".$uniq_name."_default').css('display', 'none');
} }
</script>"; </script>";
$returnString = ob_get_clean(); $returnString = ob_get_clean();

View File

@ -837,8 +837,8 @@ function post_process_select_events(name) {
*/ */
function period_select_init(name, allow_zero) { function period_select_init(name, allow_zero) {
// Manual mode is hidden by default // Manual mode is hidden by default
$("#" + name + "_manual").hide(); $("#" + name + "_manual").css("display", "none");
$("#" + name + "_default").show(); $("#" + name + "_default").css("display", "flex");
// If the text input is empty, we put on it 5 minutes by default // If the text input is empty, we put on it 5 minutes by default
if ($("#text-" + name + "_text").val() == "") { if ($("#text-" + name + "_text").val() == "") {
@ -852,8 +852,8 @@ function period_select_init(name, allow_zero) {
} }
} else if ($("#text-" + name + "_text").val() == 0 && allow_zero != true) { } else if ($("#text-" + name + "_text").val() == 0 && allow_zero != true) {
$("#" + name + "_units option:last").prop("selected", false); $("#" + name + "_units option:last").prop("selected", false);
$("#" + name + "_manual").show(); $("#" + name + "_manual").css("display", "flex");
$("#" + name + "_default").hide(); $("#" + name + "_default").css("display", "none");
} }
} }
@ -941,13 +941,13 @@ function selectFirst(name) {
*/ */
function toggleBoth(name) { function toggleBoth(name) {
if ($("#" + name + "_default").css("display") == "none") { if ($("#" + name + "_default").css("display") == "none") {
$("#" + name + "_default").css("display", "inline"); $("#" + name + "_default").css("display", "flex");
} else { } else {
$("#" + name + "_default").css("display", "none"); $("#" + name + "_default").css("display", "none");
} }
if ($("#" + name + "_manual").css("display") == "none") { if ($("#" + name + "_manual").css("display") == "none") {
$("#" + name + "_manual").css("display", "inline"); $("#" + name + "_manual").css("display", "flex");
} else { } else {
$("#" + name + "_manual").css("display", "none"); $("#" + name + "_manual").css("display", "none");
} }

View File

@ -2,7 +2,11 @@
* Discovery > Wizard css global style * Discovery > Wizard css global style
*/ */
#main > form.discovery.wizard > .white_box {
min-width: 1024px;
}
ul.wizard { ul.wizard {
list-style-type: none;
} }
ul.wizard li { ul.wizard li {
@ -24,13 +28,50 @@ ul.wizard li > textarea {
} }
.wizard .hidden { .wizard .hidden {
display: none; display: none !important;
} }
.wizard .indented { .wizard .indented {
margin-left: 2em; margin-left: 2em;
} }
.wizard .std_input {
display: flex;
margin-bottom: 25px;
flex-wrap: wrap;
justify-content: space-between;
}
.wizard .std_input > .label_select {
flex: 1 1 100%;
}
.wizard .std_input > * {
flex: 1 1 auto;
align-self: baseline;
}
.wizard .inline_input.no-margin {
margin-bottom: 0px;
}
.wizard .inline_input {
display: flex;
margin-bottom: 25px;
flex-wrap: wrap;
justify-content: space-between;
align-items: baseline;
}
.wizard .inline_input * {
flex: 1 1 auto;
}
.wizard .discovery_inline_input {
display: flex;
align-content: end;
flex: 0;
align-self: flex-start;
}
/* override tag-editor styles */ /* override tag-editor styles */
.wizard .tag-editor.ui-sortable { .wizard .tag-editor.ui-sortable {
width: 450px; width: 450px;
@ -57,3 +98,15 @@ ul.wizard li > textarea {
padding: 5px; padding: 5px;
background: #e63c52; background: #e63c52;
} }
.wizard .time_selection_container {
display: flex;
align-items: baseline;
justify-items: center;
align-content: space-between;
margin-top: 1em;
}
.wizard #interval_manual_container #interval_manual > * {
flex: 1 1 auto;
}

View File

@ -810,6 +810,7 @@ CREATE TABLE IF NOT EXISTS `trecon_task` (
`autoconfiguration_enabled` tinyint(1) unsigned default 0, `autoconfiguration_enabled` tinyint(1) unsigned default 0,
`summary` text, `summary` text,
`type` int NOT NULL default 0, `type` int NOT NULL default 0,
`subnet_csv` TINYINT(1) UNSIGNED DEFAULT 0,
PRIMARY KEY (`id_rt`), PRIMARY KEY (`id_rt`),
KEY `recon_task_daemon` (`id_recon_server`) KEY `recon_task_daemon` (`id_recon_server`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -6275,9 +6275,6 @@ sub notification_get_users {
', ',
safe_input($source) safe_input($source)
); );
@results = map { $_->{'id_user'} } @results;
return @results;
} }
########################################################################## ##########################################################################
@ -6299,9 +6296,6 @@ sub notification_get_groups {
', ',
safe_input($source) safe_input($source)
); );
@results = map { $_->{'id_group'} } @results;
return @results;
} }