View | Details | Raw Unified | Return to bug 2167
Collapse All | Expand All

(-)Mail-SpamAssassin-2.60-dist/Makefile.PL (-1 / +5 lines)
Lines 90-96 Link Here
90
    'VERSION_FROM' => 'lib/Mail/SpamAssassin.pm', # finds $VERSION
90
    'VERSION_FROM' => 'lib/Mail/SpamAssassin.pm', # finds $VERSION
91
91
92
    'EXE_FILES'	=> [
92
    'EXE_FILES'	=> [
93
			'spamassassin', 'sa-learn',
93
			'spamassassin', 'sa-learn', 'sa-btok-learn',
94
			@SPAMD_EXE_FILES
94
			@SPAMD_EXE_FILES
95
		],
95
		],
96
96
Lines 322-327 Link Here
322
	$(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@
322
	$(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@
323
	$(CHMOD) $(PERM_RWX) $@
323
	$(CHMOD) $(PERM_RWX) $@
324
324
325
sa-btok-learn: sa-btok-learn.raw
326
	$(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@
327
	$(CHMOD) $(PERM_RWX) $@
328
325
spamd/spamd: spamd/spamd.raw
329
spamd/spamd: spamd/spamd.raw
326
	$(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@
330
	$(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@
327
	$(CHMOD) $(PERM_RWX) $@
331
	$(CHMOD) $(PERM_RWX) $@
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Bayes.pm (+152 lines)
Lines 29-34 Link Here
29
29
30
use strict;
30
use strict;
31
use bytes;
31
use bytes;
32
use Sys::Hostname;
33
use File::Path;
34
use File::Spec;
35
use File::Basename;
32
36
33
use Mail::SpamAssassin;
37
use Mail::SpamAssassin;
34
use Mail::SpamAssassin::BayesStore;
38
use Mail::SpamAssassin::BayesStore;
Lines 295-300 Link Here
295
  }
299
  }
296
300
297
  my @toks = @{$self->{tokens}}; delete $self->{tokens};
301
  my @toks = @{$self->{tokens}}; delete $self->{tokens};
302
298
  ($wc, @toks);
303
  ($wc, @toks);
299
}
304
}
300
305
Lines 606-611 Link Here
606
611
607
###########################################################################
612
###########################################################################
608
613
614
sub learn_tokens {
615
  my ($self, $toks, $id, $isspam) = @_;
616
617
  my $ret;
618
619
  eval {
620
    local $SIG{'__DIE__'};      # do not run user die() traps in here
621
622
    my $ok;
623
    if ($self->{main}->{learn_to_journal}) {
624
      $ok = $self->{store}->tie_db_readonly();
625
    } else {
626
      $ok = $self->{store}->tie_db_writable();
627
    }
628
629
    if ($ok) {
630
      $ret = $self->learn_trapped_tokens ($toks, $id, $isspam);
631
632
      if (!$self->{main}->{learn_caller_will_untie}) {
633
        $self->{store}->untie_db();
634
      }
635
    }
636
  };
637
638
  if ($@) {             # if we died, untie the dbs.
639
    my $failure = $@;
640
    $self->{store}->untie_db();
641
    die $failure;
642
  }
643
644
  return $ret;
645
}
646
609
sub learn {
647
sub learn {
610
  my ($self, $isspam, $msg) = @_;
648
  my ($self, $isspam, $msg) = @_;
611
649
Lines 686-691 Link Here
686
  1;
724
  1;
687
}
725
}
688
726
727
sub learn_trapped_tokens {
728
  my ($self, $toks, $id, $isspam) = @_;
729
730
  my $seen = $self->{store}->seen_get($id);
731
732
  if (defined($seen)) {
733
    if (($seen eq 's' && $isspam) || ($seen eq 'h' && !$isspam)) {
734
      dbg ("$id: already learnt correctly, not learning twice");
735
      return;
736
    } elsif ($seen !~ /^[hs]$/) {
737
      warn ("db_seen corrupt: value='$seen' for $id. ignored");
738
    } else {
739
      dbg ("$id: already learnt as opposite, forgetting first");
740
      $self->forget_tokens ($toks, $id);
741
    }
742
  }
743
744
  if ($isspam) {
745
    $self->{store}->nspam_nham_change(1,0);
746
  } else {
747
    $self->{store}->nspam_nham_change(0,1);
748
  }
749
750
  my @tokens = @$toks;
751
  my %seen = ();
752
753
  my $msgatime = time(); # this is sort of incorrect.
754
755
  for (@tokens) {
756
    if ($seen{$_}) { next; } else { $seen{$_} = 1; }
757
758
    if ($isspam) {
759
      $self->{store}->tok_count_change (1, 0, $_, $msgatime);
760
    } else {
761
      $self->{store}->tok_count_change (0, 1, $_, $msgatime);
762
    }
763
  }
764
765
  $self->{store}->seen_put ($id, ($isspam ? 's' : 'h'));
766
  $self->{store}->add_touches_to_journal();
767
  1;
768
}
769
689
###########################################################################
770
###########################################################################
690
771
691
sub forget {
772
sub forget {
Lines 719-724 Link Here
719
  return $ret;
800
  return $ret;
720
}
801
}
721
802
803
sub forget_tokens {
804
  my ($self, $toks, $id) = @_;
805
806
  if (!$self->{conf}->{use_bayes}) { return; }
807
  my $ret;
808
809
  # we still tie for writing here, since we write to the seen db
810
  # synchronously
811
  eval {
812
    local $SIG{'__DIE__'};	# do not run user die() traps in here
813
814
    if ($self->{store}->tie_db_writable()) {
815
      $ret = $self->forget_trapped_tokens ($toks, $id);
816
817
      if (!$self->{main}->{learn_caller_will_untie}) {
818
        $self->{store}->untie_db();
819
      }
820
    }
821
  };
822
823
  if ($@) {		# if we died, untie the dbs.
824
    my $failure = $@;
825
    $self->{store}->untie_db();
826
    die $failure;
827
  }
828
829
  return $ret;
830
}
831
832
722
# this function is trapped by the wrapper above
833
# this function is trapped by the wrapper above
723
sub forget_trapped {
834
sub forget_trapped {
724
  my ($self, $msg, $body) = @_;
835
  my ($self, $msg, $body) = @_;
Lines 750-755 Link Here
750
  my %seen = ();
861
  my %seen = ();
751
  for (@tokens) {
862
  for (@tokens) {
752
    if ($seen{$_}) { next; } else { $seen{$_} = 1; }
863
    if ($seen{$_}) { next; } else { $seen{$_} = 1; }
864
865
    if ($isspam) {
866
      $self->{store}->tok_count_change (-1, 0, $_);
867
    } else {
868
      $self->{store}->tok_count_change (0, -1, $_);
869
    }
870
  }
871
872
  $self->{store}->seen_delete ($msgid);
873
  1;
874
}
875
876
sub forget_trapped_tokens {
877
  my ($self, $toks, $msgid) = @_;
878
879
  my $seen = $self->{store}->seen_get ($msgid);
880
  my $isspam;
881
  if (defined ($seen)) {
882
    if ($seen eq 's') {
883
      $isspam = 1;
884
    } elsif ($seen eq 'h') {
885
      $isspam = 0;
886
    } else {
887
      dbg ("forget: message $msgid seen entry is neither ham nor spam, ignored");
888
      return;
889
    }
890
  } else {
891
    dbg ("forget: message $msgid not learnt, ignored");
892
    return;
893
  }
894
895
  if ($isspam) {
896
    $self->{store}->nspam_nham_change (-1, 0);
897
  } else {
898
    $self->{store}->nspam_nham_change (0, -1);
899
  }
900
901
  my @tokens = @$toks;
902
  my %seen = ();
903
  for (@tokens) {
904
    if ($seen{$_}) { next; } else { $seen{$_} = 1; }
753
905
754
    if ($isspam) {
906
    if ($isspam) {
755
      $self->{store}->tok_count_change (-1, 0, $_);
907
      $self->{store}->tok_count_change (-1, 0, $_);
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesStore.pm (-1 lines)
Lines 136-142 Link Here
136
    dbg ("bayes_path not defined");
136
    dbg ("bayes_path not defined");
137
    return 0;
137
    return 0;
138
  }
138
  }
139
140
  my $path = $main->sed_path ($main->{conf}->{bayes_path});
139
  my $path = $main->sed_path ($main->{conf}->{bayes_path});
141
140
142
  my $found=0;
141
  my $found=0;
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesTokenLog.pm (+49 lines)
Line 0 Link Here
1
=head1 NAME
2
3
Mail::SpamAssassin::BayesTokenLog - per message logging of Bayes Tokens for
4
use in training bayes.
5
6
=head1 SYNOPSIS
7
8
=head1 DESCRIPTION
9
10
=head1 METHODS
11
12
=over 4
13
14
=cut
15
16
package Mail::SpamAssassin::BayesTokenLog;
17
18
use strict;
19
20
use Mail::SpamAssassin;
21
use Mail::SpamAssassin::Conf;
22
23
use vars qw{
24
  @ISA
25
};
26
27
@ISA = qw();
28
29
30
###########################################################################
31
32
sub new {
33
  my $class = shift;
34
  $class = ref($class) || $class;
35
  my ($main) = @_;
36
  my $self = {
37
    'main'              => $main,
38
    'conf'		=> $main->{conf},
39
  };
40
41
  bless ($self, $class);
42
43
  $self;
44
}
45
46
47
###########################################################################
48
49
1;
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Conf.pm (+47 lines)
Lines 2384-2389 Link Here
2384
      $self->{user_scores_sql_field_scope} = $1; next;
2384
      $self->{user_scores_sql_field_scope} = $1; next;
2385
    }
2385
    }
2386
2386
2387
=item state_dir_hash_base field_value
2388
2389
The base path for the state_dir_hash
2390
2391
=cut
2392
    if(/^state_dir_hash_base\s+(\S+)$/) {
2393
      $self->{state_dir_hash_base} = $1; next;
2394
    }
2395
2396
=item use_state_dir_hash field_value
2397
2398
set to 1 to enable
2399
2400
=cut
2401
    if(/^use_state_dir_hash\s+(\S+)$/) {
2402
      $self->{use_state_dir_hash} = $1; next;
2403
    }
2404
2405
=item per_msg_bayes_token_log field_value
2406
2407
set to 1 to enable
2408
2409
=cut
2410
    if(/^per_msg_bayes_token_log\s+(\S+)$/) {
2411
      $self->{per_msg_bayes_token_log} = $1; next;
2412
    }
2413
2414
=item per_msg_bayes_token_dir field_value
2415
2416
set to something like __statedir__/bayes_loken_log
2417
2418
=cut
2419
    if(/^per_msg_bayes_token_dir\s+(\S+)$/) {
2420
      $self->{per_msg_bayes_token_dir} = $1; next;
2421
    }
2422
2423
=item per_msg_bayes_token_retries field_value
2424
2425
number of times to retry for the token file
2426
2427
=cut
2428
    if(/^per_msg_bayes_token_retries\s+(\S+)$/) {
2429
      $self->{per_msg_bayes_token_retries} = $1; next;
2430
    }
2431
2432
2433
2387
###########################################################################
2434
###########################################################################
2388
2435
2389
failed_line:
2436
failed_line:
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/PerMsgStatus.pm (+62 lines)
Lines 112-117 Link Here
112
  $self->{head_only_hits} = 0;
112
  $self->{head_only_hits} = 0;
113
  $self->{hits} = 0;
113
  $self->{hits} = 0;
114
114
115
  my $toks;
116
117
  # Log all bayesian tokens to a file for later training
118
  if ($self->{conf}->{per_msg_bayes_token_log})
119
  {
120
    $toks = join("\n", $self->{main}->{bayes_scanner}->tokenize(
121
      $self->{msg}, $self->{main}->{bayes_scanner}->get_body_from_msg(
122
        $self->{msg})))."\n";
123
  }
124
115
  # Resident Mail::SpamAssassin code will possibly never change score
125
  # Resident Mail::SpamAssassin code will possibly never change score
116
  # sets, even if bayes becomes available.  So we should do a quick check
126
  # sets, even if bayes becomes available.  So we should do a quick check
117
  # to see if we should go from {0,1} to {2,3}.  We of course don't need
127
  # to see if we should go from {0,1} to {2,3}.  We of course don't need
Lines 237-242 Link Here
237
  $report =~ s/\n*$/\n\n/s;
247
  $report =~ s/\n*$/\n\n/s;
238
  $self->{report} = $report;
248
  $self->{report} = $report;
239
249
250
  if ($self->{conf}->{per_msg_bayes_token_log})
251
  {
252
    my $path = $self->{main}->sed_path($self->{conf}->{per_msg_bayes_token_dir});
253
254
    if (! -d $path)
255
    {
256
      dbg("Making (mkdiring) path for token log: $path");
257
      eval { mkpath($path, 0, 0700) } or dbg ("mkdir $path failed: $@ $!");
258
    }
259
  
260
    my $file = $self->get_maildir_file($path);
261
    dbg("Writing token log to file: $file");
262
  
263
    if (!open(F, ">$file"))
264
    {
265
      dbg("Couldn't open file $file for writing of tokens: $!");
266
      return;
267
    }
268
269
    my $hits    = $self->{hits}."\n";
270
    my $is_spam = $self->{is_spam} ? "1\n" : "0\n";
271
    my $from    = $self->{msg}->get_pristine_header('From');
272
    my $date    = $self->{msg}->get_pristine_header('Date');
273
    my $subj    = $self->{msg}->get_pristine_header('Subject');
274
275
    print F $hits;
276
    print F $is_spam;
277
    print F $from;
278
    print F $date;
279
    print F $subj;
280
281
    print F $toks;
282
283
    close(F);
284
  }
240
}
285
}
241
286
242
###########################################################################
287
###########################################################################
Lines 2507-2512 Link Here
2507
  return ($reportfile, \*TMPFILE);
2552
  return ($reportfile, \*TMPFILE);
2508
}
2553
}
2509
2554
2555
sub get_maildir_file {
2556
  my ($self, $dir) = @_;
2557
2558
  my $ctime = time();
2559
  my $pid = $$;
2560
  my $hostname = hostname();
2561
  my $i;
2562
2563
  for ( $i = 0; $i < $self->{conf}->{per_msg_bayes_token_retries}; $i++ ) {
2564
    my $name = $ctime . '.' .$pid . '_' . $i . '.' . $hostname;
2565
    return ("$dir/$name")  if ( ! -e "$dir/$name" );
2566
  }
2567
2568
  return('');  #return undef if it hit the max.
2569
2570
}
2571
2510
###########################################################################
2572
###########################################################################
2511
2573
2512
1;
2574
1;
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/StateDirHash.pm (+61 lines)
Line 0 Link Here
1
=head1 NAME
2
3
Mail::SpamAssassin::StateDirHash - determine StateDir Location
4
5
=head1 SYNOPSIS
6
7
=head1 DESCRIPTION
8
9
=head1 METHODS
10
11
=over 4
12
13
=cut
14
15
package Mail::SpamAssassin::StateDirHash;
16
17
use strict;
18
19
use Mail::SpamAssassin;
20
use Mail::SpamAssassin::Conf;
21
22
use vars qw{
23
  @ISA
24
};
25
26
@ISA = qw();
27
28
29
###########################################################################
30
31
sub new {
32
  my $class = shift;
33
  $class = ref($class) || $class;
34
  my ($main) = @_;
35
  my $self = {
36
    'main'              => $main,
37
    'conf'		=> $main->{conf},
38
  };
39
40
  bless ($self, $class);
41
42
  $self;
43
}
44
45
sub get_state_dir {
46
  my ($self, $user) = @_;
47
48
  my $state_dir = '';
49
  
50
  if ( $user =~ /^(.)(.)/ ) {
51
    $state_dir = $self->{conf}->{state_dir_hash_base} . "/$1/$2/$user/.spamassassin";
52
  }
53
54
  return ($state_dir);
55
}  
56
  
