my $compress = '| lzop -c';
my $decompress = 'lzop -d |';
-my $arh = Net::OpenSSH->new('root@10.60.0.204');
-my $dev = Net::OpenSSH->new('root@10.60.0.202');
+my $from = Net::OpenSSH->new('root@10.60.0.90');
+my $to = Net::OpenSSH->new('root@10.60.0.202');
sub on {
my ($ssh,$command) = @_;
}
}
-print on $arh => 'zpool status';
-print on $dev => 'zpool status';
+print on $from => 'zpool status';
+print on $to => 'zpool status';
-my @arh = on $arh => 'zfs list -H -o name';
-my @dev = on $dev => 'zfs list -H -o name';
+my @from = on $from => 'zfs list -H -o name';
+my @to = on $to => 'zfs list -H -o name';
-warn "# ",dump( \@arh, \@dev );
+warn "# ",dump( \@from, \@to );
-my $from_pool = $arh[0];
-my $to_pool = $dev[0];
+my $from_pool = $from[0];
+my $to_pool = $to[0];
sub snapshots_from {
my ($ssh) = @_;
return $snapshot;
}
-foreach my $fs ( @arh ) {
+foreach my $fs ( @from ) {
my $name = $fs;
$name =~ s{^$from_pool/}{} || next; # FIXME skip top-level fs
warn "? $name";
- my $arh_snapshot = snapshots_from $arh;
- if ( ! exists( $arh_snapshot->{$fs} ) ) {
+ my $from_snapshot = snapshots_from $from;
+ if ( ! exists( $from_snapshot->{$fs} ) ) {
my $snapshot = $fs . '@send';
- print on $arh => "zfs snapshot $snapshot";
- die $arh->error if $arh->error;
- $arh_snapshot = snapshots_from $arh;
+ print on $from => "zfs snapshot $snapshot";
+ die $from->error if $from->error;
+ $from_snapshot = snapshots_from $from;
}
- my $max_snapshot = $#{ $arh_snapshot->{$fs} };
+ my $max_snapshot = $#{ $from_snapshot->{$fs} };
warn "$fs has ",$max_snapshot+1," snapshots\n";
- my $to_dev = "$to_pool/$name";
+ my $to_to = "$to_pool/$name";
foreach my $i ( 0 .. $max_snapshot ) {
- my $snap = $arh_snapshot->{$fs}->[$i] || die "no snap";
+ my $snap = $from_snapshot->{$fs}->[$i] || die "no snap";
- my $dev_snapshot = snapshots_from $dev;
- if ( exists $dev_snapshot->{$to_dev} ) {
- if ( first { /^\Q$snap\E$/ } @{ $dev_snapshot->{$to_dev} } ) {
+ my $to_snapshot = snapshots_from $to;
+ if ( exists $to_snapshot->{$to_to} ) {
+ if ( first { /^\Q$snap\E$/ } @{ $to_snapshot->{$to_to} } ) {
warn "+ $name @ $snap exists\n";
next;
} else {
if ( $i == 0 ) {
$snapshot = "$from_pool/$name\@$snap";
} else {
- my $prev = $arh_snapshot->{$fs}->[$i-1] || die "no prev";
+ my $prev = $from_snapshot->{$fs}->[$i-1] || die "no prev";
$snapshot = "-i $from_pool/$name\@$prev $from_pool/$name\@$snap";
}
- warn "zfs transfer $snapshot -> $to_dev\n";
+ warn "zfs transfer $snapshot -> $to_to\n";
my $t = time();
- my $recv = "nc -w 3 -l -p 8888 | $decompress zfs receive $to_dev";
+ my $recv = "nc -w 3 -l -p 8888 | $decompress zfs receive $to_to";
warn ">> $recv\n";
- my ($rin1,$pid1) = $dev->pipe_in($recv);
+ my ($rin1,$pid1) = $to->pipe_in($recv);
warn ">> pid: $pid1";
sleep 1; # FIXME wait for netcat to start
my $send = "zfs send $snapshot $compress | nc -q 0 -w 2 10.60.0.202 8888";
warn "<< $send\n";
- $arh->system($send);
- die $arh->error if $arh->error;
+ $from->system($send);
+ die $from->error if $from->error;
$t = time() - $t;
warn "took $t seconds to complete\n";
- $dev->system("zfs set readonly=on $to_pool/$name") if $i == 0;
- warn "ERROR: ",$dev->error if $dev->error;
+ $to->system("zfs set readonly=on $to_pool/$name") if $i == 0;
+ warn "ERROR: ",$to->error if $to->error;
sleep 1;
- $dev_snapshot = snapshots_from $dev;
- die "can't find new snapshot $snap" unless $dev_snapshot->{$to_dev};
+ $to_snapshot = snapshots_from $to;
+ die "can't find new snapshot $snap" unless $to_snapshot->{$to_to};
}