Mailing List Archive

[Bug 3434] New: Debug levels for sets are out of reach of API; none for conf
http://bugzilla.spamassassin.org/show_bug.cgi?id=3434

Summary: Debug levels for sets are out of reach of API; none for
conf
Product: Spamassassin
Version: unspecified
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P3
Component: Tools
AssignedTo: spamassassin-dev@incubator.apache.org
ReportedBy: casey@geeknest.com


The following patch (which I hope this text field treats well) implements a number of changes, all
related to debug sets. I'll outline them here.

- Creates a new set, 'conf', used by ::Conf* modules.
- Adds a new option to Mail::SpamAssassin->new() called 'debug_level'.
- Documents the new option and explains how debug sets work.
- Allows salearn and spamassassin to modify debug levels for sets in the same way.
- spamassassin had a hack on --debug to allow this, it has been left in place and
options set with it will override --debug-set-level options to provide backward
compatibility.
- Tests Mail::SpamAssassin->new() debugging in new test file t/debug.t
- Modifies all calls to dbg() from ::Conf* modules to include debug set and level info.
- Updates MANIFEST to include new file
(though my manifest order seems to be different and so the patch is funky).

Patch below.

--
Casey West

diff -Nru Mail-SpamAssassin-3.000000-orig/MANIFEST Mail-SpamAssassin-3.000000/MANIFEST
--- Mail-SpamAssassin-3.000000-orig/MANIFEST Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/MANIFEST Fri May 21 15:09:44 2004
@@ -1,31 +1,22 @@
BUGS
-COPYRIGHT
-Changes
-INSTALL
-INSTALL.VMS
-LICENSE
-MANIFEST
-MANIFEST.SKIP
-Makefile.PL
-PACKAGING
-README
-STATUS
-TRADEMARK
-USAGE
-CREDITS
-build/README
build/cf_to_html
build/convert_pods_to_doc
build/find_meta_missing_dependencies
build/get_version
build/preprocessor
+build/README
build/tag_nightly_mc
build/tag_weekly_mc
build/update_devel
build/update_stable
+build/update_website_docs
contrib/mbox-to-check
contrib/run-corpora
contrib/run-masses
+COPYRIGHT
+CREDITS
+INSTALL
+INSTALL.VMS
ldap/README
ldap/README.testing
ldap/sa_test.ldif
@@ -46,49 +37,50 @@
lib/Mail/SpamAssassin/HTML.pm
lib/Mail/SpamAssassin/Locales.pm
lib/Mail/SpamAssassin/Locker.pm
-lib/Mail/SpamAssassin/Locker/UnixNFSSafe.pm
lib/Mail/SpamAssassin/Locker/Flock.pm
+lib/Mail/SpamAssassin/Locker/UnixNFSSafe.pm
lib/Mail/SpamAssassin/Locker/Win32.pm
lib/Mail/SpamAssassin/MailingList.pm
lib/Mail/SpamAssassin/Message.pm
-lib/Mail/SpamAssassin/Message/Node.pm
lib/Mail/SpamAssassin/Message/Metadata.pm
lib/Mail/SpamAssassin/Message/Metadata/Received.pm
+lib/Mail/SpamAssassin/Message/Node.pm
lib/Mail/SpamAssassin/NetSet.pm
lib/Mail/SpamAssassin/PerMsgLearner.pm
lib/Mail/SpamAssassin/PerMsgStatus.pm
lib/Mail/SpamAssassin/PersistentAddrList.pm
lib/Mail/SpamAssassin/Plugin.pm
+lib/Mail/SpamAssassin/Plugin/Hashcash.pm
+lib/Mail/SpamAssassin/Plugin/RelayCountry.pm
+lib/Mail/SpamAssassin/Plugin/SPF.pm
lib/Mail/SpamAssassin/Plugin/Test.pm
+lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm
lib/Mail/SpamAssassin/PluginHandler.pm
lib/Mail/SpamAssassin/Reporter.pm
lib/Mail/SpamAssassin/SHA1.pm
lib/Mail/SpamAssassin/SQLBasedAddrList.pm
lib/Mail/SpamAssassin/TextCat.pm
lib/Mail/SpamAssassin/Util.pm
-masses/CORPUS_POLICY
-masses/CORPUS_SUBMIT
-masses/CORPUS_SUBMIT_NIGHTLY
-masses/Makefile
-masses/README
-masses/README.perceptron
-masses/corpora/README
+lib/Mail/SpamAssassin/Util/RegistrarBoundaries.pm
+LICENSE
+MANIFEST This list of files
+MANIFEST.SKIP
masses/corpora/fuzzy-hash-maildir
masses/corpora/mass-find-nonspam
-masses/corpora/remove-tests-from-logs
+masses/corpora/README
masses/corpora/uniq-mailbox
masses/corpora/uniq-maildirs
+masses/CORPUS_POLICY
+masses/CORPUS_SUBMIT
+masses/CORPUS_SUBMIT_NIGHTLY
masses/cpucount
masses/extract-message-from-mbox
masses/find-extremes
masses/fp-fn-statistics
masses/fp-fn-to-tcr
masses/freqdiff
-masses/graphs/gen-score-freqs-gnuplot-table
-masses/graphs/gnuplot-score-graph
masses/hit-frequencies
masses/lint-rules-from-freqs
-masses/logs-to-c
masses/mass-check
masses/mass-check-results-to-mbox
masses/mass-check.cf
@@ -96,31 +88,31 @@
masses/mk-baseline-results
masses/overlap
masses/parse-rules-for-masses
-masses/perceptron.c
masses/post-ga-analysis.pl
-masses/rewrite-cf-with-new-scores
+masses/README
+masses/README.perceptron
masses/rule-dev/maildir-scan-headers
-masses/rule-qa/README.nightly
masses/rule-qa/corpus-hourly
masses/rule-qa/corpus-nightly
masses/rule-qa/corpus-tagtime
masses/rule-qa/markup-rules-file-with-freqs
masses/rule-qa/post-bugs-for-retired-tests
+masses/rule-qa/README.nightly
masses/runGA
-masses/score-ranges-from-freqs
masses/tenpass/10pass-compute-tcr
masses/tenpass/10pass-run
-masses/tenpass/README
masses/tenpass/compute-current-tcr
-masses/tenpass/split-log-into-buckets
-masses/uniq-scores
+masses/tenpass/README
ninjabutton.png
+PACKAGING
procmailrc.example
+README
rules/10_misc.cf
rules/20_anti_ratware.cf
rules/20_body_tests.cf
rules/20_compensate.cf
rules/20_dnsbl_tests.cf
+rules/20_drugs.cf
rules/20_fake_helo_tests.cf
rules/20_head_tests.cf
rules/20_html_tests.cf
@@ -130,63 +122,63 @@
rules/20_ratware.cf
rules/20_uri_tests.cf
rules/23_bayes.cf
+rules/25_body_tests_es.cf
+rules/25_hashcash.cf
+rules/25_spf.cf
+rules/25_uribl.cf
rules/30_text_de.cf
rules/30_text_fr.cf
-rules/50_scores.cf
+rules/30_text_nl.cf
+rules/30_text_pl.cf
rules/60_whitelist.cf
+rules/init.pre
+rules/languages
+rules/local.cf
rules/STATISTICS-set1.txt
rules/STATISTICS-set2.txt
rules/STATISTICS-set3.txt
rules/STATISTICS.txt
-rules/languages
-rules/local.cf
-rules/regression_tests.cf
rules/triplets.txt
rules/user_prefs.template
sa-learn.raw
sample-nonspam.txt
sample-spam.txt
-spamassassin.raw
-spamassassin.spec
-spamc/Makefile.in
-spamc/Makefile.win
-spamc/README.qmail
-spamc/README.win
spamc/acconfig.h
-spamc/config.h.in
-spamc/config.h.win
spamc/configure
spamc/configure.in
spamc/configure.pl
spamc/libspamc.c
spamc/libspamc.h
spamc/qmail-spamc.c
-spamc/replace/README.getopt
+spamc/README.qmail
+spamc/README.win
spamc/replace/getopt.c
spamc/replace/getopt.h
-spamc/spamc.c
-spamc/spamc.pod
+spamc/replace/README.getopt
spamc/utils.c
spamc/utils.h
+spamd/netbsd-rc-script.sh
spamd/README
spamd/README.vpopmail
-spamd/netbsd-rc-script.sh
spamd/redhat-rc-script.sh
spamd/slackware-rc-script.sh
spamd/solaris-rc-script.sh
-spamd/spamd.raw
spamd/suse-rc-script.sh
-sql/README
-sql/README.awl
-sql/README.bayes
sql/awl_mysql.sql
+sql/awl_pg.sql
sql/bayes_mysql.sql
sql/bayes_pg.sql
-t/SATest.pl
-t/SATest.pm
+sql/README
+sql/README.awl
+sql/README.bayes
+sql/userpref_mysql.sql
+sql/userpref_pg.sql
+STATUS
t/basic_lint.t
t/bayesdbm.t
+t/bayesdbm_flock.t
t/bayessql.t
+t/body_mod.t
t/cidrs.t
t/data/etc/hello.txt
t/data/mime-subject.txt
@@ -197,6 +189,14 @@
t/data/nice/005
t/data/nice/006
t/data/nice/007
+t/data/nice/008
+t/data/nice/009
+t/data/nice/010
+t/data/nice/011
+t/data/nice/012
+t/data/nice/013
+t/data/nice/014
+t/data/nice/015
t/data/nice/base64.txt
t/data/nice/mailman_message.txt
t/data/nice/mime1
@@ -208,6 +208,7 @@
t/data/nice/mime7
t/data/nice/mime8
t/data/nice/not_gtube.eml
+t/data/nice/spf1
t/data/spam/001
t/data/spam/002
t/data/spam/003
@@ -219,54 +220,47 @@
t/data/spam/009
t/data/spam/010
t/data/spam/011
+t/data/spam/012
+t/data/spam/013
t/data/spam/badmime.txt
t/data/spam/badmime2.txt
t/data/spam/base64.txt
t/data/spam/bsmtp
+t/data/spam/dnsbl.eml
t/data/spam/gtube.eml
-t/data/whitelists/action.eff.org
-t/data/whitelists/amazon_co_uk_ship
-t/data/whitelists/amazon_com_ship
-t/data/whitelists/cert.org
-t/data/whitelists/debian_bts_reassign
-t/data/whitelists/linuxplanet
-t/data/whitelists/lp.org
-t/data/whitelists/media_unspun
-t/data/whitelists/mlist_mailman_message
-t/data/whitelists/mlist_yahoo_groups_message
-t/data/whitelists/mypoints
-t/data/whitelists/neat_net_tricks
-t/data/whitelists/netcenter-direct_de
-t/data/whitelists/oracle_net_techblast
-t/data/whitelists/orbitz.com
-t/data/whitelists/paypal.com
-t/data/whitelists/register.com_password
-t/data/whitelists/ryanairmail.com
-t/data/whitelists/sf.net
-t/data/whitelists/winxpnews.com
-t/data/whitelists/yahoo-inc.com
t/db_awl_path.t
t/db_based_whitelist.t
t/db_based_whitelist_ips.t
+t/debug.t
t/dnsbl.t
t/forged_rcvd.t
t/gtube.t
+t/hashcash.t
t/html_obfu.t
+t/ip_addrs.t
t/lang_pl_tests.t
t/mimeparse.t
t/nonspam.t
t/plugin.t
+t/prefs_include.t
t/razor2.t
+t/rcvd_parser.t
t/recips.t
+t/report_safe.t
t/reportheader.t
t/reportheader_8bit.t
-t/rule_tests.t
+t/rule_names.t
+t/rule_types.t
+t/SATest.pl
+t/SATest.pm
t/sha1.t
t/spam.t
t/spamc.t
t/spamc_B.t
t/spamc_c.t
t/spamc_c_stdout_closed.t
+t/spamc_E.t
+t/spamc_l.t
t/spamd.t
t/spamd_allow_user_rules.t
t/spamd_hup.t
@@ -280,8 +274,10 @@
t/spamd_report_ifspam.t
t/spamd_stop.t
t/spamd_symbols.t
+t/spamd_syslog.t
t/spamd_unix.t
t/spamd_utf8.t
+t/spf.t
t/sql_based_whitelist.t
t/strip2.t
t/stripmarkup.t
@@ -289,60 +285,19 @@
t/uri.t
t/utf8.t
t/whitelist_addrs.t
+t/whitelist_from.t
t/whitelist_to.t
t/zz_cleanup.t
-tools/README.speedtest
tools/bayes_dump_to_trusted_networks
tools/check_whitelist
tools/convert_awl_dbm_to_sql
tools/desc_length.pl
tools/mboxsplit
+tools/README.speedtest
tools/sa-stats.pl
tools/speedtest
tools/split_corpora
tools/test_extract
tools/triplets.pl
-lib/Mail/SpamAssassin/Constants.pm
-rules/25_uribl.cf
-lib/Mail/SpamAssassin/Plugin/RelayCountry.pm
-lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm
-lib/Mail/SpamAssassin/Plugin/Hashcash.pm
-t/ip_addrs.t
-t/rule_types.t
-sql/awl_pg.sql
-sql/userpref_mysql.sql
-sql/userpref_pg.sql
-t/data/spam/dnsbl.eml
-t/report_safe.t
-rules/20_drugs.cf
-rules/30_text_pl.cf
-t/rcvd_parser.t
-rules/init.pre
-t/hashcash.t
-rules/25_hashcash.cf
-lib/Mail/SpamAssassin/Plugin/SPF.pm
-rules/25_spf.cf
-t/spf.t
-t/data/nice/spf1
-t/data/nice/008
-t/data/nice/009
-t/data/nice/010
-t/data/nice/011
-t/data/nice/012
-t/data/nice/013
-t/data/nice/014
-t/data/nice/015
-t/data/spam/012
-t/data/spam/013
-t/whitelist_from.t
-t/rule_names.t
-rules/25_body_tests_es.cf
-build/update_website_docs
-t/spamd_syslog.t
-t/prefs_include.t
-t/body_mod.t
-t/bayesdbm_flock.t
-t/spamc_E.t
-lib/Mail/SpamAssassin/Util/RegistrarBoundaries.pm
-t/spamc_l.t
-rules/30_text_nl.cf
+TRADEMARK
+USAGE
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/LDAP.pm Mail-
SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/LDAP.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/LDAP.pm
Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/LDAP.pm
Thu May 27 13:30:19 2004
@@ -52,7 +52,7 @@
###########################################################################

