]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Config.pm
use Sys::Hostname::hostname instead of hostname --fqdn
[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                      cgi => [qw($gLibravatarUri $gLibravatarCacheDir $gLibravatarUriOptions @gLibravatarBlacklist)],
82                      config   => [qw(%config)],
83                     );
84      @EXPORT_OK = ();
85      Exporter::export_ok_tags(keys %EXPORT_TAGS);
86      $EXPORT_TAGS{all} = [@EXPORT_OK];
87      $ENV{HOME} = '' if not defined $ENV{HOME};
88 }
89
90 use Sys::Hostname;
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: Sys::Hostname::hostname()
303
304 =back
305
306 =cut
307
308 set_default(\%config,'machine_name',Sys::Hostname::hostname());
309
310 =head2 BTS Mailing Lists
311
312
313 =over
314
315 =item submit_list
316
317 =item maint_list
318
319 =item forward_list
320
321 =item done_list
322
323 =item request_list
324
325 =item submitter_list
326
327 =item control_list
328
329 =item summary_list
330
331 =item mirror_list
332
333 =item strong_list
334
335 =cut
336
337 set_default(\%config,   'submit_list',   'bug-submit-list');
338 set_default(\%config,    'maint_list',    'bug-maint-list');
339 set_default(\%config,    'quiet_list',    'bug-quiet-list');
340 set_default(\%config,  'forward_list',  'bug-forward-list');
341 set_default(\%config,     'done_list',     'bug-done-list');
342 set_default(\%config,  'request_list',  'bug-request-list');
343 set_default(\%config,'submitter_list','bug-submitter-list');
344 set_default(\%config,  'control_list',  'bug-control-list');
345 set_default(\%config,  'summary_list',  'bug-summary-list');
346 set_default(\%config,   'mirror_list',   'bug-mirror-list');
347 set_default(\%config,   'strong_list',   'bug-strong-list');
348
349 =item bug_subscription_domain
350
351 Domain of list for messages regarding a single bug; prefixed with
352 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
353 disable sending messages to the bug subscription list.
354
355 Default: list_domain
356
357 =back
358
359 =cut
360
361 set_default(\%config,'bug_subscription_domain',$config{list_domain});
362
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
757 =item web_dir $gWebDir
758
759 Directory where base html files are kept. Should normally be the same
760 as the web server's document root.
761
762 Default: /var/lib/debbugs/www
763
764 =cut
765
766 set_default(\%config,'web_dir','/var/lib/debbugs/www');
767 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
768 set_default(\%config,'lib_path','/usr/lib/debbugs');
769
770
771 =item template_dir
772
773 directory of templates; defaults to /usr/share/debbugs/templates.
774
775 =cut
776
777 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
778
779
780 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
781 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
782 set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers');
783 set_default(\%config,'source_maintainer_file_override',undef);
784 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers');
785 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
786 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
787
788
789 =item simple_versioning
790
791 If true this causes debbugs to ignore version information and just
792 look at whether a bug is done or not done. Primarily of interest for
793 debbugs installs which don't track versions. defaults to false.
794
795 =cut
796
797 set_default(\%config,'simple_versioning',0);
798
799
800 =item version_packages_dir
801
802 Location where the version package information is kept; defaults to
803 spool_dir/../versions/pkg
804
805 =cut
806
807 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
808
809 =item version_time_index
810
811 Location of the version/time index file. Defaults to
812 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
813 exists; otherwise defaults to undef.
814
815 =cut
816
817
818 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
819
820 =item version_index
821
822 Location of the version index file. Defaults to
823 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
824 exists; otherwise defaults to undef.
825
826 =cut
827
828 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
829
830 =item binary_source_map
831
832 Location of the binary -> source map. Defaults to
833 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
834 exists; otherwise defaults to undef.
835
836 =cut
837
838 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
839
840 =item source_binary_map
841
842 Location of the source -> binary map. Defaults to
843 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
844 exists; otherwise defaults to undef.
845
846 =cut
847
848 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
849
850
851
852 set_default(\%config,'post_processall',[]);
853
854 =item sendmail
855
856 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
857
858 =cut
859
860 set_default(\%config,'sendmail','/usr/lib/sendmail');
861
862 =item sendmail_arguments
863
864 Default arguments to pass to sendmail. Defaults to C<qw(-oem -oi)>.
865
866 =cut
867
868 set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]);
869
870 =item spam_scan
871
872 Whether or not spamscan is being used; defaults to 0 (not being used
873
874 =cut
875
876 set_default(\%config,'spam_scan',0);
877
878 =item spam_crossassassin_db
879
880 Location of the crosassassin database, defaults to
881 spool_dir/../CrossAssassinDb
882
883 =cut
884
885 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
886
887 =item spam_max_cross
888
889 Maximum number of cross-posted messages
890
891 =cut
892
893 set_default(\%config,'spam_max_cross',6);
894
895
896 =item spam_spams_per_thread
897
898 Number of spams for each thread (on average). Defaults to 200
899
900 =cut
901
902 set_default(\%config,'spam_spams_per_thread',200);
903
904 =item spam_max_threads
905
906 Maximum number of threads to start. Defaults to 20
907
908 =cut
909
910 set_default(\%config,'spam_max_threads',20);
911
912 =item spam_keep_running
913
914 Maximum number of seconds to run without restarting. Defaults to 3600.
915
916 =cut
917
918 set_default(\%config,'spam_keep_running',3600);
919
920 =item spam_mailbox
921
922 Location to store spam messages; is run through strftime to allow for
923 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
924
925 =cut
926
927 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
928
929 =item spam_crossassassin_mailbox
930
931 Location to store crossassassinated messages; is run through strftime
932 to allow for %d,%m,%Y, et al. Defaults to
933 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
934
935 =cut
936
937 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
938
939 =item spam_local_tests_only
940
941 Whether only local tests are run, defaults to 0
942
943 =cut
944
945 set_default(\%config,'spam_local_tests_only',0);
946
947 =item spam_user_prefs
948
949 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
950
951 =cut
952
953 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
954
955 =item spam_rules_dir
956
957 Site rules directory for spamassassin, defaults to
958 '/usr/share/spamassassin'
959
960 =cut
961
962 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
963
964 =back
965
966 =head2 CGI Options
967
968 =over
969
970 =item libravatar_uri $gLibravatarUri
971
972 URI to a libravatar configuration. If empty or undefined, libravatar
973 support will be disabled. Defaults to
974 libravatar.cgi, our internal federated libravatar system.
975
976 =cut
977
978 set_default(\%config,'libravatar_uri','http://'.$config{cgi_domain}.'/libravatar.cgi?email=');
979
980 =item libravatar_uri_options $gLibravatarUriOptions
981
982 Options to append to the md5_hex of the e-mail. This sets the default
983 avatar used when an avatar isn't available. Currently defaults to
984 '?d=retro', which causes a bitmap-looking avatar to be displayed for
985 unknown e-mails.
986
987 Other options which make sense include ?d=404, ?d=wavatar, etc. See
988 the API of libravatar for details.
989
990 =cut
991
992 set_default(\%config,'libravatar_uri_options','');
993
994 =item libravatar_default_image
995
996 Default image to serve for libravatar if there is no avatar for an
997 e-mail address. By default, this is a 1x1 png. [This will also be the
998 image served if someone specifies avatar=no.]
999
1000 Default: $config{web_dir}/1x1.png
1001
1002 =cut
1003
1004 set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png');
1005
1006 =item libravatar_cache_dir
1007
1008 Directory where cached libravatar images are stored
1009
1010 Default: $config{web_dir}/libravatar/
1011
1012 =cut
1013
1014 set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/');
1015
1016 =item libravatar_blacklist
1017
1018 Array of regular expressions to match against emails, domains, or
1019 images to only show the default image
1020
1021 Default: empty array
1022
1023 =cut
1024
1025 set_default(\%config,'libravatar_blacklist',[]);
1026
1027 =back
1028
1029 =head2 Text Fields
1030
1031 The following are the only text fields in general use in the scripts;
1032 a few additional text fields are defined in text.in, but are only used
1033 in db2html and a few other specialty scripts.
1034
1035 Earlier versions of debbugs defined these values in /etc/debbugs/text,
1036 but now they are required to be in the configuration file. [Eventually
1037 the longer ones will move out into a fully fledged template system.]
1038
1039 =cut
1040
1041 =over
1042
1043 =item bad_email_prefix
1044
1045 This prefixes the text of all lines in a bad e-mail message ack.
1046
1047 =cut
1048
1049 set_default(\%config,'bad_email_prefix','');
1050
1051
1052 =item text_instructions
1053
1054 This gives more information about bad e-mails to receive.in
1055
1056 =cut
1057
1058 set_default(\%config,'text_instructions',$config{bad_email_prefix});
1059
1060 =item html_tail
1061
1062 This shows up at the end of (most) html pages
1063
1064 In many pages this has been replaced by the html/tail template.
1065
1066 =cut
1067
1068 set_default(\%config,'html_tail',<<END);
1069  <ADDRESS>$config{maintainer} &lt;<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>&gt;.
1070  Last modified:
1071  <!--timestamp-->
1072  SUBSTITUTE_DTIME
1073  <!--timestamp-->
1074  <P>
1075  <A HREF=\"http://$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1076  Copyright (C) 1999 Darren O. Benham,
1077  1997,2003 nCipher Corporation Ltd,
1078  1994-97 Ian Jackson.
1079  </ADDRESS>
1080 END
1081
1082
1083 =item html_expire_note
1084
1085 This message explains what happens to archive/remove-able bugs
1086
1087 =cut
1088
1089 set_default(\%config,'html_expire_note',
1090             "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1091
1092 =back
1093
1094 =cut
1095
1096
1097 sub read_config{
1098      my ($conf_file) = @_;
1099      if (not -e $conf_file) {
1100          print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG;
1101          return;
1102      }
1103      # first, figure out what type of file we're reading in.
1104      my $fh = new IO::File $conf_file,'r'
1105           or die "Unable to open configuration file $conf_file for reading: $!";
1106      # A new version configuration file must have a comment as its first line
1107      my $first_line = <$fh>;
1108      my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1109      if (defined $version) {
1110           if ($version == 1) {
1111                # Do something here;
1112                die "Version 1 configuration files not implemented yet";
1113           }
1114           else {
1115                die "Version $version configuration files are not supported";
1116           }
1117      }
1118      else {
1119           # Ugh. Old configuration file
1120           # What we do here is we create a new Safe compartment
1121           # so fucked up crap in the config file doesn't sink us.
1122           my $cpt = new Safe or die "Unable to create safe compartment";
1123           # perldoc Opcode; for details
1124           $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1125           $cpt->reval(qq(require '$conf_file';));
1126           die "Error in configuration file: $@" if $@;
1127           # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1128           # we want to glob in from the configuration file
1129           for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) {
1130                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1131                my $var_glob = $cpt->varglob($glob_name);
1132                my $value; #= $cpt->reval("return $variable");
1133                # print STDERR "$variable $value",qq(\n);
1134                if (defined $var_glob) {{
1135                     no strict 'refs';
1136                     if ($glob_type eq '%') {
1137                          $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1138                     }
1139                     elsif ($glob_type eq '@') {
1140                          $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1141                     }
1142                     else {
1143                          $value = ${*{$var_glob}};
1144                     }
1145                     # We punt here, because we can't tell if the value was
1146                     # defined intentionally, or if it was just left alone;
1147                     # this tries to set sane defaults.
1148                     set_default(\%config,$hash_name,$value) if defined $value;
1149                }}
1150           }
1151      }
1152 }
1153
1154 sub __convert_name{
1155      my ($variable) = @_;
1156      my $hash_name = $variable;
1157      $hash_name =~ s/^([\$\%\@])g//;
1158      my $glob_type = $1;
1159      my $glob_name = 'g'.$hash_name;
1160      $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1161      $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1162      $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1163      return $hash_name unless wantarray;
1164      return ($hash_name,$glob_name,$glob_type);
1165 }
1166
1167 # set_default
1168
1169 # sets the configuration hash to the default value if it's not set,
1170 # otherwise doesn't do anything
1171 # If $USING_GLOBALS, then sets an appropriate global.
1172
1173 sub set_default{
1174      my ($config,$option,$value) = @_;
1175      my $varname;
1176      if ($USING_GLOBALS) {
1177           # fix up the variable name
1178           $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1179           # Fix stupid HTML names
1180           $varname =~ s/(Html|Cgi)/uc($1)/ge;
1181      }
1182      # update the configuration value
1183      if (not $USING_GLOBALS and not exists $config->{$option}) {
1184           $config->{$option} = $value;
1185      }
1186      elsif ($USING_GLOBALS) {{
1187           no strict 'refs';
1188           # Need to check if a value has already been set in a global
1189           if (defined *{"Debbugs::Config::${varname}"}) {
1190                $config->{$option} = *{"Debbugs::Config::${varname}"};
1191           }
1192           else {
1193                $config->{$option} = $value;
1194           }
1195      }}
1196      if ($USING_GLOBALS) {{
1197           no strict 'refs';
1198           *{"Debbugs::Config::${varname}"} = $config->{$option};
1199      }}
1200 }
1201
1202
1203 ### import magick
1204
1205 # All we care about here is whether we've been called with the globals or text option;
1206 # if so, then we need to export some symbols back up.
1207 # In any event, we call exporter.
1208
1209 sub import {
1210      if (grep /^:(?:text|globals)$/, @_) {
1211           $USING_GLOBALS=1;
1212           for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1213                my $tmp = $variable;
1214                no strict 'refs';
1215                # Yes, I don't care if these are only used once
1216                no warnings 'once';
1217                # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1218                no warnings 'misc';
1219                my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1220                $tmp =~ s/^[\%\$\@]//;
1221                *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1222           }
1223      }
1224      Debbugs::Config->export_to_level(1,@_);
1225 }
1226
1227
1228 1;