219 lines
6.4 KiB
Perl
Executable File
219 lines
6.4 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
##########################################################################
|
|
# Pandora FMS Server
|
|
# Pandora FMS. the Flexible Monitoring System. http://www.pandorafms.org
|
|
##########################################################################
|
|
# Copyright (c) 2005-2009 Artica Soluciones Tecnologicas S.L
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; version 2
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
##########################################################################
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
# Pandora Modules
|
|
use PandoraFMS::DB;
|
|
use PandoraFMS::Config;
|
|
use PandoraFMS::Tools;
|
|
use PandoraFMS::Core;
|
|
use PandoraFMS::DataServer;
|
|
use PandoraFMS::NetworkServer;
|
|
use PandoraFMS::SNMPServer;
|
|
use PandoraFMS::ReconServer;
|
|
use PandoraFMS::WMIServer;
|
|
use PandoraFMS::PluginServer;
|
|
use PandoraFMS::PredictionServer;
|
|
|
|
# Global vars
|
|
my %Config;
|
|
my @Servers;
|
|
my $DBH;
|
|
|
|
########################################################################################
|
|
# Server shutdown. Handler to do a controlled shutdown.
|
|
########################################################################################
|
|
sub pandora_shutdown () {
|
|
logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' Shutdown by signal ', 0);
|
|
|
|
# Stop servers
|
|
foreach my $server (@Servers) {
|
|
$server->downEvent ();
|
|
$server->stop ();
|
|
}
|
|
|
|
print_message (\%Config, ' [*] Shutting down ' . $Config{'servername'} . "(received signal)...\n", 0);
|
|
db_disconnect ($DBH);
|
|
exit (0);
|
|
}
|
|
|
|
########################################################################################
|
|
# Server startup.
|
|
########################################################################################
|
|
sub pandora_startup () {
|
|
|
|
# Start logging
|
|
pandora_start_log (\%Config);
|
|
|
|
# Connect to the DB
|
|
$DBH = db_connect ('mysql', $Config{'dbname'}, $Config{'dbhost'}, 3306,
|
|
$Config{'dbuser'}, $Config{'dbpass'});
|
|
|
|
pandora_audit (\%Config, 'Pandora FMS Server Daemon starting', 'SYSTEM', 'System', $DBH);
|
|
|
|
# Load servers
|
|
pandora_reset_server (\%Config, $DBH);
|
|
push (@Servers, new PandoraFMS::DataServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::NetworkServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::ReconServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::SNMPServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::WMIServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::PluginServer (\%Config, $DBH));
|
|
push (@Servers, new PandoraFMS::PredictionServer (\%Config, $DBH));
|
|
|
|
enterprise_hook('load_enterprise_servers', [\@Servers, \%Config, $DBH]);
|
|
|
|
# Remove disabled servers
|
|
@Servers = grep { defined ($_) } @Servers;
|
|
|
|
# Run
|
|
foreach my $server (@Servers) {
|
|
$server->run ();
|
|
}
|
|
}
|
|
|
|
########################################################################################
|
|
# Server restart.
|
|
########################################################################################
|
|
sub pandora_restart () {
|
|
|
|
# Stop the servers
|
|
foreach my $server (@Servers) {
|
|
$server->stop ();
|
|
}
|
|
|
|
# Remove the servers
|
|
while (pop (@Servers)) {};
|
|
|
|
# Close STDERR, redirected by pandora_start_log
|
|
close (STDERR);
|
|
|
|
# Wait before trying to start again
|
|
sleep ($Config{'restart_delay'});
|
|
|
|
# Start the servers
|
|
pandora_startup ();
|
|
}
|
|
|
|
########################################################################################
|
|
# Server crash. Handler to write in the log unhandled errors and write it to console
|
|
########################################################################################
|
|
sub pandora_crash () {
|
|
|
|
logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' unhandled error', 0);
|
|
print_message (\%Config, '[E] Unhandled error in "' . $Config{'servername'} . "\". See more information in logfiles at '/var/log/pandora' \n", 0);
|
|
my(@array) = @_;
|
|
|
|
foreach my $error_line (@array) {
|
|
logger (\%Config, '[E] \'' . $Config{'servername'} . "': $error_line", 0);
|
|
print_message (\%Config, "[E] $error_line \n", 0);
|
|
}
|
|
}
|
|
|
|
$SIG{'TERM'} = 'pandora_shutdown';
|
|
$SIG{'INT'} = 'pandora_shutdown';
|
|
|
|
# Error handler needs to be reviewed, Enterprise not found errors are too nasty :(
|
|
#$SIG{__DIE__} = 'pandora_crash';
|
|
|
|
# Prevent alarm from bombing the main thread when called within a thread
|
|
$SIG{'ALRM'} = 'IGNORE';
|
|
|
|
# Initialize
|
|
pandora_init(\%Config, 'Pandora FMS Server');
|
|
pandora_load_config (\%Config);
|
|
|
|
# Load enterprise module
|
|
if (enterprise_load () == 0) {
|
|
print " [*] Pandora FMS Enterprise module not available.\n";
|
|
} else {
|
|
print " [*] Pandora FMS Enterprise module loaded.\n";
|
|
}
|
|
|
|
# Daemonize and put in background
|
|
if ($Config{'daemon'} == 1) {
|
|
print_message (\%Config, " [*] Backgrounding Pandora FMS Server process.\n\n", 0);
|
|
pandora_daemonize (\%Config);
|
|
}
|
|
|
|
# Start the servers
|
|
pandora_startup ();
|
|
|
|
# Generate 'going up' events
|
|
foreach my $server (@Servers) {
|
|
$server->upEvent ();
|
|
}
|
|
|
|
# Main loop
|
|
my $time_ref = time ();
|
|
my $mcast_timer = 0;
|
|
|
|
while (1) {
|
|
|
|
eval {
|
|
|
|
# Update server status
|
|
foreach my $server (@Servers) {
|
|
die ($server->getErrStr ()) unless ($server->checkThreads () == 1);
|
|
$server->update ();
|
|
}
|
|
|
|
pandora_planned_downtime (\%Config, $DBH);
|
|
pandora_exec_forced_alerts (\%Config, $DBH);
|
|
pandora_module_keep_alive_nd (\%Config, $DBH);
|
|
|
|
# Multicast status report each 30 x Server Threshold secs
|
|
if ($mcast_timer > 30){
|
|
enterprise_hook('mcast_status_report', [\%Config, $DBH]);
|
|
$mcast_timer = 0;
|
|
}
|
|
$mcast_timer++;
|
|
};
|
|
|
|
# Restart on error or auto restart
|
|
if ($@) {
|
|
|
|
# Generate 'restarting' events
|
|
foreach my $server (@Servers) {
|
|
$server->restartEvent ($@);
|
|
}
|
|
|
|
logger (\%Config, 'Pandora FMS Server restarting (' . $@ . ') in ' . $Config{'restart_delay'} . ' seconds.', 0);
|
|
pandora_restart ();
|
|
} elsif (($Config{'auto_restart'} > 0) && (time () - $time_ref > $Config{'auto_restart'})) {
|
|
$time_ref = time ();
|
|
|
|
# Mute
|
|
open(OLDOUT, ">&STDOUT");
|
|
open (STDOUT, '>/dev/null');
|
|
|
|
# Restart
|
|
pandora_restart ();
|
|
|
|
# Unmute
|
|
open(STDOUT, ">&OLDOUT");
|
|
close (OLDOUT);
|
|
}
|
|
|
|
threads->yield;
|
|
sleep ($Config{'server_threshold'});
|
|
}
|