#!/usr/bin/perl
################################################################################
# Pandora DB Stress tool
################################################################################
# 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 POSIX qw(strftime);

# Configure here target (AGENT_ID for Stress)

my $target_module = -1; # -1 for all modules of that agent
my $target_agent = -1;
my $target_interval = 300;
my $target_days = 30;

################################################################################
################################################################################

# Includes list
use strict;
use DBI;			# DB interface with MySQL
use Math::Trig;			# Math functions

# Default lib dir for RPM and DEB packages
use lib '/usr/lib/perl5';

# Pandora Modules
use PandoraFMS::Config;
use PandoraFMS::Tools;
use PandoraFMS::DB;
use PandoraFMS::Core;

################################################################################
################################################################################

my $version = "3.0 PS091214";

# FLUSH in each IO (only for debug, very slooow)
# ENABLED in DEBUGMODE
# DISABLE FOR PRODUCTION
$| = 0;

my %pa_config;

# Inicio del bucle principal de programa
pandora_init(\%pa_config,"Pandora DB Stress tool");

# Read config file for Global variables
pandora_load_config (\%pa_config,0); #Start like a data server

# open database, only ONCE. We pass reference to DBI handler ($dbh) to all subprocess
my $dbh = DBI->connect("DBI:mysql:$pa_config{'dbname'}:$pa_config{'dbhost'}:3306",$pa_config{'dbuser'}, $pa_config{'dbpass'},	{ RaiseError => 1, AutoCommit => 1 });

print " [*] Working for agent ID $target_agent \n";
print " [*] Generating data of $target_days days ago \n";
print " [*] Interval for this workload is $target_interval \n";

# For each module of $target_agent_id
my $query_idag;

if ($target_agent ne -1){
	if ($target_module ne -1){
		$query_idag = "select * from tagente_modulo where id_agente = $target_agent AND id_agente_modulo = $target_module";
	} else {
		$query_idag = "select * from tagente_modulo where id_agente = $target_agent";
	}
} else {
	$query_idag = "select * from tagente_modulo";
}

my $s_idag = $dbh->prepare($query_idag);
$s_idag ->execute;
if ($s_idag->rows != 0) {
	while (my $module = $s_idag->fetchrow_hashref()) {
		# Fill this module with data !
		process_module (\%pa_config, $module, $target_interval, $target_days, $dbh);
	}
}
$s_idag->finish();
$dbh->disconnect();
print " [*] All work done\n\n";
# END of main proc


##############################################################################
# SUB process_module ()
# Create a full range set of Pseudo random data for id_agente_modulo passed
# as second parameter. Depends on module_name to generate a random value
# (random) or periodic curve (cuve) values.
##############################################################################

