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