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