sub process_module($$$$$){
	my ($pa_config, $module, $target_interval, $target_days, $dbh) = @_;

	my $id_agentemodulo = $module->{'id_agente_modulo'};
	my $target_name = $module->{'nombre'};
	my $target_agent = $module->{'id_agente'};

	my $factor;

	my $valor = 0; # value storage for data generation
	my $a; # loopcounter
	my $b; # counter
	print " [*] Processing module $target_name \n";
	my $agent_name = get_agent_name ($dbh, $target_agent);
	my $err; # not used
	# Init start time to now - target_days 
	my $utimestamp = time () - (86400 * $target_days);
	my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));

	# Calculate how many iterations need to fill data range
	# $target_days*min*sec / $target_interval 

	my $iterations = ($target_days * 24 * 60 * 60) / $target_interval;

	print " [D] ID_AgenteMoludo $id_agentemodulo Interval $target_interval ModuleName $target_name Days $target_days Agent $target_agent \n";

	open (LOG,">> pandora_dbstress.log");
	# Generate MATH/Curve data for beautiful Drawings
	if ( $target_name =~ /curve/i ){
		# COS function to draw curves in a regular way
		$b = 0;
		$factor=rand(20);
		for ($a=1;$a<$iterations;$a++){
			$valor = 1 + cos(deg2rad($b));
			$b = $b + $factor/10;
			if ($b > 180){
				$b =0;
			}
			$utimestamp += $target_interval;
			my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
			$valor = $valor * $b * 10;
			$valor = sprintf("%.2f", $valor);
			$valor =~ s/\,/\./g;
			if (($a % 20) == 0) {
				print "\r -> ".int($a / ($iterations / 100))."% generated for ($target_name)				";
			}
			pandora_update_agent($pa_config, $timestamp, $target_agent, "none","1.2", $target_interval, $dbh);
			# print LOG $mysql_date, $target_name, $valor, "\n";
			pandora_process_module ($pa_config, $valor, '', $module, '', '', $utimestamp, $dbh);
			#pandora_writedata($pa_config,$mysql_date,$agent_name,$target_type,$target_name,$valor,0,0,"",$dbh,\$bUpdateDatos);			
			#pandora_writestate ($pa_config,$agent_name,$target_type,$target_name,$valor,100,$dbh,$bUpdateDatos);
			}
	}

	# Generate pseudo-random data for changing drawings
	if ( $target_name =~ /random/i ){
		# Random values over line a static line
		for ($a=1;$a<$iterations;$a++){
			$valor = rand(15) + rand(15) + rand(15) + rand(15) + rand(15) + rand(15);
			$valor = sprintf("%.2f", $valor);
			$valor =~ s/\,/\./g; 
			$utimestamp += $target_interval;
			my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
			if ($a % 20 == 0) {
				print "\r -> ".int($a / ($iterations / 100))."% generated for ($target_name)				";
			}
			pandora_update_agent($pa_config, $timestamp, $target_agent, "none","1.2", $target_interval, $dbh);
			#print LOG $mysql_date, $target_name, $valor, "\n";
			pandora_process_module ($pa_config, $valor, '', $module, '', '', $utimestamp, $dbh);
			#pandora_writedata($pa_config,$mysql_date,$agent_name,$target_type,$target_name,$valor,0,0,"",$dbh,\$bUpdateDatos);			
			#pandora_writestate ($pa_config,$agent_name,$target_type,$target_name,$valor,100,$dbh,$bUpdateDatos);
		}

	}

	# Generate pseudo-random data for boolean data
	if ( $target_name =~ /boolean/i ){
		for ($a=1;$a<$iterations;$a++){
			$valor = rand(50);
			if ($valor > 2){ 
				$valor = 1;
			} else {
				$valor = 0;
			}
			$utimestamp += $target_interval;
			my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
			if ($a % 20 eq 0) {
				print "\r -> ".int($a / ($iterations / 100))."% generated for ($target_name)				";
			}
			pandora_update_agent($pa_config, $timestamp, $target_agent, "none","1.2", $target_interval, $dbh);
			#print LOG $mysql_date, $target_name, $valor, "\n";
			pandora_process_module ($pa_config, $valor, '', $module, '', '', $utimestamp, $dbh);
			#pandora_writedata($pa_config,$mysql_date,$agent_name,$target_type,$target_name,$valor,0,0,"",$dbh,\$bUpdateDatos);
			#pandora_writestate ($pa_config,$agent_name,$target_type,$target_name,$valor,$valor,$dbh,$bUpdateDatos);
		}

	}
	
	# Generate pseudo-random data for boolean data
	if ( $target_name =~ /text/i ){
		for ($a=1;$a<$iterations;$a++){
			$valor = pandora_trash_ascii (rand(100)+50);
			$utimestamp += $target_interval;
			my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
			if ($a % 20 eq 0) {
				print "\r -> ".int($a / ($iterations / 100))."% generated for ($target_name)				";
			}
			pandora_update_agent($pa_config, $timestamp, $target_agent, "none","1.2", $target_interval, $dbh);
			#print LOG $mysql_date, $target_name, $valor, "\n";
			pandora_process_module ($pa_config, $valor, '', $module, '', '', $utimestamp, $dbh);
			#pandora_writedata($pa_config,$mysql_date,$agent_name,$target_type,$target_name,$valor,0,0,"",$dbh,\$bUpdateDatos);
			#pandora_writestate ($pa_config,$agent_name,$target_type,$target_name,$valor,100,$dbh,$bUpdateDatos);
		}
	}

	close (LOG);
	print "\n";
}