Category: Win32 Cluster
Author/Contact Info Oscar Alarcon R Buenos Aires - Argentina
Description: Its simple process for duplicate at incoming recipient with minimal standard security method for replica, like refiled recipient. enjoy!
use File::Basename;

(%param)=&init();
while(true) {
    &proces(%param);
    sleep($param{wait});
}

sub init {
              open(CFG, "< flexcopy.ini") or die "Can't find config fi
+le => $!\n";
              while(<CFG>){
                          $linea = $_;
                          chomp($linea);
                          if($linea =~ /\[/){
                          }else{
                               if($linea =~ /\#/){
                               }else{
                                   ($key, $content)=split(/=/, $linea)
+;
                                   if($key){
                                       $param{$key}=$content;
                                   }
                               }
                          }
                }
                close(CFG);
        if (!$param{error_class}){
            if (!$param{mailhost}){
                print "Error in CFG file\nPlease consult MANIFEST.TXT\
+n";
                exit;
            }
            if (!$param{admin_mail}){
                print "Error in CFG file\nPlease consult MANIFEST.TXT\
+n";
                exit;
            }
        }else{
            if (lc($param{error_class}) eq "default"){
                if (!$param{mailhost}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
                if (!$param{admin_mail}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
            }elsif(lc($param{error_class}) eq "tivoli"){
                if (!$param{tivoli_host}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
                if (!$param{tivoli_aplicacion}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
                if (!$param{tivoli_instancia}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
                if (!$param{tivoli_clase}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
                if (!$param{tivoli_source}){
                    print "Error in CFG file\nPlease consult MANIFEST.
+TXT\n";
                    exit;
                }
            }else{
                print "Error in CFG file\nPlease consult MANIFEST.TXT\
+n";
                exit;
            }
        }
        use Net::Domain qw(hostname hostfqdn hostdomain);
        $param{hostname}=hostname();
        &logging(%param);
        return(%param);
}
sub logging {
        (%param)=@_;
        use Time::localtime;
            $now = ctime();
            chop($now);
            if(uc($param{log}) eq "Y"){
                           open(LOG, ">$param{log_name}");
                           print LOG "Cluster Archive Service 1.0\n";
                           print LOG "Realizado por Arquitectura Tecno
+logica - Banco Rio.\n";
                           print LOG "--------------------------------
+-------------------\n\n";
                           print LOG "$now\n";
                           print LOG "for $param{tailn} tails\n";
                           print LOG "Wait Time       = $param{wait} s
+eg.\n\n";
                           print LOG "Logging...\n";
            print LOG "-----------------------------------------------
+---------------------------------------------------------------------
+------------------------------------------------------------------\n"
+;
            print LOG "Archive:                 Fecha:                
+          Accion:                         Origen:                    
+     Destino:                        Hostname:\n";
            print LOG "-----------------------------------------------
+---------------------------------------------------------------------
+------------------------------------------------------------------\n"
+;
                           close(LOG);
                }
        return();
}
sub proces {
        (%param)=@_;
                   open(LOG, ">>$param{log_name}");
                   $tail = 1;
                   while ($tail < ($param{tailn}+1)){
                       $src = "src_tail_".$tail;
                       $prd = "prd_tail_".$tail;
                       $bkp = "bkp_tail_".$tail;
            $ndw = "ndw_tail_".$tail;
            opendir(DIR, $param{$ndw}) || die "Can't open $param{$ndw}
+ => $!\n";
            @listing2 = readdir(DIR);
            closedir DIR;
                       foreach $file (@listing2){
                           chomp($file);
                           if($file){
                    if($file eq "."){
                    }elsif($file eq ".."){
                    }else{
                        &replica($file);
                    }
                           }
                       }
            opendir(DIR, $param{$src}) || die "Can't open $param{$src}
+ => $!\n";
            @listing = readdir(DIR);
            closedir DIR;
                       foreach $file (@listing){
                           chomp($file);
                           if($file){
                    if($file eq "."){
                    }elsif($file eq ".."){
                    }else{
                        &master($file);
                    }
                           }
                       }
                       $tail = $tail + 1;
                   }
        close(LOG);
        return();
}
sub master {
        ($file)=@_;
        use File::Copy;
        $control_fx = 0;
        $origen  = $param{$src};
        $destino = $param{$prd};
        $accion  = "COPY";
        ($fecha)=&fecha_log();
        write(LOG) if(uc($param{log}) eq "Y");
        $source = $param{$src}."\\".$file;
        if (-e $param{$prd}){
            copy($source,$param{$prd}) or $control_fx=1;
        }
        $contador = 0;
        while ($control_fx eq 1){
            $control_fx = 0;
            &Error_msg("1");
            $wait_error = ($param{wait}/2);
            sleep($wait_error);
            copy($source,$param{$prd}) or $control_fx=1;
            $contador = ++$contador;
            if ($contador eq 11){
                return();
            }
        }
        $origen  = $param{$src};
        $destino = $param{$bkp};
        $accion  = "COPY";
        ($fecha)=&fecha_log();
            write(LOG) if(uc($param{log}) eq "Y");
        if (-e $param{$bkp}){
            $control_fx = 0;
            copy($source,$param{$bkp}) or $control_fx=1;
        }
        if ($control_fx eq 0){
            $origen  = $param{$src};
            $destino = "";
            $accion  = "REMOVE";
            ($fecha)=&fecha_log();
            write(LOG) if(uc($param{log}) eq "Y");
            unlink($source);
        }else{
            &Error_msg("2");
            $origen  = $param{$src};
            $destino = $param{$nwd};
            $accion  = "COPY";
            ($fecha)=&fecha_log();
                write(LOG) if(uc($param{log}) eq "Y");
            move($source,$param{$ndw});
        }
        return();
}
sub replica {
        ($file)=@_;
        use File::Copy;
        $source = $param{$ndw}."\\".$file;
        $origen  = $param{$nwd};
        $destino = $param{$bkp};
        $accion  = "COPY";
        ($fecha)=&fecha_log();
            write(LOG) if(uc($param{log}) eq "Y");
        $control_fx = 0;
        if (-e $param{$bkp}){
            copy($source,$param{$bkp}) or $control_fx=1;
        }
        if ($control_fx eq 0){
            $origen  = $param{$src};
            $destino = "";
            $accion  = "REMOVE";
            ($fecha)=&fecha_log();
            write(LOG) if(uc($param{log}) eq "Y");
            unlink($source);
        }else{
            &Error_msg("3");
            $origen  = $param{$src};
            $destino = $param{$ndw};
            $accion  = "MOVE";
            ($fecha)=&fecha_log();
                write(LOG) if(uc($param{log}) eq "Y");
            move($source,$param{$ndw});
        }
        return();
}
sub fecha_log {
    use Time::localtime;
    $T=localtime;
    my ($wday, $hour, $min, $sec, $year,$mon, $mday)=($T->wday, $T->ho
+ur, $T->min, $T->sec, $T->year+1900,$T->mon+1,$T->mday);
    my $out = sprintf "%02.0f\/%02.0f\/%0004.0f %02.0f\:%02.0f\:%02.0f
+",$mday,$mon,$year,$hour,$min,$sec;
    return($out);
}
sub Error_msg {
    ($error_code)=@_;
    $error_class = $param{error_class};
    if (!$param{ermsg_host}){
        $ermsg_host = "localhost";
    }else{
        $ermsg_host = lc($param{ermsg_host});
    }
    if (!$param{error_class}){
        $error_class = "default";
    }else{
        $error_class = lc($param{error_class});
    }
    if (!$param{ermsg_warning1}){
        $error_msg2 = "Warning in Copy to BKP";
    }else{
        $error_msg2 = lc($param{ermsg_warning1});
    }
    if (!$param{ermsg_warning2}){
        $error_msg3 = "Warning in Copy to BKP over";
    }else{
        $error_msg3 = lc($param{ermsg_warning2});
    }
    if (!$param{ermsg_critical}){
        $error_msg1 = "Critical in Copy to PRD";
    }else{
        $error_msg1 = lc($param{ermsg_critical});
    }
    if ($error_code eq 1){
        $message = $error_msg1;
        $status = "CRITICAL";
    }elsif($error_code eq 2){
        $message = $error_msg2;
        $status = "HARMLESS";
    }elsif($error_code eq 3){
        $message = $error_msg3;
        $status = "HARMLESS";
    }
    if ($error_class eq "default"){
        use Net::SMTP;
        $smtp = Net::SMTP->new($param{mailhost});
        $smtp->mail("Flexcopy");
        $smtp->to($param{admin_mail});
        $smtp->data();
        $smtp->datasend("To: $param{admin_mail}\n");
        $smtp->datasend("\n");
        $smtp->datasend($message."\n");
        $smtp->dataend();
        $smtp->quit;
    }elsif ($error_class eq "tivoli"){
        $tivmsg = "postemsg -S $param{tivoli_host} -r $status -m \"".$
+message."\" hostname=$param{hostname} aplicacion=$param{tivoli_aplica
+cion} instancia=$param{tivoli_instancia} $param{tivoli_clase} $param{
+tivoli_source}";
        system($tivmsg);
    }
    return();
}

format LOG =
@<<<<<<<<<<<<<<<<<<<<<   ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ^<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<   ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ^<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<   ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$file,$fecha,$accion,$origen,$destino,$param{hostname}
.