2012-07-24 Miguel de Dios <miguel.dedios@artica.es>

* lib/PandoraFMS/Core.pm, lib/PandoraFMS/Tools.pm,
	lib/PandoraFMS/PredictionServer.pm: cleaned source code style.
	
	* lib/PandoraFMS/DB.pm: added functions "get_agent_status",
		"get_agent_modules" and "get_agentmodule_status".




git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@6803 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
mdtrooper 2012-07-24 13:23:27 +00:00
parent b063fc814c
commit 28bca04079
5 changed files with 541 additions and 361 deletions

View File

@ -1,3 +1,11 @@
2012-07-24 Miguel de Dios <miguel.dedios@artica.es>
* lib/PandoraFMS/Core.pm, lib/PandoraFMS/Tools.pm,
lib/PandoraFMS/PredictionServer.pm: cleaned source code style.
* lib/PandoraFMS/DB.pm: added functions "get_agent_status",
"get_agent_modules" and "get_agentmodule_status".
2012-07-16 Dario Rodriguez <dario.rodriguez@artica.es>
* lib/PandoraFMS/Core.pm: Updated statistic queries from php code

View File

@ -872,7 +872,11 @@ sub pandora_process_module ($$$$$$$$$;$) {
my ($pa_config, $data_object, $agent, $module, $module_type,
$timestamp, $utimestamp, $server_id, $dbh, $extra_macros) = @_;
logger($pa_config, "Processing module '" . safe_output($module->{'nombre'}) . "' for agent " . (defined ($agent) && $agent ne '' ? "'" . safe_output($agent->{'nombre'}) . "'" : 'ID ' . $module->{'id_agente'}) . ".", 10);
logger($pa_config,
"Processing module '" . safe_output($module->{'nombre'}) .
"' for agent " .
(defined ($agent) && $agent ne '' ? "'" . safe_output($agent->{'nombre'}) . "'" : 'ID ' . $module->{'id_agente'}) . ".",
1);
# Get agent information
if (! defined ($agent) || $agent eq '') {

View File

@ -22,6 +22,8 @@ use warnings;
use DBI;
use PandoraFMS::Tools;
#use Data::Dumper;
require Exporter;
our @ISA = ("Exporter");
@ -73,6 +75,9 @@ our @EXPORT = qw(
get_user_exists
is_agent_address
is_group_disabled
get_agent_status
get_agent_modules
get_agentmodule_status
);
##########################################################################
@ -96,7 +101,8 @@ sub db_connect ($$$$$$) {
$dbh->{'mysql_enable_utf8'} = 1;
return $dbh;
} elsif ($rdbms eq 'postgresql') {
}
elsif ($rdbms eq 'postgresql') {
$RDBMS = 'postgresql';
# Connect to PostgreSQL
@ -188,55 +194,169 @@ sub get_os_id ($$) {
sub get_agent_group ($$) {
my ($dbh, $agent_id) = @_;
my $group_id = get_db_value ($dbh, "SELECT id_grupo FROM tagente WHERE id_agente = ?", $agent_id);
my $group_id = get_db_value ($dbh, "SELECT id_grupo
FROM tagente
WHERE id_agente = ?", $agent_id);
return 0 unless defined ($group_id);
return $group_id;
}
##########################################################################
########################################################################
## SUB get_agent_name (agent_id)
## Return agent name, given "agent_id"
##########################################################################
########################################################################
sub get_agent_name ($$) {
my ($dbh, $agent_id) = @_;
return get_db_value ($dbh, "SELECT nombre FROM tagente WHERE id_agente = ?", $agent_id);
return get_db_value ($dbh, "SELECT nombre
FROM tagente
WHERE id_agente = ?", $agent_id);
}
##########################################################################
########################################################################
## SUB agents_get_modules (agent_id, fields, filters)
## Return the list of modules, given "agent_id"
########################################################################
sub get_agent_modules ($$$$$) {
my ($pa_config, $dbh, $agent_id, $fields, $filters) = @_;
my $str_filter = '';
foreach my $key (keys $filters) {
$str_filter .= ' AND ' . $key . " = " . $filters->{$key};
}
my @rows = get_db_rows($dbh, "SELECT *
FROM tagente_modulo
WHERE id_agente = ?" . $str_filter, $agent_id);
return @rows;
}
########################################################################
## SUB get_agentmodule_status (agent_module_id)
## Return agent module status. given "agent_module_id"
########################################################################
sub get_agentmodule_status($$$) {
my ($pa_config, $dbh, $agent_module_id) = @_;
my $status = get_db_value($dbh, 'SELECT estado
FROM tagente_estado
WHERE id_agente_modulo = ?', $agent_module_id);
return $status;
}
########################################################################
## SUB get_get_status (agent_id)
## Return agent status, given "agent_id"
########################################################################
sub get_agent_status ($$$) {
my ($pa_config, $dbh, $agent_id) = @_;
my @modules = get_agent_modules ($pa_config, $dbh,
$agent_id, 'id_agente_modulo', {'disabled' => 0});
#logger($pa_config, Dumper(@modules), 5);
# The status are:
# 3 -> AGENT_MODULE_STATUS_UNKNOW
# 4 -> AGENT_MODULE_STATUS_CRITICAL_ALERT
# 1 -> AGENT_MODULE_STATUS_CRITICAL_BAD
# 2 -> AGENT_MODULE_STATUS_WARNING
# 0 -> AGENT_MODULE_STATUS_NORMAL
my $module_status = 3;
my $modules_async = 0;
foreach my $module (@modules) {
my $m_status = get_agentmodule_status($pa_config, $dbh,
$module->{'id_agente_modulo'});
#This is the order to check
# AGENT_MODULE_STATUS_CRITICAL_ALERT
# AGENT_MODULE_STATUS_CRITICAL_BAD
# AGENT_MODULE_STATUS_WARNING
# AGENT_MODULE_STATUS_UNKNOW
# AGENT_MODULE_STATUS_NORMAL
if ($m_status == 4) {
$module_status = 4;
}
elsif ($module_status != 4) {
if ($m_status == 1) {
$module_status = 1;
}
elsif ($module_status != 1) {
if ($m_status == 2) {
$module_status = 2;
}
else {
if ($m_status == 0) {
$module_status = 0;
}
}
}
}
my $module_type = get_db_value($dbh, 'SELECT id_tipo_modulo
FROM tagente_modulo
WHERE id_agente_modulo = ?', $module->{'id_agente_modulo'});
if (($module_type >= 21 && $module_type <= 23) ||
$module_type == 100) {
$modules_async++;
}
}
my $count_modules = scalar(@modules);
# If all the modules are asynchronous or keep alive, the group cannot be unknown
if ($modules_async < $count_modules) {
my $last_contact = get_db_value($dbh,
'SELECT (UNIX_TIMESTAMP(ultimo_contacto) + (intervalo * 2)) AS last_contact
FROM tagente WHERE id_agente = ?', $agent_id);
if ($last_contact < time ()) {
return 3;
}
}
return $module_status;
}
########################################################################
## SUB get_module_agent_id (agent_module_id)
## Return agent id, given "agent_module_id"
##########################################################################
########################################################################
sub get_module_agent_id ($$) {
my ($dbh, $agent_module_id) = @_;
return get_db_value ($dbh, "SELECT id_agente FROM tagente_modulo WHERE id_agente_modulo = ?", $agent_module_id);
}
##########################################################################
########################################################################
## SUB get_agent_address (id_agente)
## Return agent address, given "agent_id"
##########################################################################
########################################################################
sub get_agent_address ($$) {
my ($dbh, $agent_id) = @_;
return get_db_value ($dbh, "SELECT direccion FROM tagente WHERE id_agente = ?", $agent_id);
}
##########################################################################
########################################################################
## SUB get_module_name(module_id)
## Return the module name, given "module_id"
##########################################################################
########################################################################
sub get_module_name ($$) {
my ($dbh, $module_id) = @_;
return get_db_value ($dbh, "SELECT nombre FROM tagente_modulo WHERE id_agente_modulo = ?", $module_id);
}
##########################################################################
########################################################################
## Return module id given the module name and agent id.
##########################################################################
########################################################################
sub get_agent_module_id ($$$) {
my ($dbh, $module_name, $agent_id) = @_;
@ -364,12 +484,12 @@ sub get_group_name ($$) {
return get_db_value ($dbh, "SELECT nombre FROM tgrupo WHERE id_grupo = ?", $group_id);
}
##########################################################################
########################################################################
## Get a single column returned by an SQL query as a hash reference.
##########################################################################
########################################################################
sub get_db_value ($$;@) {
my ($dbh, $query, @values) = @_;
my @rows;
#my @rows;
# Cache statements
my $sth = $dbh->prepare_cached($query);
@ -383,6 +503,7 @@ sub get_db_value ($$;@) {
}
$sth->finish();
return undef;
}
@ -392,7 +513,7 @@ sub get_db_value ($$;@) {
##########################################################################
sub get_db_single_row ($$;@) {
my ($dbh, $query, @values) = @_;
my @rows;
#my @rows;
# Cache statements
my $sth = $dbh->prepare_cached($query);
@ -407,6 +528,7 @@ sub get_db_single_row ($$;@) {
}
$sth->finish();
return undef;
}
@ -426,7 +548,8 @@ sub get_db_rows ($$;@) {
while (my $row = $sth->fetchrow_hashref()) {
if ($RDBMS eq 'oracle') {
push (@rows, {map { lc ($_) => $row->{$_} } keys (%{$row})});
} else {
}
else {
push (@rows, $row);
}
}
@ -576,7 +699,11 @@ sub add_new_address_agent ($$$) {
sub get_addr_id ($$) {
my ($dbh, $addr) = @_;
my $addr_id = get_db_value ($dbh, 'SELECT id_a FROM taddress WHERE ip = ?', $addr);
my $addr_id = get_db_value ($dbh,
'SELECT id_a
FROM taddress
WHERE ip = ?', $addr);
return (defined ($addr_id) ? $addr_id : -1);
}
@ -587,7 +714,11 @@ sub get_addr_id ($$) {
sub get_agent_addr_id ($$$) {
my ($dbh, $addr_id, $agent_id) = @_;
my $agent_addr_id = get_db_value ($dbh, 'SELECT id_ag FROM taddress_agent WHERE id_a = ? AND id_agent = ?', $addr_id, $agent_id);
my $agent_addr_id = get_db_value ($dbh,
'SELECT id_ag
FROM taddress_agent
WHERE id_a = ?
AND id_agent = ?', $addr_id, $agent_id);
return (defined ($agent_addr_id) ? $agent_addr_id : -1);
}
@ -608,7 +739,8 @@ sub db_do ($$;@) {
sub is_agent_address ($$$) {
my ($dbh, $id_agent, $id_addr) = @_;
my $id_ag = get_db_value ($dbh, 'SELECT id_ag FROM taddress_agent
my $id_ag = get_db_value ($dbh, 'SELECT id_ag
FROM taddress_agent
WHERE id_a = ?
AND id_agent = ?', $id_addr, $id_agent);
@ -671,8 +803,8 @@ sub db_concat ($$) {
my ($element1, $element2) = @_;
return " concat(" . $element1 . ", ' '," . $element2 . ") " if ($RDBMS eq 'mysql');
return " " . $element1 . " || ' ' || " . $element2 . " " if ($RDBMS eq 'oracle' or $RDBMS eq 'postgresql');
return " " . $element1 . " || ' ' || " . $element2 . " " if ($RDBMS eq 'oracle' or $RDBMS eq 'postgresql');
}
##########################################################################

View File

@ -1,8 +1,8 @@
package PandoraFMS::PredictionServer;
##########################################################################
########################################################################
# Pandora FMS Prediction 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
@ -36,6 +36,9 @@ use PandoraFMS::DB;
use PandoraFMS::Core;
use PandoraFMS::ProducerConsumerServer;
#For debug
#use Data::Dumper;
# Inherits from PandoraFMS::ProducerConsumerServer
our @ISA = qw(PandoraFMS::ProducerConsumerServer);
@ -45,9 +48,9 @@ my %PendingTasks :shared;
my $Sem :shared = Thread::Semaphore->new;
my $TaskSem :shared = Thread::Semaphore->new (0);
########################################################################################
########################################################################
# Prediction Server class constructor.
########################################################################################
########################################################################
sub new ($$;$) {
my ($class, $config, $dbh) = @_;
@ -57,12 +60,13 @@ sub new ($$;$) {
my $self = $class->SUPER::new($config, 5, \&PandoraFMS::PredictionServer::data_producer, \&PandoraFMS::PredictionServer::data_consumer, $dbh);
bless $self, $class;
return $self;
}
###############################################################################
########################################################################
# Run.
###############################################################################
########################################################################
sub run ($) {
my $self = shift;
my $pa_config = $self->getConfig ();
@ -72,9 +76,9 @@ sub run ($) {
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
}
###############################################################################
########################################################################
# Data producer.
###############################################################################
########################################################################
sub data_producer ($) {
my $self = shift;
my ($pa_config, $dbh) = ($self->getConfig (), $self->getDBH ());
@ -83,7 +87,8 @@ sub data_producer ($) {
my @rows;
if ($pa_config->{'pandora_master'} != 1) {
@rows = get_db_rows ($dbh, 'SELECT tagente_modulo.id_agente_modulo, tagente_modulo.flag, last_execution_try
@rows = get_db_rows ($dbh, 'SELECT tagente_modulo.id_agente_modulo,
tagente_modulo.flag, last_execution_try
FROM tagente, tagente_modulo, tagente_estado
WHERE server_name = ?
AND tagente_modulo.id_agente = tagente.id_agente
@ -95,17 +100,23 @@ sub data_producer ($) {
AND (tagente_modulo.flag = 1
OR (tagente_estado.last_execution_try + tagente_estado.current_interval) < UNIX_TIMESTAMP())
ORDER BY last_execution_try ASC ', $pa_config->{'servername'});
} else {
@rows = get_db_rows ($dbh, 'SELECT DISTINCT(tagente_modulo.id_agente_modulo), tagente_modulo.flag, last_execution_try
}
else {
@rows = get_db_rows ($dbh, 'SELECT DISTINCT(tagente_modulo.id_agente_modulo),
tagente_modulo.flag, last_execution_try
FROM tagente, tagente_modulo, tagente_estado
WHERE ((server_name = ?) OR (server_name = ANY(SELECT name FROM tserver WHERE status = 0)))
WHERE ((server_name = ?)
OR (server_name = ANY(SELECT name
FROM tserver
WHERE status = 0)))
AND tagente_modulo.id_agente = tagente.id_agente
AND tagente.disabled = 0
AND tagente_modulo.disabled = 0
AND tagente_modulo.prediction_module != 0
AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND tagente_modulo.id_modulo = 5
AND (tagente_modulo.flag = 1 OR (tagente_estado.last_execution_try + tagente_estado.current_interval) < UNIX_TIMESTAMP())
AND (tagente_modulo.flag = 1
OR (tagente_estado.last_execution_try + tagente_estado.current_interval) < UNIX_TIMESTAMP())
ORDER BY last_execution_try ASC', $pa_config->{'servername'});
}
@ -122,29 +133,32 @@ sub data_producer ($) {
return @tasks;
}
###############################################################################
########################################################################
# Data consumer.
###############################################################################
########################################################################
sub data_consumer ($$) {
my ($self, $task) = @_;
exec_prediction_module ($self->getConfig (), $task, $self->getServerID (), $self->getDBH ());
}
##########################################################################
########################################################################
# Execute prediction module.
##########################################################################
########################################################################
sub exec_prediction_module ($$$$) {
my ($pa_config, $id_am, $server_id, $dbh) = @_;
# Get a full hash for agent_module record reference ($agent_module)
my $agent_module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente_modulo = ?', $id_am);
my $agent_module = get_db_single_row ($dbh, 'SELECT *
FROM tagente_modulo
WHERE id_agente_modulo = ?', $id_am);
return unless defined $agent_module;
# Service modules
if ($agent_module->{'prediction_module'} == 2) {
logger ($pa_config, "Executing service module " . $agent_module->{'nombre'}, 10);
logger ($pa_config, "Executing service module " . $agent_module->{'nombre'}, 5);
enterprise_hook ('exec_service_module', [$pa_config, $agent_module, $server_id, $dbh]);
logger ($pa_config, "End execution", 5);
return;
}
@ -211,18 +225,31 @@ sub exec_prediction_module ($$$$) {
$temp1 = $week_utimestamp[$i] + $agent_module->{'module_interval'};
# Get data for week $i in the past
$average_interval = get_db_value ($dbh, 'SELECT AVG(datos) FROM tagente_datos WHERE id_agente_modulo = ? AND utimestamp > ? AND utimestamp < ?', $target_module->{'id_agente_modulo'}, $week_utimestamp[$i], $temp1);
$average_interval = get_db_value ($dbh, 'SELECT AVG(datos)
FROM tagente_datos
WHERE id_agente_modulo = ?
AND utimestamp > ?
AND utimestamp < ?', $target_module->{'id_agente_modulo'}, $week_utimestamp[$i], $temp1);
# Need to get data outside interval because no data.
if (!(defined($average_interval)) || ($average_interval == 0)) {
$last_data = get_db_value ($dbh, 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = ? AND utimestamp > ? LIMIT 1', $target_module->{'id_agente_modulo'}, $week_utimestamp[$i]);
$last_data = get_db_value ($dbh, 'SELECT datos
FROM tagente_datos
WHERE id_agente_modulo = ?
AND utimestamp > ?
LIMIT 1', $target_module->{'id_agente_modulo'}, $week_utimestamp[$i]);
next unless defined ($last_data);
$first_data = get_db_value ($dbh, 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = ? AND utimestamp < ? LIMIT 1', $target_module->{'id_agente_modulo'}, $temp1);
$first_data = get_db_value ($dbh, 'SELECT datos
FROM tagente_datos
WHERE id_agente_modulo = ?
AND utimestamp < ?
LIMIT 1', $target_module->{'id_agente_modulo'}, $temp1);
next unless defined ($first_data);
$sum_data++ if ($last_data != 0);
$sum_data++ if ($first_data != 0);
$week_data[$i] = ($sum_data > 0) ? (($last_data + $first_data) / $sum_data) : 0;
} else {
}
else {
$week_data[$i] = $average_interval;
}
@ -250,13 +277,17 @@ sub exec_prediction_module ($$$$) {
}
$typical_deviation = ($n > 1) ? sqrt ($typical_deviation / ($n-1)) : 0;
my $current_value = get_db_value ($dbh, 'SELECT datos FROM tagente_estado WHERE id_agente_modulo = ?', $target_module->{'id_agente_modulo'});
my $current_value = get_db_value ($dbh, 'SELECT datos
FROM tagente_estado
WHERE id_agente_modulo = ?', $target_module->{'id_agente_modulo'});
if ( ($current_value > ($average - $typical_deviation)) && ($current_value < ($average + $typical_deviation)) ){
$module_data = 1; # OK !!
} else {
}
else {
$module_data = 0; # Out of predictions
}
} else {
}
else {
# Prediction based on data
$module_data = $average;
}
@ -264,7 +295,9 @@ sub exec_prediction_module ($$$$) {
my %data = ("data" => $module_data);
pandora_process_module ($pa_config, \%data, '', $agent_module, '', $timestamp, $utimestamp, $server_id, $dbh);
my $agent_os_version = get_db_value ($dbh, 'SELECT os_version FROM tagente WHERE id_agente = ?', $agent_module->{'id_agente'});
my $agent_os_version = get_db_value ($dbh, 'SELECT os_version
FROM tagente
WHERE id_agente = ?', $agent_module->{'id_agente'});
if ($agent_os_version eq ''){
$agent_os_version = $pa_config->{'servername'}.'_Prediction';

View File

@ -1,8 +1,8 @@
package PandoraFMS::Tools;
##########################################################################
########################################################################
# Tools Package
# Pandora FMS. the Flexible Monitoring System. http://www.pandorafms.org
##########################################################################
########################################################################
# Copyright (c) 2005-2011 Artica Soluciones Tecnologicas S.L
#
# This program is free software; you can redistribute it and/or
@ -68,10 +68,10 @@ our @EXPORT = qw(
safe_output
);
##########################################################################
########################################################################
## SUB pandora_trash_ascii
# Generate random ascii strings with variable lenght
##########################################################################
########################################################################
sub pandora_trash_ascii {
my $config_depth = $_[0];
@ -84,9 +84,9 @@ sub pandora_trash_ascii {
return $output
}
##########################################################################
########################################################################
## Convert the $value encode in html entity to clear char string.
##########################################################################
########################################################################
sub safe_input($) {
my $value = shift;
@ -131,9 +131,9 @@ sub safe_input($) {
return $value;
}
##########################################################################
########################################################################
## Convert the html entities to value encode to rebuild char string.
##########################################################################
########################################################################
sub safe_output($) {
my $value = shift;
@ -213,10 +213,10 @@ sub get_html_entities {
return \%trans;
}
##########################################################################
########################################################################
# SUB ascii_to_html (string)
# Convert an ascii string to hexadecimal
##########################################################################
########################################################################
sub ascii_to_html($) {
my $ascii = shift;
@ -225,10 +225,10 @@ sub ascii_to_html($) {
}
##########################################################################
########################################################################
# SUB pandora_get_os (string)
# Detect OS using a string, and return id_os
##########################################################################
########################################################################
sub pandora_get_os ($) {
my $command = $_[0];
@ -278,15 +278,16 @@ sub pandora_get_os ($) {
else {
return 10; # Unknown / Other
}
} else {
}
else {
return 10;
}
}
##########################################################################
########################################################################
# Sub daemonize ()
# Put program in background (for daemon mode)
##########################################################################
########################################################################
sub pandora_daemonize {
my $pa_config = $_[0];
@ -300,7 +301,6 @@ sub pandora_daemonize {
# Store PID of this process in file presented by config token
if ($pa_config->{'PID'} ne "") {
if ( -e $pa_config->{'PID'} && open (FILE, $pa_config->{'PID'})) {
$pid = <FILE> + 0;
close FILE;
@ -325,14 +325,14 @@ sub pandora_daemonize {
# -------------------------------------------+
##########################################################################
########################################################################
# SUB pandora_sendmail
# Send a mail, connecting directly to MTA
# param1 - config hash
# param2 - Destination email addres
# param3 - Email subject
# param4 - Email Message body
##########################################################################
########################################################################
sub pandora_sendmail {
@ -366,13 +366,13 @@ sub pandora_sendmail {
if (sendmail %mail) {
return;
} else {
}
else {
logger ($pa_config, "[ERROR] Sending email to $to_address with subject $subject", 1);
if (defined($Mail::Sendmail::error)){
logger ($pa_config, "ERROR Code: $Mail::Sendmail::error", 5);
}
}
}
##########################################################################
@ -394,7 +394,8 @@ sub is_numeric {
my $NUMBER = qr{ ($SIGN?) ($DIGITS) }xms;
if ( $val !~ /^${NUMBER}$/ ) {
return 0; #Non-numeric
} else {
}
else {
return 1; #Numeric
}
}
@ -429,16 +430,17 @@ sub md5check {
if ($buf =~ /$buf2/ ) {
#print "MD5 Correct";
return 1;
} else {
}
else {
#print "MD5 Incorrect";
return 0;
}
}
##########################################################################
########################################################################
# SUB logger (pa_config, message, level)
# Log to file
##########################################################################
########################################################################
sub logger ($$;$) {
my ($pa_config, $message, $level) = @_;
@ -457,9 +459,9 @@ sub logger ($$;$) {
close (FILE);
}
##########################################################################
########################################################################
# limpia_cadena (string) - Purge a string for any forbidden characters (esc, etc)
##########################################################################
########################################################################
sub limpia_cadena {
my $micadena;
$micadena = $_[0];
@ -467,14 +469,15 @@ sub limpia_cadena {
$micadena =~ s/[^\-\:\;\.\,\_\s\a\*\=\(\)a-zA-Z0-9]//g;
$micadena =~ s/[\n\l\f]//g;
return $micadena;
} else {
}
else {
return "";
}
}
##########################################################################
########################################################################
# clean_blank (string) - Purge a string for any blank spaces in it
##########################################################################
########################################################################
sub clean_blank {
my $input = $_[0];
$input =~ s/\s//g;
@ -553,9 +556,9 @@ sub enterprise_hook ($$) {
return $output;
}
##########################################################################
########################################################################
# Prints a message to STDOUT at the given log level.
##########################################################################
########################################################################
sub print_message ($$$) {
my ($pa_config, $message, $log_level) = @_;
@ -581,10 +584,10 @@ sub get_tag_value ($$$) {
return $def_value;
}
###############################################################################
########################################################################
# Initialize some variables needed by the MD5 algorithm.
# See http://en.wikipedia.org/wiki/MD5#Pseudocode.
###############################################################################
########################################################################
my (@R, @K);
sub md5_init () {