[collectd] [PATCH] SpamAssassin plugin: Update license foo and add timout

Alexander Wirt formorer<span style="display: none;">.trailing-username</span>(a)<span style="display: none;">leading-domain.</span>formorer.de
Thu Dec 7 11:15:28 CET 2006


Also updated example.cf to reflect the new timeout option
(default is 2 sec.). The whole thing is now dual licensed
(Artistic and Apache License).

Signed-off-by: Alexander Wirt <formorer<span style="display: none;">.trailing-username</span>(a)<span style="display: none;">leading-domain.</span>formorer.de>
---
 contrib/SpamAssassin/Collectd.pm |  131 ++++++++++++++++++++++----------------
 contrib/SpamAssassin/example.cf  |    1 +
 2 files changed, 77 insertions(+), 55 deletions(-)

diff --git a/contrib/SpamAssassin/Collectd.pm b/contrib/SpamAssassin/Collectd.pm
index d3b103e..6f1c0dc 100644
--- a/contrib/SpamAssassin/Collectd.pm
+++ b/contrib/SpamAssassin/Collectd.pm
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-# $Id: Collectd.pm 4 2006-12-02 15:18:14Z formorer $
+# $Id: Collectd.pm 7 2006-12-07 06:13:12Z formorer $
 
 =head1 NAME
 
@@ -48,15 +48,17 @@ Alexander Wirt <formorer<span style="display: none;">.trailing-username</span>(a)<span style="display: none;">leading-domain.</span>formorer.de>
 
  Copyright 2006 Alexander Wirt <formorer<span style="display: none;">.trailing-username</span>(a)<span style="display: none;">leading-domain.</span>formorer.de> 
  
- Licensed under the Apache License,  Version 2.0 (the "License"); 
- you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0 Unless required 
- by applicable law or agreed to in writing, software distributed 
- under the License is distributed on an "AS IS" BASIS, WITHOUT 
- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- See the License for the specific language governing permissions 
- and limitations under the License.
+ This program is free software; you can redistribute it and/or modify 
+ it under the the terms of either: 
+
+ a) the Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+
+ or
+
+ b) the "Artistic License" which comes with perl
+ (http://www.perl.com/pub/a/language/misc/Artistic.html) 
+
+ use whatever you like more. 
 
 =cut
 
@@ -104,6 +106,13 @@ sub set_config {
 	    type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRING,
     });
 
+	push (@cmds, {
+			setting => 'collectd_timeout',
+			default => 2,
+			type =>
+			$Mail::SpamAssassin::Conf::CONF_TYPE_NUMERIC,
+	});
+
     $conf->{parser}->register_commands(\@cmds);
 }
 
