Features:
-RSYNC_PORT=6502 ./rsync-piper.pl
+sudo ./rsync-piper.pl
- generate rsync configuration based on content of RSYNC_DIR/users
- start rsync server on specified port
- follow rsync transfer log, parse it and trigger events
- gearman log shipping in json format
- support login+host usernames for client secrets
- push md5sum file to create files from server's md5 pool
-
-data-worker.pl
- - gearman worker to store rsync transfer log into PostgreSQL
+ - track quota usage using uid/gid using libnss-extrausers
create-user.sh
remove-user.sh
# });
# $self->new_file($origin);
warn "INFO: sent file ",dump($l,$f);
-# my $md5 = $self->{md5}->{$s} || die "no md5 for $s";
-# $self->{md5}->{$d} = $md5;
+ my $md5sum = $self->md5sum($data);
+
+ my $md5 = $md5sum->{$s} || die "no md5 for $s";
+ $md5sum->{$d} = $md5; # FIXME broken!
}
}
}
+our $md5_login;
+sub md5sum {
+ my ( $self, $data ) = @_;
+
+ if ( exists $md5_login->{$data->{login}} ) {
+ return $md5_login->{$data->{login}};
+ } elsif ( my $login = $data->{login} ) {
+
+ my $md5_path = $self->{dir} || die "no dir?";
+ $login =~ s/^u//;
+ $md5_path .= "/$login/.md5.db";
+
+ my %md5;
+ my $db = tie %md5, 'BerkeleyDB::Hash',
+ -Filename => $md5_path,
+ -Flags => DB_CREATE,
+ ;
+
+ return $md5_login->{$login} = \%md5;
+ } else {
+ confess "can't open md5sum";
+ }
+}
+
sub rsync_log {
my ( $self, $data ) = @_;
if ( $data =~ m/\[(\d+)\] rsync \w+ (\S+) \w+ (\S+)/ ) {
my ( $pid, $module, $login ) = ( $1, $2, $3 );
+
$login =~ s/\@.+//;
my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
getpwnam $login;
- my %md5;
- my $db = tie %md5, 'BerkeleyDB::Hash',
- -Filename => "$dir/.md5.db",
- -Flags => DB_CREATE
- ;
-
$self->{pid}->{$pid} = {
login => $login,
uid => $uid,
email => $email,
dir => $dir,
shell => $shell,
- md5 => \%md5,
};
- } elsif ( $data =~ m/\[(\d+)\] sent \d+ bytes\s+received \d+ bytes/ ) {
+ warn "created $pid";
+
+ } elsif ( $data =~ m/\[(\d+)\] sent \S+ bytes\s+received \S+ bytes/ ) {
my $pid = $1;
- untie $self->{pid}->{$pid}->{md5} && warn "md5 hash untied";
- warn "removed ", dump
+ untie $md5_login->{ $self->{$pid}->{login} } && warn "untie $pid";
delete $self->{pid}->{$pid};
+ warn "removed $pid";
} else {
- warn "## rsync_log $data";
+# warn "## rsync_log $data";
}
}
link $path, "$pool/$md5";
}
- my $md5hash = $self->{pid}->{ $data->{pid} }->{md5} || die "no md5 for $data->{pid} in ",dump( $self->{pid} );
- $md5hash->{ $data->{file} } = $md5;
+ my $md5sum = $self->md5sum($data);
+ $md5sum->{ $data->{file} } = $md5;
}
my $empty_md5 = " " x 32;