X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FCloudStore%2FAPI.pm;h=d68cd1e04cc5c9c677c0fc9260c3d22e277be51d;hb=e7298af5a01b460b29272ea6a69636854b4ac223;hp=39a27cd5e9ac5c627d85bcf6e68431a53d8f5dbc;hpb=03d21c8b5c3ce89af9fd2b4bb5730d7af995baf3;p=cloudstore.git diff --git a/lib/CloudStore/API.pm b/lib/CloudStore/API.pm index 39a27cd..d68cd1e 100644 --- a/lib/CloudStore/API.pm +++ b/lib/CloudStore/API.pm @@ -73,7 +73,7 @@ sub create_user { while(<$fh>) { my ( $login, $passwd, $uid, $gid, $email, $dir, $shell ) = split(/:/,$_); $max_uid = $uid if $uid > $max_uid; - $found = $uid if $email eq $new_email; + $found = $login if $email eq $new_email; } close($fh); @@ -91,7 +91,7 @@ sub create_user { open(my $fh, '>>', $self->{passwd}); print $fh "u$max_uid:$new_passwd:$max_uid:$port:$new_email:$dir:/bin/true\n"; close($fh); - $found = $max_uid; + $found = "u$max_uid"; mkdir $dir; chown $max_uid, $port, $dir; @@ -106,7 +106,7 @@ sub create_user { # FIXME update quota only on create? $self->gearman_do( $self->dir2gearman( $dir, 'quota', 'set' ) => "$found $new_quota" ); - return 'u' . $found; + return $found; } sub mkbasepath { @@ -116,7 +116,7 @@ sub mkbasepath { } sub user_dir { - my ( $self,$user, $dir ) = @_; + my ( $self, $user, $dir ) = @_; $user = $self->user_info($user) unless ref $user eq 'HASH'; my $path; if ( exists $user->{dir} ) { @@ -160,6 +160,23 @@ sub append_meta { sub usage { my ( $self, $user ) = @_; $user = $self->user_info($user) unless ref $user eq 'HASH'; + + my $usage_path = $user->{dir} . '/.meta/files.usage'; + $self->mkbasepath( $usage_path, { uid => $user->{uid} } ); + if ( ! -e $usage_path ) { + warn "# usage $usage_path missing"; + $self->list_files($user); + } + + open(my $fh, '<', $usage_path); + my $size = <$fh>; + chomp $size; + + warn "# usage $user->{login} usage: $size\n"; + return $size; + +=for slow and broken + my $path = $self->user_dir( $user => 'usage'); my $sum; open(my $fh, '<', $path); @@ -176,6 +193,9 @@ sub usage { $sum->{_quota} = $quota; warn "## usage ",dump($user, $sum), $/; return $sum; + +=cut + } sub send_file { @@ -227,6 +247,8 @@ sub send_file { $self->append( $t, 'recv', $size, $f->{uid}, $t_path ); $self->append_meta('md5sum', $t, $md5 => $t_path ) if $md5; # md5sum for received files! FIXME -- cross-slice md5 $self->refresh_file_list( $t ); + } else { + warn "ERROR: send_file $f_full -> $t_full: $!"; } return $size; @@ -242,6 +264,8 @@ sub rename_file { $self->mkbasepath( $t_full, { uid => $user->{uid}, gid => $user->{gid} } ); my $ok = rename $f_full, $t_full; + $self->refresh_file_list( $user ); + my $md5 = $self->md5_get($t_full); if ( ! $md5 ) { warn "ERROR: no md5sum for $from"; @@ -251,8 +275,6 @@ sub rename_file { $self->append_meta('md5sum', $user, 'rename' => $from ); $self->append_meta('md5sum', $user, $md5 => $from ); - $self->refresh_file_list( $user ); - return $ok; } @@ -301,6 +323,55 @@ sub file_size { return -s $full_path; } +sub list_files { + my ( $self, $user, $path ) = @_; + + $user =~ s{/+$}{} && warn "cleanup list_files arg [$user]"; + + $user = $self->user_info($user) unless ref $user eq 'HASH'; + + die "no dir for ",dump($user) unless exists $user->{dir}; + + my $files = $user->{dir} . '/.meta/files'; + $self->mkbasepath( $files, { uid => $user->{uid} } ); + if ( -e $files && -s $files > 0) { + local $/ = undef; + open(my $fh, '<', $files); + my $list = <$fh>; + close($fh); + warn "# list_files $user->{login} cached ", length($list), " bytes"; + return $list; + } + + my $dir = $user->{dir}; + open(my $pipe, '-|', qq|find -L $dir -printf "%y %s %p\n"|); + open(my $fh, '>', "$files.new"); + my $total_usage = 0; + my $list_txt; + while(<$pipe>) { + chomp; + my ( $type, $size, $name ) = split(/\s/, $_); + $name =~ s{$dir}{./}; + $name =~ s{//+}{/}g; + my $line = "$type $size $name\n"; + print $fh $line; + $list_txt .= $line; + $total_usage += $size; + } + close($pipe); + close($fh); + rename "$files.new", $files; + + open(my $usage, '>', "$files.usage.new"); + print $usage $total_usage; + close($usage); + rename "$files.usage.new", "$files.usage"; + + warn "# list_files $dir usage: $total_usage\n"; + + return $list_txt; +} + sub refresh_file_list { my ( $self, $user ) = @_; $user = $self->user_info($user) unless ref $user eq 'HASH'; @@ -311,6 +382,8 @@ sub refresh_file_list { } else { warn "## refresh_file_list $full_path missing"; } + + unlink "$full_path.usage" if -e "$full_path.usage"; } 1;