diff --git a/pandora_server/ChangeLog b/pandora_server/ChangeLog index f6d7c755ea..4429a384f5 100644 --- a/pandora_server/ChangeLog +++ b/pandora_server/ChangeLog @@ -1,3 +1,8 @@ +2010-12-27 Ramon Novoa + + * util/pandora_recode_db.pl: Added back to the repository until + version 3.2 is released. + 2010-12-27 Sancho Lerena * util/pandora_sync_db.pl: Fixed a undefined condition. diff --git a/pandora_server/util/pandora_recode_db.pl b/pandora_server/util/pandora_recode_db.pl new file mode 100755 index 0000000000..ab7d6b20cd --- /dev/null +++ b/pandora_server/util/pandora_recode_db.pl @@ -0,0 +1,221 @@ +#!/usr/bin/perl + +############################################################################### +# Pandora FMS Database Synchronization Tool +############################################################################### +# Copyright (c) 2010 Artica Soluciones Tecnologicas S.L +# +# This code is not free or OpenSource. Please don't redistribute. +############################################################################### + +# Includes list +use strict; +use DBI; # DB interface with MySQL +use POSIX qw(strftime); +use POSIX; +use HTML::Entities; # Encode or decode strings with HTML entities + +# Default lib dir for RPM and DEB packages +use lib '/usr/lib/perl5'; + +use PandoraFMS::Tools; +use PandoraFMS::DB; +use PandoraFMS::Core; +use PandoraFMS::Config; + +# Recode tool version +my $version = "1.0"; + +# Pandora server configuration +my %conf; + +# Errors counters +my $errors_agents; +my $errors_modules; +my $errors_servers; +my $errors_exportservers; + +# Read databases credentials +pandora_load_credentials (\%conf); + +# Pandora database tables +my $tables_data = recode_store_tables(); +my @tables_data = @{$tables_data}; + +# FLUSH in each IO +$| = 0; + +# Connect to the DBs +my $dbh = db_connect ('mysql', $conf{'dbname'}, $conf{'dbhost'}, '3306', $conf{'dbuser'}, $conf{'dbpass'}); + +my $history_dbh = ($conf{'_history_db_enabled'} eq '1') ? db_connect ('mysql', $conf{'_history_db_name'}, + $conf{'_history_db_host'}, '3306', $conf{'_history_db_user'}, $conf{'_history_db_pass'}) : undef; + +# Main +pandora_recode_main($dbh, $dbh, $history_dbh); + +# Cleanup and exit +db_disconnect ($history_dbh) if defined ($history_dbh); +db_disconnect ($dbh); +exit; + +############################################################################### +############################################################################### +# GENERAL FUNCTIONS +############################################################################### +############################################################################### + +############################################################################## +# Init screen +############################################################################## +sub pandora_load_credentials ($) { + my $conf = shift; + + $conf->{"verbosity"}=0; # Verbose 1 by default + $conf->{"daemon"}=0; # Daemon 0 by default + $conf->{'PID'}=""; # PID file not exist by default + $conf->{"quiet"}=0; # Daemon 0 by default + + + print "\nPandora FMS Recode tool $version Copyright (c) 2010 Artica ST\n"; + print "This program is Free Software, licensed under the terms of GPL License v2\n"; + print "You can download latest versions and documentation at http://www.pandorafms.org\n\n"; + + # Load config file from command line + help_screen () if ($#ARGV < 3); + + $conf{'dbname'} = $ARGV[0]; + $conf{'dbhost'} = $ARGV[1]; + $conf{'dbuser'} = $ARGV[2]; + $conf{'dbpass'} = $ARGV[3]; + +} + +sub recode_store_tables() { + # Storing tables names + my @tables = ('tagente', 'tagente_modulo', 'tserver', 'tmodule', 'tperfil', 'tgrupo', 'tplugin', 'treport', 'tpolicies', 'talert_templates', + 'talert_actions', 'ttipo_modulo', 'tconfig_os', 'tpolicy_modules'); + + my @columns = ('nombre', 'nombre', 'name', 'name', 'name', 'nombre', 'name', 'name', 'name', 'name', + 'name', 'nombre', 'name', 'name'); + + my @data = (\@tables, \@columns); + + return \@data; +} + +########################################################################## +## Recode specific value of a table. +########################################################################## +sub recode_table ($$$) { + my ($dbh, $table, $column) = @_; + my $encoded_values = 0; + + my @tablestatus = get_db_rows ($dbh, "SHOW TABLE STATUS WHERE name = '$table'"); + + if($#tablestatus == -1) { + return 0; + } + + my @rows = get_db_rows ($dbh, "SELECT $column FROM $table"); + + foreach my $row (@rows) { + my $coded_column = safe_input(safe_output($row->{$column})); + if($row->{$column} ne $coded_column) { + $encoded_values ++; + if($encoded_values == 1) { + print "Recoding Column '$column' of Table '$table'."; + } + else { + print "."; + } + db_update ($dbh, "UPDATE $table SET `$column` = '$coded_column' WHERE `$column` = '$row->{$column}'"); + } + } + if($encoded_values > 0) { + print "\n"; + } + + return $encoded_values; +} + +############################################################################## +# Print a help screen and exit. +############################################################################## +sub help_screen{ + print "\n[ERROR] No valid arguments\n\n"; + + print "Usage: \n\n$0 \n\n"; + + exit; +} + +########################################################################## +## Convert the $value encode in html entity to clear char string. +########################################################################## +sub safe_input($) { + my $value = shift; + + $value = encode_entities ($value, "'<>&"); + + #//Replace the character '\' for the equivalent html entitie + $value =~ s/\\/\/gi; + + #// First attempt to avoid SQL Injection based on SQL comments + #// Specific for MySQL. + $value =~ s/\/\*//*/gi; + $value =~ s/\*\//*//gi; + + #//Replace ( for the html entitie + $value =~ s/\(/(/gi; + + #//Replace ( for the html entitie + $value =~ s/\)/)/gi; + + #//Replace some characteres for html entities + for (my $i=0;$i<33;$i++) { + my $pattern = chr($i); + my $hex = ascii_to_html($i); + $value =~ s/$pattern/$hex/gi; + } + + return $value; +} + +########################################################################## +# SUB ascii_to_html (string) +# Convert an ascii string to hexadecimal +########################################################################## + +sub ascii_to_html($) { + my $ascii = shift; + + return "&#x".substr(unpack("H*", pack("N", $ascii)),6,3).";"; +} + +############################################################################### +############################################################################### +# MAIN +############################################################################### +############################################################################### + +sub pandora_recode_main ($$$) { + my ($dbh_source, $dbh_dest, $history_dbh) = @_; + my $encoded_values; + + $|++; + my $success = 0; + my $percent; + my @columns; + my @types; + + print "\n[*] Recoding destination database.\n\n"; + + for(my $i = 0; $i <= $#{$tables_data[0]}; $i++) { + $encoded_values = $encoded_values + recode_table($dbh,$tables_data[0]->[$i],$tables_data[1]->[$i]); + } + + print "\n$encoded_values values recoded. \n\n"; + + exit; +}