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($gSubmitList $gMaintList $gQuietList $gForwardList),
51 qw($gDoneList $gRequestList $gSubmitterList $gControlList),
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),
64 qw($gSendmail @gSendmailArguments $gLibPath $gSpamScan @gExcludeFromControl),
65 qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities),
66 qw(%gTagsSingleLetter),
68 qw(%gDistributionAliases),
69 qw(%gObsoleteSeverities),
70 qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures),
71 qw(@gRemovalStrongSeverityDefaultDistributionTags),
72 qw(@gAffectsDistributionTags),
73 qw(@gDefaultArchitectures),
77 qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb),
79 text => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote),
81 cgi => [qw($gLibravatarUri $gLibravatarCacheDir $gLibravatarUriOptions @gLibravatarBlacklist)],
82 config => [qw(%config)],
85 Exporter::export_ok_tags(keys %EXPORT_TAGS);
86 $EXPORT_TAGS{all} = [@EXPORT_OK];
87 $ENV{HOME} = '' if not defined $ENV{HOME};
91 use File::Basename qw(dirname);
95 =head1 CONFIGURATION VARIABLES
97 =head2 General Configuration
105 # untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
106 # This enables us to test things that are -T.
107 if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
108 # This causes all sorts of problems for mirrors of debbugs; disable
110 # if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] == $<) {
111 $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
112 $ENV{DEBBUGS_CONFIG_FILE} = $1;
115 # die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
118 read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
120 =item email_domain $gEmailDomain
122 The email domain of the bts
126 set_default(\%config,'email_domain','bugs.something');
128 =item list_domain $gListDomain
130 The list domain of the bts, defaults to the email domain
134 set_default(\%config,'list_domain',$config{email_domain});
136 =item web_host $gWebHost
138 The web host of the bts; defaults to the email domain
142 set_default(\%config,'web_host',$config{email_domain});
144 =item web_host_bug_dir $gWebHostDir
146 The directory of the web host on which bugs are kept, defaults to C<''>
150 set_default(\%config,'web_host_bug_dir','');
152 =item web_domain $gWebDomain
154 Full path of the web domain where bugs are kept including the protocol (http://
155 or https://). Defaults to the concatenation of 'http://', L</web_host> and
160 set_default(\%config,'web_domain','http://'.$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir});
162 =item html_suffix $gHTMLSuffix
164 Suffix of html pages, defaults to .html
168 set_default(\%config,'html_suffix','.html');
170 =item cgi_domain $gCGIDomain
172 Full path of the web domain where cgi scripts are kept. Defaults to
173 the concatentation of L</web_domain> and cgi.
177 set_default(\%config,'cgi_domain',$config{web_domain}.($config{web_domain}=~m{/$}?'':'/').'cgi');
179 =item mirrors @gMirrors
181 List of mirrors [What these mirrors are used for, no one knows.]
186 set_default(\%config,'mirrors',[]);
188 =item package_pages $gPackagePages
190 Domain where the package pages are kept; links should work in a
191 package_pages/foopackage manner. Defaults to undef, which means that
192 package links will not be made.
197 set_default(\%config,'package_pages',undef);
199 =item package_pages $gUsertagPackageDomain
201 Domain where where usertags of packages belong; defaults to $gPackagePages
205 set_default(\%config,'usertag_package_domain',$config{package_pages});
208 =item subscription_domain $gSubscriptionDomain
210 Domain where subscriptions to package lists happen
214 set_default(\%config,'subscription_domain',undef);
217 =item cc_all_mails_to_addr $gCcAllMailsToAddr
219 Address to Cc (well, Bcc) all e-mails to
223 set_default(\%config,'cc_all_mails_to_addr',undef);
226 =item cve_tracker $gCVETracker
228 URI to CVE security tracker; in bugreport.cgi, CVE-2001-0002 becomes
229 linked to http://$config{cve_tracker}CVE-2001-002
231 Default: security-tracker.debian.org/tracker/
235 set_default(\%config,'cve_tracker','security-tracker.debian.org/tracker/');
243 =head2 Project Identification
247 =item project $gProject
255 set_default(\%config,'project','Something');
257 =item project_title $gProjectTitle
259 Name of this install of Debbugs, defaults to "L</project> Debbugs Install"
261 Default: "$config{project} Debbugs Install"
265 set_default(\%config,'project_title',"$config{project} Debbugs Install");
267 =item maintainer $gMaintainer
269 Name of the maintainer of this debbugs install
271 Default: 'Local DebBugs Owner's
275 set_default(\%config,'maintainer','Local DebBugs Owner');
277 =item maintainer_webpage $gMaintainerWebpage
279 Webpage of the maintainer of this install of debbugs
281 Default: "$config{web_domain}/~owner"
285 set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner");
287 =item maintainer_email $gMaintainerEmail
289 Email address of the maintainer of this Debbugs install
291 Default: 'root@'.$config{email_domain}
295 set_default(\%config,'maintainer_email','root@'.$config{email_domain});
297 =item unknown_maintainer_email
299 Email address where packages with an unknown maintainer will be sent
301 Default: $config{maintainer_email}
305 set_default(\%config,'unknown_maintainer_email',$config{maintainer_email});
309 The name of the machine that this instance of debbugs is running on
310 (currently used for debbuging purposes and web page output.)
312 Default: Sys::Hostname::hostname()
318 set_default(\%config,'machine_name',Sys::Hostname::hostname());
320 =head2 BTS Mailing Lists
347 set_default(\%config, 'submit_list', 'bug-submit-list');
348 set_default(\%config, 'maint_list', 'bug-maint-list');
349 set_default(\%config, 'quiet_list', 'bug-quiet-list');
350 set_default(\%config, 'forward_list', 'bug-forward-list');
351 set_default(\%config, 'done_list', 'bug-done-list');
352 set_default(\%config, 'request_list', 'bug-request-list');
353 set_default(\%config,'submitter_list','bug-submitter-list');
354 set_default(\%config, 'control_list', 'bug-control-list');
355 set_default(\%config, 'summary_list', 'bug-summary-list');
356 set_default(\%config, 'mirror_list', 'bug-mirror-list');
357 set_default(\%config, 'strong_list', 'bug-strong-list');
359 =item bug_subscription_domain
361 Domain of list for messages regarding a single bug; prefixed with
362 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
363 disable sending messages to the bug subscription list.
371 set_default(\%config,'bug_subscription_domain',$config{list_domain});
381 Name of the mailer to use
387 set_default(\%config,'mailer','exim');
396 Default: ucfirst($config{bug});
404 Default: ucfirst($config{ubugs});
408 set_default(\%config,'bug','bug');
409 set_default(\%config,'ubug',ucfirst($config{bug}));
410 set_default(\%config,'bugs','bugs');
411 set_default(\%config,'ubugs',ucfirst($config{bugs}));
415 Age at which bugs are archived/removed
421 set_default(\%config,'remove_age',28);
425 Whether old bugs are saved or deleted
431 set_default(\%config,'save_old_bugs',1);
433 =item distribution_aliases
435 Map of distribution aliases to the distribution name
438 {experimental => 'experimental',
439 unstable => 'unstable',
440 testing => 'testing',
442 oldstable => 'oldstable',
446 sarge => 'oldstable',
451 set_default(\%config,'distribution_aliases',
452 {experimental => 'experimental',
453 unstable => 'unstable',
454 testing => 'testing',
456 oldstable => 'oldstable',
460 sarge => 'oldstable',
468 List of valid distributions
470 Default: The values of the distribution aliases map.
474 my %_distributions_default;
475 @_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}};
476 set_default(\%config,'distributions',[keys %_distributions_default]);
479 =item default_architectures
481 List of default architectures to use when architecture(s) are not
484 Default: i386 amd64 arm ppc sparc alpha
488 set_default(\%config,'default_architectures',
489 [qw(i386 amd64 arm powerpc sparc alpha)]
492 =item affects_distribution_tags
494 List of tags which restrict the buggy state to a set of distributions.
496 The set of distributions that are buggy is the intersection of the set
497 of distributions that would be buggy without reference to these tags
498 and the set of these tags that are distributions which are set on a
501 Setting this to [] will remove this feature.
503 Default: @{$config{distributions}}
507 set_default(\%config,'affects_distribution_tags',
508 [@{$config{distributions}}],
511 =item removal_unremovable_tags
513 Bugs which have these tags set cannot be archived
519 set_default(\%config,'removal_unremovable_tags',
523 =item removal_distribution_tags
525 Tags which specifiy distributions to check
527 Default: @{$config{distributions}}
531 set_default(\%config,'removal_distribution_tags',
532 [@{$config{distributions}}]);
534 =item removal_default_distribution_tags
536 For removal/archival purposes, all bugs are assumed to have these tags
539 Default: qw(experimental unstable testing);
543 set_default(\%config,'removal_default_distribution_tags',
544 [qw(experimental unstable testing)]
547 =item removal_strong_severity_default_distribution_tags
549 For removal/archival purposes, all bugs with strong severity are
550 assumed to have these tags set.
552 Default: qw(experimental unstable testing stable);
556 set_default(\%config,'removal_strong_severity_default_distribution_tags',
557 [qw(experimental unstable testing stable)]
561 =item removal_architectures
563 For removal/archival purposes, these architectures are consulted if
564 there is more than one architecture applicable. If the bug is in a
565 package not in any of these architectures, the architecture actually
566 checked is undefined.
568 Default: value of default_architectures
572 set_default(\%config,'removal_architectures',
573 $config{default_architectures},
577 =item package_name_re
579 The regex which will match a package name
581 Default: '[a-z0-9][a-z0-9\.+-]+'
585 set_default(\%config,'package_name_re',
586 '[a-z0-9][a-z0-9\.+-]+');
588 =item package_version_re
590 The regex which will match a package version
592 Default: '[A-Za-z0-9:+\.-]+'
597 set_default(\%config,'package_version_re',
598 '[A-Za-z0-9:+\.~-]+');
601 =item default_package
603 This is the name of the default package. If set, bugs assigned to
604 packages without a maintainer and bugs missing a Package: psuedoheader
605 will be assigned to this package instead.
607 Defaults to unset, which is the traditional debbugs behavoir
611 set_default(\%config,'default_package',
616 =item control_internal_requester
618 This address is used by Debbugs::Control as the request address which
619 sent a control request for faked log messages.
621 Default:"Debbugs Internal Request <$config{maintainer_email}>"
625 set_default(\%config,'control_internal_requester',
626 "Debbugs Internal Request <$config{maintainer_email}>",
629 =item control_internal_request_addr
631 This address is used by Debbugs::Control as the address to which a
632 faked log message request was sent.
634 Default: "internal_control\@$config{email_domain}";
638 set_default(\%config,'control_internal_request_addr',
639 'internal_control@'.$config{email_domain},
643 =item exclude_from_control
645 Addresses which are not allowed to send messages to control
649 set_default(\%config,'exclude_from_control',[]);
653 =item default_severity
655 The default severity of bugs which have no severity set
661 set_default(\%config,'default_severity','normal');
663 =item severity_display
665 A hashref of severities and the informative text which describes them.
669 {critical => "Critical $config{bugs}",
670 grave => "Grave $config{bugs}",
671 normal => "Normal $config{bugs}",
672 wishlist => "Wishlist $config{bugs}",
677 set_default(\%config,'severity_display',{critical => "Critical $config{bugs}",
678 grave => "Grave $config{bugs}",
679 serious => "Serious $config{bugs}",
680 important=> "Important $config{bugs}",
681 normal => "Normal $config{bugs}",
682 minor => "Minor $config{bugs}",
683 wishlist => "Wishlist $config{bugs}",
686 =item show_severities
688 A scalar list of the severities to show
690 Defaults to the concatenation of the keys of the severity_display
691 hashlist with ', ' above.
695 set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}}));
697 =item strong_severities
699 An arrayref of the serious severities which shoud be emphasized
701 Default: [qw(critical grave)]
705 set_default(\%config,'strong_severities',[qw(critical grave)]);
709 An arrayref of a list of the severities
711 Defaults to the keys of the severity display hashref
715 set_default(\%config,'severity_list',[keys %{$config{severity_display}}]);
717 =item obsolete_severities
719 A hashref of obsolete severities with the replacing severity
725 set_default(\%config,'obsolete_severities',{});
729 An arrayref of the tags used
731 Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also
732 includes the distributions.
736 set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed),
737 @{$config{distributions}}
740 set_default(\%config,'tags_single_letter',
744 unreproducible => 'R',
749 set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'.
750 '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'.
751 '^mail.*agent|^tcpmail|^bitmail|^mailman');
753 set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'));
754 set_default(\%config,'spool_dir','/var/lib/debbugs/spool');
758 Directory which contains the usertags
760 Default: $config{spool_dir}/user
764 set_default(\%config,'usertag_dir',$config{spool_dir}.'/user');
765 set_default(\%config,'incoming_dir','incoming');
767 =item web_dir $gWebDir
769 Directory where base html files are kept. Should normally be the same
770 as the web server's document root.
772 Default: /var/lib/debbugs/www
776 set_default(\%config,'web_dir','/var/lib/debbugs/www');
777 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
778 set_default(\%config,'lib_path','/usr/lib/debbugs');
783 directory of templates; defaults to /usr/share/debbugs/templates.
787 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
790 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
791 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
792 set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers');
793 set_default(\%config,'source_maintainer_file_override',undef);
794 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers');
795 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
796 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
799 =item simple_versioning
801 If true this causes debbugs to ignore version information and just
802 look at whether a bug is done or not done. Primarily of interest for
803 debbugs installs which don't track versions. defaults to false.
807 set_default(\%config,'simple_versioning',0);
810 =item version_packages_dir
812 Location where the version package information is kept; defaults to
813 spool_dir/../versions/pkg
817 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
819 =item version_time_index
821 Location of the version/time index file. Defaults to
822 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
823 exists; otherwise defaults to undef.
828 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
832 Location of the version index file. Defaults to
833 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
834 exists; otherwise defaults to undef.
838 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
840 =item binary_source_map
842 Location of the binary -> source map. Defaults to
843 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
844 exists; otherwise defaults to undef.
848 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
850 =item source_binary_map
852 Location of the source -> binary map. Defaults to
853 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
854 exists; otherwise defaults to undef.
858 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
862 set_default(\%config,'post_processall',[]);
866 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
870 set_default(\%config,'sendmail','/usr/lib/sendmail');
872 =item sendmail_arguments
874 Default arguments to pass to sendmail. Defaults to C<qw(-oem -oi)>.
878 set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]);
882 Envelope from to use for sent messages. If not set, whatever sendmail picks is
887 set_default(\%config,'envelope_from',undef);
891 Whether or not spamscan is being used; defaults to 0 (not being used
895 set_default(\%config,'spam_scan',0);
897 =item spam_crossassassin_db
899 Location of the crosassassin database, defaults to
900 spool_dir/../CrossAssassinDb
904 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
908 Maximum number of cross-posted messages
912 set_default(\%config,'spam_max_cross',6);
915 =item spam_spams_per_thread
917 Number of spams for each thread (on average). Defaults to 200
921 set_default(\%config,'spam_spams_per_thread',200);
923 =item spam_max_threads
925 Maximum number of threads to start. Defaults to 20
929 set_default(\%config,'spam_max_threads',20);
931 =item spam_keep_running
933 Maximum number of seconds to run without restarting. Defaults to 3600.
937 set_default(\%config,'spam_keep_running',3600);
941 Location to store spam messages; is run through strftime to allow for
942 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
946 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
948 =item spam_crossassassin_mailbox
950 Location to store crossassassinated messages; is run through strftime
951 to allow for %d,%m,%Y, et al. Defaults to
952 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
956 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
958 =item spam_local_tests_only
960 Whether only local tests are run, defaults to 0
964 set_default(\%config,'spam_local_tests_only',0);
966 =item spam_user_prefs
968 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
972 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
976 Site rules directory for spamassassin, defaults to
977 '/usr/share/spamassassin'
981 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
989 =item libravatar_uri $gLibravatarUri
991 URI to a libravatar configuration. If empty or undefined, libravatar
992 support will be disabled. Defaults to
993 libravatar.cgi, our internal federated libravatar system.
997 set_default(\%config,'libravatar_uri',$config{cgi_domain}.'/libravatar.cgi?email=');
999 =item libravatar_uri_options $gLibravatarUriOptions
1001 Options to append to the md5_hex of the e-mail. This sets the default
1002 avatar used when an avatar isn't available. Currently defaults to
1003 '?d=retro', which causes a bitmap-looking avatar to be displayed for
1006 Other options which make sense include ?d=404, ?d=wavatar, etc. See
1007 the API of libravatar for details.
1011 set_default(\%config,'libravatar_uri_options','');
1013 =item libravatar_default_image
1015 Default image to serve for libravatar if there is no avatar for an
1016 e-mail address. By default, this is a 1x1 png. [This will also be the
1017 image served if someone specifies avatar=no.]
1019 Default: $config{web_dir}/1x1.png
1023 set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png');
1025 =item libravatar_cache_dir
1027 Directory where cached libravatar images are stored
1029 Default: $config{web_dir}/libravatar/
1033 set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/');
1035 =item libravatar_blacklist
1037 Array of regular expressions to match against emails, domains, or
1038 images to only show the default image
1040 Default: empty array
1044 set_default(\%config,'libravatar_blacklist',[]);
1050 The following are the only text fields in general use in the scripts;
1051 a few additional text fields are defined in text.in, but are only used
1052 in db2html and a few other specialty scripts.
1054 Earlier versions of debbugs defined these values in /etc/debbugs/text,
1055 but now they are required to be in the configuration file. [Eventually
1056 the longer ones will move out into a fully fledged template system.]
1062 =item bad_email_prefix
1064 This prefixes the text of all lines in a bad e-mail message ack.
1068 set_default(\%config,'bad_email_prefix','');
1071 =item text_instructions
1073 This gives more information about bad e-mails to receive.in
1077 set_default(\%config,'text_instructions',$config{bad_email_prefix});
1081 This shows up at the end of (most) html pages
1083 In many pages this has been replaced by the html/tail template.
1087 set_default(\%config,'html_tail',<<END);
1088 <ADDRESS>$config{maintainer} <<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>>.
1094 <A HREF=\"$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
1095 Copyright (C) 1999 Darren O. Benham,
1096 1997,2003 nCipher Corporation Ltd,
1097 1994-97 Ian Jackson.
1103 =item html_expire_note
1105 This message explains what happens to archive/remove-able bugs
1109 set_default(\%config,'html_expire_note',
1110 "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
1118 my ($conf_file) = @_;
1119 if (not -e $conf_file) {
1120 print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG;
1123 # first, figure out what type of file we're reading in.
1124 my $fh = new IO::File $conf_file,'r'
1125 or die "Unable to open configuration file $conf_file for reading: $!";
1126 # A new version configuration file must have a comment as its first line
1127 my $first_line = <$fh>;
1128 my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
1129 if (defined $version) {
1130 if ($version == 1) {
1131 # Do something here;
1132 die "Version 1 configuration files not implemented yet";
1135 die "Version $version configuration files are not supported";
1139 # Ugh. Old configuration file
1140 # What we do here is we create a new Safe compartment
1141 # so fucked up crap in the config file doesn't sink us.
1142 my $cpt = new Safe or die "Unable to create safe compartment";
1143 # perldoc Opcode; for details
1144 $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
1145 $cpt->reval(qq(require '$conf_file';));
1146 die "Error in configuration file: $@" if $@;
1147 # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
1148 # we want to glob in from the configuration file
1149 for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) {
1150 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1151 my $var_glob = $cpt->varglob($glob_name);
1152 my $value; #= $cpt->reval("return $variable");
1153 # print STDERR "$variable $value",qq(\n);
1154 if (defined $var_glob) {{
1156 if ($glob_type eq '%') {
1157 $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1159 elsif ($glob_type eq '@') {
1160 $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1163 $value = ${*{$var_glob}};
1165 # We punt here, because we can't tell if the value was
1166 # defined intentionally, or if it was just left alone;
1167 # this tries to set sane defaults.
1168 set_default(\%config,$hash_name,$value) if defined $value;
1175 my ($variable) = @_;
1176 my $hash_name = $variable;
1177 $hash_name =~ s/^([\$\%\@])g//;
1179 my $glob_name = 'g'.$hash_name;
1180 $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge;
1181 $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1182 $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1183 return $hash_name unless wantarray;
1184 return ($hash_name,$glob_name,$glob_type);
1189 # sets the configuration hash to the default value if it's not set,
1190 # otherwise doesn't do anything
1191 # If $USING_GLOBALS, then sets an appropriate global.
1194 my ($config,$option,$value) = @_;
1196 if ($USING_GLOBALS) {
1197 # fix up the variable name
1198 $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1199 # Fix stupid HTML names
1200 $varname =~ s/(Html|Cgi)/uc($1)/ge;
1202 # update the configuration value
1203 if (not $USING_GLOBALS and not exists $config->{$option}) {
1204 $config->{$option} = $value;
1206 elsif ($USING_GLOBALS) {{
1208 # Need to check if a value has already been set in a global
1209 if (defined *{"Debbugs::Config::${varname}"}) {
1210 $config->{$option} = *{"Debbugs::Config::${varname}"};
1213 $config->{$option} = $value;
1216 if ($USING_GLOBALS) {{
1218 *{"Debbugs::Config::${varname}"} = $config->{$option};
1225 # All we care about here is whether we've been called with the globals or text option;
1226 # if so, then we need to export some symbols back up.
1227 # In any event, we call exporter.
1230 if (grep /^:(?:text|globals)$/, @_) {
1232 for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1233 my $tmp = $variable;
1235 # Yes, I don't care if these are only used once
1237 # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1239 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1240 $tmp =~ s/^[\%\$\@]//;
1241 *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1244 Debbugs::Config->export_to_level(1,@_);