more correct (not complete) chown and usage tracking for rsync
[cloudstore.git] / lib / CloudStore / Store.pm
index f1528fc..924a4ad 100644 (file)
@@ -147,7 +147,7 @@ sub new_file {
 #      $self->file_set($data);
 }
 
-sub remove_file {
+sub removed_file {
        my ( $self, $data ) = @_;
 
        my $md5 = $self->md5sum($data)->get( $data->{file} );
@@ -156,7 +156,11 @@ sub remove_file {
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
                $atime,$mtime,$ctime,$blksize,$blocks)
                        = stat($path);
-       if ( $nlink == 1 ) {
+
+       my $user = $self->{api}->user_info($data->{login});
+
+       if ( $nlink == 1 && $uid == $user->{uid} ) {
+               $self->append( $user, 'removed', -$size, $uid, $data->{file} );
                my $id = getpwnam 'md5';
                chown $id,$gid, $path;
                warn "# chown $id $gid $path";
@@ -229,17 +233,7 @@ sub init_pid_login {
        my ( $self, $pid, $login ) = @_;
 
        $login =~ s/\@.+//;
-       my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
-               getpwnam $login;
-
-       $self->{pid}->{$pid} = {
-               login => $login,
-               uid => $uid,
-               gid => $gid,
-               email => $email,
-               dir => $dir,
-               shell => $shell,
-       };
+       $self->{pid}->{$pid} = $self->{api}->user_info($login);
 
        warn "created $pid";
 }
@@ -262,7 +256,7 @@ sub rsync_log {
                my $pid = $1;
                $self->cleanup_pid( $pid );
        } else {
-#              warn "## rsync_log $data";
+               warn "## rsync_log $data";
        }
 }
 
@@ -293,7 +287,7 @@ sub rsync_transfer {
                        die "unknown type $type ", dump $data;
                }
        } elsif ( $data->{itemize} =~ m/\*deleting/ ) {
-               $self->remove_file($data);
+               $self->removed_file($data);
        } else {
                warn "IGNORED ",dump($data) if $ENV{DEBUG};
        }
@@ -309,13 +303,26 @@ sub md5pool {
        my $md5 = $data->{md5} || die "no md5 in ",dump $data;
        my $path = $self->blob_path($data);
 
-       if ( -e "$pool/$md5" ) {
+       my $pool_md5 = "$pool/$md5";
+
+       if ( -e $pool_md5 ) {
                warn "dedup hit $md5 $path\n";
+
+               my ($pool_uid,$pool_size) = (stat($pool_md5))[4,7];
+               my $user = $self->{api}->user_info( $data->{login} );
+
+               if ( $pool_uid != $self->{api}->{md5}->{uid} ) {
+                       chown $self->{api}->{md5}->{uid}, $self->{api}->{md5}->{gid}, $pool_md5;
+                       chmod oct("0444"), $pool_md5;
+                       my $steal_user = $self->{api}->user_info( $pool_uid );
+                       $self->append( $steal_user, 'dedup-steal', $pool_size, $pool_uid, $data->{file} );
+               }
+               $self->append( $user, 'dedup', $pool_size, $pool_uid, $data->{file} );
+
                my $dedup = $path . '.dedup';
                rename $path, $dedup;
                link "$pool/$md5", $path;
                unlink $dedup;
-               # FIXME fix perms?
        } else {
                link $path, "$pool/$md5";
                warn "dedup +++ $md5 $path";
@@ -348,11 +355,7 @@ sub dedup {
                        };
                        my $new_path = $self->blob_path($new);
                        if ( ! -e $new_path ) {
-                               # create path from md5sum file
-                               mkbasedir $new_path;
-                               $imported += link "$self->{md5path}/$md5", $new_path;
-                               $self->new_file($new);
-                               warn "import from $path ",dump($new);
+                               $self->{api}->send_file( 'md5' => $md5, $data->{login}, "$dir$file" );
                                $self->md5pool( $new );
                        } else {
                                $self->md5pool( $new );