sub load_modules { # static
- dbg("LDAP: loading Net::LDAP and URI");
+ dbg("LDAP: loading Net::LDAP and URI", conf => 1);
eval {
require Net::LDAP; # actual server connection
require URI; # parse server connection dsn
@@ -73,9 +73,9 @@
my ($self, $username) = @_;

my $url = $self->{main}->{conf}->{user_scores_dsn}; # an ldap URI
- dbg("LDAP: URL is $url");
+ dbg("LDAP: URL is $url", conf => 1);
if(!defined($url) || $url eq '') {
- dbg ("LDAP: No URL defined; skipping LDAP");
+ dbg ("LDAP: No URL defined; skipping LDAP", conf => 1);
return;
}

@@ -103,7 +103,7 @@

my $host = $uri->host;
if (!defined($host) || $host eq '') {
- dbg("LDAP: No server specified, assuming localhost");
+ dbg("LDAP: No server specified, assuming localhost", conf => 1);
$host = "localhost";
}
my $port = $uri->port;
@@ -114,7 +114,7 @@
my %extn = $uri->extensions; # unused

$filter =~ s/__USERNAME__/$username/g;
- dbg("LDAP: host=$host, port=$port, base='$base', attr=${attr[0]}, scope=$scope, filter='$filter'");
+ dbg("LDAP: host=$host, port=$port, base='$base', attr=${attr[0]}, scope=$scope, filter='$filter'",
conf => 1);

my $main = $self->{main};
my $ldapuser = $main->{conf}->{user_scores_ldap_username};
@@ -123,14 +123,14 @@
if(!$ldapuser) {
undef($ldapuser);
} else {
- dbg("LDAP: user='$ldapuser'");
+ dbg("LDAP: user='$ldapuser'", conf => 1);
}

if(!$ldappass) {
undef($ldappass);
} else {
# don't log this to avoid leaking sensitive info
- # dbg("LDAP: pass='$ldappass'");
+ # dbg("LDAP: pass='$ldappass'", conf => 1);
}

my $f_attribute = $attr[0];
@@ -152,7 +152,7 @@
foreach my $entry ($result->all_entries) {
my @v = $entry->get_value($f_attribute);
foreach my $v (@v) {
- dbg("LDAP: retrieving prefs for $username: $v");
+ dbg("LDAP: retrieving prefs for $username: $v", conf => 1);
$conf .= $v."\n";
}
}
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/SQL.pm Mail-
SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/SQL.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/SQL.pm
Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/SQL.pm
Thu May 27 13:31:55 2004
@@ -88,7 +88,7 @@

my $dsn = $self->{main}->{conf}->{user_scores_dsn};
if(!defined($dsn) || $dsn eq '') {
- dbg ("No DSN defined; skipping sql");
+ dbg ("No DSN defined; skipping sql", conf => 1);
return 1;
}

@@ -140,12 +140,12 @@
"$f_username = ".$dbh->quote($username).
" or $f_username = '\@GLOBAL' order by $f_username asc";
}
- dbg("Conf::SQL: executing SQL: $sql");
+ dbg("Conf::SQL: executing SQL: $sql", conf => 1);
my $sth = $dbh->prepare($sql);
if($sth) {
my $rv = $sth->execute();
if($rv) {
- dbg("retrieving prefs for $username from SQL server");
+ dbg("retrieving prefs for $username from SQL server", conf => 1);
my @row;
my $text = '';
while(@row = $sth->fetchrow_array()) {
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf.pm Mail-SpamAssassin
-3.000000/lib/Mail/SpamAssassin/Conf.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf.pm
Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf.pm
Fri May 21 15:02:45 2004
@@ -391,7 +391,7 @@
my ($self, $set) = @_;
$self->{scores} = $self->{scoreset}->[$set];
$self->{scoreset_current} = $set;
- dbg("Score set $set chosen.");
+ dbg("Score set $set chosen.", conf => 1);
}

sub get_score_set {
@@ -1141,7 +1141,7 @@
if ($self->{lint_rules}) {
warn $msg."\n";
} else {
- dbg ($msg);
+ dbg ($msg, conf => 1);
}
$self->{errors}++;
next;
@@ -1200,7 +1200,7 @@
}

# if we get here, note the issue, then we'll fail through for an error.
- dbg("rewrite_header: ignoring $hdr, not From, Subject, or To");
+ dbg("rewrite_header: ignoring $hdr, not From, Subject, or To", conf => 1);
}

=item fold_headers { 0 | 1 } (default: 1)
@@ -2338,7 +2338,7 @@
if (!$self->{allow_user_rules}) {
goto failed_line;
}
- dbg("Checking privileged commands in user config");
+ dbg("Checking privileged commands in user config", conf => 1);
}

=back
@@ -2374,7 +2374,9 @@

if ( $key eq 'allow_user_rules' ) {
$self->{allow_user_rules} = $value+0;
- dbg( ($self->{allow_user_rules} ? "Allowing":"Not allowing") . " user rules!"); next;
+ dbg( ($self->{allow_user_rules} ? "Allowing":"Not allowing") . " user rules!",
+ conf => 1);
+ next;
}

=item header SYMBOLIC_TEST_NAME header op /pattern/modifiers
[if-unset: STRING]
@@ -3244,7 +3246,7 @@
if ($self->{lint_rules}) {
warn $msg."\n";
} else {
- dbg ($msg);
+ dbg ($msg, conf => 1);
}
$self->{errors}++;
}
@@ -3538,7 +3540,7 @@
if (!File::Spec->file_name_is_absolute ($path)) {
my ($vol, $dirs, $file) = File::Spec->splitpath ($self->{currentfile});
$path = File::Spec->catpath ($vol, $dirs, $path);
- dbg ("plugin: fixed relative path: $path");
+ dbg ("plugin: fixed relative path: $path", conf => 1);
}
return $path;
}
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin.pm Mail-SpamAssassin
-3.000000/lib/Mail/SpamAssassin.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin.pm
Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin.pm
Fri May 21 15:04:57 2004
@@ -224,6 +224,41 @@
Otherwise, the default is taken from the runtime environment (ie. this process'
effective UID under UNIX).

