]> source.dussan.org Git - rspamd.git/commitdiff
* Take callback argument in Mail::Rspamd::Client for processing files and directories
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Fri, 2 Jul 2010 14:28:10 +0000 (18:28 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Fri, 2 Jul 2010 14:28:10 +0000 (18:28 +0400)
* Print results if rspamc is called for a directory

perl/lib/Mail/Rspamd/Client.pm
rspamc.pl.in

index ad2ab7a862fd6026ccabda95315970457e3876c3..ca90b7421fee32bbadc49a6c8bcfe28da70d356d 100644 (file)
@@ -150,16 +150,17 @@ The return value is a hash reference containing results of each command for each
 sub process_item {
        my $self = shift;
        my $item = shift;
+       my $cb = shift;
        
        if (defined ($item)) {
                if ($item =~ qr|^imap(s?):user:([^:]+):password:([^:]*):host:([^:]+):mbox:(.+)$|) {
-                       return $self->_process_imap ($1, $2, $3, $4, $5);
+                       return $self->_process_imap ($1, $2, $3, $4, $5, $cb);
                }
                elsif (-f $item) {
-                       return $self->_process_file ($item);
+                       return $self->_process_file ($item, $cb);
                }
                elsif (-d $item) {
-                       return $self->_process_directory ($item);
+                       return $self->_process_directory ($item, $cb);
                }
                else {
                        warn "urecognized argument: $item";
@@ -180,9 +181,11 @@ The return value is a hash reference containing results of each command for each
 =cut
 sub process_path {
        my $self = shift;
+       my $cb = shift;
        my %res;
+
        foreach (@_) {
-               $res{$_} = $self->process_item($_);
+               $res{$_} = $self->process_item($_, $cb);
        }
 
        return \%res;
@@ -1167,6 +1170,8 @@ sub _do_control_command {
 sub _process_file {
        my $self = shift;
        my $file = shift;
+       my $cb = shift;
+       my $res;
 
        open(FILE, "< $file") or return;
        
@@ -1176,19 +1181,23 @@ sub _process_file {
        }
        
        close FILE;
-       $self->do_all_cmd ($input);
+       $res = $self->do_all_cmd ($input);
+       if (defined ($cb) && $res) {
+               $cb->($file, $res);
+       }
 }
 
 sub _process_directory {
        my $self = shift;
        my $dir = shift;
+       my $cb = shift;
 
        opendir (DIR, $dir) or return;
 
        while (defined (my $file = readdir (DIR))) {
                $file = "$dir/$file";
                if (-f $file) {
-                       $self->_process_file ($file);
+                       $self->_process_file ($file, $cb);
                }       
        }
        closedir (DIR);
@@ -1269,9 +1278,10 @@ sub _parse_imap_sequences {
 }
 
 sub _process_imap {
-       my ($self, $ssl, $user, $password, $host, $mbox) = @_;
+       my ($self, $ssl, $user, $password, $host, $mbox, $cb) = @_;
        my $seq = 1;
        my $sock;
+       my $res;
 
        if (!$password) {
                eval {
@@ -1329,6 +1339,9 @@ sub _process_imap {
                syswrite $sock, "$seq FETCH $message body[]$EOL";
                if (defined (my $input = $self->_parse_imap_body ($sock, $seq))) {
                        $self->do_all_cmd ($input);
+                       if (defined ($cb) && $res) {
+                               $cb->($seq, $res);
+                       }
                }
                $seq ++;
        } 
index 077832438fb4e2c3fe60c9442258c3753e8e1890..a71e061f153d0ab5f4363432f5c9c56033bc227a 100755 (executable)
@@ -10,6 +10,7 @@
 use Socket qw(:DEFAULT :crlf);
 use Term::Cap;
 use Mail::Rspamd::Client;
+use Data::Dumper;
 
 my %cfg = (
     'conf_file' => '@CMAKE_INSTALL_PREFIX@/etc/rspamd.conf',
@@ -186,6 +187,22 @@ sub print_rspamc_result {
        }
 }
 
+sub print_item_result {
+       my ($file, $res) = @_;
+       $terminal->Tputs( 'md', 1, *STDOUT );
+       print "Results for item $file:\n\n";
+       $terminal->Tputs( 'me', 1, *STDOUT );
+
+       while (my ($host, $result) =  each (%{ $res })) {
+               if ($cfg{control}) {
+                       print_control_result ($host, $result);
+               }
+               else {
+                       print_rspamc_result ($host, $result);
+               }
+       }
+       
+}
 ############################# Main part ###########################################
 my %args;
 
@@ -330,17 +347,5 @@ if (!defined ($path[0]) || ! $cfg{'require_input'}) {
        }
 }
 else {
-       my $res = $rspamd->process_path (@path);
-
-       while (my ($item, $result) =  each (%{ $res })) {
-               print "Results for item $item:\n";
-               while (my ($host, $r) =  each (%{ $result })) {
-                       if ($cfg{control}) {
-                               print_control_result ($host, $r);
-                       }
-                       else {
-                               print_rspamc_result ($host, $r);
-                       }
-               }
-       }
+       $rspamd->process_path (\&print_item_result, @path);
 }