57
 
58
59
###########################################################################
60
61
1;
(-)Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin.pm (-2 / +14 lines)
Lines 58-63 Link Here
58
use 5.005;
58
use 5.005;
59
59
60
use Mail::SpamAssassin::Conf;
60
use Mail::SpamAssassin::Conf;
61
use Mail::SpamAssassin::StateDirHash;
61
use Mail::SpamAssassin::ConfSourceSQL;
62
use Mail::SpamAssassin::ConfSourceSQL;
62
use Mail::SpamAssassin::PerMsgStatus;
63
use Mail::SpamAssassin::PerMsgStatus;
63
use Mail::SpamAssassin::NoMailAudit;
64
use Mail::SpamAssassin::NoMailAudit;
Lines 1263-1273 Link Here
1263
1264
1264
  # user state directory
1265
  # user state directory
1265
  my $fname = $self->{userstate_dir};
1266
  my $fname = $self->{userstate_dir};
1267
1268
  # get statedir hash from module if the config says so
1269
  if ($self->{conf}->{use_state_dir_hash})
1270
  {
1271
    my $sdh = Mail::SpamAssassin::StateDirHash->new($self);
1272
    my $dir = $sdh->get_state_dir($self->{username});
1273
1274
    unshift(@default_userstate_dir, $dir);
1275
  }
