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