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