X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FConfig.pm;h=454db3553098b136db67cd8ecb4708efb9c20ba8;hb=fae2d5eea37642cc3773faa697973c25e5e140c2;hp=5fbb524e6f9a4c2f1546422089a7a7e2befc3d6e;hpb=8626368c04a2998e11be0cb231b7f962da295549;p=debbugs.git diff --git a/Debbugs/Config.pm b/Debbugs/Config.pm index 5fbb524..454db35 100644 --- a/Debbugs/Config.pm +++ b/Debbugs/Config.pm @@ -1,3 +1,9 @@ +# This module is part of debbugs, and is released +# under the terms of the GPL version 2, or any later +# version at your option. +# See the file README and COPYING for more information. +# +# Copyright 2007 by Don Armstrong . package Debbugs::Config; @@ -43,25 +49,45 @@ BEGIN { qw($gMaintainer $gMaintainerWebpage $gMaintainerEmail $gUnknownMaintainerEmail), qw($gSubmitList $gMaintList $gQuietList $gForwardList), qw($gDoneList $gRequestList $gSubmitterList $gControlList), + qw($gStrongList), + qw($gBugSubscriptionDomain), + qw($gPackageVersionRe), qw($gSummaryList $gMirrorList $gMailer $gBug), qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity), qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir), qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile), - qw($gMaintainerFileOverride $gPseudoDescFile $gPackageSource), + qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource), qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap), - qw($gSendmail $gLibPath), + qw($gVersionTimeIndex), + qw($gSimpleVersioning), + qw($gCVETracker), + qw($gSendmail @gSendmailArguments $gLibPath $gSpamScan @gExcludeFromControl), qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities), + qw(%gTagsSingleLetter), qw(%gSearchEstraier), + qw(%gDistributionAliases), + qw(%gObsoleteSeverities), + qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures), + qw(@gRemovalStrongSeverityDefaultDistributionTags), + qw(@gAffectsDistributionTags), + qw(@gDefaultArchitectures), + qw($gMachineName), + qw($gTemplateDir), + qw($gDefaultPackage), + qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb), ], text => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote), ], + cgi => [qw($gLibravatarUri $gLibravatarCacheDir $gLibravatarUriOptions @gLibravatarBlacklist)], config => [qw(%config)], ); @EXPORT_OK = (); - Exporter::export_ok_tags(qw(globals text config)); + Exporter::export_ok_tags(keys %EXPORT_TAGS); $EXPORT_TAGS{all} = [@EXPORT_OK]; + $ENV{HOME} = '' if not defined $ENV{HOME}; } +use Sys::Hostname; use File::Basename qw(dirname); use IO::File; use Safe; @@ -76,6 +102,19 @@ use Safe; # read in the files; %config = (); +# untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us +# This enables us to test things that are -T. +if (exists $ENV{DEBBUGS_CONFIG_FILE}) { +# This causes all sorts of problems for mirrors of debbugs; disable +# it. +# if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] == $<) { + $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/; + $ENV{DEBBUGS_CONFIG_FILE} = $1; +# } +# else { +# die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script."; +# } +} read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'); =item email_domain $gEmailDomain @@ -117,7 +156,7 @@ concatenation of L and L =cut -set_default(\%config,'web_domain',$config{web_host}.'/'.$config{web_host_bug_dir}); +set_default(\%config,'web_domain',$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir}); =item html_suffix $gHTMLSuffix @@ -156,15 +195,45 @@ package links will not be made. set_default(\%config,'package_pages',undef); +=item package_pages $gUsertagPackageDomain + +Domain where where usertags of packages belong; defaults to $gPackagePages + +=cut + +set_default(\%config,'usertag_package_domain',$config{package_pages}); + + =item subscription_domain $gSubscriptionDomain Domain where subscriptions to package lists happen =cut - set_default(\%config,'subscription_domain',undef); + +=item cc_all_mails_to_addr $gCcAllMailsToAddr + +Address to Cc (well, Bcc) all e-mails to + +=cut + +set_default(\%config,'cc_all_mails_to_addr',undef); + + +=item cve_tracker $gCVETracker + +URI to CVE security tracker; in bugreport.cgi, CVE-2001-0002 becomes +linked to http://$config{cve_tracker}CVE-2001-002 + +Default: security-tracker.debian.org/tracker/ + +=cut + +set_default(\%config,'cve_tracker','security-tracker.debian.org/tracker/'); + + =back =cut @@ -214,7 +283,7 @@ Default: "$config{web_domain}/~owner" set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner"); -=item maintainer_email +=item maintainer_email $gMaintainerEmail Email address of the maintainer of this Debbugs install @@ -230,11 +299,22 @@ Email address where packages with an unknown maintainer will be sent Default: $config{maintainer_email} +=cut + +set_default(\%config,'unknown_maintainer_email',$config{maintainer_email}); + +=item machine_name + +The name of the machine that this instance of debbugs is running on +(currently used for debbuging purposes and web page output.) + +Default: Sys::Hostname::hostname() + =back =cut -set_default(\%config,'unknown_maintainer_email',$config{maintainer_email}); +set_default(\%config,'machine_name',Sys::Hostname::hostname()); =head2 BTS Mailing Lists @@ -259,7 +339,7 @@ set_default(\%config,'unknown_maintainer_email',$config{maintainer_email}); =item mirror_list -=back +=item strong_list =cut @@ -273,16 +353,61 @@ set_default(\%config,'submitter_list','bug-submitter-list'); set_default(\%config, 'control_list', 'bug-control-list'); set_default(\%config, 'summary_list', 'bug-summary-list'); set_default(\%config, 'mirror_list', 'bug-mirror-list'); +set_default(\%config, 'strong_list', 'bug-strong-list'); + +=item bug_subscription_domain + +Domain of list for messages regarding a single bug; prefixed with +bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to +disable sending messages to the bug subscription list. + +Default: list_domain + +=back + +=cut + +set_default(\%config,'bug_subscription_domain',$config{list_domain}); + + =head2 Misc Options =over +=item mailer + +Name of the mailer to use + +Default: exim + =cut set_default(\%config,'mailer','exim'); + + +=item bug + +Default: bug + +=item ubug + +Default: ucfirst($config{bug}); + +=item bugs + +Default: bugs + +=item ubugs + +Default: ucfirst($config{ubugs}); + +=cut + set_default(\%config,'bug','bug'); +set_default(\%config,'ubug',ucfirst($config{bug})); set_default(\%config,'bugs','bugs'); +set_default(\%config,'ubugs',ucfirst($config{bugs})); =item remove_age @@ -304,15 +429,95 @@ Default: 1 set_default(\%config,'save_old_bugs',1); +=item distribution_aliases + +Map of distribution aliases to the distribution name + +Default: + {experimental => 'experimental', + unstable => 'unstable', + testing => 'testing', + stable => 'stable', + oldstable => 'oldstable', + sid => 'unstable', + lenny => 'testing', + etch => 'stable', + sarge => 'oldstable', + } + +=cut + +set_default(\%config,'distribution_aliases', + {experimental => 'experimental', + unstable => 'unstable', + testing => 'testing', + stable => 'stable', + oldstable => 'oldstable', + sid => 'unstable', + lenny => 'testing', + etch => 'stable', + sarge => 'oldstable', + }, + ); + + + =item distributions List of valid distributions -Default: qw(experimental unstable testing stable oldstable); +Default: The values of the distribution aliases map. + +=cut + +my %_distributions_default; +@_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}}; +set_default(\%config,'distributions',[keys %_distributions_default]); + + +=item default_architectures + +List of default architectures to use when architecture(s) are not +specified + +Default: i386 amd64 arm ppc sparc alpha + +=cut + +set_default(\%config,'default_architectures', + [qw(i386 amd64 arm powerpc sparc alpha)] + ); + +=item affects_distribution_tags + +List of tags which restrict the buggy state to a set of distributions. + +The set of distributions that are buggy is the intersection of the set +of distributions that would be buggy without reference to these tags +and the set of these tags that are distributions which are set on a +bug. + +Setting this to [] will remove this feature. + +Default: @{$config{distributions}} + +=cut + +set_default(\%config,'affects_distribution_tags', + [@{$config{distributions}}], + ); + +=item removal_unremovable_tags + +Bugs which have these tags set cannot be archived + +Default: [] =cut -set_default(\%config,'distributions',[qw(experimental unstable testing stable oldstable)]); +set_default(\%config,'removal_unremovable_tags', + [], + ); =item removal_distribution_tags @@ -330,56 +535,505 @@ set_default(\%config,'removal_distribution_tags', For removal/archival purposes, all bugs are assumed to have these tags set. -Default: qw(unstable testing); +Default: qw(experimental unstable testing); =cut set_default(\%config,'removal_default_distribution_tags', - [qw(unstable testing)] + [qw(experimental unstable testing)] + ); + +=item removal_strong_severity_default_distribution_tags + +For removal/archival purposes, all bugs with strong severity are +assumed to have these tags set. + +Default: qw(experimental unstable testing stable); + +=cut + +set_default(\%config,'removal_strong_severity_default_distribution_tags', + [qw(experimental unstable testing stable)] + ); + + +=item removal_architectures + +For removal/archival purposes, these architectures are consulted if +there is more than one architecture applicable. If the bug is in a +package not in any of these architectures, the architecture actually +checked is undefined. + +Default: value of default_architectures + +=cut + +set_default(\%config,'removal_architectures', + $config{default_architectures}, + ); + + +=item package_name_re + +The regex which will match a package name + +Default: '[a-z0-9][a-z0-9\.+-]+' + +=cut + +set_default(\%config,'package_name_re', + '[a-z0-9][a-z0-9\.+-]+'); + +=item package_version_re + +The regex which will match a package version + +Default: '[A-Za-z0-9:+\.-]+' + +=cut + + +set_default(\%config,'package_version_re', + '[A-Za-z0-9:+\.~-]+'); + + +=item default_package + +This is the name of the default package. If set, bugs assigned to +packages without a maintainer and bugs missing a Package: psuedoheader +will be assigned to this package instead. + +Defaults to unset, which is the traditional debbugs behavoir + +=cut + +set_default(\%config,'default_package', + undef + ); + + +=item control_internal_requester + +This address is used by Debbugs::Control as the request address which +sent a control request for faked log messages. + +Default:"Debbugs Internal Request <$config{maintainer_email}>" + +=cut + +set_default(\%config,'control_internal_requester', + "Debbugs Internal Request <$config{maintainer_email}>", ); +=item control_internal_request_addr + +This address is used by Debbugs::Control as the address to which a +faked log message request was sent. + +Default: "internal_control\@$config{email_domain}"; + +=cut + +set_default(\%config,'control_internal_request_addr', + 'internal_control@'.$config{email_domain}, + ); + + +=item exclude_from_control + +Addresses which are not allowed to send messages to control + +=cut + +set_default(\%config,'exclude_from_control',[]); + + + +=item default_severity + +The default severity of bugs which have no severity set + +Default: normal + +=cut + set_default(\%config,'default_severity','normal'); -set_default(\%config,'show_severities','critical, grave, normal, minor, wishlist'); -set_default(\%config,'strong_severities',[qw(critical grave)]); -set_default(\%config,'severity_list',[qw(critical grave normal wishlist)]); + +=item severity_display + +A hashref of severities and the informative text which describes them. + +Default: + + {critical => "Critical $config{bugs}", + grave => "Grave $config{bugs}", + normal => "Normal $config{bugs}", + wishlist => "Wishlist $config{bugs}", + } + +=cut + set_default(\%config,'severity_display',{critical => "Critical $config{bugs}", grave => "Grave $config{bugs}", + serious => "Serious $config{bugs}", + important=> "Important $config{bugs}", normal => "Normal $config{bugs}", + minor => "Minor $config{bugs}", wishlist => "Wishlist $config{bugs}", }); +=item show_severities + +A scalar list of the severities to show + +Defaults to the concatenation of the keys of the severity_display +hashlist with ', ' above. + +=cut + +set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}})); + +=item strong_severities + +An arrayref of the serious severities which shoud be emphasized + +Default: [qw(critical grave)] + +=cut + +set_default(\%config,'strong_severities',[qw(critical grave)]); + +=item severity_list + +An arrayref of a list of the severities + +Defaults to the keys of the severity display hashref + +=cut + +set_default(\%config,'severity_list',[keys %{$config{severity_display}}]); + +=item obsolete_severities + +A hashref of obsolete severities with the replacing severity + +Default: {} + +=cut + +set_default(\%config,'obsolete_severities',{}); + +=item tags + +An arrayref of the tags used + +Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also +includes the distributions. + +=cut + set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed), @{$config{distributions}} ]); +set_default(\%config,'tags_single_letter', + {patch => '+', + wontfix => '', + moreinfo => 'M', + unreproducible => 'R', + fixed => 'F', + } + ); + set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'. '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'. '^mail.*agent|^tcpmail|^bitmail|^mailman'); set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config')); set_default(\%config,'spool_dir','/var/lib/debbugs/spool'); + +=item usertag_dir + +Directory which contains the usertags + +Default: $config{spool_dir}/user + +=cut + +set_default(\%config,'usertag_dir',$config{spool_dir}.'/user'); set_default(\%config,'incoming_dir','incoming'); + +=item web_dir $gWebDir + +Directory where base html files are kept. Should normally be the same +as the web server's document root. + +Default: /var/lib/debbugs/www + +=cut + set_default(\%config,'web_dir','/var/lib/debbugs/www'); set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt'); set_default(\%config,'lib_path','/usr/lib/debbugs'); + +=item template_dir + +directory of templates; defaults to /usr/share/debbugs/templates. + +=cut + +set_default(\%config,'template_dir','/usr/share/debbugs/templates'); + + set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers'); set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override'); +set_default(\%config,'source_maintainer_file',$config{config_dir}.'/Source_maintainers'); +set_default(\%config,'source_maintainer_file_override',undef); +set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maintainers'); set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description'); set_default(\%config,'package_source',$config{config_dir}.'/indices/sources'); + +=item simple_versioning + +If true this causes debbugs to ignore version information and just +look at whether a bug is done or not done. Primarily of interest for +debbugs installs which don't track versions. defaults to false. + +=cut + +set_default(\%config,'simple_versioning',0); + + +=item version_packages_dir + +Location where the version package information is kept; defaults to +spool_dir/../versions/pkg + +=cut + set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg'); +=item version_time_index + +Location of the version/time index file. Defaults to +spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions +exists; otherwise defaults to undef. + +=cut + + +set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef); + +=item version_index + +Location of the version index file. Defaults to +spool_dir/../versions/indices/versions.idx if spool_dir/../versions +exists; otherwise defaults to undef. + +=cut + +set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef); + +=item binary_source_map + +Location of the binary -> source map. Defaults to +spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions +exists; otherwise defaults to undef. + +=cut + +set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef); + +=item source_binary_map + +Location of the source -> binary map. Defaults to +spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions +exists; otherwise defaults to undef. + +=cut + +set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef); + + + +set_default(\%config,'post_processall',[]); + =item sendmail Sets the sendmail binary to execute; defaults to /usr/lib/sendmail =cut -set_default(\%config,'sendmail',$config{sendmail},'/usr/lib/sendmail'); +set_default(\%config,'sendmail','/usr/lib/sendmail'); + +=item sendmail_arguments + +Default arguments to pass to sendmail. Defaults to C. + +=cut + +set_default(\%config,'sendmail_arguments',[qw(-oem -oi)]); + +=item spam_scan + +Whether or not spamscan is being used; defaults to 0 (not being used + +=cut + +set_default(\%config,'spam_scan',0); + +=item spam_crossassassin_db + +Location of the crosassassin database, defaults to +spool_dir/../CrossAssassinDb + +=cut + +set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb'); + +=item spam_max_cross + +Maximum number of cross-posted messages + +=cut + +set_default(\%config,'spam_max_cross',6); + + +=item spam_spams_per_thread + +Number of spams for each thread (on average). Defaults to 200 + +=cut + +set_default(\%config,'spam_spams_per_thread',200); + +=item spam_max_threads + +Maximum number of threads to start. Defaults to 20 + +=cut + +set_default(\%config,'spam_max_threads',20); + +=item spam_keep_running + +Maximum number of seconds to run without restarting. Defaults to 3600. + +=cut + +set_default(\%config,'spam_keep_running',3600); + +=item spam_mailbox + +Location to store spam messages; is run through strftime to allow for +%d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d' + +=cut + +set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d'); + +=item spam_crossassassin_mailbox + +Location to store crossassassinated messages; is run through strftime +to allow for %d,%m,%Y, et al. Defaults to +'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d' + +=cut + +set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d'); + +=item spam_local_tests_only + +Whether only local tests are run, defaults to 0 + +=cut + +set_default(\%config,'spam_local_tests_only',0); + +=item spam_user_prefs + +User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs + +=cut + +set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs"); + +=item spam_rules_dir + +Site rules directory for spamassassin, defaults to +'/usr/share/spamassassin' + +=cut + +set_default(\%config,'spam_rules_dir','/usr/share/spamassassin'); =back +=head2 CGI Options + +=over + +=item libravatar_uri $gLibravatarUri + +URI to a libravatar configuration. If empty or undefined, libravatar +support will be disabled. Defaults to +libravatar.cgi, our internal federated libravatar system. + +=cut + +set_default(\%config,'libravatar_uri','http://'.$config{cgi_domain}.'/libravatar.cgi?email='); + +=item libravatar_uri_options $gLibravatarUriOptions + +Options to append to the md5_hex of the e-mail. This sets the default +avatar used when an avatar isn't available. Currently defaults to +'?d=retro', which causes a bitmap-looking avatar to be displayed for +unknown e-mails. + +Other options which make sense include ?d=404, ?d=wavatar, etc. See +the API of libravatar for details. + +=cut + +set_default(\%config,'libravatar_uri_options',''); + +=item libravatar_default_image + +Default image to serve for libravatar if there is no avatar for an +e-mail address. By default, this is a 1x1 png. [This will also be the +image served if someone specifies avatar=no.] + +Default: $config{web_dir}/1x1.png + +=cut + +set_default(\%config,'libravatar_default_image',$config{web_dir}.'/1x1.png'); + +=item libravatar_cache_dir + +Directory where cached libravatar images are stored + +Default: $config{web_dir}/libravatar/ + +=cut + +set_default(\%config,'libravatar_cache_dir',$config{web_dir}.'/libravatar/'); + +=item libravatar_blacklist + +Array of regular expressions to match against emails, domains, or +images to only show the default image + +Default: empty array + +=cut + +set_default(\%config,'libravatar_blacklist',[]); + +=back =head2 Text Fields @@ -403,10 +1057,21 @@ This prefixes the text of all lines in a bad e-mail message ack. set_default(\%config,'bad_email_prefix',''); + +=item text_instructions + +This gives more information about bad e-mails to receive.in + +=cut + +set_default(\%config,'text_instructions',$config{bad_email_prefix}); + =item html_tail This shows up at the end of (most) html pages +In many pages this has been replaced by the html/tail template. + =cut set_default(\%config,'html_tail',< END @@ -440,6 +1106,10 @@ set_default(\%config,'html_expire_note', sub read_config{ my ($conf_file) = @_; + if (not -e $conf_file) { + print STDERR "configuration file '$conf_file' doesn't exist; skipping it\n" if $DEBUG; + return; + } # first, figure out what type of file we're reading in. my $fh = new IO::File $conf_file,'r' or die "Unable to open configuration file $conf_file for reading: $!"; @@ -466,7 +1136,7 @@ sub read_config{ die "Error in configuration file: $@" if $@; # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables # we want to glob in from the configuration file - for my $variable (@{$EXPORT_TAGS{globals}}) { + for my $variable (map {$_ =~ /^(?:config|all)$/ ? () : @{$EXPORT_TAGS{$_}}} keys %EXPORT_TAGS) { my ($hash_name,$glob_name,$glob_type) = __convert_name($variable); my $var_glob = $cpt->varglob($glob_name); my $value; #= $cpt->reval("return $variable"); @@ -497,7 +1167,7 @@ sub __convert_name{ $hash_name =~ s/^([\$\%\@])g//; my $glob_type = $1; my $glob_name = 'g'.$hash_name; - $hash_name =~ s/(HTML|CGI)/ucfirst(lc($1))/ge; + $hash_name =~ s/(HTML|CGI|CVE)/ucfirst(lc($1))/ge; $hash_name =~ s/^([A-Z]+)/lc($1)/e; $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge; return $hash_name unless wantarray;