minisync/r.pl

82 lines
1.6 KiB
Perl
Raw Normal View History

2010-09-27 13:40:21 +02:00
#!/usr/bin/env perl
2010-09-27 16:33:31 +02:00
use strict;
use warnings;
2010-09-30 16:12:00 +02:00
use POSIX qw(strftime);
2010-09-27 16:33:31 +02:00
2010-10-01 00:26:37 +02:00
my$child = 0;
__FILE__ =~ /^(.*\/)?[^\/]*?$/;
my$libexec = $1 || '.';
2010-09-30 16:12:00 +02:00
2010-10-01 00:26:37 +02:00
END {
print STDERR "\n";
kill $child, 15;
waitpid $child, 0;
2010-09-27 16:56:02 +02:00
exit $?;
2010-10-01 00:26:37 +02:00
}
$SIG{CLD} = $SIG{INT} = sub { exit; };
2010-09-27 16:33:31 +02:00
sub mj {
%_ = @_;
'{ts:"'.strftime( '%Y-%m-%d %H:%M:%S', localtime).'", proc:"s", '.join( ', ', map "$_:\"$_{$_}\"", keys%_)."}\n";
}
sub readg {
2010-09-27 16:33:31 +02:00
my $data = '';
while( length( $data) < $_[0]) {
read( STDIN, $data, $_[0]-length($data), length($data)) or return(0);
2010-09-27 16:33:31 +02:00
}
$data;
}
2010-10-01 00:26:37 +02:00
sub shdump {
my$r = $_[0];
$r =~ s/[\\']/\'\\$&\'/g;
"'".$r."'";
}
my( $machine, $source, $destination) = @ARGV;
pipe SIN, ROUT;
pipe RIN, SOUT;
unless( $child = fork()) {
open F, '<', "$libexec/s.pl" or die( mj( error=>'cannot_open_s.pl', exception=>$!));
sysread F, my $s_pl, -s F;
close F;
close ROUT;
close RIN;
open STDOUT, '>&', \*SOUT;
open STDIN, '<&', \*SIN;
exec 'ssh', $machine, 'perl', '-e', shdump($s_pl), shdump($source);
}
close SOUT;
close SIN;
open STDOUT, '>&', \*ROUT;
open STDIN, '<&', \*RIN;
$|++;
my@f;
chdir $destination or die( mj( error=>'cannot_chdir', exception=>$!));
while( my$data = readg(6)) {
my( $cmd, $length) = unpack( 'nN', $data);
$data = readg $length;
2010-09-27 13:40:21 +02:00
if( 1 == $cmd) {
2010-10-01 00:26:37 +02:00
print STDERR "\n" if $f[0];
open( F, '>>', $data) or die( mj( error=>'unable_to_open_file', message=>"Can't open file <$data>"));
2010-10-01 00:26:37 +02:00
@f = ($data, -s F);
print pack( 'N', $f[1]);
2010-09-27 13:40:21 +02:00
}
elsif( 2 == $cmd) {
2010-10-01 00:26:37 +02:00
$f[1] += length $data;
2010-09-27 15:34:24 +02:00
print F $data;
}
else {
die( mj( error=>'unknown_command', command=>$cmd));
2010-09-27 13:40:21 +02:00
}
2010-10-01 00:26:37 +02:00
printf STDERR "\r% 14d %s", $f[1], $f[0];
2010-09-27 13:40:21 +02:00
}
2010-10-01 00:26:37 +02:00
exit;