use File::Basename; (%param)=&init(); while(true) { &proces(%param); sleep($param{wait}); } sub init { open(CFG, "< flexcopy.ini") or die "Can't find config file => $!\n"; while(){ $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 Tecnologica - Banco Rio.\n"; print LOG "---------------------------------------------------\n\n"; print LOG "$now\n"; print LOG "for $param{tailn} tails\n"; print LOG "Wait Time = $param{wait} seg.\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->hour, $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_aplicacion} instancia=$param{tivoli_instancia} $param{tivoli_clase} $param{tivoli_source}"; system($tivmsg); } return(); } format LOG = @<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $file,$fecha,$accion,$origen,$destino,$param{hostname} .