+=item debug
+
+If set to true, debugging is enabled. It is disabled by default.
+
+=item debug_level
+
+Sets debug levels for SpamAssassin debugging operations. The value is
+a hash reference. Following are valid debug set names and their default values.
+
+ {
+ datediff => -1,
+ razor => -3,
+ dcc => 0,
+ pyzor => 0,
+ rbl => 0,
+ dnsavailable => -2,
+ bayes => 0,
+ conf => 1,
+
+ # Bitfield:
+ # header regex: 1
+ # body-text: 2
+ # uri tests: 4
+ # raw-body-text: 8
+ # full-text regexp: 16
+ # run_eval_tests: 32
+ # run_rbl_eval_tests: 64
+ rulesrun => 64,
+ }
+
+A value of zero (C<0>) disables the debug set. If debug levels are
+progressive, use negative numbers. Lowering the debug level B<increases>
+the amount of debugging that will occur. If debug levels are bit fields,
+use positive numbers.
+
=back

If none of C<rules_filename>, C<site_rules_filename>, C<userprefs_filename>, or
@@ -266,10 +301,16 @@
$DEBUG->{rbl}=0;
$DEBUG->{dnsavailable}=-2;
$DEBUG->{bayes}=0;
+ $DEBUG->{conf}=1;
# Bitfield:
# header regex: 1 | body-text: 2 | uri tests: 4 | raw-body-text: 8
# full-text regexp: 16 | run_eval_tests: 32 | run_rbl_eval_tests: 64
$DEBUG->{rulesrun}=64;
+ if ( defined $self->{debug_level} && ref($self->{debug_level}) eq 'HASH' ) {
+ my @dbg_sets = grep { $_ ne 'enabled' } keys %{$DEBUG};
+ my @new_levels = grep { defined $self->{debug_level}->{$_} } @dbg_sets;
+ @{$DEBUG}{@new_levels} = @{$self->{debug_level}}{@new_levels};
+ }