1276
1266
  $fname ||= $self->first_existing_path (@default_userstate_dir);
1277
  $fname ||= $self->first_existing_path (@default_userstate_dir);
1267
1278
1268
  # If vpopmail is enabled then set fname to virtual homedir
1279
  # If vpopmail is enabled then set fname to virtual homedir
1269
  #
1280
  #
1270
  if (defined $self->{user_dir}) {
1281
  if (!$self->{conf}->{use_state_dir_hash} && defined $self->{user_dir}) {
1271
    $fname = File::Spec->catdir ($self->{user_dir}, ".spamassassin");
1282
    $fname = File::Spec->catdir ($self->{user_dir}, ".spamassassin");
1272
  }
1283
  }
1273
1284
Lines 1374-1380 Link Here
1374
  $path =~ s/__local_rules_dir__/$self->{LOCAL_RULES_DIR} || ''/ges;
1385
  $path =~ s/__local_rules_dir__/$self->{LOCAL_RULES_DIR} || ''/ges;
1375
  $path =~ s/__def_rules_dir__/$self->{DEF_RULES_DIR} || ''/ges;
1386
  $path =~ s/__def_rules_dir__/$self->{DEF_RULES_DIR} || ''/ges;
1376
  $path =~ s{__prefix__}{$self->{PREFIX} || $Config{prefix} || '/usr'}ges;
