store audit log in PostgreSQL
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 16 Jul 2011 10:45:48 +0000 (10:45 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 16 Jul 2011 10:45:48 +0000 (10:45 +0000)
cloudstore.sql [new file with mode: 0644]
rsync-piper.pl

diff --git a/cloudstore.sql b/cloudstore.sql
new file mode 100644 (file)
index 0000000..b1a484b
--- /dev/null
@@ -0,0 +1,17 @@
+-- drop database cloudstore;
+-- create database cloudstore;
+drop table log;
+create table log (
+       timestamp timestamp, -- 2011/07/16 09:45:32
+       ip inet, -- 127.0.0.1
+       login text, -- dpavlin
+       host text, -- localhost
+       op text, -- recv
+       file text, -- :foo
+       pid int, -- 906
+       len int, -- 9334
+       transfered int, -- 9374
+       mtime timestamp, -- 2011/07/16-09:45:32
+       perms text, -- rw-r--r--
+       updated text -- >f+++++++++
+);
index 07fedfb..076634c 100755 (executable)
@@ -10,6 +10,7 @@ use Time::HiRes;
 use Data::Dump qw(dump);
 use English;
 use JSON::XS;
+use DBI;
 
 my $dir = '/srv/cloudstore/var';
 my $log_fifo = "$dir/rsyncd.log";
@@ -17,20 +18,25 @@ my $pid_file = "$dir/rsyncd.pid";
 my $cfg_file   = "$dir/rsyncd.conf";
 my $users    = "users";
 
+my $dbh = DBI->connect_cached('DBI:Pg:dbname=cloudstore','','', {
+       RaiseError => 1,
+       AutoCommit => 1,
+});
+
 mkdir $dir if ! -e $dir;
 
 mkfifo $log_fifo, 0700 unless -p $log_fifo;
 
 my $transfer_log = {
        ip => '%a',
-       user => '%u',
+       login => '%u',
        host => '%h',
        perms => '%B',
        file => '%f',
        updated => '%i',
        len => '%l',
        transfered => '%b',
-       module => '%m',
+#      module => '%m',
        mtime => '%M',
        op => '%o',
        pid => '%p',
@@ -113,11 +119,17 @@ while(1) {
                        print "transfer-log:",dump(\%data),$/;
 
                        my $path = sprintf "users/%s/data/%.5f-%d",
-                               $data{user}, Time::HiRes::time(), $data{pid};
+                               $data{login}, Time::HiRes::time(), $data{pid};
                        open(my $json, '>', $path);
                        print $json encode_json \%data;
                        close $json;
                        print $path, " ", -s $path, " bytes\n";
+
+                       my $sql = sprintf 'INSERT INTO log (%s) values (%s)',
+                               join(',',@k), join(',', map { '?' } @v);
+                       warn "# $sql";
+                       my $sth = $dbh->prepare($sql);
+                       $sth->execute( @v );
                }
        }
        close($log);