]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Config.pm
Allow the default sendmail options to be specified in the config file;
[debbugs.git] / Debbugs / Config.pm
1 # This module is part of debbugs, and is released
2 # under the terms of the GPL version 2, or any later
3 # version at your option.
4 # See the file README and COPYING for more information.
5 #
6 # Copyright 2007 by Don Armstrong <don@donarmstrong.com>.
7
8 package Debbugs::Config;
9
10 =head1 NAME
11
12 Debbugs::Config -- Configuration information for debbugs
13
14 =head1 SYNOPSIS
15
16  use Debbugs::Config;
17
18 # to get the compatiblity interface
19
20  use Debbugs::Config qw(:globals);
21
22 =head1 DESCRIPTION
23
24 This module provides configuration variables for all of debbugs.
25
26 =head1 CONFIGURATION FILES
27
28 The default configuration file location is /etc/debbugs/config; this
29 configuration file location can be set by modifying the
30 DEBBUGS_CONFIG_FILE env variable to point at a different location.
31
32 =cut
33
34 use warnings;
35 use strict;
36 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT $USING_GLOBALS %config);
37 use base qw(Exporter);
38
39 BEGIN {
40      # set the version for version checking
41      $VERSION     = 1.00;
42      $DEBUG = 0 unless defined $DEBUG;
43      $USING_GLOBALS = 0;
44
45      @EXPORT = ();
46      %EXPORT_TAGS = (globals => [qw($gEmailDomain $gListDomain $gWebHost $gWebHostBugDir),
47                                  qw($gWebDomain $gHTMLSuffix $gCGIDomain $gMirrors),
48                                  qw($gPackagePages $gSubscriptionDomain $gProject $gProjectTitle),
49                                  qw($gMaintainer $gMaintainerWebpage $gMaintainerEmail $gUnknownMaintainerEmail),
50                                  qw($gSubmitList $gMaintList $gQuietList $gForwardList),
51                                  qw($gDoneList $gRequestList $gSubmitterList $gControlList),
52                                  qw($gStrongList),
53                                  qw($gBugSubscriptionDomain),
54                                  qw($gPackageVersionRe),
55                                  qw($gSummaryList $gMirrorList $gMailer $gBug),
56                                  qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity),
57                                  qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir),
58                                  qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile),
59                                  qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource),
60                                  qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap),
61                                  qw($gVersionTimeIndex),
62                                  qw($gSimpleVersioning),
63                                  qw($gCVETracker),
64                                  qw($gSendmail @gSendmailArguments $gLibPath $gSpamScan @gExcludeFromControl),
65                                  qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities),
66                                  qw(%gTagsSingleLetter),
67                                  qw(%gSearchEstraier),
68                                  qw(%gDistributionAliases),
69                                  qw(%gObsoleteSeverities),
70                                  qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures),
71                                  qw(@gRemovalStrongSeverityDefaultDistributionTags),
72                                  qw(@gAffectsDistributionTags),
73                                  qw(@gDefaultArchitectures),
74                                  qw($gMachineName),
75                                  qw($gTemplateDir),
76                                  qw($gDefaultPackage),
77                                  qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb),
78                                 ],
79                      text     => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote),
80                                  ],
81                      config   => [qw(%config)],
82                     );
83      @EXPORT_OK = ();
84      Exporter::export_ok_tags(qw(globals text config));
85      $EXPORT_TAGS{all} = [@EXPORT_OK];
86      $ENV{HOME} = '' if not defined $ENV{HOME};
87 }
88
89 use File::Basename qw(dirname);
90 use IO::File;
91 use Safe;
92
93 =head1 CONFIGURATION VARIABLES
94
95 =head2 General Configuration
96
97 =over
98
99 =cut
100
101 # read in the files;
102 %config = ();
103 # untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
104 # This enables us to test things that are -T.
105 if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
106      if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] = $<) {
107           $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
108           $ENV{DEBBUGS_CONFIG_FILE} = $1;
109      }
110      else {
111           die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
112      }
113 }
114 read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
115
116 =item email_domain $gEmailDomain
117
118 The email domain of the bts
119
120 =cut
121
122 set_default(\%config,'email_domain','bugs.something');
123
124 =item list_domain $gListDomain
125
126 The list domain of the bts, defaults to the email domain
127
128 =cut
129
130 set_default(\%config,'list_domain',$config{email_domain});
131
132 =item web_host $gWebHost
133
134 The web host of the bts; defaults to the email domain
135
136 =cut
137
138 set_default(\%config,'web_host',$config{email_domain});
139
140 =item web_host_bug_dir $gWebHostDir
141
142 The directory of the web host on which bugs are kept, defaults to C<''>
143
144 =cut
145
146 set_default(\%config,'web_host_bug_dir','');
147
148 =item web_domain $gWebDomain
149
150 Full path of the web domain where bugs are kept, defaults to the
151 concatenation of L</web_host> and L</web_host_bug_dir>
152
153 =cut
154
155 set_default(\%config,'web_domain',$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir});
156
157 =item html_suffix $gHTMLSuffix
158
159 Suffix of html pages, defaults to .html
160
161 =cut
162
163 set_default(\%config,'html_suffix','.html');
164
165 =item cgi_domain $gCGIDomain
166
167 Full path of the web domain where cgi scripts are kept. Defaults to
168 the concatentation of L</web_host> and cgi.
169
170 =cut
171
172 set_default(\%config,'cgi_domain',$config{web_domain}.($config{web_domain}=~m{/$}?'':'/').'cgi');
173
174 =item mirrors @gMirrors
175
176 List of mirrors [What these mirrors are used for, no one knows.]
177
178 =cut
179
180
181 set_default(\%config,'mirrors',[]);
182
183 =item package_pages  $gPackagePages
184
185 Domain where the package pages are kept; links should work in a
186 package_pages/foopackage manner. Defaults to undef, which means that
187 package links will not be made.
188
189 =cut
190
191
192 set_default(\%config,'package_pages',undef);
193
194 =item package_pages  $gUsertagPackageDomain
195
196 Domain where where usertags of packages belong; defaults to $gPackagePages
197
198 =cut
199
200 set_default(\%config,'usertag_package_domain',$config{package_pages});
201
202
203 =item subscription_domain $gSubscriptionDomain
204
205 Domain where subscriptions to package lists happen
206
207 =cut
208
209 set_default(\%config,'subscription_domain',undef);
210
211
212 =item cve_tracker $gCVETracker
213
214 URI to CVE security tracker; in bugreport.cgi, CVE-2001-0002 becomes
215 linked to http://$config{cve_tracker}CVE-2001-002
216
217 Default: security-tracker.debian.org/tracker/
218
219 =cut
220
221 set_default(\%config,'cve_tracker','security-tracker.debian.org/tracker/');
222
223
224 =back
225
226 =cut
227
228
229 =head2 Project Identification
230
231 =over
232
233 =item project $gProject
234
235 Name of the project
236
237 Default: 'Something'
238
239 =cut
240
241 set_default(\%config,'project','Something');
242
243 =item project_title $gProjectTitle
244
245 Name of this install of Debbugs, defaults to "L</project> Debbugs Install"
246
247 Default: "$config{project} Debbugs Install"
248
249 =cut
250
251 set_default(\%config,'project_title',"$config{project} Debbugs Install");
252
253 =item maintainer $gMaintainer
254
255 Name of the maintainer of this debbugs install
256
257 Default: 'Local DebBugs Owner's
258
259 =cut
260
261 set_default(\%config,'maintainer','Local DebBugs Owner');
262
263 =item maintainer_webpage $gMaintainerWebpage
264
265 Webpage of the maintainer of this install of debbugs
266
267 Default: "$config{web_domain}/~owner"
268
269 =cut
270
271 set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner");
272
273 =item maintainer_email $gMaintainerEmail
274
275 Email address of the maintainer of this Debbugs install
276
277 Default: 'root@'.$config{email_domain}
278
279 =cut
280
281 set_default(\%config,'maintainer_email','root@'.$config{email_domain});
282
283 =item unknown_maintainer_email
284
285 Email address where packages with an unknown maintainer will be sent
286
287 Default: $config{maintainer_email}
288
289 =cut
290
291 set_default(\%config,'unknown_maintainer_email',$config{maintainer_email});
292
293 =item machine_name
294
295 The name of the machine that this instance of debbugs is running on
296 (currently used for debbuging purposes and web page output.)
297
298 Default: qx(hostname --fqdn)
299
300 =back
301
302 =cut
303
304 my $_old_path = $ENV{PATH};
305 $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
306 my $temp_hostname = qx(hostname --fqdn);
307 chomp $temp_hostname;
308 set_default(\%config,'machine_name',$temp_hostname);
309 $ENV{PATH} = $_old_path;
310
311 =head2 BTS Mailing Lists
312
313
314 =over
315
316 =item submit_list
317
318 =item maint_list
319
320 =item forward_list
321
322 =item done_list
323
324 =item request_list
325
326 =item submitter_list
327
328 =item control_list
329
330 =item summary_list
331
332 =item mirror_list
333
334 =item strong_list
335
336 =cut
337
338 set_default(\%config,   'submit_list',   'bug-submit-list');
339 set_default(\%config,    'maint_list',    'bug-maint-list');
340 set_default(\%config,    'quiet_list',    'bug-quiet-list');
341 set_default(\%config,  'forward_list',  'bug-forward-list');
342 set_default(\%config,     'done_list',     'bug-done-list');
343 set_default(\%config,  'request_list',  'bug-request-list');
344 set_default(\%config,'submitter_list','bug-submitter-list');
345 set_default(\%config,  'control_list',  'bug-control-list');
346 set_default(\%config,  'summary_list',  'bug-summary-list');
347 set_default(\%config,   'mirror_list',   'bug-mirror-list');
348 set_default(\%config,   'strong_list',   'bug-strong-list');
349
350 =item bug_subscription_domain
351
352 Domain of list for messages regarding a single bug; prefixed with
353 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
354 disable sending messages to the bug subscription list.
355
356 Default: list_domain
357
358 =back
359
360 =cut
361
362 set_default(\%config,'bug_subscription_domain',$config{list_domain});
363
364
365 =head2 Misc Options
366
367 =over
368
369 =item mailer
370
371 Name of the mailer to use
372
373 Default: exim
374
375 =cut
376
377 set_default(\%config,'mailer','exim');
378
379
380 =item bug
381
382 Default: bug
383
384 =item ubug
385
386 Default: ucfirst($config{bug});
387
388 =item bugs
389
390 Default: bugs
391
392 =item ubugs
393
394 Default: ucfirst($config{ubugs});
395
396 =cut
397
398 set_default(\%config,'bug','bug');
399 set_default(\%config,'ubug',ucfirst($config{bug}));
400 set_default(\%config,'bugs','bugs');
401 set_default(\%config,'ubugs',ucfirst($config{bugs}));
402
403 =item remove_age
404
405 Age at which bugs are archived/removed
406
407 Default: 28
408
409 =cut
410
411 set_default(\%config,'remove_age',28);
412
413 =item save_old_bugs
414
415 Whether old bugs are saved or deleted
416
417 Default: 1
418
419 =cut
420
421 set_default(\%config,'save_old_bugs',1);
422
423 =item distribution_aliases
424
425 Map of distribution aliases to the distribution name
426
427 Default:
428          {experimental => 'experimental',
429           unstable     => 'unstable',
430           testing      => 'testing',
431           stable       => 'stable',
432           oldstable    => 'oldstable',
433           sid          => 'unstable',
434           lenny        => 'testing',
435           etch         => 'stable',
436           sarge        => 'oldstable',
437          }
438
439 =cut
440
441 set_default(\%config,'distribution_aliases',
442             {experimental => 'experimental',
443              unstable     => 'unstable',
444              testing      => 'testing',
445              stable       => 'stable',
446              oldstable    => 'oldstable',
447              sid          => 'unstable',
448              lenny        => 'testing',
449              etch         => 'stable',
450              sarge        => 'oldstable',
451             },
452            );
453
454
455
456 =item distributions
457
458 List of valid distributions
459
460 Default: The values of the distribution aliases map.
461
462 =cut
463
464 my %_distributions_default;
465 @_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}};
466 set_default(\%config,'distributions',[keys %_distributions_default]);
467
468
469 =item default_architectures
470
471 List of default architectures to use when architecture(s) are not
472 specified
473
474 Default: i386 amd64 arm ppc sparc alpha
475
476 =cut
477
478 set_default(\%config,'default_architectures',
479             [qw(i386 amd64 arm powerpc sparc alpha)]
480            );
481
482 =item affects_distribution_tags
483
484 List of tags which restrict the buggy state to a set of distributions.
485
486 The set of distributions that are buggy is the intersection of the set
487 of distributions that would be buggy without reference to these tags
488 and the set of these tags that are distributions which are set on a
489 bug.
490
491 Setting this to [] will remove this feature.
492
493 Default: @{$config{distributions}}
494
495 =cut
496
497 set_default(\%config,'affects_distribution_tags',
498             [@{$config{distributions}}],
499            );
500
501 =item removal_unremovable_tags
502
503 Bugs which have these tags set cannot be archived
504
505 Default: []
506
507 =cut
508
509 set_default(\%config,'removal_unremovable_tags',
510             [],
511            );
512
513 =item removal_distribution_tags
514
515 Tags which specifiy distributions to check
516
517 Default: @{$config{distributions}}
518
519 =cut
520
521 set_default(\%config,'removal_distribution_tags',
522             [@{$config{distributions}}]);
523
524 =item removal_default_distribution_tags
525
526 For removal/archival purposes, all bugs are assumed to have these tags
527 set.
528
529 Default: qw(unstable testing);
530
531 =cut
532
533 set_default(\%config,'removal_default_distribution_tags',
534             [qw(unstable testing)]
535            );
536
537 =item removal_strong_severity_default_distribution_tags
538
539 For removal/archival purposes, all bugs with strong severity are
540 assumed to have these tags set.
541
542 Default: qw(unstable testing stable);
543
544 =cut
545
546 set_default(\%config,'removal_strong_severity_default_distribution_tags',
547             [qw(unstable testing stable)]
548            );
549
550
551 =item removal_architectures
552
553 For removal/archival purposes, these architectures are consulted if
554 there is more than one architecture applicable. If the bug is in a
555 package not in any of these architectures, the architecture actually
556 checked is undefined.
557
558 Default: value of default_architectures
559
560 =cut
561
562 set_default(\%config,'removal_architectures',
563             $config{default_architectures},
564            );
565
566
567 =item package_name_re
568
569 The regex which will match a package name
570
571 Default: '[a-z0-9][a-z0-9\.+-]+'
572
573 =cut
574
575 set_default(\%config,'package_name_re',
576             '[a-z0-9][a-z0-9\.+-]+');
577
578 =item package_version_re
579
580 The regex which will match a package version
581
582 Default: '[A-Za-z0-9:+\.-]+'
583
584 =cut
585
586
587 set_default(\%config,'package_version_re',
588             '[A-Za-z0-9:+\.~-]+');
589
590
591 =item default_package
592
593 This is the name of the default package. If set, bugs assigned to
594 packages without a maintainer and bugs missing a Package: psuedoheader
595 will be assigned to this package instead.
596
597 Defaults to unset, which is the traditional debbugs behavoir
598
599 =cut
600
601 set_default(\%config,'default_package',
602             undef
603            );
604
605
606 =item control_internal_requester
607
608 This address is used by Debbugs::Control as the request address which
609 sent a control request for faked log messages.
610
611 Default:"Debbugs Internal Request <$config{maintainer_email}>"
612
613 =cut
614
615 set_default(\%config,'control_internal_requester',
616             "Debbugs Internal Request <$config{maintainer_email}>",
617            );
618
619 =item control_internal_request_addr
620
621 This address is used by Debbugs::Control as the address to which a
622 faked log message request was sent.
623
624 Default: "internal_control\@$config{email_domain}";
625
626 =cut
627
628 set_default(\%config,'control_internal_request_addr',
629             'internal_control@'.$config{email_domain},
630            );
631
632
633 =item exclude_from_control
634
635 Addresses which are not allowed to send messages to control
636
637 =cut
638
639 set_default(\%config,'exclude_from_control',[]);
640
641
642
643 =item default_severity
644
645 The default severity of bugs which have no severity set
646
647 Default: normal
648
649 =cut
650
651 set_default(\%config,'default_severity','normal');
652
653 =item severity_display
654
655 A hashref of severities and the informative text which describes them.
656
657 Default:
658
659  {critical => "Critical $config{bugs}",
660   grave    => "Grave $config{bugs}",
661   normal   => "Normal $config{bugs}",
662   wishlist => "Wishlist $config{bugs}",
663  }
664
665 =cut
666
667 set_default(\%config,'severity_display',{critical => "Critical $config{bugs}",
668                                          grave    => "Grave $config{bugs}",
669                                          serious  => "Serious $config{bugs}",
670                                          important=> "Important $config{bugs}",
671                                          normal   => "Normal $config{bugs}",
672                                          minor    => "Minor $config{bugs}",
673                                          wishlist => "Wishlist $config{bugs}",
674                                         });
675
676 =item show_severities
677
678 A scalar list of the severities to show
679
680 Defaults to the concatenation of the keys of the severity_display
681 hashlist with ', ' above.
682
683 =cut
684
685 set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}}));
686
687 =item strong_severities
688
689 An arrayref of the serious severities which shoud be emphasized
690
691 Default: [qw(critical grave)]
692
693 =cut
694
695 set_default(\%config,'strong_severities',[qw(critical grave)]);
696
697 =item severity_list
698
699 An arrayref of a list of the severities
700
701 Defaults to the keys of the severity display hashref
702
703 =cut
704
705 set_default(\%config,'severity_list',[keys %{$config{severity_display}}]);
706
707 =item obsolete_severities
708
709 A hashref of obsolete severities with the replacing severity
710
711 Default: {}
712
713 =cut
714
715 set_default(\%config,'obsolete_severities',{});
716
717 =item tags
718
719 An arrayref of the tags used
720
721 Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also
722 includes the distributions.
723
724 =cut
725
726 set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed),
727                              @{$config{distributions}}
728                             ]);
729
730 set_default(\%config,'tags_single_letter',
731             {patch => '+',
732              wontfix => '',
733              moreinfo => 'M',
734              unreproducible => 'R',
735              fixed   => 'F',
736             }
737            );
738
739 set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'.
740             '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'.
741             '^mail.*agent|^tcpmail|^bitmail|^mailman');
742
743 set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'));
744 set_default(\%config,'spool_dir','/var/lib/debbugs/spool');
745
746 =item usertag_dir
747
748 Directory which contains the usertags
749
750 Default: $config{spool_dir}/user
751
752 =cut
753
754 set_default(\%config,'usertag_dir',$config{spool_dir}.'/user');
755 set_default(\%config,'incoming_dir','incoming');
756 set_default(\%config,'web_dir','/var/lib/debbugs/www');
757 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
758 set_default(\%config,'lib_path','/usr/lib/debbugs');
759
760
761 =item template_dir
762
763 directory of templates; defaults to /usr/share/debbugs/templates.
764
765 =cut
766
767 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
768
769
770 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
771 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
772 set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers');
773 set_default(\%config,'source_maintainer_file_override',undef);
774 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers');
775 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
776 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
777
778
779 =item simple_versioning
780
781 If true this causes debbugs to ignore version information and just
782 look at whether a bug is done or not done. Primarily of interest for
783 debbugs installs which don't track versions. defaults to false.
784
785 =cut
786
787 set_default(\%config,'simple_versioning',0);
788
789
790 =item version_packages_dir
791
792 Location where the version package information is kept; defaults to
793 spool_dir/../versions/pkg
794
795 =cut
796
797 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
798
799 =item version_time_index
800
801 Location of the version/time index file. Defaults to
802 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
803 exists; otherwise defaults to undef.
804
805 =cut
806
807
808 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
809
810 =item version_index
811
812 Location of the version index file. Defaults to
813 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
814 exists; otherwise defaults to undef.
815
816 =cut
817
818 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
819
820 =item binary_source_map
821
822 Location of the binary -> source map. Defaults to
823 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
824 exists; otherwise defaults to undef.
825
826 =cut
827
828 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
829
830 =item source_binary_map
831
832 Location of the source -> binary map. Defaults to
833 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
834 exists; otherwise defaults to undef.
835
836 =cut
837
838 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
839
840
841
842 set_default(\%config,'post_processall',[]);
843
844 =item sendmail
845
846 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
847
848 =cut
849
850 set_default(\%config,'sendmail','/usr/lib/sendmail');
851
852 =item sendmail_arguments
853
854 Default arguments to pass to sendmail. Defaults to C<qw(-oem -oi)>.
855
856 =cut
857
858 set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]);
859
860 =item spam_scan
861
862 Whether or not spamscan is being used; defaults to 0 (not being used
863
864 =cut
865
866 set_default(\%config,'spam_scan',0);
867
868 =item spam_crossassassin_db
869
870 Location of the crosassassin database, defaults to
871 spool_dir/../CrossAssassinDb
872
873 =cut
874
875 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
876
877 =item spam_max_cross
878
879 Maximum number of cross-posted messages
880
881 =cut
882
883 set_default(\%config,'spam_max_cross',6);
884
885
886 =item spam_spams_per_thread
887
888 Number of spams for each thread (on average). Defaults to 200
889
890 =cut
891
892 set_default(\%config,'spam_spams_per_thread',200);
893
894 =item spam_max_threads
895
896 Maximum number of threads to start. Defaults to 20
897
898 =cut
899
900 set_default(\%config,'spam_max_threads',20);
901
902 =item spam_keep_running
903
904 Maximum number of seconds to run without restarting. Defaults to 3600.
905
906 =cut
907
908 set_default(\%config,'spam_keep_running',3600);
909
910 =item spam_mailbox
911
912 Location to store spam messages; is run through strftime to allow for
913 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
914
915 =cut
916
917 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
918
919 =item spam_crossassassin_mailbox
920
921 Location to store crossassassinated messages; is run through strftime
922 to allow for %d,%m,%Y, et al. Defaults to
923 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
924
925 =cut
926
927 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
928
929 =item spam_local_tests_only
930
931 Whether only local tests are run, defaults to 0
932
933 =cut
934
935 set_default(\%config,'spam_local_tests_only',0);
936
937 =item spam_user_prefs
938
939 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
940
941 =cut
942
943 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
944
945 =item spam_rules_dir
946
947 Site rules directory for spamassassin, defaults to
948 '/usr/share/spamassassin'
949
950 =cut
951
952 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
953
954 =back
955
956
957 =head2 Text Fields
958
959 The following are the only text fields in general use in the scripts;
960 a few additional text fields are defined in text.in, but are only used
961 in db2html and a few other specialty scripts.
962
963 Earlier versions of debbugs defined these values in /etc/debbugs/text,
964 but now they are required to be in the configuration file. [Eventually
965 the longer ones will move out into a fully fledged template system.]
966
967 =cut
968
969 =over
970
971 =item bad_email_prefix
972
973 This prefixes the text of all lines in a bad e-mail message ack.
974
975 =cut
976
977 set_default(\%config,'bad_email_prefix','');
978
979
980 =item text_instructions
981
982 This gives more information about bad e-mails to receive.in
983
984 =cut
985
986 set_default(\%config,'text_instructions',$config{bad_email_prefix});
987
988 =item html_tail
989
990 This shows up at the end of (most) html pages
991
992 In many pages this has been replaced by the html/tail template.
993
994 =cut
995
996 set_default(\%config,'html_tail',<<END);
997  <ADDRESS>$config{maintainer} &lt;<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>&gt;.
998  Last modified:
999  <!--timestamp-->
1000  SUBSTITUTE_DTIME
1001  <!--timestamp-->
1002  <P>
1003  <A HREF=\"http://$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1004  Copyright (C) 1999 Darren O. Benham,
1005  1997,2003 nCipher Corporation Ltd,
1006  1994-97 Ian Jackson.
1007  </ADDRESS>
1008 END
1009
1010
1011 =item html_expire_note
1012
1013 This message explains what happens to archive/remove-able bugs
1014
1015 =cut
1016
1017 set_default(\%config,'html_expire_note',
1018             "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1019
1020 =back
1021
1022 =cut
1023
1024
1025 sub read_config{
1026      my ($conf_file) = @_;
1027      if (not -e $conf_file) {
1028          print STDERR "configuration file '$conf_file' doesn't exist; skipping it";
1029          return;
1030      }
1031      # first, figure out what type of file we're reading in.
1032      my $fh = new IO::File $conf_file,'r'
1033           or die "Unable to open configuration file $conf_file for reading: $!";
1034      # A new version configuration file must have a comment as its first line
1035      my $first_line = <$fh>;
1036      my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1037      if (defined $version) {
1038           if ($version == 1) {
1039                # Do something here;
1040                die "Version 1 configuration files not implemented yet";
1041           }
1042           else {
1043                die "Version $version configuration files are not supported";
1044           }
1045      }
1046      else {
1047           # Ugh. Old configuration file
1048           # What we do here is we create a new Safe compartment
1049           # so fucked up crap in the config file doesn't sink us.
1050           my $cpt = new Safe or die "Unable to create safe compartment";
1051           # perldoc Opcode; for details
1052           $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1053           $cpt->reval(qq(require '$conf_file';));
1054           die "Error in configuration file: $@" if $@;
1055           # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1056           # we want to glob in from the configuration file
1057           for my $variable (@{$EXPORT_TAGS{globals}}) {
1058                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1059                my $var_glob = $cpt->varglob($glob_name);
1060                my $value; #= $cpt->reval("return $variable");
1061                # print STDERR "$variable $value",qq(\n);
1062                if (defined $var_glob) {{
1063                     no strict 'refs';
1064                     if ($glob_type eq '%') {
1065                          $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1066                     }
1067                     elsif ($glob_type eq '@') {
1068                          $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1069                     }
1070                     else {
1071                          $value = ${*{$var_glob}};
1072                     }
1073                     # We punt here, because we can't tell if the value was
1074                     # defined intentionally, or if it was just left alone;
1075                     # this tries to set sane defaults.
1076                     set_default(\%config,$hash_name,$value) if defined $value;
1077                }}
1078           }
1079      }
1080 }
1081
1082 sub __convert_name{
1083      my ($variable) = @_;
1084      my $hash_name = $variable;
1085      $hash_name =~ s/^([\$\%\@])g//;
1086      my $glob_type = $1;
1087      my $glob_name = 'g'.$hash_name;
1088      $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1089      $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1090      $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1091      return $hash_name unless wantarray;
1092      return ($hash_name,$glob_name,$glob_type);
1093 }
1094
1095 # set_default
1096
1097 # sets the configuration hash to the default value if it's not set,
1098 # otherwise doesn't do anything
1099 # If $USING_GLOBALS, then sets an appropriate global.
1100
1101 sub set_default{
1102      my ($config,$option,$value) = @_;
1103      my $varname;
1104      if ($USING_GLOBALS) {
1105           # fix up the variable name
1106           $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1107           # Fix stupid HTML names
1108           $varname =~ s/(Html|Cgi)/uc($1)/ge;
1109      }
1110      # update the configuration value
1111      if (not $USING_GLOBALS and not exists $config->{$option}) {
1112           $config->{$option} = $value;
1113      }
1114      elsif ($USING_GLOBALS) {{
1115           no strict 'refs';
1116           # Need to check if a value has already been set in a global
1117           if (defined *{"Debbugs::Config::${varname}"}) {
1118                $config->{$option} = *{"Debbugs::Config::${varname}"};
1119           }
1120           else {
1121                $config->{$option} = $value;
1122           }
1123      }}
1124      if ($USING_GLOBALS) {{
1125           no strict 'refs';
1126           *{"Debbugs::Config::${varname}"} = $config->{$option};
1127      }}
1128 }
1129
1130
1131 ### import magick
1132
1133 # All we care about here is whether we've been called with the globals or text option;
1134 # if so, then we need to export some symbols back up.
1135 # In any event, we call exporter.
1136
1137 sub import {
1138      if (grep /^:(?:text|globals)$/, @_) {
1139           $USING_GLOBALS=1;
1140           for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1141                my $tmp = $variable;
1142                no strict 'refs';
1143                # Yes, I don't care if these are only used once
1144                no warnings 'once';
1145                # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1146                no warnings 'misc';
1147                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1148                $tmp =~ s/^[\%\$\@]//;
1149                *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1150           }
1151      }
1152      Debbugs::Config->export_to_level(1,@_);
1153 }
1154
1155
1156 1;