if ( $f->{uid} == $self->{md5}->{uid} ) {
$md5 = $f_path; # we don't have local md5sum db for md5 user!
} else {
- $md5 = $self->md5sum($f)->get( $f_path );
- $self->md5sum_close($f);
+ $md5 = $self->md5_get($f_full);
}
if ( ! $md5 ) {
warn "ERROR: no md5 for $f_path";
return $ok;
}
- $self->md5sum($t)->put( $t_path => $md5 );
- $self->md5sum_close($t);
-
$self->append_meta('md5sum', $t, $md5 => $t_path ); # md5sum for received files!
return $ok;
my ( $self, $user, $from, $to ) = @_;
$user = $self->user_info($user) unless ref $user eq 'HASH';
- $self->mkbasepath( "$user->{dir}/$to", { uid => $user->{uid}, gid => $user->{gid} } );
- my $ok = rename "$user->{dir}/$from", "$user->{dir}/$to";
+ my $f_full = "$user->{dir}/$from";
+ my $t_full = "$user->{dir}/$to";
+
+ $self->mkbasepath( $t_full, { uid => $user->{uid}, gid => $user->{gid} } );
+ my $ok = rename $f_full, $t_full;
- my $md5 = $self->md5sum($user)->get( $from );
+ my $md5 = $self->md5_get($t_full);
if ( ! $md5 ) {
warn "ERROR: no md5sum for $from";
return $ok; # XXX our internal error
}
- $self->md5sum($user)->out( $from );
- $self->md5sum($user)->put( $to => $md5 );
- $self->md5sum_close($user);
-
$self->append_meta('md5sum', $user, 'rename' => $from );
$self->append_meta('md5sum', $user, $md5 => $from );
$self->append( $user, 'delete', -$deleted_size, $user->{uid}, $path );
$self->append_meta('md5sum', $user, 'delete', $path );
- $self->md5sum($user)->out( $path );
- $self->md5sum_close($user);
-
return $full_path;
}
use warnings;
use strict;
-use TokyoCabinet;
use Carp qw(confess carp);
+use Data::Dump qw(dump);
-sub new {
- my ($class) = @_;
- my $self = {};
- bless $self, $class;
- return $self;
+sub md5_get {
+ my ( $self, $path ) = @_;
+ my $md5 = `attr -q -g md5 $path`;
+ warn "## md5_get $path $md5\n";
+ return $md5;
}
-our $md5sum_db;
-
-sub md5sum {
- my ( $self, $data ) = @_;
-
- my $login = $data;
- $login = $data->{login} if ref $data eq 'HASH' && exists $data->{login};
-
- return $md5sum_db->{$login} if exists $md5sum_db->{$login};
-
- my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
- getpwnam $login;
-
- my $md5_path = "$dir/.md5";
-
- my $db = TokyoCabinet::HDB->new();
- if ( ! $db->open($md5_path, $db->OWRITER | $db->OCREAT) ) {
- warn "FATAL ERROR: md5sum $md5_path: ",$db->errmsg( $db->ecode ),"\n";
- rename $md5_path, $md5_path . 'bak' && warn "saved old file in $md5_path.bak and re-created database";
- $db->open($md5_path, $db->OWRITER | $db->OCREAT);
- }
-
- warn "open $md5_path";
-
- $md5sum_db->{$login} = $db;
- return $db;
-}
-
-sub md5sum_dump {
- my ( $self, $login ) = @_;
-
- my @lines;
-
- my $hdb = $self->md5sum( $login );
- $hdb->iterinit();
- while(defined(my $key = $hdb->iternext())){
- my $value = $hdb->get($key);
- if(defined($value)){
- push @lines, "$value $key";
- }
- }
- return @lines;
-}
-
-
-sub md5sum_close {
- my ( $self, $login ) = @_;
-
- $login = $login->{login} if ref $login eq 'HASH';
- if ( ! $login ) {
- warn "ERROR: md5sum_close no login";
- return;
- }
-
- if ( exists $md5sum_db->{$login} ) {
- $md5sum_db->{$login}->close;
- delete $md5sum_db->{$login};
- warn "close md5sum $login";
- } else {
- carp "# close md5sum $login IGNORED";
- }
+sub md5_set {
+ my ( $self, $path, $md5 ) = @_;
+ system "attr -q -s md5 -V $md5 $path";
+ warn "## md5_set $path $md5\n";
+ return $md5;
}
1;
use strict;
use lib 'lib';
-use base 'CloudStore::MD5sum';
+use base qw(CloudStore::MD5sum);
use CloudStore::API;
use autodie;
sub removed_file {
my ( $self, $data ) = @_;
- my $md5 = $self->md5sum($data)->get( $data->{file} );
+ my $md5 = $self->md5_get( $data );
return unless $md5; # directories don't have md5sums
my $path = $self->{md5pool} . '/' . $md5;
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
warn "# chown $id $gid $path";
}
- $self->md5sum($data)->out( $data->{file} );
- $self->md5sum_close($data);
-
$self->api->append_meta('md5sum', $user, 'delete', $data->{file} );
}
sub cleanup_pid {
my ( $self, $pid ) = @_;
- $self->md5sum_close( $self->{pid}->{$pid} );
-
delete $self->{pid}->{$pid};
warn "removed $pid";
}
warn "dedup +++ $md5 $path";
}
- $self->md5sum($data)->put( $data->{file} => $md5 );
- $self->md5sum_close($data);
+ $self->md5_set( $path => $md5 );
$self->api->append_meta('md5sum', $data->{login}, $md5, $data->{file} );
}
use strict;
use warnings;
-use Test::More tests => 5;
+use Test::More tests => 3;
use Data::Dump qw(dump);
+use File::Slurp;
use lib 'lib';
use_ok 'CloudStore::MD5sum';
-my $login = $ENV{LOGIN} || 'u2002';
+my $file = '/tmp/test.attr';
+write_file $file => "test\n";
+my $md5 = rand(1234567890);
-ok my $o = CloudStore::MD5sum->new, 'new';
+ok CloudStore::MD5sum->md5_set($file => $md5), 'md5_set';
-ok my $db = $o->md5sum($login), 'md5sum';
-diag dump $db;
-
-ok my $l = [ $o->md5sum_dump($login) ], 'md5sum_dump';
-diag dump $l;
-
-ok $o->md5sum_close($login), 'md5sum_close';
+cmp_ok CloudStore::MD5sum->md5_get($file), 'eq', $md5, 'md5_get';
mkdir('/tmp/client');
-ok write_file('/tmp/client/one', "one");
+ok write_file('/tmp/client/one', "one" . time() );
diag "reload rsync config with invalid username";
upload('reload-config' => '/tmp/client/one');