$self->{conf} ||= new Mail::SpamAssassin::Conf ($self);
$self->{plugins} = Mail::SpamAssassin::PluginHandler->new ($self);
diff -Nru Mail-SpamAssassin-3.000000-orig/sa-learn.raw Mail-SpamAssassin-3.000000/sa-learn.raw
--- Mail-SpamAssassin-3.000000-orig/sa-learn.raw Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/sa-learn.raw Thu May 27 13:27:45 2004
@@ -112,9 +112,10 @@
'learnprob=f' => \$opt{'learnprob'},
'randseed=i' => \$opt{'randseed'},

- 'debug-level|D:s' => \$opt{'debug-level'},
- 'version|V' => \$opt{'version'},
- 'help|h|?' => \$opt{'help'},
+ 'debug-level|D:s' => \$opt{'debug-level'},
+ 'debug-set-level=s%' => \$opt{'debug-set-level'},
+ 'version|V' => \$opt{'version'},
+ 'help|h|?' => \$opt{'help'},

'dump:s' => \$opt{'dump'},
'import' => \$opt{'import'},
@@ -186,6 +187,7 @@
site_rules_filename => $opt{'siteconfigpath'},
userprefs_filename => $opt{'prefspath'},
debug => defined( $opt{'debug-level'} ),
+ debug_level => ($opt{'debug-set-level'} || {}),
local_tests_only => 1,
dont_copy_prefs => 1,
PREFIX => $PREFIX,
@@ -518,6 +520,7 @@
-p prefs, --prefspath=file, --prefs-file=file Set user preferences file
--siteconfigpath=path Path for site configs (def: /etc/mail/spamassassin)
-D, --debug-level Print debugging messages
+--debug-set-level name=level Configure debug levels for individual debug sets
-V, --version Print version
-h, --help Print usage message