1387
  $path =~ s{__prefix__}{$self->{PREFIX} || $Config{prefix} || '/usr'}ges;
1377
  $path =~ s{__userstate__}{$self->get_and_create_userstate_dir()}ges;
1388
  $path =~ s/__userstate__/$self->get_and_create_userstate_dir()/ges;
1378
  $path =~ s/^\~([^\/]*)/$self->expand_name($1)/es;
1389
  $path =~ s/^\~([^\/]*)/$self->expand_name($1)/es;
1379
1390
1380
  return Mail::SpamAssassin::Util::untaint_file_path ($path);
1391
  return Mail::SpamAssassin::Util::untaint_file_path ($path);
Lines 1383-1388 Link Here
1383
sub first_existing_path {
1394
sub first_existing_path {
1384
  my $self = shift;
1395
  my $self = shift;
1385
  my $path;
1396
  my $path;
1397
1386
  foreach my $p (@_) {
1398
  foreach my $p (@_) {
1387
    $path = $self->sed_path ($p);
1399
    $path = $self->sed_path ($p);
1388
    if (defined $path && -e $path) { return $path; }
1400
    if (defined $path && -e $path) { return $path; }
(-)Mail-SpamAssassin-2.60-dist/rules/local.cf (+1 lines)
Lines 9-11 Link Here
9
# report_safe 1
9
# report_safe 1
10
# trusted_networks 212.17.35.
10
# trusted_networks 212.17.35.
11
11
12
state_dir_hash_base	/tmp
(-)Mail-SpamAssassin-2.60-dist/sa-btok-learn.raw (+94 lines)
Line 0 Link Here
1
#!/usr/bin/perl -w
2
3
use strict;
4
use bytes;
5
6
use Mail::SpamAssassin;
7
use Mail::SpamAssassin::Bayes;
8
use Mail::SpamAssassin::PerMsgLearner;
9
10
# create the tester factory
11
my $spamtest = new Mail::SpamAssassin ({
12
		rules_filename      => 0,
13
		userprefs_filename  => 0, # perhaps use later
14
		debug               => 0,
15
		local_tests_only    => 1,
16
		dont_copy_prefs     => 1,
17
		});
18
19
$spamtest->init (1);
20
21
$spamtest->init_learner({
22
		force_expire      => 0,
23
		learn_to_journal  => 0,
24
		wait_for_lock     => 1,
25
		caller_will_untie => 1
26
		});
27
28
# sync the journal first if we're going to go r/w so we make sure to
29
# learn everything before doing anything else.
30
#
31
$spamtest->rebuild_learner_caches();
32
33
my $processed = 0;
34
35
while (<>)
36
{
37
	my @a = split(/\s/, $_);
38
	&do($a[0], $a[1]);
39
	$processed++;
40
}
41
42
print "Learned from $processed messages.\n";
43
44
$spamtest->finish_learner();
45
exit(0);
46
47
sub do {
48
	my ($file, $isspam) = @_;
49
50
	# message ID is the last directory piece (the filename)
51
	my @id = split(/\//, $file);
52
	my $id = $id[scalar(@id)-1];
53
54
	my @toks;
55
56
	if (!open (F, $file))
57
	{
58
		warn "Couldn't open file $file for reading of tokens: $!";
59
	} else {
60
61
		# always ignore the first 6 lines.
62
		<F>;
63
		<F>;
64
		<F>;
65
		<F>;
66
		<F>;
67
		<F>;
68
69
		# copy out the tokens
70
		while (<F>)
71
		{
72
			chomp;
73
			push (@toks, $_);
74
		}
75
76
		close(F);
77
78
		eval {
79
			my $status = &learn_tokens(\@toks, $id, $isspam);
80
		};
81
82
		if ($@)
83
		{
84
			print "Couldn't learn tokens out of file $file: $@";
85
		}
86
	}
87
}
88
89
sub learn_tokens
90
{
91
	my ($toks, $id, $isspam) = @_;
92
93
	$spamtest->{bayes_scanner}->learn_tokens($toks, $id, $isspam);
94
}
(-)Mail-SpamAssassin-2.60-dist/spamd/spamd.raw (+3 lines)
Lines 105-110 Link Here
105
  'vpopmail!'                   => \$opt{'vpopmail'},
105
  'vpopmail!'                   => \$opt{'vpopmail'},
106
    'v'                         => \$opt{'vpopmail'},
106
    'v'                         => \$opt{'vpopmail'},
107
  'configpath|C=s'              => \$opt{'configpath'},
107
  'configpath|C=s'              => \$opt{'configpath'},
108
  'use-statedir-hash'           => \$opt{'use_statedir_hash'},
109
    'U'                         => \$opt{'use_statedir_hash'},
108
  'user-config'                 => \$opt{'user-config'},
110
  'user-config'                 => \$opt{'user-config'},
109
    'nouser-config|x'           => sub{ $opt{'user-config'} = 0 },
111
    'nouser-config|x'           => sub{ $opt{'user-config'} = 0 },
110
  'allowed-ips|A=s'             => \@{$opt{'allowed-ip'}},
112
  'allowed-ips|A=s'             => \@{$opt{'allowed-ip'}},
Lines 222-227 Link Here
222
  rules_filename       => ($opt{'configpath'} || 0),
224
  rules_filename       => ($opt{'configpath'} || 0),
223
  local_tests_only     => ($opt{'local'} || 0),
225
  local_tests_only     => ($opt{'local'} || 0),
224
  debug                => ($opt{'debug'} || 0),
226
  debug                => ($opt{'debug'} || 0),
227
  use_statedir_hash    => ($opt{'use_statedir_hash'} || 0),
225
  paranoid             => ($opt{'paranoid'} || 0),
228
  paranoid             => ($opt{'paranoid'} || 0),
226
  home_dir_for_helpers => (defined $opt{'home_dir_for_helpers'} ? $opt{'home_dir_for_helpers'} : $orighome),
229
  home_dir_for_helpers => (defined $opt{'home_dir_for_helpers'} ? $opt{'home_dir_for_helpers'} : $orighome),
227
  PREFIX               => $PREFIX,
230
  PREFIX               => $PREFIX,

Return to bug 2167