@@ -111,56 +120,68 @@ sub check_end {
     my ($self, $params) = @_;
     my $message_status = $params->{permsgstatus};
 	#create  new connection to our socket
-	my $sock = new IO::Socket::UNIX ( $self->{main}->{conf}->{collectd_socket});
-	# debug some informations if collectd is not running or anything else went
-	# wrong
-	if ( ! $sock ) {
-		dbg("collect: could not connect to " .
-			$self->{main}->{conf}->{collectd_socket} . ": $! - collectd plugin
-			disabled"); 
-		return 0; 
-	}
-	$sock->autoflush(1);
+	eval {
+		local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
+		die "alarm\n";
+		#generate a timeout
+		alarm $self->{main}->{conf}->{collectd_timeout};
+
+		my $sock = new IO::Socket::UNIX ( $self->{main}->{conf}->{collectd_socket});
+		# debug some informations if collectd is not running or anything else went
+		# wrong
+		if ( ! $sock ) {
+			dbg("collect: could not connect to " .
+				$self->{main}->{conf}->{collectd_socket} . ": $! - collectd plugin
+				disabled"); 
+			return 0; 
+		}
+		$sock->autoflush(1);
 
-	my $score = $message_status->{score};
-	#get the size of the message 
-	my $body = $message_status->{msg}->{pristine_body};
+		my $score = $message_status->{score};
+		#get the size of the message 
+		my $body = $message_status->{msg}->{pristine_body};
 
-	my $len = length($body);
+		my $len = length($body);
 
-	if ($message_status->{score} >= $self->{main}->{conf}->{required_score} ) {
-		#hey we have spam
-		print $sock "e:spam:$len\n";
-	} else {
-		print $sock "e:ham:$len\n";
-	}
-	print $sock "s:$score\n";
-	my @tmp_array; 
-	my @tests = @{$message_status->{test_names_hit}};
-
-	my $buffersize = $self->{main}->{conf}->{collectd_buffersize}; 
-	dbg("collectd: buffersize: $buffersize"); 
-
-	while  (scalar(@tests) > 0) {
-	 push (@tmp_array, pop(@tests)); 
-		if (length(join(',', @tmp_array) . '\n') > $buffersize) {
-			push (@tests, pop(@tmp_array)); 
-				if (length(join(',', @tmp_array) . '\n') > $buffersize or scalar(@tmp_array) == 0) {
-					dbg("collectd: this shouldn't happen. Do you have tests"
-						." with names that have more than ~ $buffersize Bytes?");
-					return 1; 
-				} else {
-					dbg ( "collectd: c:" . join(',', @tmp_array) . "\n" ); 
-					print $sock "c:" . join(',', @tmp_array) . "\n"; 
-					#clean the array
-					@tmp_array = ();
-				} 
-		} elsif ( scalar(@tests) == 0 ) {
-			dbg ( "collectd: c:" . join(',', @tmp_array) . '\n' );
-			print $sock "c:" . join(',', @tmp_array) . "\n";
+		if ($message_status->{score} >= $self->{main}->{conf}->{required_score} ) {
+			#hey we have spam
+			print $sock "e:spam:$len\n";
+		} else {
+			print $sock "e:ham:$len\n";
+		}
+		print $sock "s:$score\n";
+		my @tmp_array; 
+		my @tests = @{$message_status->{test_names_hit}};
+
+		my $buffersize = $self->{main}->{conf}->{collectd_buffersize}; 
+		dbg("collectd: buffersize: $buffersize"); 
+
+		while  (scalar(@tests) > 0) {
+		push (@tmp_array, pop(@tests)); 
+			if (length(join(',', @tmp_array) . '\n') > $buffersize) {
+				push (@tests, pop(@tmp_array)); 
+					if (length(join(',', @tmp_array) . '\n') > $buffersize or scalar(@tmp_array) == 0) {
+						dbg("collectd: this shouldn't happen. Do you have tests"
+							." with names that have more than ~ $buffersize Bytes?");
+						return 1; 
+					} else {
+						dbg ( "collectd: c:" . join(',', @tmp_array) . "\n" ); 
+						print $sock "c:" . join(',', @tmp_array) . "\n"; 
+						#clean the array
+						@tmp_array = ();
+					} 
+			} elsif ( scalar(@tests) == 0 ) {
+				dbg ( "collectd: c:" . join(',', @tmp_array) . '\n' );
+				print $sock "c:" . join(',', @tmp_array) . "\n";
+			}
 		}
+		close($sock); 
+		alarm 0; 
+	};
+	if ($@ eq "alarm\n") {
+		info("Connection to collectd timed out");
+		return -1; 
 	}
-	close($sock); 
 }
 
 1;
diff --git a/contrib/SpamAssassin/example.cf b/contrib/SpamAssassin/example.cf
index 31e763c..fa0a1fe 100644
--- a/contrib/SpamAssassin/example.cf
+++ b/contrib/SpamAssassin/example.cf
@@ -1,2 +1,3 @@
 collectd_buffersize 256
 collectd_socket /tmp/.collectd-email
+collectd_timeout 2
-- 
1.4.4.1




More information about the collectd mailing list