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