2010-12-27 Ramon Novoa <rnovoa@artica.es>
* util/pandora_recode_db.pl: Added back to the repository until version 3.2 is released. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@3712 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
15215c921b
commit
ccf52be04e
|
@ -1,3 +1,8 @@
|
|||
2010-12-27 Ramon Novoa <rnovoa@artica.es>
|
||||
|
||||
* util/pandora_recode_db.pl: Added back to the repository until
|
||||
version 3.2 is released.
|
||||
|
||||
2010-12-27 Sancho Lerena <slerena@artica.es>
|
||||
|
||||
* util/pandora_sync_db.pl: Fixed a undefined condition.
|
||||
|
|
|
@ -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 <dbname> <dbhost> <dbuser> <dbpass> \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;
|
||||
}
|
Loading…
Reference in New Issue