package PerlSvc; $Name = 'Flexcopy'; $DisplayName = 'Cluster Archive Service by ZeroQuo'; sub Startup { my(%param) = &main::init(); &main::Event_Log("Inicio de Ciclo"); while(ContinueRun()) { &main::Flex_Svc(%param); sleep($param{wait}); } &main::Event_Log("Fin de Ciclo"); } sub Install { print "\nService are Installed\n"; } sub Remove { print "\nService are Removed\n"; } sub Help { print "\nPlease consult with System Programer\n\n"; print "Martin Battiston\n"; print "Oscar Alarcon Rodriguez\n"; } package main; use File::Copy; use File::Basename; use Net::SMTP; use Net::Domain qw(hostname hostfqdn hostdomain); use Time::localtime; use Win32::EventLog; use Win32::EventLog::Message; my $src = ""; my $prd = ""; my $bkp = ""; my $ndw = ""; sub Flex_Svc { &main::Debuging("Inicio de Ciclo") if (uc($param{debug}) eq "Y"); my(%param) = (@_); if(uc($param{readpar}) eq "Y"){ (%param)=&main::init(); &main::Debuging("Lectura forzada de Parametros") if(uc($param{debug}) eq "Y"); &main::proces(%param); }else{ &main::proces(%param); } } sub init { open(CFG, "< c:\\flexcopy\\flexcopy.ini") || &main::Event_Log("Error en acceso a archivo de configuración"); while(){ chomp($_); if(!($_ =~ /\[/)){ if(!($_ =~ /\#/)){ my($key, $content)=split(/=/, $_); if($key){ $param{$key}=$content; } } } } close(CFG); if (!$param{error_class}){ if (!$param{mailhost}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{admin_mail}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } }else{ if (lc($param{error_class}) eq "default"){ if (!$param{mailhost}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{admin_mail}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } }elsif(lc($param{error_class}) eq "tivoli"){ if (!$param{tivoli_host}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{tivoli_aplicacion}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{tivoli_instancia}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{tivoli_clase}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } if (!$param{tivoli_source}){ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } }else{ &main::Event_Log("Error en archivo de parametros"); print "Error in CFG file\nPlease consult MANIFEST.TXT\n"; exit; } } if(!$param{readpar}){ $param{readpar} = "Y"; } if(!$param{debug}){ $param{debug} = "N"; } $param{hostname}=hostname(); &main::logging(%param); return(%param); } sub logging { my(%param) = (@_); &main::Debuging("Generacion de Log") if (uc($param{debug}) eq "Y"); 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 "".ctime()."\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 { my(%param) = (@_); &main::Debuging("Inicio de rutina Proceso") if (uc($param{debug}) eq "Y"); open(LOG, ">> $param{log_name}"); my $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}) || &main::Event_Log("Error en acceso a Cola NDW") | exit; &main::Debuging("Lectura de Cola de NDW ".$param{$ndw}) if (uc($param{debug}) eq "Y"); foreach (readdir(DIR)){ chomp($_); if($_){ if($_ eq "."){ }elsif($_ eq ".."){ }else{ &main::Debuging("Llamada a rutina replica con parametro ".$_) if (uc($param{debug}) eq "Y"); &main::replica($_); } } } closedir DIR; opendir(DIR, $param{$src}) || &main::Event_Log("Error en acceso a Cola SRC") | exit; &main::Debuging("Lectura de Cola de SRC ".$param{$src}) if (uc($param{debug}) eq "Y"); foreach (readdir(DIR)){ chomp($_); if($_){ if($_ eq "."){ }elsif($_ eq ".."){ }else{ &main::Debuging("Llamada a rutina master con parametro ".$_) if (uc($param{debug}) eq "Y"); &main::master($_); } } } closedir DIR; $tail = $tail + 1; } close(LOG); return(); } sub master { my ($file) = (@_); &main::Debuging("Inicio de rutina master con parametro ".$file) if (uc($param{debug}) eq "Y"); my $control_fx = 0; my $origen = $param{$src}; my $destino = $param{$prd}; my $accion = "COPY"; my ($fecha) = &main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); my $source = $param{$src}."\\".$file; &main::Debuging("Generacion de parametro Source ".$source) if (uc($param{debug}) eq "Y"); if (-e $param{$prd}){ &main::Debuging("Copiando ".$source." a ".$param{$prd}) if (uc($param{debug}) eq "Y"); copy($source,$param{$prd}) or $control_fx=1; } my $contador = 0; while ($control_fx eq 1){ $control_fx = 0; &main::Error_msg("1"); $wait_error = ($param{wait}/2); sleep($wait_error); &main::Debuging("Copiando ".$source." a ".$param{$prd}) if (uc($param{debug}) eq "Y"); copy($source,$param{$prd}) or $control_fx=1; $contador = ++$contador; if ($contador eq 11){ return(); } } $origen = $param{$src}; $destino = $param{$bkp}; $accion = "COPY"; ($fecha)=&main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); if (-e $param{$bkp}){ $control_fx = 0; &main::Debuging("Copiando ".$source." a ".$param{$bkp}) if (uc($param{debug}) eq "Y"); copy($source,$param{$bkp}) or $control_fx=1; } if ($control_fx eq 0){ $origen = $param{$src}; $destino = ""; $accion = "REMOVE"; ($fecha)=&main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); &main::Debuging("Borrando ".$source) if (uc($param{debug}) eq "Y"); unlink($source); }else{ &main::Error_msg("2"); $origen = $param{$src}; $destino = $param{$nwd}; $accion = "COPY"; ($fecha)=&main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); &main::Debuging("Moviendo ".$source." a ".$param{$ndw}) if (uc($param{debug}) eq "Y"); move($source,$param{$ndw}); } return(); } sub replica { my ($file)=(@_); &main::Debuging("Inicio de rutina replica con parametros ".$file) if (uc($param{debug}) eq "Y"); my $source = $param{$ndw}."\\".$file; &main::Debuging("Generacion de parametro Source ".$source) if (uc($param{debug}) eq "Y"); my $origen = $param{$nwd}; my $destino = $param{$bkp}; my $accion = "COPY"; my($fecha) = &main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); my $control_fx = 0; if (-e $param{$bkp}){ &main::Debuging("Copiando ".$source." a ".$param{$bkp}) if (uc($param{debug}) eq "Y"); copy($source,$param{$bkp}) or $control_fx=1; } if ($control_fx eq 0){ $origen = $param{$src}; $destino = ""; $accion = "REMOVE"; ($fecha)=&main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); &main::Debuging("Borrando ".$source) if (uc($param{debug}) eq "Y"); unlink($source); }else{ &main::Error_msg("3"); $origen = $param{$src}; $destino = $param{$ndw}; $accion = "MOVE"; ($fecha)=&main::fecha_log(); write(LOG) if(uc($param{log}) eq "Y"); &main::Debuging("Moviendo ".$source." a ".$param{$ndw}) if (uc($param{debug}) eq "Y"); move($source,$param{$ndw}); } return(); } sub fecha_log { my ($wday, $hour, $min, $sec, $year,$mon, $mday)=(localtime->wday, localtime->hour, localtime->min, localtime->sec, localtime->year+1900,localtime->mon+1,localtime->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 { my $message = ""; my $status = ""; if (!$param{ermsg_host}){ $param{ermsg_host} = "localhost"; }else{ $param{ermsg_host} = lc($param{ermsg_host}); } if (!$param{error_class}){ $param{error_class} = "default"; }else{ $param{error_class} = lc($param{error_class}); } if (!$param{ermsg_warning1}){ $param{ermsg_warning1} = "Warning in Copy to BKP"; }else{ $param{ermsg_warning1} = lc($param{ermsg_warning1}); } if (!$param{ermsg_warning2}){ $param{ermsg_warning2} = "Warning in Copy to BKP over"; }else{ $param{ermsg_warning2} = lc($param{ermsg_warning2}); } if (!$param{ermsg_critical}){ $param{ermsg_critical} = "Critical in Copy to PRD"; }else{ $param{ermsg_critical} = lc($param{ermsg_critical}); } if ($_[0] eq 1){ $message = $param{ermsg_critical}; $status = "CRITICAL"; }elsif($_[0] eq 2){ $message = $param{ermsg_warning2}; $status = "HARMLESS"; }elsif($_[0] eq 3){ $message = $param{ermsg_warning1}; $status = "HARMLESS"; } if ($param{error_class} eq "default"){ &main::Event_Log("Envio de mail a Administrador"); my $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 ($param{error_class} eq "tivoli"){ &main::Event_Log("Envio de mensaje a Tivoli"); my $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(); } sub Event_Log { &main::Debuging("Generacion de Evento en EventLog ".$_[0]) if (uc($param{debug}) eq "Y"); my $PerlSource = "Flexcopy Agent"; my $SourceLog = "Application"; Win32::EventLog::Message::RegisterSource( $SourceLog, $PerlSource ); my $Event = Win32::EventLog->new( $SourceLog ) || die; my $Result = $Event->Report( { "Computer" => $ENV{computername}, "Source" => $PerlSource, "EventType" => 'EVENTLOG_SUCCESS_TYPE', "EventID" => 'EVENT_ID', "Strings" => $_[0], } ); return(); } sub Debuging { my ($message) = (@_); open(DBG, ">> c:\\flexcopy\\flexsvc.dbg"); print DBG "$message\n"; close(DBG); return(); } format LOG = @<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $file,$fecha,$accion,$origen,$destino,$param{hostname} .