diff --git a/pandora_agents/pc/DEBIAN/make_deb_package.sh b/pandora_agents/pc/DEBIAN/make_deb_package.sh index f44dfec8f4..691918b54e 100644 --- a/pandora_agents/pc/DEBIAN/make_deb_package.sh +++ b/pandora_agents/pc/DEBIAN/make_deb_package.sh @@ -36,6 +36,8 @@ mkdir -p temp_package/usr/bin/ mkdir -p temp_package/usr/sbin/ mkdir -p temp_package/etc/pandora/plugins mkdir -p temp_package/etc/pandora/collections +mkdir -p temp_package/etc/pandora/trans +mkdir -p temp_package/etc/pandora/commands mkdir -p temp_package/etc/init.d/ mkdir -p temp_package/var/log/pandora/ mkdir -p temp_package/usr/share/man/man1/ diff --git a/pandora_agents/pc/pandora_agent_installer b/pandora_agents/pc/pandora_agent_installer index ab2a00877e..469364abf1 100644 --- a/pandora_agents/pc/pandora_agent_installer +++ b/pandora_agents/pc/pandora_agent_installer @@ -324,6 +324,11 @@ install () { cp -r collections $PANDORA_BASE$PANDORA_HOME chmod -R 700 $PANDORA_BASE$PANDORA_HOME/collections ln -s $PANDORA_BASE$PANDORA_HOME/collections $PANDORA_BASE$PANDORA_CFG + + echo "Copying Pandora FMS Agent commands to $PANDORA_BASE$PANDORA_HOME/commands..." + cp -r commands $PANDORA_BASE$PANDORA_HOME + chmod -R 700 $PANDORA_BASE$PANDORA_HOME/commands + ln -s $PANDORA_BASE$PANDORA_HOME/commands $PANDORA_BASE$PANDORA_CFG echo "Copying tentacle server to $PANDORA_BASE$TENTACLE_SERVER" cp tentacle_server $PANDORA_BASE$TENTACLE_SERVER diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index f28fdab114..74a6e96001 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -36,6 +36,8 @@ mkdir -p temp_package/usr/bin/ mkdir -p temp_package/usr/sbin/ mkdir -p temp_package/etc/pandora/plugins mkdir -p temp_package/etc/pandora/collections +mkdir -p temp_package/etc/pandora/trans +mkdir -p temp_package/etc/pandora/commands mkdir -p temp_package/etc/init.d/ mkdir -p temp_package/lib/systemd/system/ mkdir -p temp_package/var/log/pandora/ diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index a3c40e50f0..0dfcf8848a 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -24,6 +24,7 @@ Version 6.0 use strict; use warnings; +use Scalar::Util qw(looks_like_number); use POSIX qw(strftime floor); use Sys::Hostname; use File::Basename; @@ -32,6 +33,18 @@ use IO::Socket; use Sys::Syslog; use Time::Local; +my $YAML = 0; +# Dynamic load. Avoid unwanted behaviour. +eval { + eval 'require YAML::Tiny;1' or die('YAML::Tiny lib not found, commands feature won\'t be available'); +}; +if ($@) { + $YAML = 0; + print STDERR $@; +} else { + $YAML = 1; +} + # Agent XML data my $Xml; @@ -187,6 +200,7 @@ my %DefaultConf = ( 'custom_id' => '', 'url_address' => '', 'standby' => 0, + 'cmd_file' => undef, ); my %Conf = %DefaultConf; @@ -268,6 +282,20 @@ sub error ($) { exit 1; } +################################################################################ +# Try to load extra libraries.c +################################################################################ +sub load_libraries() { + # Dynamic load. Avoid unwanted behaviour. + eval {eval 'require YAML::Tiny;1' or die('YAML::Tiny lib not found, commands feature won\'t be available');}; + if ($@) { + $YAML = 0; + print STDERR $@; + } else { + $YAML = 1; + } +} + ################################################################################ # Check a regular expression. Returns 1 if its valid, 0 otherwise. ################################################################################ @@ -284,6 +312,27 @@ sub valid_regexp ($) { return 1; } +################################################################################ +# Reads a file and returns entire content or undef if error. +################################################################################ +sub read_file { + my $path = shift; + + my $_FILE; + if( !open($_FILE, "<", $path) ) { + # failed to open, return undef + return undef; + } + + # Slurp configuration file content. + my $content = do { local $/; <$_FILE> }; + + # Close file + close($_FILE); + + return $content; +} + ################################################################################ # Recursively delete files and directories. ################################################################################ @@ -682,6 +731,13 @@ sub parse_conf_modules($) { # Macros } elsif ($line =~ /^\s*module_macro(\S+)\s+(.*)\s*$/) { $module->{'macros'}{$1} = $2; + # Commands + } elsif ($line =~ /^\s*cmd_file\s+(.+)$/) { + if (ref ($Conf{'commands'}) ne "HASH") { + $Conf{'commands'} = {}; + } + # Initialize empty command hash. + $Conf{'commands'}->{$1} = {}; } } return; @@ -1157,14 +1213,14 @@ sub recv_file { }; if ($@) { - log_message ('error', "Error retrieving file: File transfer command is not responding."); + log_message ('error', "Error retrieving file: '.$file.' File transfer command is not responding."); exit 1; } # Get the errorlevel my $rc = $? >> 8; if ($rc != 0) { - log_message ('error', "Error retrieving file: $output"); + log_message ('error', "Error retrieving file: '$file' $output"); } exit $rc; } @@ -1362,6 +1418,220 @@ sub check_collections () { } } +################################################################################ +# Check for remote commands defined. +################################################################################ +sub prepare_remote_commands { + if ($YAML == 0) { + log_message( + 'error', + 'Cannot use commands without YAML dependency, please install it.' + ); + return; + } + + foreach my $ref (keys %{$Conf{'commands'}}) { + my $file_content; + my $download = 0; + my $rcmd_file = $ConfDir.'/commands/'.$ref.'.rcmd'; + + # Check for local .rcmd.done files + if (-e $Conf{'temporal'}.'/'.$ref.'.rcmd.done') { + # Ignore. + delete $Conf{'commands'}->{$ref}; + next; + } + + # Search for local .rcmd file + if (-e $rcmd_file) { + my $remote_md5_file = $Conf{'temporal'}.'/'.$ref.'.md5'; + + $file_content = read_file($rcmd_file); + if (recv_file($ref.'.md5', $remote_md5_file) != 0) { + # Remote file could not be retrieved, skip. + delete $Conf{'commands'}->{$ref}; + next; + } + + my $local_md5 = md5($file_content); + my $remote_md5 = md5(read_file($remote_md5_file)); + + if ($local_md5 ne $remote_md5) { + # Must be downloaded again. + $download = 1; + } + } else { + $download = 1; + } + + # Search for remote .rcmd file + if ($download == 1) { + # Download .rcmd file + if (recv_file($ref.'.rcmd') != 0) { + # Remote file could not be retrieved, skip. + delete $Conf{'commands'}->{$ref}; + next; + } else { + # Success + move($Conf{'temporal'}.'/'.$ref.'.rcmd', $rcmd_file); + } + } + + # Parse and prepare in memory skel. + eval { + $Conf{'commands'}->{$ref} = YAML::Tiny->read($rcmd_file); + }; + if ($@) { + # Failed. + log_message('error', 'Failed to decode command. ' . "\n".$@); + delete $Conf{'commands'}->{$ref}; + next; + } + + } +} + +################################################################################ +# Command report. +################################################################################ +sub report_command { + my ($ref, $err_level) = @_; + + # Retrieve content from .stdout and .stderr + my $stdout_file = $Conf{'temporal'}.'/'.$ref.'.stdout'; + my $stderr_file = $Conf{'temporal'}.'/'.$ref.'.stderr'; + + my $return; + eval { + $return = { + 'error_level' => $err_level, + 'stdout' => read_file($stdout_file), + 'stderr' => read_file($stderr_file), + }; + + $return->{'name'} = $Conf{'commands'}->{$ref}->[0]->{'name'}; + }; + if ($@) { + log_message('error', 'Failed to report command output. ' . $@); + } + + # Cleanup + unlink($stdout_file) if (-e $stdout_file); + unlink($stderr_file) if (-e $stderr_file); + + # Mark command as done. + open (my $R_FILE, '> '.$ConfDir.'/commands/'.$ref.'.rcmd.done'); + print $R_FILE $err_level; + close($R_FILE); + + + $return->{'stdout'} = '' unless defined ($return->{'stdout'}); + $return->{'stderr'} = '' unless defined ($return->{'stderr'}); + + return $return; +} + +################################################################################ +# Executes a command using defined timeout. +################################################################################ +sub execute_command_timeout { + my ($command, $timeout) = @_; + + if (!looks_like_number($timeout)) { + `$command`; + } else { + `$command`; + } + + return $?>>8; +} + +################################################################################ +# Executes a block of commands, returns error level, leaves output in +# redirection set by $std_files. E.g: +# $std_files = ' >> /tmp/stdout 2>> /tmp/stderr +################################################################################ +sub execute_command_block { + my ($commands, $std_files, $timeout) = @_; + + return 0 unless defined($commands); + + my $err_level = 0; + $std_files = '' unless defined ($std_files); + + if (ref($commands) ne "ARRAY") { + return 0 if $commands eq ''; + $err_level = execute_command_timeout( + "($commands) $std_files", + $timeout + ); + + } else { + foreach my $comm (@{$commands}) { + next unless defined($comm); + $err_level = execute_command_timeout( + "($comm) $std_files", + $timeout + ); + + last unless ($err_level == 0); + } + } + + return $err_level; +} + +################################################################################ +# Evalate given command. +################################################################################ +sub evaluate_command { + my ($ref) = @_; + + # Not found. + return unless defined $Conf{'commands'}->{$ref}; + + # Already completed. + return if (-e $ConfDir.'/commands/'.$ref.'.rcmd.done'); + + # [0] because how library works. + my $cmd = $Conf{'commands'}->{$ref}->[0]; + + my $std_files = ' >> '.$Conf{'temporal'}.'/'.$ref.'.stdout '; + $std_files .= ' 2>> '.$Conf{'temporal'}.'/'.$ref.'.stderr '; + + # Check preconditions + my $err_level; + + $err_level = execute_command_block( + $cmd->{'preconditions'}, + $std_files, + $cmd->{'timeout'} + ); + + # Precondition not satisfied. + return report_command($ref, $err_level) unless ($err_level == 0); + + # Main run. + $err_level = execute_command_block( + $cmd->{'script'}, + $std_files, + $cmd->{'timeout'} + ); + + # Script not success. + return report_command($ref, $err_level) unless ($err_level == 0); + + # Check postconditions + $err_level = execute_command_block( + $cmd->{'postconditions'}, + $std_files, + $cmd->{'timeout'} + ); + + # Return results. + return report_command($ref, $err_level); +} + ################################################################################ # Sleep function ################################################################################ @@ -2985,6 +3255,8 @@ my $iter_base_time = time(); $LogFileIdx = -1; # Loop while (1) { + load_libraries(); + if (-e $Conf{'logfile'} && (stat($Conf{'logfile'}))[7] > $Conf{'logsize'}) { rotate_log(); } @@ -2999,6 +3271,25 @@ while (1) { # Check file collections check_collections () unless ($Conf{'debug'} eq '1'); + if ($Conf{'debug'} ne '1') { + # Check remote commands + prepare_remote_commands (); + + # Cleanup old .rcmd.done files. + my %registered = map { $_.'.rcmd.done' => 1 } keys %{$Conf{'commands'}}; + if(opendir(my $dir, $ConfDir.'/commands/')) { + while (my $item = readdir($dir)) { + # Skip other files. + next if ($item !~ /\.rcmd\.done$/); + + # Clean .rcmd.done file if its command is not referenced in conf. + if (!defined($registered{$item})) { + unlink ($item); + } + } + } + } + # Launch broker agents @BrokerPid = (); my @broker_agents = read_config ('broker_agent'); @@ -3128,6 +3419,24 @@ while (1) { } } + if (ref ($Conf{'commands'}) eq "HASH") { + foreach my $command (keys %{$Conf{'commands'}}) { + my $result = evaluate_command($command); + if (ref($result) eq "HASH") { + # Process command result. + $Xml .= "\n"; + $Xml .= " \n"; + $Xml .= " {'name'}."]]>\n"; + $Xml .= " \n"; + $Xml .= " {'error_level'}."]]>\n"; + $Xml .= " {'stdout'}."]]>\n"; + $Xml .= " {'stderr'}."]]>\n"; + $Xml .= " \n"; + $Xml .= "\n"; + } + } + } + # Wait for all the threads $ThreadSem->down ($Conf{'agent_threads'}) if (defined ($ThreadSem) && $Conf{'agent_threads'} > 1); $ThreadSem->up ($Conf{'agent_threads'}) if (defined ($ThreadSem) && $Conf{'agent_threads'} > 1); diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index f5ed96e5d9..05f8c89559 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -99,6 +99,11 @@ if [ ! -e /etc/pandora/collections ]; then ln -s /usr/share/pandora_agent/collections /etc/pandora fi +if [ ! -e /etc/pandora/commands ]; then + mkdir -p /usr/share/pandora_agent/commands + ln -s /usr/share/pandora_agent/commands /etc/pandora +fi + mkdir -p /var/spool/pandora/data_out if [ ! -d /var/log/pandora ]; then mkdir -p /var/log/pandora diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index ea8efb582c..18ac2f32c0 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -90,6 +90,11 @@ fi if [ ! -e /etc/pandora/collections ]; then mkdir /etc/pandora/collections fi + +if [ ! -e /etc/pandora/commands ]; then + mkdir /etc/pandora/commands +fi + cp -aRf /usr/share/pandora_agent/pandora_agent_logrotate /etc/logrotate.d/pandora_agent # Enable the service on SystemD diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 316e2a03c2..bf85762a39 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -400,6 +400,11 @@ install () { mkdir -p $PANDORA_BASE$PANDORA_HOME/collections chmod -R 700 $PANDORA_BASE$PANDORA_HOME/collections ln -s $PANDORA_BASE_REAL$PANDORA_HOME/collections $PANDORA_BASE$PANDORA_CFG + + echo "Creating the commands directory in $PANDORA_BASE$PANDORA_HOME/commands..." + mkdir -p $PANDORA_BASE$PANDORA_HOME/commands + chmod -R 700 $PANDORA_BASE$PANDORA_HOME/commands + ln -s $PANDORA_BASE_REAL$PANDORA_HOME/commands $PANDORA_BASE$PANDORA_CFG if [ $WITHOUT_TENTACLE_SERVER -eq 0 ] then diff --git a/pandora_console/extensions/agents_modules.php b/pandora_console/extensions/agents_modules.php index 97657f5189..f492f5e437 100644 --- a/pandora_console/extensions/agents_modules.php +++ b/pandora_console/extensions/agents_modules.php @@ -13,7 +13,264 @@ * GNU General Public License for more details. */ +// Begin. + +/** + * Extra JS. + * + * @return void + */ +function agents_modules_load_js() +{ + $ignored_params['refresh'] = ''; + + ?> + + + + - - - diff --git a/pandora_console/extensions/plugin_registration.php b/pandora_console/extensions/plugin_registration.php index ef08e34bae..6cf20858ab 100644 --- a/pandora_console/extensions/plugin_registration.php +++ b/pandora_console/extensions/plugin_registration.php @@ -23,12 +23,12 @@ function pluginreg_extension_main() return; } - ui_require_css_file('firts_task'); + ui_require_css_file('first_task'); ui_print_page_header(__('Plugin registration'), 'images/extensions.png', false, '', true, ''); echo '
'; - echo html_print_image('images/firts_task/icono_grande_import.png', true, ['title' => __('Plugin Registration') ]); + echo html_print_image('images/first_task/icono_grande_import.png', true, ['title' => __('Plugin Registration') ]); echo '
'; echo '
'; echo '

'.__('Plugin registration').'

'; diff --git a/pandora_console/extras/mr/33.sql b/pandora_console/extras/mr/33.sql index 3d5e32a42d..50fc5e0bce 100644 --- a/pandora_console/extras/mr/33.sql +++ b/pandora_console/extras/mr/33.sql @@ -8,4 +8,30 @@ INSERT INTO `ttipo_modulo` VALUES (36,'remote_cmd_string', 10, 'Remote execution, alphanumeric data', 'mod_remote_cmd_string.png'), (37,'remote_cmd_inc', 10, 'Remote execution, incremental data', 'mod_remote_cmd_inc.png'); +CREATE TABLE `tremote_command` ( + `id` SERIAL, + `name` varchar(150) NOT NULL, + `timeout` int(10) unsigned NOT NULL default 30, + `retries` int(10) unsigned NOT NULL default 3, + `preconditions` text, + `script` text, + `postconditions` text, + `utimestamp` int(20) unsigned NOT NULL default 0, + `id_group` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `tremote_command_target` ( + `id` SERIAL, + `rcmd_id` bigint unsigned NOT NULL, + `id_agent` int(10) unsigned NOT NULL, + `utimestamp` int(20) unsigned NOT NULL default 0, + `stdout` text, + `stderr` text, + `errorlevel` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`), + FOREIGN KEY (`rcmd_id`) REFERENCES `tremote_command`(`id`) + ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + COMMIT; diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index e8bd9064bc..fd51f73668 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -1247,13 +1247,13 @@ ALTER TABLE titem MODIFY `source_data` int(10) unsigned; INSERT INTO `tconfig` (`token`, `value`) VALUES ('big_operation_step_datos_purge', '100'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('small_operation_step_datos_purge', '1000'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('days_autodisable_deletion', '30'); -INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 32); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 33); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_docs_logo', 'default_docs.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_support_logo', 'default_support.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_logo_white_bg_preview', 'pandora_logo_head_white_bg.png'); UPDATE tconfig SET value = 'https://licensing.artica.es/pandoraupdate7/server.php' WHERE token='url_update_manager'; DELETE FROM `tconfig` WHERE `token` = 'current_package_enterprise'; -INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '739'); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '741'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('status_monitor_fields', 'policy,agent,data_type,module_name,server_type,interval,status,graph,warn,data,timestamp'); UPDATE `tconfig` SET `value` = 'mini_severity,evento,id_agente,estado,timestamp' WHERE `token` LIKE 'event_fields'; DELETE FROM `tconfig` WHERE `token` LIKE 'integria_api_password'; @@ -2300,6 +2300,39 @@ CREATE TABLE `tdeployment_hosts` ( ON UPDATE CASCADE ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ---------------------------------------------------------------------- +-- Table `tremote_command` +-- ---------------------------------------------------------------------- +CREATE TABLE `tremote_command` ( + `id` SERIAL, + `name` varchar(150) NOT NULL, + `timeout` int(10) unsigned NOT NULL default 30, + `retries` int(10) unsigned NOT NULL default 3, + `preconditions` text, + `script` text, + `postconditions` text, + `utimestamp` int(20) unsigned NOT NULL default 0, + `id_group` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------------------------------------------------- +-- Table `tremote_command_target` +-- ---------------------------------------------------------------------- +CREATE TABLE `tremote_command_target` ( + `id` SERIAL, + `rcmd_id` bigint unsigned NOT NULL, + `id_agent` int(10) unsigned NOT NULL, + `utimestamp` int(20) unsigned NOT NULL default 0, + `stdout` text, + `stderr` text, + `errorlevel` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`), + FOREIGN KEY (`rcmd_id`) REFERENCES `tremote_command`(`id`) + ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + -- Extra tnetwork_component INSERT INTO `tnetwork_component` (`id_nc`, `name`, `description`, `id_group`, `type`, `max`, `min`, `module_interval`, `tcp_port`, `tcp_send`, `tcp_rcv`, `snmp_community`, `snmp_oid`, `id_module_group`, `id_modulo`, `id_plugin`, `plugin_user`, `plugin_pass`, `plugin_parameter`, `max_timeout`, `max_retries`, `history_data`, `min_warning`, `max_warning`, `max_critical`, `str_warning`, `min_ff_event`, `min_critical`, `custom_string_2`, `str_critical`, `custom_integer_1`, `custom_string_1`, `post_process`, `custom_string_3`, `wizard_level`, `custom_integer_2`, `critical_instructions`, `unit`, `unknown_instructions`, `macros`, `warning_inverse`, `warning_instructions`, `tags`, `critical_inverse`, `module_macros`, `id_category`, `min_ff_event_warning`, `disabled_types_event`, `ff_type`, `min_ff_event_normal`, `dynamic_interval`, `min_ff_event_critical`, `dynamic_min`, `each_ff`, `dynamic_two_tailed`, `dynamic_max`, `dynamic_next`) VALUES (786,'N. total processes','Number of running processes in a Windows system.',11,34,0,0,300,0,'tasklist /NH | findstr /c /v ""','','','',6,2,0,'','','',0,0,1,0.00,0.00,'',0.00,0.00,'',0,'','windows','',0,0,0.000000000000000,'','nowizard','','','','',0,0,0,'','{\"going_unknown\":1}','',0,0,0,0,0,0,0,0,0,0); INSERT INTO `tnetwork_component` (`id_nc`, `name`, `description`, `id_group`, `type`, `max`, `min`, `module_interval`, `tcp_port`, `tcp_send`, `tcp_rcv`, `snmp_community`, `snmp_oid`, `id_module_group`, `id_modulo`, `id_plugin`, `plugin_user`, `plugin_pass`, `plugin_parameter`, `max_timeout`, `max_retries`, `history_data`, `min_warning`, `max_warning`, `max_critical`, `str_warning`, `min_ff_event`, `min_critical`, `custom_string_2`, `str_critical`, `custom_integer_1`, `custom_string_1`, `post_process`, `custom_string_3`, `wizard_level`, `custom_integer_2`, `critical_instructions`, `unit`, `unknown_instructions`, `macros`, `warning_inverse`, `warning_instructions`, `tags`, `critical_inverse`, `module_macros`, `id_category`, `min_ff_event_warning`, `disabled_types_event`, `ff_type`, `min_ff_event_normal`, `dynamic_interval`, `min_ff_event_critical`, `dynamic_min`, `each_ff`, `dynamic_two_tailed`, `dynamic_max`, `dynamic_next`) VALUES (787,'Free space in C:','Free space available in C:',11,34,0,0,300,0,'powershell $obj=(Get-WmiObject -class "Win32_LogicalDisk" -namespace "root\CIMV2") ; $obj.FreeSpace * 100 /$obj.Size','','','',4,2,0,'','','',0,0,1,0.00,0.00,'',0.00,0.00,'',0,'','windows','',0,0,0.000000000000000,'%','nowizard','','','','',0,0,0,'','{\"going_unknown\":1}','',0,0,0,0,0,0,0,0,0,0); diff --git a/pandora_console/general/firts_task/HA_cluster_builder.php b/pandora_console/general/first_task/HA_cluster_builder.php similarity index 95% rename from pandora_console/general/firts_task/HA_cluster_builder.php rename to pandora_console/general/first_task/HA_cluster_builder.php index 6d82d94ad0..7ae56a4287 100644 --- a/pandora_console/general/firts_task/HA_cluster_builder.php +++ b/pandora_console/general/first_task/HA_cluster_builder.php @@ -33,13 +33,13 @@ if (! check_acl($config['id_user'], 0, 'PM')) { exit; } -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ui_print_info_message(['no_close' => true, 'message' => __('There are no HA clusters defined yet.') ]); ?>
- __('Clusters')]); ?> + __('Clusters')]); ?>

diff --git a/pandora_console/general/firts_task/cluster_builder.php b/pandora_console/general/first_task/cluster_builder.php similarity index 96% rename from pandora_console/general/firts_task/cluster_builder.php rename to pandora_console/general/first_task/cluster_builder.php index ba9d8c311a..e80d4e4b15 100644 --- a/pandora_console/general/firts_task/cluster_builder.php +++ b/pandora_console/general/first_task/cluster_builder.php @@ -24,7 +24,7 @@ if (! check_acl($config['id_user'], 0, 'AR') && ! check_acl($config['id_user'], return; } -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no clusters defined yet.') ]); @@ -32,7 +32,7 @@ ui_print_info_message(['no_close' => true, 'message' => __('There are no cluster
- __('Clusters')]); ?> + __('Clusters')]); ?>

diff --git a/pandora_console/general/firts_task/collections.php b/pandora_console/general/first_task/collections.php similarity index 98% rename from pandora_console/general/firts_task/collections.php rename to pandora_console/general/first_task/collections.php index 8e27ce6ee3..2ca4583bb9 100755 --- a/pandora_console/general/firts_task/collections.php +++ b/pandora_console/general/first_task/collections.php @@ -13,7 +13,7 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no collections defined yet.') ]); ?> diff --git a/pandora_console/general/firts_task/custom_fields.php b/pandora_console/general/first_task/custom_fields.php similarity index 94% rename from pandora_console/general/firts_task/custom_fields.php rename to pandora_console/general/first_task/custom_fields.php index 7d07ff9495..30f5b839c6 100644 --- a/pandora_console/general/firts_task/custom_fields.php +++ b/pandora_console/general/first_task/custom_fields.php @@ -13,7 +13,7 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no custom fields defined yet.') ]); @@ -21,7 +21,7 @@ ui_print_info_message(['no_close' => true, 'message' => __('There are no custom
- __('Custom Fields')]); ?> + __('Custom Fields')]); ?>

diff --git a/pandora_console/general/firts_task/custom_graphs.php b/pandora_console/general/first_task/custom_graphs.php similarity index 94% rename from pandora_console/general/firts_task/custom_graphs.php rename to pandora_console/general/first_task/custom_graphs.php index e22187c6f5..d49001449a 100644 --- a/pandora_console/general/firts_task/custom_graphs.php +++ b/pandora_console/general/first_task/custom_graphs.php @@ -13,7 +13,7 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no custom graphs defined yet.') ]); @@ -21,7 +21,7 @@ ui_print_info_message(['no_close' => true, 'message' => __('There are no custom

- __('Custom Graphs')]); ?> + __('Custom Graphs')]); ?>

diff --git a/pandora_console/general/firts_task/fields_manager.php b/pandora_console/general/first_task/fields_manager.php similarity index 94% rename from pandora_console/general/firts_task/fields_manager.php rename to pandora_console/general/first_task/fields_manager.php index f81de216db..2ef6e70f55 100755 --- a/pandora_console/general/firts_task/fields_manager.php +++ b/pandora_console/general/first_task/fields_manager.php @@ -13,13 +13,13 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no custom fields defined yet.') ]); ?>

- __('Fields Manager')]); ?> + __('Fields Manager')]); ?>

diff --git a/pandora_console/general/firts_task/incidents.php b/pandora_console/general/first_task/incidents.php similarity index 95% rename from pandora_console/general/firts_task/incidents.php rename to pandora_console/general/first_task/incidents.php index daa83588e3..20630ff5e3 100644 --- a/pandora_console/general/firts_task/incidents.php +++ b/pandora_console/general/first_task/incidents.php @@ -15,7 +15,7 @@ global $config; global $incident_w; global $incident_m; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no incidents defined yet.') ]); @@ -25,7 +25,7 @@ if ($incident_w || $incident_m) {

- __('Incidents')]); ?> + __('Incidents')]); ?>

diff --git a/pandora_console/general/firts_task/map_builder.php b/pandora_console/general/first_task/map_builder.php similarity index 95% rename from pandora_console/general/firts_task/map_builder.php rename to pandora_console/general/first_task/map_builder.php index 352f7374e5..509f967195 100755 --- a/pandora_console/general/firts_task/map_builder.php +++ b/pandora_console/general/first_task/map_builder.php @@ -15,7 +15,7 @@ global $config; global $vconsoles_write; global $vconsoles_manage; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ui_print_info_message( [ @@ -28,7 +28,7 @@ if ($vconsoles_write || $vconsoles_manage) {

- __('Visual Console')]); ?> + __('Visual Console')]); ?>

diff --git a/pandora_console/general/firts_task/network_map.php b/pandora_console/general/first_task/network_map.php similarity index 95% rename from pandora_console/general/firts_task/network_map.php rename to pandora_console/general/first_task/network_map.php index 0526f936aa..f1de76c08b 100755 --- a/pandora_console/general/firts_task/network_map.php +++ b/pandora_console/general/first_task/network_map.php @@ -13,7 +13,7 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no network map defined yet.') ]); @@ -23,7 +23,7 @@ $networkmap_types = networkmap_get_types($strict_user);

- __('Network Map')]); ?> + __('Network Map')]); ?>

diff --git a/pandora_console/general/first_task/omnishell.php b/pandora_console/general/first_task/omnishell.php new file mode 100644 index 0000000000..948204917c --- /dev/null +++ b/pandora_console/general/first_task/omnishell.php @@ -0,0 +1,56 @@ + + true, 'message' => __('There is no command defined yet.') ]); ?> + +

+
+ __('Omnishell')]); ?> +
+
+

+ '.__( + 'Omnishell is an enterprise feature which allows you to execute a structured command along any agent in your %s. The only requirement is to have remote configuration enabled in your agent.', + io_safe_output(get_product_name()) + ).'

'; + + echo '

'.__( + 'You can execute any command on as many agents you need, and check the execution on all of them using the Omnishell Command View' + ).'

'; + ?> +

+ +
+ +
+ +
+
diff --git a/pandora_console/general/firts_task/planned_downtime.php b/pandora_console/general/first_task/planned_downtime.php similarity index 94% rename from pandora_console/general/firts_task/planned_downtime.php rename to pandora_console/general/first_task/planned_downtime.php index 21bfb4b083..83c6cd9384 100644 --- a/pandora_console/general/firts_task/planned_downtime.php +++ b/pandora_console/general/first_task/planned_downtime.php @@ -13,13 +13,13 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no planned downtime defined yet.') ]); ?>
- __('Planned Downtime')]); ?> + __('Planned Downtime')]); ?>

diff --git a/pandora_console/general/firts_task/recon_view.php b/pandora_console/general/first_task/recon_view.php similarity index 95% rename from pandora_console/general/firts_task/recon_view.php rename to pandora_console/general/first_task/recon_view.php index 8c59b23f64..9eee373dec 100755 --- a/pandora_console/general/firts_task/recon_view.php +++ b/pandora_console/general/first_task/recon_view.php @@ -13,13 +13,13 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no discovery tasks defined yet.') ]); ?>

- __('Discovery server')]); ?> + __('Discovery server')]); ?>

diff --git a/pandora_console/general/firts_task/service_list.php b/pandora_console/general/first_task/service_list.php similarity index 95% rename from pandora_console/general/firts_task/service_list.php rename to pandora_console/general/first_task/service_list.php index 424bc60400..f4a56a826b 100755 --- a/pandora_console/general/firts_task/service_list.php +++ b/pandora_console/general/first_task/service_list.php @@ -15,14 +15,14 @@ global $config; global $agent_w; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no services defined yet.') ]); ?>

- __('Services')]); ?> + __('Services')]); ?>

diff --git a/pandora_console/general/firts_task/snmp_filters.php b/pandora_console/general/first_task/snmp_filters.php similarity index 95% rename from pandora_console/general/firts_task/snmp_filters.php rename to pandora_console/general/first_task/snmp_filters.php index 602702da69..724c9da31f 100755 --- a/pandora_console/general/firts_task/snmp_filters.php +++ b/pandora_console/general/first_task/snmp_filters.php @@ -13,13 +13,13 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no SNMP filter defined yet.') ]); ?>

- __('SNMP Filter')]); ?> + __('SNMP Filter')]); ?>

diff --git a/pandora_console/general/firts_task/tags.php b/pandora_console/general/first_task/tags.php similarity index 94% rename from pandora_console/general/firts_task/tags.php rename to pandora_console/general/first_task/tags.php index 38c006d3b2..ea8086357c 100755 --- a/pandora_console/general/firts_task/tags.php +++ b/pandora_console/general/first_task/tags.php @@ -13,13 +13,13 @@ // GNU General Public License for more details. global $config; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no tags defined yet.') ]); ?>

- __('Tags')]); ?> + __('Tags')]); ?>

diff --git a/pandora_console/general/firts_task/transactional_list.php b/pandora_console/general/first_task/transactional_list.php similarity index 95% rename from pandora_console/general/firts_task/transactional_list.php rename to pandora_console/general/first_task/transactional_list.php index 6edc964ad7..40381f2da8 100644 --- a/pandora_console/general/firts_task/transactional_list.php +++ b/pandora_console/general/first_task/transactional_list.php @@ -15,7 +15,7 @@ global $config; global $networkmaps_write; global $networkmaps_manage; check_login(); -ui_require_css_file('firts_task'); +ui_require_css_file('first_task'); ?> true, 'message' => __('There are no transactions defined yet.') ]); @@ -25,7 +25,7 @@ if ($networkmaps_write || $networkmaps_manage) {

- __('Transactions')]); ?> + __('Transactions')]); ?>

diff --git a/pandora_console/godmode/agentes/fields_manager.php b/pandora_console/godmode/agentes/fields_manager.php index 20a9db547a..1536e5c278 100644 --- a/pandora_console/godmode/agentes/fields_manager.php +++ b/pandora_console/godmode/agentes/fields_manager.php @@ -126,7 +126,7 @@ if ($fields) { $table->size[3] = '8%'; $table->data = []; } else { - include_once $config['homedir'].'/general/firts_task/fields_manager.php'; + include_once $config['homedir'].'/general/first_task/fields_manager.php'; return; } diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php index 01f30afba6..f116b2dcd8 100755 --- a/pandora_console/godmode/agentes/planned_downtime.list.php +++ b/pandora_console/godmode/agentes/planned_downtime.list.php @@ -352,7 +352,7 @@ if (!empty($groups)) { // No downtimes cause the user has not anyone. if (!$downtimes && !$filter_performed) { - include_once $config['homedir'].'/general/firts_task/planned_downtime.php'; + include_once $config['homedir'].'/general/first_task/planned_downtime.php'; } // No downtimes cause the user performed a search. else if (!$downtimes) { diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index edf7be1873..3a9e3de9c0 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -346,6 +346,8 @@ if (check_acl($config['id_user'], 0, 'PM') || check_acl($config['id_user'], 0, ' $sub['godmode/setup/links']['id'] = 'Links'; $sub['tools/diagnostics']['text'] = __('Diagnostic info'); $sub['tools/diagnostics']['id'] = 'Diagnostic info'; + enterprise_hook('omnishell'); + $sub['godmode/setup/news']['text'] = __('Site news'); $sub['godmode/setup/news']['id'] = 'Site news'; $sub['godmode/setup/file_manager']['text'] = __('File manager'); diff --git a/pandora_console/godmode/reporting/graphs.php b/pandora_console/godmode/reporting/graphs.php index e9f1aef011..155eb560db 100644 --- a/pandora_console/godmode/reporting/graphs.php +++ b/pandora_console/godmode/reporting/graphs.php @@ -337,7 +337,7 @@ $table_aux = new stdClass(); echo '

'; } else { - include_once $config['homedir'].'/general/firts_task/custom_graphs.php'; + include_once $config['homedir'].'/general/first_task/custom_graphs.php'; } ?> diff --git a/pandora_console/godmode/reporting/map_builder.php b/pandora_console/godmode/reporting/map_builder.php index 8f5774b3a9..96f86191d7 100644 --- a/pandora_console/godmode/reporting/map_builder.php +++ b/pandora_console/godmode/reporting/map_builder.php @@ -395,7 +395,7 @@ if ($own_info['is_admin'] || $vconsoles_read) { if (!$maps && !is_metaconsole()) { $total = count(visual_map_get_user_layouts($config['id_user'], false, false, false)); if (!$total) { - include_once $config['homedir'].'/general/firts_task/map_builder.php'; + include_once $config['homedir'].'/general/first_task/map_builder.php'; } else { ui_print_info_message( [ diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index f0e2a4ad08..0006fc3e9b 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -154,7 +154,7 @@ foreach ($servers as $server) { if ($server['type'] == 'recon') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/firts_task/icono_grande_reconserver.png', + 'images/first_task/icono_grande_reconserver.png', true, [ 'title' => __('Manage Discovery tasks'), diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index 680d0b7a45..cb5fb27ab1 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -304,7 +304,7 @@ if (!empty($result)) { } else if ($filter_performed) { echo $filter_form; } else { - include $config['homedir'].'/general/firts_task/tags.php'; + include $config['homedir'].'/general/first_task/tags.php'; return; } } diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index ed523d0b82..9b12f2ee36 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -145,7 +145,7 @@ class DiscoveryTaskList extends Wizard $ret2 = $this->showList(); if ($ret === false && $ret2 === false) { - include_once $config['homedir'].'/general/firts_task/recon_view.php'; + include_once $config['homedir'].'/general/first_task/recon_view.php'; } else { $form = [ 'form' => [ diff --git a/pandora_console/godmode/wizards/Wizard.main.php b/pandora_console/godmode/wizards/Wizard.main.php index 5ffeb716d9..6f1d59d56b 100644 --- a/pandora_console/godmode/wizards/Wizard.main.php +++ b/pandora_console/godmode/wizards/Wizard.main.php @@ -436,11 +436,15 @@ class Wizard * * @param array $input Definition of target block to be printed. * @param boolean $return Return as string or direct output. + * @param boolean $direct Avoid encapsulation if input print is direct. * * @return string HTML content. */ - public function printBlock(array $input, bool $return=false, bool $not_direct=false) - { + public function printBlock( + array $input, + bool $return=false, + bool $direct=false + ) { $output = ''; if ($input['hidden'] == 1) { $class = ' hidden'; @@ -453,7 +457,7 @@ class Wizard } if (is_array($input['block_content']) === true) { - $not_direct = (bool) $input['direct']; + $direct = (bool) $input['direct']; // Print independent block of inputs. $output .= '
  • '; @@ -462,17 +466,21 @@ class Wizard $output .= '<'.$input['wrapper'].' id="'.$input['block_id'].'" class="'.$class.'">'; } - if (!$not_direct) { + if (!$direct) { // Avoid encapsulation if input is direct => 1. $output .= '
      '; } foreach ($input['block_content'] as $input) { - $output .= $this->printBlock($input, $return, (bool) $not_direct); + $output .= $this->printBlock( + $input, + $return, + (bool) $direct + ); } // Close block. - if (!$not_direct) { + if (!$direct) { $output .= '
    '; } @@ -483,7 +491,7 @@ class Wizard $output .= '
  • '; } else { if ($input['arguments']['type'] != 'hidden') { - if (!$not_direct) { + if (!$direct) { $output .= '
  • '; } @@ -491,7 +499,7 @@ class Wizard $output .= $this->printInput($input['arguments']); // Allow dynamic content. $output .= $input['extra']; - if (!$not_direct) { + if (!$direct) { $output .= '
  • '; } } else { @@ -806,8 +814,11 @@ class Wizard $padding_left = isset($column['padding-left']) ? 'padding-left: '.$column['padding-left'].';' : 'padding-left: 0;'; $padding_right = isset($column['padding-right']) ? 'padding-right: '.$column['padding-right'].';' : 'padding-right: 0;'; $extra_styles = isset($column['style']) ? $column['style'] : ''; + $class = isset($column['class']) ? $column['class'] : ''; - $output .= '
    '; + $output .= '
    '; foreach ($column['inputs'] as $input) { if (is_array($input)) { diff --git a/pandora_console/images/firts_task/icono-cluster-activo.png b/pandora_console/images/first_task/icono-cluster-activo.png similarity index 100% rename from pandora_console/images/firts_task/icono-cluster-activo.png rename to pandora_console/images/first_task/icono-cluster-activo.png diff --git a/pandora_console/images/firts_task/icono_aws.png b/pandora_console/images/first_task/icono_aws.png similarity index 100% rename from pandora_console/images/firts_task/icono_aws.png rename to pandora_console/images/first_task/icono_aws.png diff --git a/pandora_console/images/firts_task/icono_grande_custom_reporting.png b/pandora_console/images/first_task/icono_grande_custom_reporting.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_custom_reporting.png rename to pandora_console/images/first_task/icono_grande_custom_reporting.png diff --git a/pandora_console/images/firts_task/icono_grande_event_alerts.png b/pandora_console/images/first_task/icono_grande_event_alerts.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_event_alerts.png rename to pandora_console/images/first_task/icono_grande_event_alerts.png diff --git a/pandora_console/images/firts_task/icono_grande_export.png b/pandora_console/images/first_task/icono_grande_export.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_export.png rename to pandora_console/images/first_task/icono_grande_export.png diff --git a/pandora_console/images/firts_task/icono_grande_gestiondetags.png b/pandora_console/images/first_task/icono_grande_gestiondetags.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_gestiondetags.png rename to pandora_console/images/first_task/icono_grande_gestiondetags.png diff --git a/pandora_console/images/firts_task/icono_grande_import.png b/pandora_console/images/first_task/icono_grande_import.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_import.png rename to pandora_console/images/first_task/icono_grande_import.png diff --git a/pandora_console/images/firts_task/icono_grande_incidencia.png b/pandora_console/images/first_task/icono_grande_incidencia.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_incidencia.png rename to pandora_console/images/first_task/icono_grande_incidencia.png diff --git a/pandora_console/images/firts_task/icono_grande_inventario.png b/pandora_console/images/first_task/icono_grande_inventario.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_inventario.png rename to pandora_console/images/first_task/icono_grande_inventario.png diff --git a/pandora_console/images/firts_task/icono_grande_licencia.png b/pandora_console/images/first_task/icono_grande_licencia.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_licencia.png rename to pandora_console/images/first_task/icono_grande_licencia.png diff --git a/pandora_console/images/firts_task/icono_grande_reconserver.png b/pandora_console/images/first_task/icono_grande_reconserver.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_reconserver.png rename to pandora_console/images/first_task/icono_grande_reconserver.png diff --git a/pandora_console/images/firts_task/icono_grande_registro_plugin.png b/pandora_console/images/first_task/icono_grande_registro_plugin.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_registro_plugin.png rename to pandora_console/images/first_task/icono_grande_registro_plugin.png diff --git a/pandora_console/images/firts_task/icono_grande_servicios.png b/pandora_console/images/first_task/icono_grande_servicios.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_servicios.png rename to pandora_console/images/first_task/icono_grande_servicios.png diff --git a/pandora_console/images/firts_task/icono_grande_topology.png b/pandora_console/images/first_task/icono_grande_topology.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_topology.png rename to pandora_console/images/first_task/icono_grande_topology.png diff --git a/pandora_console/images/firts_task/icono_grande_visualconsole.png b/pandora_console/images/first_task/icono_grande_visualconsole.png similarity index 100% rename from pandora_console/images/firts_task/icono_grande_visualconsole.png rename to pandora_console/images/first_task/icono_grande_visualconsole.png diff --git a/pandora_console/images/firts_task/icono_manage_agents.png b/pandora_console/images/first_task/icono_manage_agents.png similarity index 100% rename from pandora_console/images/firts_task/icono_manage_agents.png rename to pandora_console/images/first_task/icono_manage_agents.png diff --git a/pandora_console/images/first_task/omnishell.png b/pandora_console/images/first_task/omnishell.png new file mode 100644 index 0000000000..8724d322fb Binary files /dev/null and b/pandora_console/images/first_task/omnishell.png differ diff --git a/pandora_console/images/firts_task/op_workspace.menu.png b/pandora_console/images/first_task/op_workspace.menu.png similarity index 100% rename from pandora_console/images/firts_task/op_workspace.menu.png rename to pandora_console/images/first_task/op_workspace.menu.png diff --git a/pandora_console/images/firts_task/slave-mode.png b/pandora_console/images/first_task/slave-mode.png similarity index 100% rename from pandora_console/images/firts_task/slave-mode.png rename to pandora_console/images/first_task/slave-mode.png diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index d795233265..0ad31cf931 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2911,6 +2911,130 @@ function ui_progress( } +/** + * Generates a progress bar CSS based. + * Requires css progress.css + * + * @param array $progress Progress. + * @param string $width Width. + * @param integer $height Height in 'em'. + * @param array $color status color. + * @param boolean $return Return or paint (if false). + * @param boolean $text Text to be displayed,by default progress %. + * @param array $ajax Ajax: [ 'page' => 'page', 'data' => 'data' ] Sample: + * [ + * 'page' => 'operation/agentes/ver_agente', Target page. + * 'interval' => 100 / $agent["intervalo"], Ask every interval seconds. + * 'data' => [ Data to be sent to target page. + * 'id_agente' => $id_agente, + * 'refresh_contact' => 1, + * ], + * ]. + * + * @return string HTML code. + */ +function ui_progress_extend( + $progress, + $width='100%', + $height='2.5', + $color='#82b92e', + $return=true, + $text='', + $ajax=false +) { + if (!$progress['total']) { + $progress = 0; + } + + $totalW = ($progress['total'] * 100); + if ($totalW > 100) { + $totalW = 100; + } + + if ($totalW < 0) { + $totalW = 0; + } + + if (empty($text)) { + $text = $totalW.'%'; + } + + $badW = (($progress['bad'] * 100 ) / $progress['total']); + $goodW = (($progress['good'] * 100 ) / $progress['total']); + $unknownW = (($progress['unknown'] * 100 ) / $progress['total']); + ui_require_css_file('progress'); + $output .= '
    '; + $output .= '
    '; + $output .= '
    '; + $output .= '
    '; + $output .= '
    '; + + if ($ajax !== false && is_array($ajax)) { + $output .= ''; + } + + if (!$return) { + echo $output; + } + + return $output; +} + + /** * Generate needed code to print a datatables jquery plugin. * diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index c3ed855213..6a29b6b552 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -1885,12 +1885,35 @@ function load_modal(settings) { } data.append("page", settings.onshow.page); data.append("method", settings.onshow.method); + if (settings.onshow.extradata != undefined) { + data.append("extradata", JSON.stringify(settings.onshow.extradata)); + } + + if (settings.target == undefined) { + var uniq = uniqId(); + var div = document.createElement("div"); + div.id = "div-modal-" + uniq; + div.style.display = "none"; + + document.getElementById("main").append(div); + + var id_modal_target = "#div-modal-" + uniq; + + settings.target = $(id_modal_target); + } var width = 630; if (settings.onshow.width) { width = settings.onshow.width; } + if (settings.modal.overlay == undefined) { + settings.modal.overlay = { + opacity: 0.5, + background: "black" + }; + } + settings.target.html("Loading modal..."); settings.target .dialog({ @@ -2081,14 +2104,16 @@ function load_modal(settings) { modal: true, title: settings.modal.title, width: width, - overlay: { - opacity: 0.5, - background: "black" - }, + overlay: settings.modal.overlay, buttons: required_buttons, closeOnEscape: false, open: function() { $(".ui-dialog-titlebar-close").hide(); + }, + close: function() { + if (id_modal_target != undefined) { + $(id_modal_target).remove(); + } } }); }, @@ -2100,13 +2125,7 @@ function load_modal(settings) { //Function that shows a dialog box to confirm closures of generic manners. The modal id is random function confirmDialog(settings) { - var randomStr = - Math.random() - .toString(36) - .substring(2, 15) + - Math.random() - .toString(36) - .substring(2, 15); + var randomStr = uniqId(); $("body").append( '
    ' + settings.message + "
    " @@ -2142,6 +2161,18 @@ function confirmDialog(settings) { .show(); } +function uniqId() { + var randomStr = + Math.random() + .toString(36) + .substring(2, 15) + + Math.random() + .toString(36) + .substring(2, 15); + + return randomStr; +} + /** * Function to show modal with message Validation. * diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css index 2aee23f645..82451e7a1e 100644 --- a/pandora_console/include/styles/discovery.css +++ b/pandora_console/include/styles/discovery.css @@ -31,7 +31,7 @@ li.discovery > a label { } div.data_container > label { - font-family: "lato-bolder", "Open Sans", sans-serif; + font-family: "lato", "Open Sans", sans-serif; font-weight: lighter; } diff --git a/pandora_console/include/styles/firts_task.css b/pandora_console/include/styles/first_task.css similarity index 88% rename from pandora_console/include/styles/firts_task.css rename to pandora_console/include/styles/first_task.css index be75dd632d..06aa36af82 100755 --- a/pandora_console/include/styles/firts_task.css +++ b/pandora_console/include/styles/first_task.css @@ -1,5 +1,11 @@ +.new_task p, +.new_task div { + font-family: "lato-lighter", "Open Sans", sans-serif; + font-weight: lighter; +} .new_task { margin-top: 30px; + min-width: 600px; left: 20px; width: 60%; height: 300px; @@ -30,6 +36,7 @@ div.new_task_cluster > div { .image_task { width: 20%; + min-width: 175px; height: 100%; float: left; } @@ -47,7 +54,7 @@ div.new_task_cluster > div { .text_task { width: 70%; - float: right; + float: left; height: 100%; padding-right: 25px; } diff --git a/pandora_console/include/styles/omnishell.css b/pandora_console/include/styles/omnishell.css new file mode 100644 index 0000000000..b6dcd37826 --- /dev/null +++ b/pandora_console/include/styles/omnishell.css @@ -0,0 +1,477 @@ +.edit_yaml { + margin-left: 39px; + margin-top: 10px; + margin-bottom: 10px; +} + +.margin_button { + margin-right: 5px; +} + +.container-target { + display: flex; + flex-flow: row wrap; +} + +.element-target { + width: 20px; + margin: 2px; + height: 20px; +} + +.status-normal { + background-color: #add570; +} + +.status-critical { + background-color: #e3485e; +} + +.status-notinit { + background-color: #8bbbdd; +} + +.container-msg-target-modal { + max-height: 400px; + overflow: initial; + padding-right: 20px; + padding-left: 20px; +} + +.container-msg-target-modal p { + font-family: "lato-lighter", "Open Sans", sans-serif; + margin-bottom: 20px; + font-size: 10pt; +} + +span.failed { + color: #fb4444; + font-weight: bolder; +} + +span.success { + color: #82b92f; + font-weight: bolder; +} + +.container-msg-target-modal pre { + font-family: monospace; + padding: 1em; + white-space: pre-wrap; + background-color: #efefef; + color: #565656; + font-size: 1.2em; + border: 2px solid #ddd; + border-radius: 5px; +} + +.container-msg-target-modal p img { + margin-right: 0.3em; + height: 1.3em; +} + +ul.wizard li > textarea { + height: 5em; +} + +.label_select { + font-family: "lato-lighter", "Open Sans", sans-serif; + font-weight: bolder; +} + +.divided select { + width: 100%; +} + +.inline { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-content: center; + align-items: center; +} + +.inline label:first-child { + width: 250px; + vertical-align: top; + display: inline-block; +} + +.inline label:nth-child(3) { + margin-right: 1em; + margin-left: 1em; +} + +.inline select { + margin-right: 1em; +} + +.middle { + align-self: center; +} +.edit_discovery_info { + padding-top: 0; +} + +ul.wizard { + width: 100%; +} + +.filter_column { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + align-content: center; +} + +.filter_column .edit_discovery_input { + flex-grow: 1; + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-content: baseline; + margin-left: 2em; +} +.filter_column .edit_discovery_input .label_select { + display: inline; + margin: 0; +} + +.filter_column .edit_discovery_input select { + flex-grow: 1; + margin-left: 2em; +} + +.wizard li { + display: flex; +} + +/* + * Discovery css global + */ + +ul.bigbuttonlist { + min-height: 200px; +} + +li.discovery { + display: inline-block; + float: left; + width: 250px; + margin: 15px; + padding-bottom: 50px; +} + +li.discovery > a { + text-decoration: none; + color: #333; +} +li.discovery > a:hover { + color: #000; +} + +li.discovery img { + height: 90px; +} + +li.discovery > a label { + cursor: pointer; +} + +div.data_container > label { + font-family: "lato", "Open Sans", sans-serif; + font-weight: lighter; +} + +div.data_container { + width: 100%; + height: 100%; + text-align: center; + padding-top: 30px; + padding-bottom: 30px; +} + +div.data_container:hover { + box-shadow: 2px 2px 10px #ddd; +} + +/* + * TODO: This may be at hostdevices.css + */ +.texto { + height: auto; + text-align: center; +} +h1.wizard { + padding: 0; + margin: 0; +} +h1.wizard a { + margin-left: -20px; +} +h1.wizard a:hover { + color: #fff; +} +#text_wizard { + font-weight: bolder; + text-decoration: none; + font-size: 24px; +} +div.arrow_box { + display: inline-block; + position: relative; + color: #888; + padding: 1.3em; + margin-left: 20px; + margin-bottom: 10px; + padding-left: 3em; +} + +.arrow_box.selected { + background: #424242; + color: #ccc; +} + +.arrow_box:after { + left: 0%; + border-left-color: white; + border-width: 20px; + margin-top: -20px; +} + +div.arrow_box:before { + left: 100%; + border-left-color: #ccc; + border-width: 20px; + margin-top: -20px; +} +.arrow_box.selected:before { + border-left-color: #424242; +} + +.arrow_box.selected:hover { + color: #fff; +} +.arrow_box:hover { + color: #000; +} + +/* + * Breadcrum + */ + +#menu_tab_frame_view_bc { + display: flex; + justify-content: space-between; + border-bottom: 2px solid #82b92e; + max-height: 70px; + min-height: 55px; + width: 100%; + padding-right: 0px; + margin-left: 0px; + margin-bottom: 20px; + height: 55px; + box-sizing: border-box; + background-color: #fafafa; + border-top-right-radius: 7px; + border-top-left-radius: 7px; + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.1); +} + +#menu_tab_frame_view_bc .breadcrumbs_container { + align-self: flex-start; +} + +.breadcrumbs_container { + padding-top: 4px; + text-indent: 0.25em; + padding-left: 2.5em; +} + +.breadcrumb_link { + color: #848484; + font-size: 10pt; + font-family: "lato-bolder", "Open Sans", sans-serif; + text-decoration: none; +} + +span.breadcrumb_link { + color: #d0d0d0; + font-size: 12pt; +} + +.breadcrumb_link.selected { + color: #95b750; +} + +.breadcrumb_link.selected:hover { + color: #95b750; +} +.breadcrumb_link:hover { + color: #95b750; +} + +/* + * Discovery forms structure + */ + +form.discovery * { + font-size: 10pt; +} + +form.discovery .label_select b { + font-family: "lato", "Open Sans", sans-serif; + font-weight: bolder; +} + +.edit_discovery_info { + display: flex; + align-items: flex-start; + padding-top: 25px; +} + +.edit_discovery_input { + align-items: center; + margin-bottom: 25px; +} + +/* + * Discovery text inputs + */ + +.discovery_label_hint { + display: flex; +} + +label { + color: #343434; + font-weight: bold; +} + +.discovery_full_width_input { + width: 100%; +} + +li > input[type="text"], +li > input[type="email"], +li > input[type="password"], +li > input[type="email"], +.discovery_text_input > input[type="password"], +.discovery_text_input > input[type="text"], +#interval_manual > input[type="text"] { + background-color: transparent; + border: none; + border-radius: 0; + border-bottom: 1px solid #ccc; + font-family: "lato-bolder", "Open Sans", sans-serif; + font-weight: lighter; + padding: 0px 0px 2px 0px; + box-sizing: border-box; + margin-bottom: 4px; +} + +#interval_manual > input[type="text"] { + width: 50px; + margin-left: 10px; + margin-right: 10px; +} + +.discovery_list_input { + width: 100%; + border: 1px solid #cbcbcb; + overflow-y: auto; +} + +.discovery_list_input option { + text-align: left; +} + +.discovery_list_input option:checked { + background: #1aab8e -webkit-linear-gradient(bottom, #7db742 0%, #7db742 100%); + color: #fff; +} + +.discovery_textarea_input { + background-color: #fbfbfb; + padding-left: 10px; + width: 100%; + height: 100px; + max-height: 100px; + max-width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + resize: none; +} + +a.tip { + margin-left: 8px; +} + +.inline_switch > label { + float: right; +} + +.discovery_interval_select_width { + width: 90%; +} + +a.ext_link { + margin-left: 1em; + font-size: 8pt; +} + +div.ui-tooltip.ui-corner-all.ui-widget-shadow.ui-widget.ui-widget-content.uitooltip { + background: grey; + opacity: 0.9; + border-radius: 4px; + box-shadow: 6px 5px 9px -9px black; + padding: 6px; +} + +.ui-tooltip-content { + background: transparent; + color: #fff; + font-weight: bold; + font-family: "lato-lighter", "Open Sans", sans-serif; + letter-spacing: 0.03pt; + font-size: 8pt; +} + +.arrow { + width: 70px; + height: 16px; + overflow: hidden; + position: absolute; + left: 50%; + margin-left: -35px; + bottom: -16px; +} +.arrow.top { + top: -16px; + bottom: auto; +} +.arrow.left { + left: 50%; +} +.arrow:after { + background: grey; + content: ""; + position: absolute; + left: 20px; + top: -20px; + width: 25px; + height: 25px; + box-shadow: 6px 5px 9px -9px black; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +.arrow.top:after { + bottom: -20px; + top: auto; +} diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index ef1d250759..aba0f03a81 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5698,7 +5698,7 @@ div#status_pie { align-items: center; flex-wrap: wrap; padding: 1em; - min-width: fit-content; + min-width: 100%; } .white_table_graph_content { diff --git a/pandora_console/operation/incidents/incident.php b/pandora_console/operation/incidents/incident.php index 5057b4d281..62e2f33fee 100755 --- a/pandora_console/operation/incidents/incident.php +++ b/pandora_console/operation/incidents/incident.php @@ -372,7 +372,7 @@ if ($count_total >= 1) { } if ($count_total < 1) { - include_once $config['homedir'].'/general/firts_task/incidents.php'; + include_once $config['homedir'].'/general/first_task/incidents.php'; } else { // TOTAL incidents $url = 'index.php?sec=workspace&sec2=operation/incidents/incident'; diff --git a/pandora_console/operation/servers/recon_view.php b/pandora_console/operation/servers/recon_view.php index 5401f6e307..facf494179 100644 --- a/pandora_console/operation/servers/recon_view.php +++ b/pandora_console/operation/servers/recon_view.php @@ -36,7 +36,7 @@ if ($servers === false) { $recon_task = db_get_all_rows_sql('SELECT * FROM trecon_task'); if ($recon_task === false) { ui_print_page_header(__('Recon View'), 'images/op_recon.png', false, '', false); - include_once $config['homedir'].'/general/firts_task/recon_view.php'; + include_once $config['homedir'].'/general/first_task/recon_view.php'; return; } else { include_once $config['homedir'].'/include/functions_graph.php'; diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 3b11dccb4d..910961ec94 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -3658,3 +3658,35 @@ CREATE TABLE `tdeployment_hosts` ( FOREIGN KEY (`target_agent_version_id`) REFERENCES `tagent_repository`(`id`) ON UPDATE CASCADE ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------------------------------------------------- +-- Table `tremote_command` +-- ---------------------------------------------------------------------- +CREATE TABLE `tremote_command` ( + `id` SERIAL, + `name` varchar(150) NOT NULL, + `timeout` int(10) unsigned NOT NULL default 30, + `retries` int(10) unsigned NOT NULL default 3, + `preconditions` text, + `script` text, + `postconditions` text, + `utimestamp` int(20) unsigned NOT NULL default 0, + `id_group` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------------------------------------------------- +-- Table `tremote_command_target` +-- ---------------------------------------------------------------------- +CREATE TABLE `tremote_command_target` ( + `id` SERIAL, + `rcmd_id` bigint unsigned NOT NULL, + `id_agent` int(10) unsigned NOT NULL, + `utimestamp` int(20) unsigned NOT NULL default 0, + `stdout` text, + `stderr` text, + `errorlevel` int(10) unsigned NOT NULL default 0, + PRIMARY KEY (`id`), + FOREIGN KEY (`rcmd_id`) REFERENCES `tremote_command`(`id`) + ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 8f2d106dba..e689aeae92 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -109,10 +109,10 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('MR', 32), +('MR', 33), ('identification_reminder', 1), ('identification_reminder_timestamp', 0), -('current_package_enterprise', '740'), +('current_package_enterprise', '741'), ('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.0009765625":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'), ('custom_docs_logo', 'default_docs.png'), ('custom_support_logo', 'default_support.png'), diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh index e37636af68..5c0a5e0bee 100644 --- a/pandora_server/DEBIAN/make_deb_package.sh +++ b/pandora_server/DEBIAN/make_deb_package.sh @@ -80,7 +80,9 @@ then mkdir -p temp_package/var/spool/pandora/data_in/netflow chmod 770 temp_package/var/spool/pandora/data_in/netflow mkdir -p temp_package/var/spool/pandora/data_in/trans - chmod 770 temp_package/var/spool/pandora/data_in/trans + chmod 770 temp_package/var/spool/pandora/data_in/trans + mkdir -p temp_package/var/spool/pandora/data_in/commands + chmod 770 temp_package/var/spool/pandora/data_in/commands mkdir -p temp_package/var/log/pandora/ chmod 754 temp_package/var/log/pandora/ mkdir -p temp_package/usr/share/pandora_server/conf/ diff --git a/pandora_server/conf/tentacle_server.conf.new b/pandora_server/conf/tentacle_server.conf.new index d4ebe4a71f..992a6b1944 100644 --- a/pandora_server/conf/tentacle_server.conf.new +++ b/pandora_server/conf/tentacle_server.conf.new @@ -21,7 +21,7 @@ daemon 1 # insecure 0 # Filters (regexp:dir;regexp:dir...) -filters .*\.conf:conf;.*\.md5:md5;.*\.zip:collections;.*\.lock:trans +filters .*\.conf:conf;.*\.md5:md5;.*\.zip:collections;.*\.lock:trans;.*\.rcmd:commands # [-m] Maximum file size allowed by the server in bytes #max_size 2000000 diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index df1cbbecfb..38a33fc263 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -602,8 +602,12 @@ sub process_xml_data ($$$$$) { # Process events process_events_dataserver($pa_config, $data, $agent_id, $group_id, $dbh); - # Process disovery modules + # Process discovery modules enterprise_hook('process_discovery_data', [$pa_config, $data, $server_id, $dbh]); + + # Process command responses + enterprise_hook('process_rcmd_report', [$pa_config, $data, $server_id, $dbh, $agent_id, $timestamp]); + } ########################################################################## diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 05fed4153c..058a7a201f 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -54,6 +54,8 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/conf mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/md5 mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/collections mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/netflow +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/trans +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/spool/pandora/data_in/commands mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/pandora/ mkdir -p $RPM_BUILD_ROOT%{prefix}/pandora_server/conf/ mkdir -p $RPM_BUILD_ROOT%{_mandir}/man1/ @@ -195,3 +197,5 @@ exit 0 %{_localstatedir}/spool/pandora/data_in/collections %{_localstatedir}/spool/pandora/data_in/conf %{_localstatedir}/spool/pandora/data_in/netflow +%{_localstatedir}/spool/pandora/data_in/trans +%{_localstatedir}/spool/pandora/data_in/commands diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index ca4e1b49d5..1cc4ce0412 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -61,6 +61,7 @@ mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/md5 mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/collections mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/netflow mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/trans +mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/commands mkdir -p $RPM_BUILD_ROOT/var/log/pandora/ mkdir -p $RPM_BUILD_ROOT%{prefix}/pandora_server/conf/ mkdir -p $RPM_BUILD_ROOT%{prefix}/tentacle/conf/ @@ -198,6 +199,7 @@ rm -Rf /usr/share/man/man1/tentacle_server.1.gz /var/spool/pandora/data_in/netflow /var/spool/pandora/data_in/conf /var/spool/pandora/data_in/trans +/var/spool/pandora/data_in/commands %defattr(-,pandora,root,750) /etc/pandora diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 17381fad66..34b1a6479c 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -315,6 +315,8 @@ install () { chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/netflow mkdir $DESTDIR$PANDORA_SPOOL/data_in/trans 2> /dev/null chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/trans + mkdir $DESTDIR$PANDORA_SPOOL/data_in/commands 2> /dev/null + chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/commands mkdir -p $DESTDIR$PANDORA_LOG 2> /dev/null chown -R pandora $DESTDIR$PANDORA_LOG 2> /dev/null chmod 2774 $DESTDIR$PANDORA_LOG 2> /dev/null