diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index c6b1fc15bb..5d3bb55868 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -76,6 +76,9 @@ sub pandora_shutdown () { # Stop the netflow daemon pandora_stop_netflow_daemon (); + # Stop the sflow daemon + pandora_stop_sflow_daemon (); + # Stop server threads. stop_server_threads(); @@ -167,6 +170,9 @@ sub pandora_startup () { # Start the netflow daemon if necessary pandora_start_netflow_daemon (); + + # Start the sflow daemon if necessary + pandora_start_sflow_daemon (); # Remove disabled servers @Servers = grep { defined ($_) } @Servers; @@ -310,6 +316,62 @@ sub pandora_stop_netflow_daemon () { return 0; } +######################################################################################## +# Start the sflow daemon if necessary. +######################################################################################## +sub pandora_start_sflow_daemon () { + my $pid_file = '/var/run/pandora_sfcapd.pid'; + + # Check if sflow is enabled + if ($Config{'activate_sflow'} != 1) { + logger (\%Config, " [*] sflow daemon disabled.", 1); + print_message (\%Config, " [*] sflow daemon disabled.", 1); + return; + } + + # Stop sfcapd if it's already running + my $pid = pandora_stop_sflow_daemon (); + if (pandora_stop_sflow_daemon () != 0) { + logger (\%Config, "sfcapd (pid $pid) is already running, attempting to kill it...", 1); + print_message (\%Config, "sfcapd (pid $pid) is already running, attempting to kill it...", 1); + } + + # Start sfcapd + my $command = $Config{'sflow_daemon'} . ' -D -T all -w -t ' . $Config{'sflow_interval'} . ' -P ' . $pid_file . ' -l ' . $Config{'sflow_path'}; + if (system ("$command >/dev/null 2>&1") != 0) { + logger (\%Config, " [E] Could not start sfcapd: $command", 1); + print_message (\%Config, " [E] Could not start sfcapd: $command", 1); + return; + } + + logger (\%Config, "[*] sflow daemon started.", 1); + print_message (\%Config, "[*] sflow daemon started.", 1); +} + +######################################################################################## +# Stop the sflow daemon if it's running. +######################################################################################## +sub pandora_stop_sflow_daemon () { + + my $pid_file = '/var/run/pandora_sfcapd.pid'; + + # Open the pid file + if ( ! (-e $pid_file && open (PIDFILE, $pid_file))) { + return 0; + } + + my $pid = ; + close PIDFILE; + + # Check if sfcapd is running + if (kill (0, $pid) > 0) { + kill (9, $pid); + return $pid; + } + + return 0; +} + sub pandora_agent_autoconfiguration_scheduled($) { my $pa_config = shift; diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index 7bf9e9f9c6..dbd64da63f 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -144,6 +144,12 @@ sub pandora_get_sharedconfig ($$) { $pa_config->{"netflow_interval"} = pandora_get_tconfig_token ($dbh, 'netflow_interval', 300); $pa_config->{"netflow_daemon"} = pandora_get_tconfig_token ($dbh, 'netflow_daemon', '/usr/bin/nfcapd'); + # Sflow configuration options + $pa_config->{"activate_sflow"} = pandora_get_tconfig_token ($dbh, 'activate_sflow', 0); + $pa_config->{"sflow_path"} = pandora_get_tconfig_token ($dbh, 'sflow_path', '/var/spool/pandora/data_in/sflow'); + $pa_config->{"sflow_interval"} = pandora_get_tconfig_token ($dbh, 'sflow_interval', 300); + $pa_config->{"sflow_daemon"} = pandora_get_tconfig_token ($dbh, 'sflow_daemon', '/usr/bin/nfcapd'); + # Log module configuration $pa_config->{"log_dir"} = pandora_get_tconfig_token ($dbh, 'log_dir', '/var/spool/pandora/data_in/log'); $pa_config->{"log_interval"} = pandora_get_tconfig_token ($dbh, 'log_interval', 3600); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index a4738c6552..54f98ce6f0 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -55,6 +55,7 @@ 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/sflow 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/ @@ -237,5 +238,6 @@ 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/sflow %{_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 b108390a3d..e415360696 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -62,6 +62,7 @@ mkdir -p $RPM_BUILD_ROOT/var/spool/pandora/data_in/conf 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/sflow 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/ @@ -235,6 +236,7 @@ rm -Rf /usr/share/man/man1/tentacle_server.1.gz /var/spool/pandora/data_in/md5 /var/spool/pandora/data_in/collections /var/spool/pandora/data_in/netflow +/var/spool/pandora/data_in/sflow /var/spool/pandora/data_in/conf /var/spool/pandora/data_in/trans /var/spool/pandora/data_in/commands diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 2a76611dde..293c1bb145 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -308,6 +308,8 @@ install () { chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/collections mkdir $DESTDIR$PANDORA_SPOOL/data_in/netflow 2> /dev/null chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/netflow + mkdir $DESTDIR$PANDORA_SPOOL/data_in/sflow 2> /dev/null + chmod 2770 $DESTDIR$PANDORA_SPOOL/data_in/sflow 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 diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ce08881710..15fcdff1ac 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -353,6 +353,23 @@ sub pandora_purgedb ($$$) { else { log_message ('PURGE', 'netflow_max_lifetime is set to 0. Old netflow data will not be deleted.'); } + + # Delete old sflow data + if ($conf->{'_sflow_max_lifetime'} > 0) { + log_message ('PURGE', "Deleting old sflow data."); + if (! defined ($conf->{'_sflow_path'}) || ! -d $conf->{'_sflow_path'}) { + log_message ('!', "sflow data directory does not exist, skipping."); + } + elsif (! -x $conf->{'_sflow_nfexpire'}) { + log_message ('!', "Cannot execute " . $conf->{'_sflow_nfexpire'} . ", skipping."); + } + else { + `yes 2>/dev/null | $conf->{'_sflow_nfexpire'} -r "$conf->{'_sflow_path'}" -t $conf->{'_sflow_max_lifetime'}d`; + } + } + else { + log_message ('PURGE', 'sflow_max_lifetime is set to 0. Old sflow data will not be deleted.'); + } # Delete old log data log_message ('PURGE', "Deleting old log data.");