10 use Data::Dump qw(dump);
14 my $dir = '/srv/cloudstore/var';
15 my $log_fifo = "$dir/rsyncd.log";
16 my $pid_file = "$dir/rsyncd.pid";
17 my $cfg_file = "$dir/rsyncd.conf";
20 mkdir $dir if ! -e $dir;
22 mkfifo $log_fifo, 0700 unless -p $log_fifo;
40 my $rsync_config = qq{
48 lock file = $dir/rsyncd.lock
50 #syslog facility = local5
53 transfer logging = yes
54 log format = transfer-log:} . join('|',values %$transfer_log) . qq{
59 # don't check secrets file permission (uid)
62 pre-xfer exec = /srv/cloudstore/pre-xfer.sh
63 post-xfer exec = /srv/cloudstore/post-xfer.sh
66 path = /srv/cloudstore/users/dpavlin/blob
68 secrets file = /srv/cloudstore/secrets/dpavlin
73 write_file $cfg_file, $rsync_config;
74 warn "created $cfg_file ", -s $cfg_file, " bytes\n";
77 my $pid = read_file $pid_file;
80 warn "found rsync pid $pid";
86 if ( ! -e $pid_file ) {
87 my $exec = "rsync --daemon --config $cfg_file --no-detach --port=6501";
90 die "could not fork\n" unless defined(my $pid = fork);
92 warn "start server with $exec\n";
96 warn "wait for pid file";
97 while ( ! -e $pid_file ) {
104 warn "# reading log output from $log_fifo\n";
105 open(my $log, '<', $log_fifo);
106 while( my $line = <$log> ) {
108 if ( $line =~ /transfer-log:(.+\|.+)/ ) {
110 my @k = keys %$transfer_log;
111 my @v = split(/\|/,$1);
112 @data{@k} = @v ; # FIXME validate?
113 print "transfer-log:",dump(\%data),$/;
115 my $path = sprintf "users/%s/data/%.5f-%d",
116 $data{user}, Time::HiRes::time(), $data{pid};
117 open(my $json, '>', $path);
118 print $json encode_json \%data;
120 print $path, " ", -s $path, " bytes\n";