File: [local] / wpscripts / ztransfer / send.pm (download)
Revision 1.3, Fri Jul 1 12:44:28 2011 UTC (13 years, 2 months ago) by yason
Branch: MAIN
Changes since 1.2: +4 -201 lines
change paths, remove unused subs
|
#!/usr/bin/perl
# $Id: send.pm,v 1.3 2011/07/01 12:44:28 yason Exp $
package send;
use fetch;
use db;
use log;
use fileops;
use warnings;
# spool path constants (without leading slash)
our $SPOOL_ZAYAVKI = "/mnt/archive/archive/wp/zayavki";
our $SPOOL_PROBAS = "/mnt/archive/archive/wp/proba";
our $SPOOL_TMPDIR = "/mnt/archive/archive/temp";
# temp variables for map table lookup
our $ret;
our $tmpd;
our $tmpf;
sub zayavki()
{
my @dbids;
my @localpaths;
my @remotepaths;
my $dbids_ref;
my $localpaths_ref;
my $i = 0;
my $okay = 0;
my $curfile;
my $size_orig;
my $size_arc;
my $spool;
my $delete;
($dbids_ref, $localpaths_ref) = fetch::zayavki_list();
@dbids = @$dbids_ref;
@localpaths = @$localpaths_ref;
log::main("Fetched " . scalar(@localpaths) . " zayavki from database");
log::zayavki("<< Starting transfer process >>");
@remotepaths = @localpaths; # clone
while($localpaths[$i])
{
# check if there is a void element
# ???
next if(!$localpaths[$i]);
#
#
# fill $spool with right spool directory
if( db::get_tx_count($dbids[$i]) > 0 )
{
# retransmission
# set $spool to temporary directory to make backup collector happy :)
# in this case also let $delete = 1 (removing garbage after copy, as in old times)
# considering okay to not to check /usr/backup for availability
$spool = $SPOOL_TMPDIR;
$delete = 1;
}
else
{
# this is the first time copy
# set $spool to backup spool directory
# and not to delete archive
$spool = $SPOOL_ZAYAVKI;
$delete = 0;
}
# lookup in table first
chomp( $tmpf = `basename $remotepaths[$i]` );
chomp( $_ = `dirname $remotepaths[$i]` );
$tmpd = hash::lookup($_);
print "\$remotepaths[\$i] is $remotepaths[$i] \$_ is $_ \$tmpd is $tmpd\n";
if ( $tmpd ne '' )
{
$remotepaths[$i] = $tmpd. "/". $tmpf;
}
else
{
# hardcoded
$remotepaths[$i] =~ s/\/mnt\/maket/\/mnt\/rmt_maket/;
}
if(-e $remotepaths[$i] || -e $remotepaths[$i] . '.rar')
{
log::error("Remote file $remotepaths[$i] or $remotepaths[$i].rar already exists");
db::change_status($dbids[$i], 1);
}
else
{
# In this place we must be sure that local file is ok
if( -e $localpaths[$i] )
{
# set $size_orig
$size_orig = -s "$localpaths[$i]";
# rar and copy local file
fileops::checkdir($remotepaths[$i]);
chomp($curfile = `basename $localpaths[$i]`) , $curfile .= '.rar';
# two functions in log.pm makes newer versions of zlist happy
log::file_work_on($curfile, "rar");
log::zayavki("compressing '$localpaths[$i]' -> '$spool/$curfile'");
`/usr/local/bin/rar a -rr10% -ep '$spool/$curfile' '$localpaths[$i]'`;
if( ($? >> 8) == 0)
{
# rar exited successfully
# set $size_arc
$size_arc = -s "$spool/$curfile";
# it can be possible that file already uploaded by hand while rar copressed one
# so we should check for existence of archive in remote before send it
if( -e $remotepaths[$i] || -e $remotepaths[$i] . '.rar')
{
log::error("Can not save $remotepaths[$i].rar cause of file has appeared after compressing");
log::zayavki("Can not save $remotepaths[$i].rar cause of file has appeared after compressing");
# file was uploaded by hand, let us change its status in db
db::change_status($dbids[$i], 1);
# log::file_work_done();
}
else
{
# copy archive and then delete it from /usr/backup/spool
log::zayavki("transferring $spool/$curfile -> $remotepaths[$i].rar");
log::file_work_on($curfile, "copy");
if( system("cp '$spool/$curfile' $remotepaths[$i].rar") == 0 )
{
# OKAY
log::zayavki("saved $localpaths[$i] -> $remotepaths[$i].rar [size_orig=$size_orig, size_arc=$size_arc]");
log::file_work_done();
log::diff($localpaths[$i], $size_orig, $size_arc);
# update database
db::change_status($dbids[$i], 1);
db::write_size_orig($dbids[$i], $size_orig);
db::write_size_arc($dbids[$i], $size_arc);
# write ux_rpaths
db::write_ux_rpath($dbids[$i], "$remotepaths[$i].rar");
# increment tx_count
db::increment_tx_count($dbids[$i]);
$okay++;
}
else
{
# error in the copy process
log::zayavki("error in copy process (see error log)");
log::error("error in copy process: $?");
# additional cleanup for log::file_work_on()
# log::file_work_done();
}
# finally, delete $spool/XXXXX.rar if $delete
if($delete)
{
if( (system("/bin/rm -f '$spool/$curfile'")) == 0 )
{
log::zayavki("removed temporary file $spool/$curfile");
}
else
{
# /bin/rm exits with error
log::zayavki("error while removing temporary file $spool/$curfile (see error log)");
log::error("error while removing temporary file $spool/$curfile: $?");
}
}
}
}
else
{
# an error occurs in the archivation process
log::zayavki("error in archivation process (see error log)");
log::error("error in archivation process: $?");
# clean out compressed file in /usr/backup/spool on error
#system("/bin/rm -f '/usr/backup/spool/$curfile'");
`/bin/rm -f '$spool/$curfile'`;
}
}
else
{
# error, local file doesn't exists
log::error("Can not open local file $localpaths[$i]");
log::zayavki("Can not open local file $localpaths[$i]");
}
}
# next iteration of 'while' and increment of $i
$i++;
log::file_work_done();
}
# end while
log::main("Saved $okay zayavki on remote host");
log::zayavki("<< End transfer process >>");
}
sub probas()
{
my @dbids;
my @localpaths;
my @remotepaths;
my $dbids_ref;
my $localpaths_ref;
my $i = 0;
my $okay = 0;
my $curfile;
my $size_orig;
my $size_arc;
my $spool;
my $delete;
($dbids_ref, $localpaths_ref) = fetch::probas_list();
@dbids = @$dbids_ref;
@localpaths = @$localpaths_ref;
log::main("Fetched " . scalar(@localpaths) . " probas from database");
log::probas("<< Starting transfer process >>");
@remotepaths = @localpaths; # clone
while($localpaths[$i])
{
# cloned from send::zayavki()
# check if there is a void element
# ???
next if(!$localpaths[$i]);
#
#
# fill $spool with right spool directory
if( db::get_tx_count($dbids[$i]) > 0 )
{
# retransmission
# set $spool to temporary directory to make backup collector happy :)
# in this case also let $delete = 1 (removing garbage after copy, as in old times)
# considering okay to not to check /usr/backup for availability
$spool = $SPOOL_TMPDIR;
$delete = 1;
}
else
{
# this is the first time copy
# set $spool to backup spool directory
# and not to delete archive
$spool = $SPOOL_PROBAS;
$delete = 0;
}
# lookup in table first
chomp( $tmpf = `basename $remotepaths[$i]` );
chomp( $_ = `dirname $remotepaths[$i]` );
$tmpd = hash::lookup($_);
if ( $tmpd ne '' )
{
$remotepaths[$i] = $tmpd. "/". $tmpf;
}
else
{
# /mnt/maket/proba/* goes on /mnt/rmt_maket/proba/
substr($remotepaths[$i], 1, 2, 'mnt/rmt_maket');
}
if(-e $remotepaths[$i] || -e $remotepaths[$i] . '.rar')
{
log::error("Remote file $remotepaths[$i] already exists");
db::change_status($dbids[$i], 1);
}
else
{
if( -e $localpaths[$i] )
{
# rar and copy local file
fileops::checkdir($remotepaths[$i]);
# set $size_orig
$size_orig = -s "$localpaths[$i]";
chomp($curfile = `basename $localpaths[$i]`) , $curfile .= '.rar';
# two functions in log.pm makes newer versions of zlist happy
log::file_work_on($curfile, "rar");
log::probas("compressing '$localpaths[$i]' -> '$spool/$curfile'");
`/usr/local/bin/rar a -rr10% -ep '$spool/$curfile' '$localpaths[$i]'`;
if( ($? >> 8) == 0)
{
# rar exited successfully
# set $size_arc
$size_arc = -s "$spool/$curfile";
# it can be possible that file already uploaded by hand while rar copressed one
# so we should check for existence of archive in remote before send it
if( -e $remotepaths[$i] || -e $remotepaths[$i] . '.rar')
{
log::error("Can not save $remotepaths[$i].rar cause of file has appeared after compressing");
log::probas("Can not save $remotepaths[$i].rar cause of file has appeared after compressing");
db::change_status($dbids[$i], 1);
}
else
{
# copy archive and then delete it from $spool
log::file_work_on($curfile, "copy");
log::probas("transferring $spool/$curfile -> $remotepaths[$i].rar");
if( system("cp '$spool/$curfile' $remotepaths[$i].rar") == 0 )
{
log::probas("saved $localpaths[$i] -> $remotepaths[$i].rar [size_orig=$size_orig, size_arc=$size_arc]");
log::diff($localpaths[$i], $size_orig, $size_arc);
# update database
db::change_status($dbids[$i], 1);
db::write_size_orig($dbids[$i], $size_orig);
db::write_size_arc($dbids[$i], $size_arc);
db::write_ux_rpath($dbids[$i], "$remotepaths[$i].rar");
# increment tx_count
db::increment_tx_count($dbids[$i]);
$okay++;
}
else
{
# error in the copy process
log::probas("error in copy process (see error log)");
log::error("error in copy process: $?");
}
if ($delete)
{
# finally, delete $spool/XXXXX.rar
if( (system("/bin/rm -f '$spool/$curfile'")) == 0 )
{
log::probas("removed temporary file $spool/$curfile");
}
else
{
# /bin/rm exits with error
log::probas("error while removing temporary file $spool/$curfile (see error log)");
log::error("error while removing temporary file $spool/$curfile: $?");
}
} # !$delete
}
}
else
{
# an error occurs in the archivation process
log::probas("error in archivation process (see error log)");
log::error("error in archivation process: $?");
system("/bin/rm -f '$spool/$curfile'");
}
}
else
{
# error, local file doesn't exists
log::error("Can not open local file $localpaths[$i]");
log::probas("Can not open local file $localpaths[$i]");
}
}
# next iteration of 'while' and increment of $i
$i++;
log::file_work_done();
}
log::main("Saved $okay probas on remote host");
log::probas("<< End transfer process >>");
}
return(1);