@@ -835,6 +838,13 @@
=item B<-D>, B<--debug-level>

Produce diagnostic output.
+
+=item B<--debug-set-level> [name=level]
+
+Set debug levels for SpamAssassin debug sets. This allows fine-grained
+control over what code points will debug, and how much.
+
+Review the possible debug sets in L<Mail::SpamAssassin>.

=item B<--no-sync>

diff -Nru Mail-SpamAssassin-3.000000-orig/spamassassin.raw Mail-SpamAssassin-3.000000/
spamassassin.raw
--- Mail-SpamAssassin-3.000000-orig/spamassassin.raw Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/spamassassin.raw Thu May 27 13:27:27 2004
@@ -122,6 +122,7 @@
'test-mode|test|t' => \$opt{'test-mode'},
'lint' => \$opt{'lint'},
'debug-level|debug|D:s' => \$opt{'debug-level'},
+ 'debug-set-level=s%' => \$opt{'debug-set-level'},
'version|V' => \$opt{'version'},
'help|h|?' => \$opt{'help'},
'mbox' => sub { $opt{'format'} = 'mbox'; },
@@ -151,6 +152,7 @@
userprefs_filename => $opt{'prefspath'},
local_tests_only => $opt{'local'},
debug => defined( $opt{'debug-level'} ),
+ debug_level => ($opt{'debug-set-level'} || {}),
dont_copy_prefs => ( $opt{'create-prefs'} ? 0 : 1 ),
PREFIX => $PREFIX,
DEF_RULES_DIR => $DEF_RULES_DIR,
@@ -423,6 +425,8 @@
--add-addr-to-blacklist=addr Add addr to blacklist (AWL)
--remove-addr-from-whitelist=addr Remove addr from whitelist (AWL)
-D, --debug [area=n,...] Print debugging messages
+ --debug-set-level name=level Configure debug levels for individual
+ debug sets
-V, --version Print version
-h, --help Print usage message

