Merge branch 'ent-4164-8143-No-funciona-module_interval-en-modulos-de-agente-broker' into 'develop'

module_interval in broker (linux agents)

See merge request artica/pandorafms!2709
This commit is contained in:
Alejandro Fraguas 2019-09-25 15:34:48 +02:00
commit 970cbbb4be
5 changed files with 78 additions and 40 deletions

View File

@ -239,6 +239,15 @@ my $tentacle_pid = undef;
# PID of udp_server # PID of udp_server
my $udp_server_pid = undef; my $udp_server_pid = undef;
# BrokerFlag
my $BrokerFlag = 0;
# Global loop counter.
my $LoopCounter = 0;
# Define a max value for loopCounter to avoid overflow.
use constant MAX_LOOP_COUNTER => 1000000000;
################################################################################ ################################################################################
# Print usage information and exit. # Print usage information and exit.
################################################################################ ################################################################################
@ -1385,6 +1394,7 @@ sub sleep_agent {
exit (0); exit (0);
} }
$LoopCounter = ($LoopCounter + 1) % MAX_LOOP_COUNTER;
return $iter_base_time; return $iter_base_time;
} }
@ -1699,6 +1709,14 @@ sub exec_module {
} }
# Check module interval # Check module interval
if ($BrokerFlag > 0) {
if ($LoopCounter == 0) {
$module->{'counter'} = $module->{'intensive_interval'};
} else {
$module->{'counter'} = (($LoopCounter -1 ) % $module->{'intensive_interval'});
}
}
if (++($module->{'counter'}) < $module->{'intensive_interval'}) { if (++($module->{'counter'}) < $module->{'intensive_interval'}) {
$ThreadSem->up () if (defined ($ThreadSem) && $Conf{'agent_threads'} > 1); $ThreadSem->up () if (defined ($ThreadSem) && $Conf{'agent_threads'} > 1);
return; return;
@ -2985,7 +3003,6 @@ while (1) {
@BrokerPid = (); @BrokerPid = ();
my @broker_agents = read_config ('broker_agent'); my @broker_agents = read_config ('broker_agent');
foreach my $broker_agent (@broker_agents) { foreach my $broker_agent (@broker_agents) {
# Create broker conf file if it does not exist # Create broker conf file if it does not exist
if (! -e "$ConfDir/${broker_agent}.conf") { if (! -e "$ConfDir/${broker_agent}.conf") {
write_broker_conf($broker_agent); write_broker_conf($broker_agent);
@ -2995,7 +3012,9 @@ while (1) {
# Broker agent # Broker agent
if ($main_agent == 0) { if ($main_agent == 0) {
# Mark broker flag.
$BrokerFlag = 1;
# Set the configuration file # Set the configuration file
$ConfFile = "${broker_agent}.conf"; $ConfFile = "${broker_agent}.conf";

View File

@ -1422,48 +1422,48 @@ Pandora_Module::evaluatePreconditions () {
buffer[read] = '\0'; buffer[read] = '\0';
output += (char *) buffer; output += (char *) buffer;
} }
try { try {
double_output = Pandora_Strutils::strtodouble (output); double_output = Pandora_Strutils::strtodouble (output);
} catch (Pandora_Strutils::Invalid_Conversion e) { } catch (Pandora_Strutils::Invalid_Conversion e) {
double_output = 0; double_output = 0;
}
if (dwRet == WAIT_OBJECT_0) {
break;
} else if(this->getTimeout() < GetTickCount() - tickbase) {
/* STILL_ACTIVE */
TerminateProcess(pi.hThread, STILL_ACTIVE);
pandoraLog ("evaluatePreconditions: %s timed out (retcode: %d)", this->module_name.c_str (), STILL_ACTIVE);
break;
}
} }
if (dwRet == WAIT_OBJECT_0) { GetExitCodeProcess (pi.hProcess, &retval);
break;
} else if(this->getTimeout() < GetTickCount() - tickbase) { if (retval != 0) {
/* STILL_ACTIVE */ if (! TerminateJobObject (job, 0)) {
TerminateProcess(pi.hThread, STILL_ACTIVE); pandoraLog ("evaluatePreconditions: TerminateJobObject failed. (error %d)",
pandoraLog ("evaluatePreconditions: %s timed out (retcode: %d)", this->module_name.c_str (), STILL_ACTIVE); GetLastError ());
break; }
if (retval != STILL_ACTIVE) {
pandoraLog ("evaluatePreconditions: %s did not executed well (retcode: %d)",
this->module_name.c_str (), retval);
}
/* Close job, process and thread handles. */
CloseHandle (job);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
CloseHandle (new_stdout);
CloseHandle (out_read);
return 0;
} }
}
GetExitCodeProcess (pi.hProcess, &retval);
if (retval != 0) {
if (! TerminateJobObject (job, 0)) {
pandoraLog ("evaluatePreconditions: TerminateJobObject failed. (error %d)",
GetLastError ());
}
if (retval != STILL_ACTIVE) {
pandoraLog ("evaluatePreconditions: %s did not executed well (retcode: %d)",
this->module_name.c_str (), retval);
}
/* Close job, process and thread handles. */ /* Close job, process and thread handles. */
CloseHandle (job); CloseHandle (job);
CloseHandle (pi.hProcess); CloseHandle (pi.hProcess);
CloseHandle (pi.hThread); CloseHandle (pi.hThread);
CloseHandle (new_stdout);
CloseHandle (out_read);
return 0;
} }
/* Close job, process and thread handles. */
CloseHandle (job);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
CloseHandle (new_stdout); CloseHandle (new_stdout);
CloseHandle (out_read); CloseHandle (out_read);
@ -1693,4 +1693,18 @@ Pandora_Module::getAsync () {
return this->async; return this->async;
} }
/**
* Get current exections
*/
long
Pandora_Module::getExecutions () {
return this->executions;
}
/**
* Set current execution (global) used for brokers.
*/
void
Pandora_Module::setExecutions (long executions) {
this->executions = executions;
}

View File

@ -234,6 +234,8 @@ namespace Pandora_Modules {
int getTimeout (); int getTimeout ();
string getSave (); string getSave ();
bool getAsync (); bool getAsync ();
void setExecutions(long executions=0);
long getExecutions();
virtual string getXml (); virtual string getXml ();

View File

@ -1849,7 +1849,7 @@ Pandora_Windows_Service::sendBufferedXml (string path) {
} }
void void
Pandora_Windows_Service::pandora_run_broker (string config) { Pandora_Windows_Service::pandora_run_broker (string config, long executions) {
Pandora_Agent_Conf *conf = NULL; Pandora_Agent_Conf *conf = NULL;
string server_addr; string server_addr;
unsigned char data_flag = 0; unsigned char data_flag = 0;
@ -1876,7 +1876,10 @@ Pandora_Windows_Service::pandora_run_broker (string config) {
Pandora_Module *module; Pandora_Module *module;
module = this->broker_modules->getCurrentValue (); module = this->broker_modules->getCurrentValue ();
/* Keep executions matching main agent */
module->setExecutions(executions);
/* Check preconditions */ /* Check preconditions */
if (module->evaluatePreconditions () == 0) { if (module->evaluatePreconditions () == 0) {
pandoraDebug ("Preconditions not matched for module %s", module->getName ().c_str ()); pandoraDebug ("Preconditions not matched for module %s", module->getName ().c_str ());
@ -2074,7 +2077,7 @@ Pandora_Windows_Service::pandora_run (int forced_run) {
check_broker_agents(all_conf); check_broker_agents(all_conf);
for (i=0;i<num;i++){ for (i=0;i<num;i++){
pandora_init_broker(all_conf[i]); pandora_init_broker(all_conf[i]);
pandora_run_broker(all_conf[i]); pandora_run_broker(all_conf[i], execution_number);
} }
delete []all_conf; delete []all_conf;

View File

@ -87,7 +87,7 @@ namespace Pandora {
int checkConfig (string file); int checkConfig (string file);
void purgeDiskCollections (); void purgeDiskCollections ();
void pandora_init_broker (string file_conf); void pandora_init_broker (string file_conf);
void pandora_run_broker (string config); void pandora_run_broker (string config, long executions=0);
int count_broker_agents(); int count_broker_agents();
void check_broker_agents(string *all_conf); void check_broker_agents(string *all_conf);
int launchTentacleProxy(); int launchTentacleProxy();