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