#!/usr/bin/perl use Sys::Syslog; # # Written by Andrii Grytsenko 2009 # #Global variables section #1 my $config_file=shift; my %conf = (); my $active_node=0; my $ping_cnt=0; sub sys_msg { my $syslog_level=shift; my $message=shift; syslog($syslog_level,$message); } sub make_sync { my $sync_time=shift; my $debug=shift; $sync_time =~ m/(\d+)(\S+)/; my $time_amount=$1; my $time_measure=$2; my $time_value=0; sys_msg("info|$conf{log_facility}","Time amount=$time_amount, Time measure = $time_measure\n") if $debug; if ($time_measure eq "min") { $time_value=`date +%M`; } elsif ($time_measure eq "d") { $time_value=`date +%d`; } elsif ($time_measure eq "h") { $time_value=`date +%H`; } elsif ($time_measure eq "mon") { $time_value=`date +%m`; } else { sys_msg("info|$conf{log_facility}","Error the time measure is not valid\n"); } chomp($time_value); sys_msg("info|$conf{log_facility}","Current time is $time_value\n"); if ($time_value%$time_amount == 0 ) { sys_msg("info|$conf{log_facility}","Try to get actual content from active node\n") if $debug; system("/usr/bin/rsync -e ssh -aq rsync\@$conf{another_node_addr}:/var/www/html /var/www/"); } } sub read_config { my $conf_file=shift; open(CONF,"<$conf_file"); while() { chomp; if ( $_ =~ /^([^#].*)=(.*)/ ){ $conf{$1}=$2; } } close(CONF); } sub check_vars { my @vars=("another_node_addr", "virtual_addr", "max_sleep_time", "max_ping_cnt", "log_facility", "sync_time", "debug"); foreach my $i (@vars) { if (!defined($conf{$i})){ print "ERROR: variable \"$i\" is not defines at configuration file\n"; sys_msg("info|$conf{log_facility}", "ERROR: variable \"$i\" is not defines at configuration file\n"); exit -1; } } } read_config("$config_file"); check_vars(); # Global variable section #2 my $sleep_time=int(rand($conf{max_sleep_time})); my $mx_ping_cnt=int(rand($conf{max_ping_cnt})); my $debug=$conf{debug}; sys_msg("info|$conf{log_facility}", "max ping = $mx_ping_cnt\t sleep = $sleep_time\n") if $debug; my $cur_addr=`/sbin/ifconfig eth0:1 | grep "addr:" | awk '{print \$2}' | awk -F: '{print \$2}'`; chomp($cur_addr); sys_msg("info|$conf{log_facility}","Current address of virtual ip is $cur_addr\n") if $debug; if ( "$cur_addr" eq "$conf{virtual_addr}" ){ $active_node=1; sys_msg("info|$conf{log_facility}","set as active node\n") if $debug; } else { my $ping_virt=system("/bin/ping -c1 $conf{virtual_addr} &>/dev/null"); chomp($ping_virt); sys_msg("info|$conf{log_facility}","ping=$ping_virt\n") if $debug; while ( $ping_virt != 0 and $ping_cnt <= $mx_ping_cnt ){ $ping_virt=system("/bin/ping -c1 $conf{virtual_addr} &>/dev/null"); chomp($ping_virt); next if ( $ping_virt == 0) ; sys_msg("info|$conf{log_facility}", "ping status is $ping_virt\n"); sys_msg("info|$conf{log_facility}","Virtual ip $conf{virtual_addr} is free. Sleep $sleep_time seconds; Ping count is $ping_cnt\n") if $debug; sleep $sleep_time; my $ping_node=system("/bin/ping -c1 $conf{another_node_addr} &>/dev/null"); chomp($ping_node); if ($ping_node != 0 or $ping_cnt == $mx_ping_cnt ){ system("/sbin/ifconfig eth0:1 $conf{virtual_addr}"); $active_node=1; } $ping_cnt++; } } if ($active_node == 1) { sys_msg("info|$conf{log_facility}","this node is active\n") if $debug; } else { sys_msg("info|$conf{log_facility}","this node is passive\n"); make_sync("$conf{sync_time}", "$conf{debug}"); }