@@ -589,6 +593,13 @@
hit, use:

spamassassin -D rulesrun=255
+
+=item B<--debug-set-level> [name=level]
+
+Set debug levels for SpamAssassin debug sets. This allows fine-grained
+control over what code points will debug, and how much.
+
+Review the possible debug sets in L<Mail::SpamAssassin>.

=item B<-x>, B<--nocreate-prefs>

diff -Nru Mail-SpamAssassin-3.000000-orig/t/SATest.pm Mail-SpamAssassin-3.000000/t/SATest.pm
--- Mail-SpamAssassin-3.000000-orig/t/SATest.pm Fri May 21 13:29:31 2004
+++ Mail-SpamAssassin-3.000000/t/SATest.pm Fri May 21 14:53:22 2004
@@ -144,7 +144,9 @@

open (OUT, ">log/tst.cf") or die;
print OUT $lines; close OUT;
- $scr_pref_args = "-p log/tst.cf";
+ $scr_pref_args = "-p log/tst.cf";
+ $salearn_pref_args = "-p log/tst.cf";
+ return "log/tst.cf";
}

# Run spamassassin. Calls back with the output.
diff -Nru Mail-SpamAssassin-3.000000-orig/t/debug.t Mail-SpamAssassin-3.000000/t/debug.t
--- Mail-SpamAssassin-3.000000-orig/t/debug.t Wed Dec 31 19:00:00 1969
+++ Mail-SpamAssassin-3.000000/t/debug.t Thu May 27 13:18:03 2004
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("debug");
+use Test; BEGIN { plan tests => 47 };
+
+# ---------------------------------------------------------------------------
+
+$SIG{__WARN__} = sub {
+ ok $_[0] !~ /Failed to parse line in SpamAssassin configuration/;
+};
+
+my $prefs_file = tstprefs <<__PREFS__;
+header LAST_RCVD_LINE Received =~ /www.fasttrec.com/
+header MESSAGEID_MATCH MESSAGEID =~ /fasttrec.com/
+header ENV_FROM EnvelopeFrom =~ /jm.netnoteinc.com/
+body SUBJ_IN_BODY /YOUR BRAND NEW HOUSE/
+uri URI_RULE /WWW.SUPERSITESCENTRAL.COM/i
+body BODY_LINE_WRAP /making obscene amounts of money from the/
+header RELAYS X-Spam-Relays-Untrusted =~ / helo=www.fasttrec.com /
+heder FOO
+__PREFS__
+
+use Mail::SpamAssassin;
+my $sa = Mail::SpamAssassin->new({
+ site_rules_filename => $prefs_file,
+ debug => 1,
+ debug_level => {
+ conf => 0,
+ },
+})->init;
+
+# Would be nice, but requires STDERR to be caught when calling the program.
+# Portability requires the use of something like IPC::Open3.
+# salearnrun "-D --debug-set-level conf=0 --sync --siteconfigpath=$prefs_file";



------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.