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