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.
6 # Copyright 2007 by Don Armstrong <don@donarmstrong.com>.
8 package Debbugs::Config;
12 Debbugs::Config -- Configuration information for debbugs
18 # to get the compatiblity interface
20 use Debbugs::Config qw(:globals);
24 This module provides configuration variables for all of debbugs.
26 =head1 CONFIGURATION FILES
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.
36 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT $USING_GLOBALS %config);
37 use base qw(Exporter);
40 # set the version for version checking
42 $DEBUG = 0 unless defined $DEBUG;
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($gPackageTrackingDomain $gUsertagPackageDomain),
51 qw($gSubmitList $gMaintList $gQuietList $gForwardList),
52 qw($gDoneList $gRequestList $gSubmitterList $gControlList),
54 qw($gBugSubscriptionDomain),
55 qw($gPackageVersionRe),
56 qw($gSummaryList $gMirrorList $gMailer $gBug),
57 qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity),
58 qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir),
59 qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile),
60 qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource),
61 qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap),
62 qw($gVersionTimeIndex),
63 qw($gSimpleVersioning),
65 qw($gSendmail @gSendmailArguments $gLibPath $gSpamScan @gExcludeFromControl),
66 qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities),
67 qw(%gTagsSingleLetter),
69 qw(%gDistributionAliases),
70 qw(%gObsoleteSeverities),
71 qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures),
72 qw(@gRemovalStrongSeverityDefaultDistributionTags),
73 qw(@gAffectsDistributionTags),
74 qw(@gDefaultArchitectures),
78 qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb),
80 text => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote),
82 cgi => [qw($gLibravatarUri $gLibravatarCacheDir $gLibravatarUriOptions @gLibravatarBlacklist)],
83 config => [qw(%config)],
86 Exporter::export_ok_tags(keys %EXPORT_TAGS);
87 $EXPORT_TAGS{all} = [@EXPORT_OK];
88 $ENV{HOME} = '' if not defined $ENV{HOME};
92 use File::Basename qw(dirname);
96 =head1 CONFIGURATION VARIABLES
98 =head2 General Configuration
106 # untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
107 # This enables us to test things that are -T.
108 if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
109 # This causes all sorts of problems for mirrors of debbugs; disable
111 # if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] == $<) {
112 $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
113 $ENV{DEBBUGS_CONFIG_FILE} = $1;
116 # die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
119 read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
121 =item email_domain $gEmailDomain
123 The email domain of the bts
127 set_default(\%config,'email_domain','bugs.something');
129 =item list_domain $gListDomain
131 The list domain of the bts, defaults to the email domain
135 set_default(\%config,'list_domain',$config{email_domain});
137 =item web_host $gWebHost
139 The web host of the bts; defaults to the email domain
143 set_default(\%config,'web_host',$config{email_domain});
145 =item web_host_bug_dir $gWebHostDir
147 The directory of the web host on which bugs are kept, defaults to C<''>
151 set_default(\%config,'web_host_bug_dir','');
153 =item web_domain $gWebDomain
155 Full path of the web domain where bugs are kept including the protocol (http://
156 or https://). Defaults to the concatenation of 'http://', L</web_host> and
161 set_default(\%config,'web_domain','http://'.$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir});
163 =item html_suffix $gHTMLSuffix
165 Suffix of html pages, defaults to .html
169 set_default(\%config,'html_suffix','.html');
171 =item cgi_domain $gCGIDomain
173 Full path of the web domain where cgi scripts are kept. Defaults to
174 the concatentation of L</web_domain> and cgi.
178 set_default(\%config,'cgi_domain',$config{web_domain}.($config{web_domain}=~m{/$}?'':'/').'cgi');
180 =item mirrors @gMirrors
182 List of mirrors [What these mirrors are used for, no one knows.]
187 set_default(\%config,'mirrors',[]);
189 =item package_pages $gPackagePages
191 Domain where the package pages are kept; links should work in a
192 package_pages/foopackage manner. Defaults to undef, which means that
193 package links will not be made.
198 set_default(\%config,'package_pages',undef);
200 =item package_tracking_domain $gPackageTrackingDomain
202 Domain where the package pages are kept; links should work in a
203 package_tracking_domain/foopackage manner. Defaults to undef, which means that
204 package links will not be made. Should be prefixed with the appropriate protocol
209 set_default(\%config,'package_tracking_domain',undef);
211 =item package_pages $gUsertagPackageDomain
213 Domain where where usertags of packages belong; defaults to $gPackagePages
217 set_default(\%config,'usertag_package_domain',map {defined $_?s{https?://}{}:(); $_} $config{package_pages});
220 =item subscription_domain $gSubscriptionDomain
222 Domain where subscriptions to package lists happen
226 set_default(\%config,'subscription_domain',undef);
229 =item cc_all_mails_to_addr $gCcAllMailsToAddr
231 Address to Cc (well, Bcc) all e-mails to
235 set_default(\%config,'cc_all_mails_to_addr',undef);
238 =item cve_tracker $gCVETracker
240 URI to CVE security tracker; in bugreport.cgi, CVE-2001-0002 becomes
241 linked to http://$config{cve_tracker}CVE-2001-002
243 Default: security-tracker.debian.org/tracker/
247 set_default(\%config,'cve_tracker','security-tracker.debian.org/tracker/');
255 =head2 Project Identification
259 =item project $gProject
267 set_default(\%config,'project','Something');
269 =item project_title $gProjectTitle
271 Name of this install of Debbugs, defaults to "L</project> Debbugs Install"
273 Default: "$config{project} Debbugs Install"
277 set_default(\%config,'project_title',"$config{project} Debbugs Install");
279 =item maintainer $gMaintainer
281 Name of the maintainer of this debbugs install
283 Default: 'Local DebBugs Owner's
287 set_default(\%config,'maintainer','Local DebBugs Owner');
289 =item maintainer_webpage $gMaintainerWebpage
291 Webpage of the maintainer of this install of debbugs
293 Default: "$config{web_domain}/~owner"
297 set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner");
299 =item maintainer_email $gMaintainerEmail
301 Email address of the maintainer of this Debbugs install
303 Default: 'root@'.$config{email_domain}
307 set_default(\%config,'maintainer_email','root@'.$config{email_domain});
309 =item unknown_maintainer_email
311 Email address where packages with an unknown maintainer will be sent
313 Default: $config{maintainer_email}
317 set_default(\%config,'unknown_maintainer_email',$config{maintainer_email});
321 The name of the machine that this instance of debbugs is running on
322 (currently used for debbuging purposes and web page output.)
324 Default: Sys::Hostname::hostname()
330 set_default(\%config,'machine_name',Sys::Hostname::hostname());
332 =head2 BTS Mailing Lists
359 set_default(\%config, 'submit_list', 'bug-submit-list');
360 set_default(\%config, 'maint_list', 'bug-maint-list');
361 set_default(\%config, 'quiet_list', 'bug-quiet-list');
362 set_default(\%config, 'forward_list', 'bug-forward-list');
363 set_default(\%config, 'done_list', 'bug-done-list');
364 set_default(\%config, 'request_list', 'bug-request-list');
365 set_default(\%config,'submitter_list','bug-submitter-list');
366 set_default(\%config, 'control_list', 'bug-control-list');
367 set_default(\%config, 'summary_list', 'bug-summary-list');
368 set_default(\%config, 'mirror_list', 'bug-mirror-list');
369 set_default(\%config, 'strong_list', 'bug-strong-list');
371 =item bug_subscription_domain
373 Domain of list for messages regarding a single bug; prefixed with
374 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
375 disable sending messages to the bug subscription list.
383 set_default(\%config,'bug_subscription_domain',$config{list_domain});
393 Name of the mailer to use
399 set_default(\%config,'mailer','exim');
408 Default: ucfirst($config{bug});
416 Default: ucfirst($config{ubugs});
420 set_default(\%config,'bug','bug');
421 set_default(\%config,'ubug',ucfirst($config{bug}));
422 set_default(\%config,'bugs','bugs');
423 set_default(\%config,'ubugs',ucfirst($config{bugs}));
427 Age at which bugs are archived/removed
433 set_default(\%config,'remove_age',28);
437 Whether old bugs are saved or deleted
443 set_default(\%config,'save_old_bugs',1);
445 =item distribution_aliases
447 Map of distribution aliases to the distribution name
450 {experimental => 'experimental',
451 unstable => 'unstable',
452 testing => 'testing',
454 oldstable => 'oldstable',
458 sarge => 'oldstable',
463 set_default(\%config,'distribution_aliases',
464 {experimental => 'experimental',
465 unstable => 'unstable',
466 testing => 'testing',
468 oldstable => 'oldstable',
472 sarge => 'oldstable',
480 List of valid distributions
482 Default: The values of the distribution aliases map.
486 my %_distributions_default;
487 @_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}};
488 set_default(\%config,'distributions',[keys %_distributions_default]);
491 =item default_architectures
493 List of default architectures to use when architecture(s) are not
496 Default: i386 amd64 arm ppc sparc alpha
500 set_default(\%config,'default_architectures',
501 [qw(i386 amd64 arm powerpc sparc alpha)]
504 =item affects_distribution_tags
506 List of tags which restrict the buggy state to a set of distributions.
508 The set of distributions that are buggy is the intersection of the set
509 of distributions that would be buggy without reference to these tags
510 and the set of these tags that are distributions which are set on a
513 Setting this to [] will remove this feature.
515 Default: @{$config{distributions}}
519 set_default(\%config,'affects_distribution_tags',
520 [@{$config{distributions}}],
523 =item removal_unremovable_tags
525 Bugs which have these tags set cannot be archived
531 set_default(\%config,'removal_unremovable_tags',
535 =item removal_distribution_tags
537 Tags which specifiy distributions to check
539 Default: @{$config{distributions}}
543 set_default(\%config,'removal_distribution_tags',
544 [@{$config{distributions}}]);
546 =item removal_default_distribution_tags
548 For removal/archival purposes, all bugs are assumed to have these tags
551 Default: qw(experimental unstable testing);
555 set_default(\%config,'removal_default_distribution_tags',
556 [qw(experimental unstable testing)]
559 =item removal_strong_severity_default_distribution_tags
561 For removal/archival purposes, all bugs with strong severity are
562 assumed to have these tags set.
564 Default: qw(experimental unstable testing stable);
568 set_default(\%config,'removal_strong_severity_default_distribution_tags',
569 [qw(experimental unstable testing stable)]
573 =item removal_architectures
575 For removal/archival purposes, these architectures are consulted if
576 there is more than one architecture applicable. If the bug is in a
577 package not in any of these architectures, the architecture actually
578 checked is undefined.
580 Default: value of default_architectures
584 set_default(\%config,'removal_architectures',
585 $config{default_architectures},
589 =item package_name_re
591 The regex which will match a package name
593 Default: '[a-z0-9][a-z0-9\.+-]+'
597 set_default(\%config,'package_name_re',
598 '[a-z0-9][a-z0-9\.+-]+');
600 =item package_version_re
602 The regex which will match a package version
604 Default: '[A-Za-z0-9:+\.-]+'
609 set_default(\%config,'package_version_re',
610 '[A-Za-z0-9:+\.~-]+');
613 =item default_package
615 This is the name of the default package. If set, bugs assigned to
616 packages without a maintainer and bugs missing a Package: psuedoheader
617 will be assigned to this package instead.
619 Defaults to unset, which is the traditional debbugs behavoir
623 set_default(\%config,'default_package',
628 =item control_internal_requester
630 This address is used by Debbugs::Control as the request address which
631 sent a control request for faked log messages.
633 Default:"Debbugs Internal Request <$config{maintainer_email}>"
637 set_default(\%config,'control_internal_requester',
638 "Debbugs Internal Request <$config{maintainer_email}>",
641 =item control_internal_request_addr
643 This address is used by Debbugs::Control as the address to which a
644 faked log message request was sent.
646 Default: "internal_control\@$config{email_domain}";
650 set_default(\%config,'control_internal_request_addr',
651 'internal_control@'.$config{email_domain},
655 =item exclude_from_control
657 Addresses which are not allowed to send messages to control
661 set_default(\%config,'exclude_from_control',[]);
665 =item default_severity
667 The default severity of bugs which have no severity set
673 set_default(\%config,'default_severity','normal');
675 =item severity_display
677 A hashref of severities and the informative text which describes them.
681 {critical => "Critical $config{bugs}",
682 grave => "Grave $config{bugs}",
683 normal => "Normal $config{bugs}",
684 wishlist => "Wishlist $config{bugs}",
689 set_default(\%config,'severity_display',{critical => "Critical $config{bugs}",
690 grave => "Grave $config{bugs}",
691 serious => "Serious $config{bugs}",
692 important=> "Important $config{bugs}",
693 normal => "Normal $config{bugs}",
694 minor => "Minor $config{bugs}",
695 wishlist => "Wishlist $config{bugs}",
698 =item show_severities
700 A scalar list of the severities to show
702 Defaults to the concatenation of the keys of the severity_display
703 hashlist with ', ' above.
707 set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}}));
709 =item strong_severities
711 An arrayref of the serious severities which shoud be emphasized
713 Default: [qw(critical grave)]
717 set_default(\%config,'strong_severities',[qw(critical grave)]);
721 An arrayref of a list of the severities
723 Defaults to the keys of the severity display hashref
727 set_default(\%config,'severity_list',[keys %{$config{severity_display}}]);
729 =item obsolete_severities
731 A hashref of obsolete severities with the replacing severity
737 set_default(\%config,'obsolete_severities',{});
741 An arrayref of the tags used
743 Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also
744 includes the distributions.
748 set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed),
749 @{$config{distributions}}
752 set_default(\%config,'tags_single_letter',
756 unreproducible => 'R',
761 set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'.
762 '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'.
763 '^mail.*agent|^tcpmail|^bitmail|^mailman');
765 set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'));
766 set_default(\%config,'spool_dir','/var/lib/debbugs/spool');
770 Directory which contains the usertags
772 Default: $config{spool_dir}/user
776 set_default(\%config,'usertag_dir',$config{spool_dir}.'/user');
777 set_default(\%config,'incoming_dir','incoming');
779 =item web_dir $gWebDir
781 Directory where base html files are kept. Should normally be the same
782 as the web server's document root.
784 Default: /var/lib/debbugs/www
788 set_default(\%config,'web_dir','/var/lib/debbugs/www');
789 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
790 set_default(\%config,'lib_path','/usr/lib/debbugs');
795 directory of templates; defaults to /usr/share/debbugs/templates.
799 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
802 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
803 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
804 set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers');
805 set_default(\%config,'source_maintainer_file_override',undef);
806 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers');
807 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
808 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
811 =item simple_versioning
813 If true this causes debbugs to ignore version information and just
814 look at whether a bug is done or not done. Primarily of interest for
815 debbugs installs which don't track versions. defaults to false.
819 set_default(\%config,'simple_versioning',0);
822 =item version_packages_dir
824 Location where the version package information is kept; defaults to
825 spool_dir/../versions/pkg
829 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
831 =item version_time_index
833 Location of the version/time index file. Defaults to
834 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
835 exists; otherwise defaults to undef.
840 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
844 Location of the version index file. Defaults to
845 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
846 exists; otherwise defaults to undef.
850 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
852 =item binary_source_map
854 Location of the binary -> source map. Defaults to
855 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
856 exists; otherwise defaults to undef.
860 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
862 =item source_binary_map
864 Location of the source -> binary map. Defaults to
865 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
866 exists; otherwise defaults to undef.
870 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
874 set_default(\%config,'post_processall',[]);
878 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
882 set_default(\%config,'sendmail','/usr/lib/sendmail');
884 =item sendmail_arguments
886 Default arguments to pass to sendmail. Defaults to C<qw(-oem -oi)>.
890 set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]);
894 Envelope from to use for sent messages. If not set, whatever sendmail picks is
899 set_default(\%config,'envelope_from',undef);
903 Whether or not spamscan is being used; defaults to 0 (not being used
907 set_default(\%config,'spam_scan',0);
909 =item spam_crossassassin_db
911 Location of the crosassassin database, defaults to
912 spool_dir/../CrossAssassinDb
916 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
920 Maximum number of cross-posted messages
924 set_default(\%config,'spam_max_cross',6);
927 =item spam_spams_per_thread
929 Number of spams for each thread (on average). Defaults to 200
933 set_default(\%config,'spam_spams_per_thread',200);
935 =item spam_max_threads
937 Maximum number of threads to start. Defaults to 20
941 set_default(\%config,'spam_max_threads',20);
943 =item spam_keep_running
945 Maximum number of seconds to run without restarting. Defaults to 3600.
949 set_default(\%config,'spam_keep_running',3600);
953 Location to store spam messages; is run through strftime to allow for
954 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
958 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
960 =item spam_crossassassin_mailbox
962 Location to store crossassassinated messages; is run through strftime
963 to allow for %d,%m,%Y, et al. Defaults to
964 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
968 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
970 =item spam_local_tests_only
972 Whether only local tests are run, defaults to 0
976 set_default(\%config,'spam_local_tests_only',0);
978 =item spam_user_prefs
980 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
984 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
988 Site rules directory for spamassassin, defaults to
989 '/usr/share/spamassassin'
993 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
1001 =item libravatar_uri $gLibravatarUri
1003 URI to a libravatar configuration. If empty or undefined, libravatar
1004 support will be disabled. Defaults to
1005 libravatar.cgi, our internal federated libravatar system.
1009 set_default(\%config,'libravatar_uri',$config{cgi_domain}.'/libravatar.cgi?email=');
1011 =item libravatar_uri_options $gLibravatarUriOptions
1013 Options to append to the md5_hex of the e-mail. This sets the default
1014 avatar used when an avatar isn't available. Currently defaults to
1015 '?d=retro', which causes a bitmap-looking avatar to be displayed for
1018 Other options which make sense include ?d=404, ?d=wavatar, etc. See
1019 the API of libravatar for details.
1023 set_default(\%config,'libravatar_uri_options','');
1025 =item libravatar_default_image
1027 Default image to serve for libravatar if there is no avatar for an
1028 e-mail address. By default, this is a 1x1 png. [This will also be the
1029 image served if someone specifies avatar=no.]
1031 Default: $config{web_dir}/1x1.png
1035 set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png');
1037 =item libravatar_cache_dir
1039 Directory where cached libravatar images are stored
1041 Default: $config{web_dir}/libravatar/
1045 set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/');
1047 =item libravatar_blacklist
1049 Array of regular expressions to match against emails, domains, or
1050 images to only show the default image
1052 Default: empty array
1056 set_default(\%config,'libravatar_blacklist',[]);
1062 The following are the only text fields in general use in the scripts;
1063 a few additional text fields are defined in text.in, but are only used
1064 in db2html and a few other specialty scripts.
1066 Earlier versions of debbugs defined these values in /etc/debbugs/text,
1067 but now they are required to be in the configuration file. [Eventually
1068 the longer ones will move out into a fully fledged template system.]
1074 =item bad_email_prefix
1076 This prefixes the text of all lines in a bad e-mail message ack.
1080 set_default(\%config,'bad_email_prefix','');
1083 =item text_instructions
1085 This gives more information about bad e-mails to receive.in
1089 set_default(\%config,'text_instructions',$config{bad_email_prefix});
1093 This shows up at the end of (most) html pages
1095 In many pages this has been replaced by the html/tail template.
1099 set_default(\%config,'html_tail',<<END);
1100 <ADDRESS>$config{maintainer} <<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>>.
1106 <A HREF=\"$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1107 Copyright (C) 1999 Darren O. Benham,
1108 1997,2003 nCipher Corporation Ltd,
1109 1994-97 Ian Jackson.
1115 =item html_expire_note
1117 This message explains what happens to archive/remove-able bugs
1121 set_default(\%config,'html_expire_note',
1122 "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1130 my ($conf_file) = @_;
1131 if (not -e $conf_file) {
1132 print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG;
1135 # first, figure out what type of file we're reading in.
1136 my $fh = new IO::File $conf_file,'r'
1137 or die "Unable to open configuration file $conf_file for reading: $!";
1138 # A new version configuration file must have a comment as its first line
1139 my $first_line = <$fh>;
1140 my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1141 if (defined $version) {
1142 if ($version == 1) {
1143 # Do something here;
1144 die "Version 1 configuration files not implemented yet";
1147 die "Version $version configuration files are not supported";
1151 # Ugh. Old configuration file
1152 # What we do here is we create a new Safe compartment
1153 # so fucked up crap in the config file doesn't sink us.
1154 my $cpt = new Safe or die "Unable to create safe compartment";
1155 # perldoc Opcode; for details
1156 $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1157 $cpt->reval(qq(require '$conf_file';));
1158 die "Error in configuration file: $@" if $@;
1159 # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1160 # we want to glob in from the configuration file
1161 for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) {
1162 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1163 my $var_glob = $cpt->varglob($glob_name);
1164 my $value; #= $cpt->reval("return $variable");
1165 # print STDERR "$variable $value",qq(\n);
1166 if (defined $var_glob) {{
1168 if ($glob_type eq '%') {
1169 $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1171 elsif ($glob_type eq '@') {
1172 $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1175 $value = ${*{$var_glob}};
1177 # We punt here, because we can't tell if the value was
1178 # defined intentionally, or if it was just left alone;
1179 # this tries to set sane defaults.
1180 set_default(\%config,$hash_name,$value) if defined $value;
1187 my ($variable) = @_;
1188 my $hash_name = $variable;
1189 $hash_name =~ s/^([\$\%\@])g//;
1191 my $glob_name = 'g'.$hash_name;
1192 $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1193 $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1194 $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1195 return $hash_name unless wantarray;
1196 return ($hash_name,$glob_name,$glob_type);
1201 # sets the configuration hash to the default value if it's not set,
1202 # otherwise doesn't do anything
1203 # If $USING_GLOBALS, then sets an appropriate global.
1206 my ($config,$option,$value) = @_;
1208 if ($USING_GLOBALS) {
1209 # fix up the variable name
1210 $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1211 # Fix stupid HTML names
1212 $varname =~ s/(Html|Cgi)/uc($1)/ge;
1214 # update the configuration value
1215 if (not $USING_GLOBALS and not exists $config->{$option}) {
1216 $config->{$option} = $value;
1218 elsif ($USING_GLOBALS) {{
1220 # Need to check if a value has already been set in a global
1221 if (defined *{"Debbugs::Config::${varname}"}) {
1222 $config->{$option} = *{"Debbugs::Config::${varname}"};
1225 $config->{$option} = $value;
1228 if ($USING_GLOBALS) {{
1230 *{"Debbugs::Config::${varname}"} = $config->{$option};
1237 # All we care about here is whether we've been called with the globals or text option;
1238 # if so, then we need to export some symbols back up.
1239 # In any event, we call exporter.
1242 if (grep /^:(?:text|globals)$/, @_) {
1244 for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1245 my $tmp = $variable;
1247 # Yes, I don't care if these are only used once
1249 # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1251 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1252 $tmp =~ s/^[\%\$\@]//;
1253 *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1256 Debbugs::Config->export_to_level(1,@_);