+sub mkbasepath {
+ my ($self,$path,$opts) = @_;
+ $path =~ s{/[^/]+$}{};
+ make_path $path unless -d $path;
+}
+
+sub user_dir {
+ my ( $self, $user, $dir ) = @_;
+ $user = $self->user_info($user) unless ref $user eq 'HASH';
+ my $path;
+ if ( exists $user->{dir} ) {
+ $path = $user->{dir} . '/.meta/' . $dir;
+ } else {
+ die "no dir in ", dump $user;
+ }
+ $path =~ s{//+}{/}g;
+
+ if ( ! -e $path ) {
+ $self->mkbasepath( $path, { uid => $user->{uid} } );
+ open(my $fh, '>', $path);
+ close $fh;
+ chown $user->{uid}, $user->{gid}, $path;
+ warn "# user_dir created $path\n";
+ }
+
+ #warn "### user_dir $path";
+ return $path;
+}
+
+sub append {
+ my $self = shift @_;
+ $self->append_meta( 'usage', @_ );
+}
+
+sub append_meta {
+ my $self = shift @_;
+ my $log = shift @_;
+ my $user = shift @_;
+ my $path = $self->user_dir( $user => $log );
+ my $delimiter = '#';
+ $delimiter = ' ' if $log =~ m/md5sum$/;
+ my $line = join($delimiter,@_);
+ open(my $fh, '>>', $path);
+ print $fh "$line\n";
+ close $fh;
+ warn "## $path $line\n";
+}
+
+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);
+ while(<$fh>) {
+ chomp;
+ my @v = split(/#/,$_);
+ $sum->{ $v[0] } += $v[1];
+ $sum->{_usage} += $v[1];
+ }
+ my ( $usage, $quota ) = split(/ /,
+ $self->gearman_do( $self->dir2gearman( $user->{dir}, 'quota', 'get' ) => $user->{uid} )
+ );
+ $sum->{_usage} += $usage;
+ $sum->{_quota} = $quota;
+ warn "## usage ",dump($user, $sum), $/;
+ return $sum;
+
+=cut
+
+}
+