commit 02cdaaeb4d3e84f483c96e52ad97f4d5fa9ef47d Author: Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> Date: Mon Jan 26 08:05:56 2015 +0100 Update to rt-4.2.9. ...001-Remove-configure-time-generated-files.patch | 4217 +++++++++++++------- ...on.patch => 0002-Add-Fedora-configuration.patch | 23 +- 0002-Broken-test-dependencies.patch | 33 - 0003-Broken-test-dependencies.patch | 25 + ...-usr-bin-perl-instead-of-usr-bin-env-perl.patch | 75 +- ...atch => 0005-Remove-fixperms-font-install.patch | 20 +- ...permissions.patch => 0006-Fix-permissions.patch | 13 +- 0007-Fix-translation.patch | 25 + ...h => 0008-Adjust-path-to-html-autohandler.patch | 4 +- 0009-Work-around-testsuite-failure.patch | 47 + README.fedora.in | 19 +- rt.spec | 122 +- 12 files changed, 2925 insertions(+), 1698 deletions(-) --- diff --git a/0006-Remove-configure-time-generated-files.patch b/0001-Remove-configure-time-generated-files.patch similarity index 82% rename from 0006-Remove-configure-time-generated-files.patch rename to 0001-Remove-configure-time-generated-files.patch index 8968578..8bd2020 100644 --- a/0006-Remove-configure-time-generated-files.patch +++ b/0001-Remove-configure-time-generated-files.patch @@ -1,42 +1,45 @@ -From c4a3d1f76d592c7b4c52b198feff6a3b99f58197 Mon Sep 17 00:00:00 2001 +From a5e8be9563b56168b93721ba3286d24d4960d1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> -Date: Fri, 16 May 2014 11:21:51 +0200 -Subject: [PATCH 6/6] Remove configure time generated files. +Date: Tue, 18 Mar 2014 07:23:24 +0100 +Subject: [PATCH 1/8] Remove configure time generated files. --- - Makefile | 569 ----- - bin/rt | 2648 ---------------------- - bin/rt-crontool | 468 ---- - bin/rt-mailgate | 526 ----- - etc/RT_Config.pm | 2772 ------------------------ + Makefile | 583 ----- + bin/rt | 2682 --------------------- + bin/rt-crontool | 456 ---- + bin/rt-mailgate | 512 ---- + etc/RT_Config.pm | 3024 ------------------------ etc/upgrade/3.8-ical-extension | 96 - etc/upgrade/4.0-customfield-checkbox-extension | 86 - etc/upgrade/generate-rtaddressregexp | 109 - etc/upgrade/split-out-cf-categories | 171 -- + etc/upgrade/switch-templates-to | 148 -- etc/upgrade/upgrade-articles | 264 --- etc/upgrade/vulnerable-passwords | 142 -- - lib/RT/Generated.pm | 81 - - sbin/rt-attributes-viewer | 122 -- - sbin/rt-clean-sessions | 190 -- - sbin/rt-dump-metadata | 357 --- - sbin/rt-email-dashboards | 173 -- - sbin/rt-email-digest | 380 ---- - sbin/rt-email-group-admin | 527 ----- - sbin/rt-fulltext-indexer | 479 ---- - sbin/rt-preferences-viewer | 149 -- - sbin/rt-server | 285 --- - sbin/rt-server.fcgi | 285 --- - sbin/rt-session-viewer | 121 -- - sbin/rt-setup-database | 607 ------ - sbin/rt-setup-fulltext-index | 720 ------ - sbin/rt-shredder | 325 --- - sbin/rt-test-dependencies | 694 ------ - sbin/rt-validate-aliases | 343 --- - sbin/rt-validator | 1182 ---------- - sbin/standalone_httpd | 285 --- - t/data/configs/apache2.2+fastcgi.conf | 50 - + lib/RT/Generated.pm | 84 - + sbin/rt-attributes-viewer | 115 - + sbin/rt-clean-sessions | 183 -- + sbin/rt-dump-metadata | 336 --- + sbin/rt-email-dashboards | 165 -- + sbin/rt-email-digest | 374 --- + sbin/rt-email-group-admin | 520 ---- + sbin/rt-fulltext-indexer | 467 ---- + sbin/rt-importer | 282 --- + sbin/rt-preferences-viewer | 144 -- + sbin/rt-serializer | 398 ---- + sbin/rt-server | 181 -- + sbin/rt-server.fcgi | 181 -- + sbin/rt-session-viewer | 114 - + sbin/rt-setup-database | 795 ------- + sbin/rt-setup-fulltext-index | 713 ------ + sbin/rt-shredder | 317 --- + sbin/rt-test-dependencies | 652 ----- + sbin/rt-validate-aliases | 373 --- + sbin/rt-validator | 1464 ------------ + sbin/standalone_httpd | 181 -- + t/data/configs/apache2.2+fastcgi.conf | 49 - t/data/configs/apache2.2+mod_perl.conf | 67 - - 32 files changed, 15273 deletions(-) + 35 files changed, 16428 deletions(-) delete mode 100644 Makefile delete mode 100755 bin/rt delete mode 100755 bin/rt-crontool @@ -46,6 +49,7 @@ Subject: [PATCH 6/6] Remove configure time generated files. delete mode 100755 etc/upgrade/4.0-customfield-checkbox-extension delete mode 100755 etc/upgrade/generate-rtaddressregexp delete mode 100755 etc/upgrade/split-out-cf-categories + delete mode 100755 etc/upgrade/switch-templates-to delete mode 100755 etc/upgrade/upgrade-articles delete mode 100755 etc/upgrade/vulnerable-passwords delete mode 100644 lib/RT/Generated.pm @@ -56,7 +60,9 @@ Subject: [PATCH 6/6] Remove configure time generated files. delete mode 100755 sbin/rt-email-digest delete mode 100755 sbin/rt-email-group-admin delete mode 100755 sbin/rt-fulltext-indexer + delete mode 100755 sbin/rt-importer delete mode 100755 sbin/rt-preferences-viewer + delete mode 100755 sbin/rt-serializer delete mode 100755 sbin/rt-server delete mode 100755 sbin/rt-server.fcgi delete mode 100755 sbin/rt-session-viewer @@ -72,10 +78,10 @@ Subject: [PATCH 6/6] Remove configure time generated files. diff --git a/Makefile b/Makefile deleted file mode 100644 -index dd3209c..0000000 +index 3037009..0000000 --- a/Makefile +++ /dev/null -@@ -1,569 +0,0 @@ +@@ -1,583 +0,0 @@ -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: @@ -141,15 +147,15 @@ index dd3209c..0000000 - - -RT_VERSION_MAJOR = 4 --RT_VERSION_MINOR = 0 --RT_VERSION_PATCH = 22 +-RT_VERSION_MINOR = 2 +-RT_VERSION_PATCH = 9 - -RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH) -TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH) - - -# This is the group that all of the installed files will be chgrp'ed to. --RTGROUP = www-data +-RTGROUP = www - - -# User which should own rt binaries. @@ -161,12 +167,8 @@ index dd3209c..0000000 -# Group that should own all of RT's libraries, generally root. -LIBS_GROUP = bin - --WEB_USER = www-data --WEB_GROUP = www-data -- -- --APACHECTL = /usr/sbin/apachectl -- +-WEB_USER = www +-WEB_GROUP = www - -# DESTDIR allows you to specify that RT be installed somewhere other than -# where it will eventually reside. DESTDIR _must_ have a trailing slash @@ -186,11 +188,13 @@ index dd3209c..0000000 -RT_DOC_PATH = /opt/rt4/docs -RT_FONT_PATH = /opt/rt4/share/fonts -RT_LEXICON_PATH = /opt/rt4/share/po +-RT_STATIC_PATH = /opt/rt4/share/static -RT_LOCAL_PATH = /opt/rt4/local -LOCAL_PLUGIN_PATH = /opt/rt4/local/plugins -LOCAL_ETC_PATH = /opt/rt4/local/etc -LOCAL_LIB_PATH = /opt/rt4/local/lib -LOCAL_LEXICON_PATH = /opt/rt4/local/po +-LOCAL_STATIC_PATH = /opt/rt4/local/static -MASON_HTML_PATH = /opt/rt4/share/html -MASON_LOCAL_HTML_PATH = /opt/rt4/local/html -MASON_DATA_PATH = /opt/rt4/var/mason_data @@ -225,7 +229,9 @@ index dd3209c..0000000 - rt-email-digest \ - rt-email-group-admin \ - rt-fulltext-indexer \ +- rt-importer \ - rt-preferences-viewer \ +- rt-serializer \ - rt-server \ - rt-server.fcgi \ - rt-session-viewer \ @@ -300,7 +306,7 @@ index dd3209c..0000000 - - - --TEST_FILES = t/*.t t/*/*.t +-TEST_FILES = t/*.t t/*/*.t t/*/*/*.t -TEST_VERBOSE = 0 - -RT_TEST_PARALLEL_NUM ?= 5 @@ -390,15 +396,21 @@ index dd3209c..0000000 - chmod -R u+rwX,go-w,go+rX $(DESTDIR)$(MASON_HTML_PATH) \ - $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \ - $(DESTDIR)$(RT_LEXICON_PATH) \ -- $(DESTDIR)$(LOCAL_LEXICON_PATH) +- $(DESTDIR)$(LOCAL_LEXICON_PATH) \ +- $(DESTDIR)$(RT_STATIC_PATH) \ +- $(DESTDIR)$(LOCAL_STATIC_PATH) - chown -R $(LIBS_OWNER) $(DESTDIR)$(MASON_HTML_PATH) \ - $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \ - $(DESTDIR)$(RT_LEXICON_PATH) \ -- $(DESTDIR)$(LOCAL_LEXICON_PATH) +- $(DESTDIR)$(LOCAL_LEXICON_PATH) \ +- $(DESTDIR)$(RT_STATIC_PATH) \ +- $(DESTDIR)$(LOCAL_STATIC_PATH) - chgrp -R $(LIBS_GROUP) $(DESTDIR)$(MASON_HTML_PATH) \ - $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \ - $(DESTDIR)$(RT_LEXICON_PATH) \ -- $(DESTDIR)$(LOCAL_LEXICON_PATH) +- $(DESTDIR)$(LOCAL_LEXICON_PATH) \ +- $(DESTDIR)$(RT_STATIC_PATH) \ +- $(DESTDIR)$(LOCAL_STATIC_PATH) - - # Make the web ui's data dir writable - chmod 0770 $(DESTDIR)$(MASON_DATA_PATH) \ @@ -412,6 +424,7 @@ index dd3209c..0000000 - $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_LOG_PATH) - $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_FONT_PATH) - $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_LEXICON_PATH) +- $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_STATIC_PATH) - $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH) - $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH)/cache - $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH)/etc @@ -423,10 +436,16 @@ index dd3209c..0000000 - $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LIB_PATH) - $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_PLUGIN_PATH) - $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LEXICON_PATH) +- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_STATIC_PATH) +- +-clean-mason-cache: +- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/cache/* +- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/etc/* +- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/obj/* - -install: testdeps config-install dirs files-install fixperms instruct - --files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install +-files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install static-install - -config-install: - $(INSTALL) -m 0755 -o $(BIN_OWNER) -g $(RTGROUP) -d $(DESTDIR)$(CONFIG_FILE_PATH) @@ -479,6 +498,7 @@ index dd3209c..0000000 - -( cd share/html && find . -type f -print ) | while read file ; do \ - $(INSTALL) -m 0644 "share/html/$$file" "$(DESTDIR)$(MASON_HTML_PATH)/$$file" ; \ - done +- $(MAKE) clean-mason-cache - -font-install: - [ -d $(DESTDIR)$(RT_FONT_PATH) ] || $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_FONT_PATH) @@ -493,6 +513,14 @@ index dd3209c..0000000 - $(INSTALL) -m 0644 "share/po/$$file" "$(DESTDIR)$(RT_LEXICON_PATH)/$$file" ; \ - done - +-static-install: +- [ -d $(DESTDIR)$(RT_STATIC_PATH) ] || $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_STATIC_PATH) +- -( cd share/static && find . -type d -print ) | while read dir ; do \ +- $(INSTALL) -m 0755 -d "$(DESTDIR)$(RT_STATIC_PATH)/$$dir" ; \ +- done +- -( cd share/static && find . -type f -print ) | while read file ; do \ +- $(INSTALL) -m 0644 "share/static/$$file" "$(DESTDIR)$(RT_STATIC_PATH)/$$file" ; \ +- done - - -doc-install: @@ -544,20 +572,12 @@ index dd3209c..0000000 -license-tag: - $(PERL) devel/tools/license_tag - --factory: initialize-database -- cd lib; $(PERL) ../devel/tools/factory $(DB_DATABASE) RT -- -start-httpd: - $(PERL) sbin/standalone_httpd & - -start-server: - $(PERL) sbin/rt-server & - --apachectl: -- $(APACHECTL) stop -- sleep 10 -- $(APACHECTL) start -- sleep 5 - -SNAPSHOT=$(shell git describe --tags) -THIRD_PARTY=devel/third-party/ @@ -579,7 +599,7 @@ index dd3209c..0000000 - rm -fr "$(SNAPSHOT)/" - -clearsign-snapshot: -- gpg --no-armor --detach-sign "$(SNAPSHOT).tar.gz" +- gpg --armor --detach-sign "$(SNAPSHOT).tar.gz" - -build-third-party: - git archive --prefix "$(SNAPSHOT)/$(THIRD_PARTY)" HEAD:$(THIRD_PARTY) \ @@ -587,7 +607,7 @@ index dd3209c..0000000 - rm -rf "$(SNAPSHOT)/$(THIRD_PARTY)" - -clearsign-third-party: -- gpg --no-armor --detach-sign "$(SNAPSHOT)-third-party-source.tar.gz" +- gpg --armor --detach-sign "$(SNAPSHOT)-third-party-source.tar.gz" - -snapshot-shasums: - sha1sum $(SNAPSHOT)*.tar.gz* @@ -605,8 +625,8 @@ index dd3209c..0000000 - --skip cpan-capitalization,cpan-mod_perl,cpan-Encode,cpan-PPI,cpan-Test-Exception-LessClever,cpan-Test-Manifest,cpan-Test-Object,cpan-Test-Pod,cpan-Test-Requires,cpan-Test-SubCalls,cpan-Test-cpan-Tester,cpan-Test-Warn --skip-all-recommends - mv $(VESSEL)/scripts/RT/build $(VESSEL)/scripts/RT/build.pl - --JSMIN_URL = http://download.bestpractical.com/mirror/jsmin-2011-01-22.c --JSMIN_SHA = 8a6b3b980a52c028eb73aee4a82ebe060c1ee854 +-JSMIN_URL = http://download.bestpractical.com/mirror/jsmin-2013-03-29.c +-JSMIN_SHA = 67dc8d73a8878f88cdaeb1a86775872eae5c3077 - -jsmin: jsmin-checkcc jsmin-fetch jsmin-verify jsmin-confirm jsmin-build jsmin-install - @echo "" @@ -647,10 +667,10 @@ index dd3209c..0000000 - $(INSTALL) -o $(BIN_OWNER) -g $(RTGROUP) -m 0755 "jsmin" "$(DESTDIR)$(RT_BIN_PATH)/" diff --git a/bin/rt b/bin/rt deleted file mode 100755 -index dffd19f..0000000 +index a73bb42..0000000 --- a/bin/rt +++ /dev/null -@@ -1,2648 +0,0 @@ +@@ -1,2682 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -983,32 +1003,53 @@ index dffd19f..0000000 - $data{orderby} =~ s/^\+?(.*)/-$1/; - } - -- if (!defined $q) { -- $q = $config{query}; +- $type ||= "ticket"; +- +- if (!defined $q ) { +- if ( $type eq 'ticket' ) { +- $q = $config{query}; +- } +- else { +- $q = ''; +- } - } -- -- $q =~ s/^#//; # get rid of leading hash -- if ($q =~ /^\d+$/) { -- # only digits, must be an id, formulate a correct query -- $q = "id=$q" if $q =~ /^\d+$/; -- } else { -- # a string only, take it as an owner or requestor (quoting done later) -- $q = "(Owner=$q or Requestor like $q) and $config{query}" -- if $q =~ /^[\w\-]+$/; -- # always add a query for a specific queue or (comma separated) queues -- $queue =~ s/,/ or Queue=/g if $queue; -- $q .= " and (Queue=$queue)" if $queue and $q and $q !~ /Queue\s*=/i -- and $q !~ /id\s*=/i; +- +- if ( $type ne 'ticket' ) { +- $rawprint = 1; - } -- # correctly quote strings in a query -- $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g; - -- $type ||= "ticket"; -- unless ($type && defined $q) { +- unless (defined $q) { - my $item = $type ? "query string" : "object type"; - whine "No $item specified."; - $bad = 1; - } +- +- $q =~ s/^#//; # get rid of leading hash +- if ( $type eq 'ticket' ) { +- if ( $q =~ /^\d+$/ ) { +- +- # only digits, must be an id, formulate a correct query +- $q = "id=$q" if $q =~ /^\d+$/; +- } +- else { +- +- # a string only, take it as an owner or requestor (quoting done later) +- $q = "(Owner=$q or Requestor like $q) and $config{query}" +- if $q =~ /^[\w\-]+$/; +- +- # always add a query for a specific queue or (comma separated) queues +- $queue =~ s/,/ or Queue=/g if $queue; +- $q .= " and (Queue=$queue)" +- if $queue +- and $q +- and $q !~ /Queue\s*=/i +- and $q !~ /id\s*=/i; +- } +- +- # correctly quote strings in a query +- $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g; +- } +- - #return help("list", $type) if $bad; - return suggest_help("list", $type, $bad) if $bad; - @@ -1425,6 +1466,7 @@ index dffd19f..0000000 - my ($action) = @_; - my (%data, $id, @files, @bcc, @cc, $msg, $content_type, $wtime, $edit); - my $bad = 0; +- my $status = ''; - - while (@ARGV) { - $_ = shift @ARGV; @@ -1432,7 +1474,7 @@ index dffd19f..0000000 - if (/^-e$/) { - $edit = 1; - } -- elsif (/^-(?:[abcmw]|ct)$/) { +- elsif (/^-(?:[abcmws]|ct)$/) { - unless (@ARGV) { - whine "No argument specified with $_."; - $bad = 1; last; @@ -1448,6 +1490,9 @@ index dffd19f..0000000 - elsif (/-ct/) { - $content_type = shift @ARGV; - } +- elsif (/-s/) { +- $status = shift @ARGV; +- } - elsif (/-([bc])/) { - my $a = $_ eq "-b" ? \@bcc : \@cc; - @$a = split /\s*,\s*/, shift @ARGV; @@ -1490,9 +1535,12 @@ index dffd19f..0000000 - TimeWorked => $wtime || '', - 'Content-Type' => $content_type || 'text/plain', - Text => $msg || '', -- Status => '' +- Status => $status - } - ]; +- if ($status ne '') { +- push(@{$form->[1]}, "Status"); +- } - - my $text = Form::compose([ $form ]); - @@ -2852,13 +2900,14 @@ index dffd19f..0000000 - Displays a list of objects matching the specified conditions. - ("ls", "list", and "search" are synonyms.) - -- Conditions are expressed in the SQL-like syntax used internally by -- RT. (For more information, see "rt help query".) The query string -- must be supplied as one argument. +- The query string must be supplied as one argument. - -- (Right now, the server doesn't support listing anything but tickets. -- Other types will be supported in future; this client will be able to -- take advantage of that support without any changes.) +- if on tickets, query is in the SQL-like syntax used internally by +- RT. (For more information, see "rt help query".), otherwise, query +- is plain string with format "FIELD OP VALUE", e.g. "Name = General". +- +- if query string is absent, we limit to privileged ones on users and +- user defined ones on groups automatically. - - Options: - @@ -2889,6 +2938,9 @@ index dffd19f..0000000 - rt ls -t ticket "Subject like '[PATCH]%'" - rt ls -q systems - rt ls -f owner,subject +- rt ls -t queue 'Name = General' +- rt ls -t user 'EmailAddress like foo@xxxxxxx' +- rt ls -t group 'Name like foo' - --- - @@ -3031,6 +3083,8 @@ index dffd19f..0000000 - than once to attach multiple files.) - -c <addrs> A comma-separated list of Cc addresses. - -b <addrs> A comma-separated list of Bcc addresses. +- -s <status> Set a new status for the ticket (default will +- leave the status unchanged) - -w <time> Specify the time spent working on this ticket. - -e Starts an editor before the submission, even if - arguments from the command line were sufficient. @@ -3301,10 +3355,10 @@ index dffd19f..0000000 - diff --git a/bin/rt-crontool b/bin/rt-crontool deleted file mode 100755 -index ca9a6d6..0000000 +index 95469f7..0000000 --- a/bin/rt-crontool +++ /dev/null -@@ -1,468 +0,0 @@ +@@ -1,456 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -3358,23 +3412,15 @@ index ca9a6d6..0000000 -use Carp; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -3388,9 +3434,6 @@ index ca9a6d6..0000000 - -use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); - --#Clean out all the nasties from the environment --CleanEnv(); -- -my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg, - $template, $template_id, $transaction, $transaction_type, $help, $log, $verbose ); -GetOptions( @@ -3413,11 +3456,14 @@ index ca9a6d6..0000000 -RT::LoadConfig(); - -# adjust logging to the screen according to options --RT->Config->Set( LogToScreen => $log ) if $log; +-RT->Config->Set( LogToSTDERR => $log ) if $log; - -#Connect to the database and get RT::SystemUser and RT::Nobody loaded -RT::Init(); - +-# Clean out all the nasties from the environment +-CleanEnv(); +- -require RT::Tickets; -require RT::Template; - @@ -3428,7 +3474,7 @@ index ca9a6d6..0000000 -help() if $help; - -unless ( $CurrentUser->Id ) { -- print loc("No RT user found. Please consult your RT administrator."); +- print loc("No RT user found. Please consult your RT administrator.") . "\n"; - exit(1); -} - @@ -3568,24 +3614,20 @@ index ca9a6d6..0000000 -# -# =cut - --{ my $cache = undef; -sub get_template { - my $ticket = shift; - return undef unless $template; - - unless ( $template =~ /\D/ ) { - # by id -- return $cache if $cache; -- -- my $cache = RT::Template->new( RT->SystemUser ); -- $cache->Load( $template ); +- my $template_obj = RT::Template->new( RT->SystemUser ); +- $template_obj->Load( $template ); - die "Failed to load template '$template'" -- unless $cache->id; -- return $cache; +- unless $template_obj->id; +- return $template_obj; - } - - my $queue = $ticket->Queue; -- return $cache->{ $queue } if $cache->{ $queue }; - - my $res = RT::Template->new( RT->SystemUser ); - $res->LoadQueueTemplate( Queue => $queue, Name => $template ); @@ -3594,8 +3636,8 @@ index ca9a6d6..0000000 - die "Failed to load template '$template', either for queue #$queue or global" - unless $res->id; - } -- return $cache->{ $queue } = $res; --} } +- return $res; +-} - - -# =head2 load_module @@ -3606,9 +3648,9 @@ index ca9a6d6..0000000 - -sub load_module { - my $modname = shift; -- eval "require $modname"; -- if ($@) { -- die loc( "Failed to load module [_1]. ([_2])", $modname, $@ ); +- unless ($modname->require) { +- my $error = $@; +- die loc( "Failed to load module [_1]. ([_2])", $modname, $error ); - } - -} @@ -3620,37 +3662,37 @@ index ca9a6d6..0000000 - . "\n"; - print loc("It takes several arguments:") . "\n\n"; - -- print " " +- print " " - . loc( "[_1] - Specify the search module you want to use", "--search" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - An argument to pass to [_2]", "--search-arg", "--search" ) - . "\n"; - -- print " " +- print " " - . loc( "[_1] - Specify the condition module you want to use", "--condition" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - An argument to pass to [_2]", "--condition-arg", "--condition" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - Specify the action module you want to use", "--action" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - An argument to pass to [_2]", "--action-arg", "--action" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - Specify name or id of template(s) you want to use", "--template" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - Specify if you want to use either 'first', 'last' or 'all' transactions", "--transaction" ) - . "\n"; -- print " " +- print " " - . loc( "[_1] - Specify the comma separated list of transactions' types you want to use", "--transaction-type" ) - . "\n"; -- print " " -- . loc( "[_1] - Adjust LogToScreen config option", "--log" ) . "\n"; -- print " " +- print " " +- . loc( "[_1] - Adjust LogToSTDERR config option", "--log" ) . "\n"; +- print " " - . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n"; - print "\n"; - print "\n"; @@ -3765,7 +3807,7 @@ index ca9a6d6..0000000 - -=item log - --Adjust LogToScreen config option +-Adjust LogToSTDERR config option - -=item verbose - @@ -3775,10 +3817,10 @@ index ca9a6d6..0000000 - diff --git a/bin/rt-mailgate b/bin/rt-mailgate deleted file mode 100755 -index 2e1c76f..0000000 +index 213d064..0000000 --- a/bin/rt-mailgate +++ /dev/null -@@ -1,526 +0,0 @@ +@@ -1,512 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -3925,12 +3967,6 @@ index 2e1c76f..0000000 - return $self->permfail(); - } - -- if (($opts->{'ca-file'} or $opts->{"verify-ssl"}) -- and not LWP::UserAgent->can("ssl_opts")) { -- print STDERR "Verifying SSL certificates requires LWP::UserAgent 6.0 or higher.\n"; -- return $self->tempfail(); -- } -- - $opts->{"verify-ssl"} = 1 unless defined $opts->{"verify-ssl"}; -} - @@ -3938,13 +3974,12 @@ index 2e1c76f..0000000 - my $self = shift; - my $opts = shift; - my $ua = LWP::UserAgent->new(); +- $ua->agent("rt-mailgate/4.2.9 "); - $ua->cookie_jar( { file => $opts->{'jar'} } ) if $opts->{'jar'}; - -- if ( $ua->can("ssl_opts") ) { -- $ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} ); -- $ua->ssl_opts( SSL_ca_file => $opts->{'ca-file'} ) -- if $opts->{'ca-file'}; -- } +- $ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} ); +- $ua->ssl_opts( SSL_ca_file => $opts->{'ca-file'} ) +- if $opts->{'ca-file'}; - - return $ua; -} @@ -4007,6 +4042,14 @@ index 2e1c76f..0000000 - - $ua->timeout( exists( $opts->{'timeout'} ) ? $opts->{'timeout'} : 180 ); - my $r = $ua->post( $full_url, $post_params, Content_Type => 'form-data' ); +- +- # Follow 3 redirects +- my $n = 0; +- while ($n++ < 3 and $r->is_redirect) { +- $full_url = $r->header( "Location" ); +- $r = $ua->post( $full_url, $post_params, Content_Type => 'form-data' ); +- } +- - $self->check_failure($r); - - my $content = $r->content; @@ -4033,13 +4076,8 @@ index 2e1c76f..0000000 - my $r = shift; - return if $r->is_success; - -- # XXX TODO 4.2: Remove the multi-line error strings in favor of something more concise -- print STDERR <<" ERROR"; --An Error Occurred --================= -- --@{[ $r->status_line ]} -- ERROR +- print STDERR "HTTP request failed: @{[ $r->status_line ]}. " +- ."Your webserver logs may have more information or there may be a network problem.\n"; - print STDERR "\n$0: undefined server error\n" if $opts->{'debug'}; - return $self->tempfail(); -} @@ -4139,10 +4177,6 @@ index 2e1c76f..0000000 -This flag tells the mail gateway where it can find your RT server. You should -probably use the same URL that users use to log into RT. - --If your RT server uses SSL, you will need to install additional Perl --libraries. RT will detect and install these dependencies if you pass the --C<--enable-ssl-mailgate> flag to configure as documented in RT's README. -- -If you have a self-signed SSL certificate, you may also need to pass -C<--ca-file> or C<--no-verify-ssl>, below. - @@ -4163,9 +4197,6 @@ index 2e1c76f..0000000 -other certificate which is not traceable back to an certificate your -system ultimitely trusts. - --Verifying SSL certificates requires L<LWP::UserAgent> version 6.0 or --higher; explicitly passing C<--verify-ssl> on prior versions will error. -- -=item C<--extension> OPTIONAL - -Some MTAs will route mail sent to user-foo@host or user+foo@host to user@host @@ -4201,12 +4232,9 @@ index 2e1c76f..0000000 -=head1 SETUP - -Much of the set up of the mail gateway depends on your MTA and mail --routing configuration. However, you will need first of all to create an --RT user for the mail gateway and assign it a password; this helps to --ensure that mail coming into the web server did originate from the --gateway. +-routing configuration. - --Next, you need to route mail to C<rt-mailgate> for the queues you're +-You need to route mail to C<rt-mailgate> for the queues you're -monitoring. For instance, if you're using F</etc/aliases> and you have a -"bugs" queue, you will want something like this: - @@ -4307,10 +4335,10 @@ index 2e1c76f..0000000 - diff --git a/etc/RT_Config.pm b/etc/RT_Config.pm deleted file mode 100644 -index 59eca8d..0000000 +index 54f4579..0000000 --- a/etc/RT_Config.pm +++ /dev/null -@@ -1,2772 +0,0 @@ +@@ -1,3024 +0,0 @@ -# -# RT was configured with: -# @@ -4428,17 +4456,35 @@ index 59eca8d..0000000 - -=item C<@Plugins> - --Set C<@Plugins> to a list of external RT plugins that should be --enabled (those plugins have to be previously downloaded and --installed). +-Once a plugin has been downloaded and installed, use C<Plugin()> to add +-to the enabled C<@Plugins> list: +- +- Plugin( "RT::Extension::SLA" ); +- Plugin( "RT::Authen::ExternalAuth" ); +- +-=cut +- +-Set(@Plugins, ()); +- +-=item C<@StaticRoots> +- +-Set C<@StaticRoots> to serve extra paths with a static handler. The +-contents of each hashref should be the the same arguments as +-L<Plack::Middleware::Static> takes. These paths will be checked before +-any plugin or core static paths. - -Example: - --C<Set(@Plugins, (qw(RT::Extension::SLA RT::Authen::ExternalAuth)));> +- Set( @StaticRoots, +- { +- path => qr{^/static/}, +- root => '/local/path/to/static/parent', +- }, +- ); - -=cut - --Set(@Plugins, ()); +-Set( @StaticRoots, () ); - -=back - @@ -4452,7 +4498,7 @@ index 59eca8d..0000000 -=item C<$DatabaseType> - -Database driver being used; case matters. Valid types are "mysql", --"Oracle" and "Pg". +-"Oracle", and "Pg". "SQLite" is also available for non-production use. - -=cut - @@ -4516,6 +4562,15 @@ index 59eca8d..0000000 - -Set($DatabaseRequireSSL, undef); - +-=item C<$DatabaseAdmin> +- +-The name of the database administrator to connect to the database as +-during upgrades. +- +-=cut +- +-Set($DatabaseAdmin, "root"); +- -=back - - @@ -4534,7 +4589,7 @@ index 59eca8d..0000000 - -=over 4 - --=item C<$LogToSyslog>, C<$LogToScreen> +-=item C<$LogToSyslog>, C<$LogToSTDERR> - -The minimum level error that will be logged to the specific device. -From lowest to highest priority, the levels are: @@ -4552,7 +4607,7 @@ index 59eca8d..0000000 -=cut - -Set($LogToSyslog, "info"); --Set($LogToScreen, "info"); +-Set($LogToSTDERR, "info"); - -=item C<$LogToFile>, C<$LogDir>, C<$LogToFileNamed> - @@ -4587,11 +4642,9 @@ index 59eca8d..0000000 - -=item C<@LogToSyslogConf> - --On Solaris or UnixWare, set to ( socket => 'inet' ). Options here --override any other options RT passes to L<Log::Dispatch::Syslog>. --Other interesting flags include facility and logopt. (See the --L<Log::Dispatch::Syslog> documentation for more information.) (Maybe --ident too, if you have multiple RT installations.) +-Additional options to pass to L<Log::Dispatch::Syslog>; the most +-interesting flags include C<facility>, C<logopt>, and possibly C<ident>. +-See the L<Log::Dispatch::Syslog> documentation for more information. - -=cut - @@ -4613,14 +4666,7 @@ index 59eca8d..0000000 -configuration. - -Be B<very careful> with it. Note that it overrides C<$rtname> for --subject token matching and that you should use only "non-capturing" --parenthesis grouping. For example: -- --C<Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/i );> -- --and NOT -- --C<Set($EmailSubjectTagRegex, qr/(example.com|example.org)/i );> +-subject token matching. - -The setting below would make RT behave exactly as it does without the -setting enabled. @@ -4632,8 +4678,10 @@ index 59eca8d..0000000 -=item C<$OwnerEmail> - -C<$OwnerEmail> is the address of a human who manages RT. RT will send --errors generated by the mail gateway to this address. This address --should I<not> be an address that's managed by your RT instance. +-errors generated by the mail gateway to this address; it will also be +-displayed as the contact person on the RT's login page. Because RT +-sends errors to this address, it should I<not> be an address that's +-managed by your RT instance, to avoid mail loops. - -=cut - @@ -4662,11 +4710,14 @@ index 59eca8d..0000000 - -C<$MaxAttachmentSize> sets the maximum size (in bytes) of attachments -stored in the database. This setting is irrelevant unless one of --$TruncateLongAttachments or $DropLongAttachments (below) are set. +-$TruncateLongAttachments or $DropLongAttachments (below) are set, B<OR> +-the database is stored in Oracle. On Oracle, attachments larger than +-this can be fully stored, but will be truncated to this length when +-read. - -=cut - --Set($MaxAttachmentSize, 10_000_000); +-Set($MaxAttachmentSize, 10_000_000); # 10M - -=item C<$TruncateLongAttachments> - @@ -4713,13 +4764,13 @@ index 59eca8d..0000000 -=item C<$CanonicalizeEmailAddressMatch>, C<$CanonicalizeEmailAddressReplace> - -RT provides functionality which allows the system to rewrite incoming --email addresses. In its simplest form, you can substitute the value --in C<CanonicalizeEmailAddressReplace> for the value in --C<CanonicalizeEmailAddressMatch> (These values are passed to the --C<CanonicalizeEmailAddress> subroutine in F<RT/User.pm>) -- --By default, that routine performs a C<s/$Match/$Replace/gi> on any --address passed to it. +-email addresses, using L<RT::User/CanonicalizeEmailAddress>. The +-default implementation replaces all occurrences of the regular +-expression in C<CanonicalizeEmailAddressMatch> with +-C<CanonicalizeEmailAddressReplace>, via C<s/$Match/$Replace/gi>. The +-most common use of this is to replace C<@something.example.com> with +-C<@example.com>. If more complex noramlization is required, +-L<RT::User/CanonicalizeEmailAddress> can be overridden to provide it. - -=cut - @@ -4738,13 +4789,16 @@ index 59eca8d..0000000 - -=item C<$ValidateUserEmailAddresses> - --If C<$ValidateUserEmailAddresses> is 1, RT will refuse to create +-By default C<$ValidateUserEmailAddresses> is 1, and RT will refuse to create -users with an invalid email address (as specified in RFC 2822) or with -an email address made of multiple email addresses. - +-Set this to 0 to skip any email address validation. Doing so may open up +-vulnerabilities. +- -=cut - --Set($ValidateUserEmailAddresses, undef); +-Set($ValidateUserEmailAddresses, 1); - -=item C<@MailPlugins> - @@ -4804,11 +4858,8 @@ index 59eca8d..0000000 - -C<$MailCommand> defines which method RT will use to try to send mail. -We know that 'sendmailpipe' works fairly well. If 'sendmailpipe' --doesn't work well for you, try 'sendmail'. Other options are 'smtp' --or 'qmail'. -- --Note that you should remove the '-t' from C<$SendmailArguments> if you --use 'sendmail' rather than 'sendmailpipe' +-doesn't work well for you, try 'sendmail'. 'qmail' is also a supported +-value. - -For testing purposes, or to simply disable sending mail out into the -world, you can set C<$MailCommand> to 'testfile' which writes all mail @@ -4855,7 +4906,7 @@ index 59eca8d..0000000 -the From_ header away from www-data or other email addresses that show -up in the "Sent by" line in Outlook. - --The option is a hash reference of queue name to email address. If +-The option is a hash reference of queue id/name to email address. If -there is no ticket involved, then the value of the C<Default> key will -be used. - @@ -5050,16 +5101,14 @@ index 59eca8d..0000000 -=item C<$SendmailArguments> - -C<$SendmailArguments> defines what flags to pass to C<$SendmailPath> --If you picked 'sendmailpipe', you MUST add a -t flag to --C<$SendmailArguments> These options are good for most sendmail --wrappers and work-a-likes. +-These options are good for most sendmail wrappers and work-a-likes. - -These arguments are good for sendmail brand sendmail 8 and newer: --C<Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m");> +-C<Set($SendmailArguments,"-oi -ODeliveryMode=b -OErrorMode=m");> - -=cut - --Set($SendmailArguments, "-oi -t"); +-Set($SendmailArguments, "-oi"); - - -=item C<$SendmailBounceArguments> @@ -5083,39 +5132,6 @@ index 59eca8d..0000000 - -=back - --=head2 SMTP configuration -- --These options only take effect if C<$MailCommand> is 'smtp' -- --=over 4 -- --=item C<$SMTPServer> -- --C<$SMTPServer> should be set to the hostname of the SMTP server to use -- --=cut -- --Set($SMTPServer, undef); -- --=item C<$SMTPFrom> -- --C<$SMTPFrom> should be set to the 'From' address to use, if not the --email's 'From' -- --=cut -- --Set($SMTPFrom, undef); -- --=item C<$SMTPDebug> -- --C<$SMTPDebug> should be set to 1 to debug SMTP mail sending -- --=cut -- --Set($SMTPDebug, 0); -- --=back -- -=head2 Other mailers - -=over 4 @@ -5123,7 +5139,7 @@ index 59eca8d..0000000 -=item C<@MailParams> - -C<@MailParams> defines a list of options passed to $MailCommand if it --is not 'sendmailpipe', 'sendmail', or 'smtp' +-is not 'sendmailpipe' or 'sendmail'; - -=cut - @@ -5141,11 +5157,12 @@ index 59eca8d..0000000 -This determines the default stylesheet the RT web interface will use. -RT ships with several themes by default: - -- web2 The default layout for RT 3.8 +- rudder The default theme for RT 4.2 - aileron The default layout for RT 4.0 +- web2 The default layout for RT 3.8 - ballard Theme which doesn't rely on JavaScript for menuing - --This value actually specifies a directory in F<share/html/NoAuth/css/> +-This value actually specifies a directory in F<share/static/css/> -from which RT will try to load the file main.css (which should @import -any other files the stylesheet needs). This allows you to easily and -cleanly create your own stylesheets to apply to RT. This option can @@ -5153,7 +5170,7 @@ index 59eca8d..0000000 - -=cut - --Set($WebDefaultStylesheet, "aileron"); +-Set($WebDefaultStylesheet, "rudder"); - -=item C<$DefaultQueue> - @@ -5192,6 +5209,48 @@ index 59eca8d..0000000 - -Set(@CustomFieldValuesSources, ()); - +-=item C<%CustomFieldGroupings> +- +-This option affects the display of ticket and user custom fields in the +-web interface. It does not address the sorting of custom fields within +-the groupings; which is controlled by the Ticket Custom Fields tab in +-Queue Configuration in the Admin UI. +- +-A nested datastructure defines how to group together custom fields +-under a mix of built-in and arbitrary headings ("groupings"). +- +-Set C<%CustomFieldGroupings> to a nested structure similar to the following: +- +- Set(%CustomFieldGroupings, +- 'RT::Ticket' => [ +- 'Grouping Name' => ['CF Name', 'Another CF'], +- 'Another Grouping' => ['Some CF'], +- 'Dates' => ['Shipped date'], +- ], +- 'RT::User' => [ +- 'Phones' => ['Fax number'], +- ], +- ); +- +-The first level keys are record types for which CFs may be used, and the +-values are either hashrefs or arrayrefs -- if arrayrefs, then the +-ordering is preserved during display, otherwise groupings are displayed +-alphabetically. The second level keys are the grouping names and the +-values are array refs containing a list of CF names. +- +-There are several special built-in groupings which RT displays in +-specific places (usually the collapsible box of the same title). The +-ordering of these standard groupings cannot be modified. You may also +-only append Custom Fields to the list in these boxes, not reorder or +-remove core fields. +- +-For C<RT::Ticket>, these groupings are: C<Basics>, C<Dates>, C<Links>, C<People> +- +-For C<RT::User>: C<Identity>, C<Access control>, C<Location>, C<Phones> +- +-Extensions may also add their own built-in groupings, refer to the individual +-extension documentation for those. +- -=item C<$CanonicalizeRedirectURLs> - -Set C<$CanonicalizeRedirectURLs> to 1 to use C<$WebURL> when @@ -5208,32 +5267,25 @@ index 59eca8d..0000000 - -Set($CanonicalizeRedirectURLs, 0); - --=item C<@JSFiles> +-=item C<$CanonicalizeURLsInFeeds> +- +-Set C<$CanonicalizeURLsInFeeds> to 1 to use C<$WebURL> in feeds +-rather than the one we get from request. +- +-If you use RT behind a reverse proxy, you almost certainly want to +-enable this option. +- +-=cut +- +-Set($CanonicalizeURLsInFeeds, 0); - --A list of JavaScript files to be included in head. Removing any of --the default entries is not suggested. +-=item C<@JSFiles> - --If you're a plugin author, refer to RT->AddJavaScript. +-A list of additional JavaScript files to be included in head. - -=cut - --Set(@JSFiles, qw/ -- jquery-1.4.2.min.js -- jquery_noconflict.js -- jquery-ui-1.8.4.custom.min.js -- jquery-ui-timepicker-addon.js -- jquery-ui-patch-datepicker.js -- jquery.cookie.js -- titlebox-state.js -- util.js -- userautocomplete.js -- jquery.event.hover-1.0.js -- superfish.js -- supersubs.js -- jquery.supposition.js -- history-folding.js -- late.js --/); +-Set(@JSFiles, qw//); - -=item C<$JSMinPath> - @@ -5260,14 +5312,75 @@ index 59eca8d..0000000 - -=item C<$UsernameFormat> - --This determines how user info is displayed. 'concise' will show one of --either NickName, RealName, Name or EmailAddress, depending on what --exists and whether the user is privileged or not. 'verbose' will show --RealName and EmailAddress. +-This determines how user info is displayed. 'concise' will show the +-first of RealName, Name or EmailAddress that has a value. 'verbose' will +-show EmailAddress, and the first of RealName or Name which is defined. +-The default, 'role', uses 'verbose' for unprivileged users, and the Name +-followed by the RealName for privileged users. +- +-=cut +- +-Set($UsernameFormat, "role"); +- +-=item C<$UserSearchResultFormat> +- +-This controls the display of lists of users returned from the User +-Summary Search. The display of users in the Admin interface is +-controlled by C<%AdminSearchResultFormat>. +- +-=cut +- +-Set($UserSearchResultFormat, +- q{ '<a href="__WebPath__/User/Summary.html?id=__id__">__id__</a>/TITLE:#'} +- .q{,'<a href="__WebPath__/User/Summary.html?id=__id__">__Name__</a>/TITLE:Name'} +- .q{,__RealName__, __EmailAddress__} +-); +- +-=item C<@UserSummaryPortlets> +- +-A list of portlets to be displayed on the User Summary page. +-By default, we show all of the available portlets. +-Extensions may provide their own portlets for this page. +- +-=cut +- +-Set(@UserSummaryPortlets, (qw/ExtraInfo CreateTicket ActiveTickets InactiveTickets/)); +- +-=item C<$UserSummaryExtraInfo> +- +-This controls what information is displayed on the User Summary +-portal. By default the user's Real Name, Email Address and Username +-are displayed. You can remove these or add more as needed. This +-expects a Format string of user attributes. Please note that not all +-the attributes are supported in this display because we're not +-building a table. +- +-=cut +- +-Set($UserSummaryExtraInfo, "RealName, EmailAddress, Name"); +- +-=item C<$UserSummaryTicketListFormat> +- +-Control the appearance of the Active and Inactive ticket lists in the +-User Summary. - -=cut - --Set($UsernameFormat, "concise"); +-Set($UserSummaryTicketListFormat, q{ +- '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#', +- '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject', +- Status, +- QueueName, +- Owner, +- Priority, +- '__NEWLINE__', +- '', +- '<small>__Requestors__</small>', +- '<small>__CreatedRelative__</small>', +- '<small>__ToldRelative__</small>', +- '<small>__LastUpdatedRelative__</small>', +- '<small>__TimeLeft__</small>' +-}); - -=item C<$WebBaseURL>, C<$WebURL> - @@ -5301,7 +5414,7 @@ index 59eca8d..0000000 - -=cut - --Set($WebImagesURL, RT->Config->Get('WebPath') . "/NoAuth/images/"); +-Set($WebImagesURL, RT->Config->Get('WebPath') . "/static/images/"); - -=item C<$LogoURL> - @@ -5329,24 +5442,6 @@ index 59eca8d..0000000 - -Set($LogoAltText, "Best Practical Solutions, LLC corporate logo"); - --=item C<$LogoImageHeight> -- --C<$LogoImageHeight> is the value of the C<height> attribute of the logo --C<img> tag. -- --=cut -- --Set($LogoImageHeight, 38); -- --=item C<$LogoImageWidth> -- --C<$LogoImageWidth> is the value of the C<width> attribute of the logo --C<img> tag. -- --=cut -- --Set($LogoImageWidth, 181); -- -=item C<$WebNoAuthRegex> - -What portion of RT's URL space should not require authentication. The @@ -5415,6 +5510,19 @@ index 59eca8d..0000000 - -Set($ChartsTimezonesInDB, 0); - +-=item C<@ChartColors> +- +-An array of 6-digit hexadecimal RGB color values used for chart series. By +-default there are 12 distinct colors. +- +-=cut +- +-Set(@ChartColors, qw( +- 66cc66 ff6666 ffcc66 663399 +- 3333cc 339933 993333 996633 +- 33cc33 cc3333 cc9933 6633cc +-)); +- -=back - - @@ -5451,7 +5559,7 @@ index 59eca8d..0000000 -Set( - $HomepageComponents, - [ -- qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage Dashboards SavedSearches) # loc_qw +- qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage Dashboards SavedSearches FindUser) # loc_qw - ] -); - @@ -5467,16 +5575,13 @@ index 59eca8d..0000000 -=item C<$UseSQLForACLChecks> - -Historically, ACLs were checked on display, which could lead to empty --search pages and wrong ticket counts. Set C<$UseSQLForACLChecks> to 1 --to limit search results in SQL instead, which eliminates these --problems. -- --This option is still relatively new; it may result in performance --problems in some cases, or significant speedups in others. +-search pages and wrong ticket counts. Set C<$UseSQLForACLChecks> to 0 +-to go back to this method; this will reduce the complexity of the +-generated SQL statements, at the cost of the aforementioned bugs. - -=cut - --Set($UseSQLForACLChecks, undef); +-Set($UseSQLForACLChecks, 1); - -=item C<$TicketsItemMapSize> - @@ -5516,7 +5621,7 @@ index 59eca8d..0000000 - '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject', - Status, - QueueName, -- OwnerName, +- Owner, - Priority, - '__NEWLINE__', - '__NBSP__', @@ -5526,6 +5631,23 @@ index 59eca8d..0000000 - '<small>__LastUpdatedRelative__</small>', - '<small>__TimeLeft__</small>'}); - +-=item C<$DefaultSearchResultOrderBy> +- +-What Tickets column should we order by for RT Ticket search results. +- +-=cut +- +-Set($DefaultSearchResultOrderBy, 'id'); +- +-=item C<$DefaultSearchResultOrder> +- +-When ordering RT Ticket search results by C<$DefaultSearchResultOrderBy>, +-should the sort be ascending (ASC) or descending (DESC). +- +-=cut +- +-Set($DefaultSearchResultOrder, 'ASC'); +- -=item C<$DefaultSelfServiceSearchResultFormat> - -C<$DefaultSelfServiceSearchResultFormat> is the default format of @@ -5538,7 +5660,7 @@ index 59eca8d..0000000 - '<B><A HREF="__WebPath__/SelfService/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject', - Status, - Requestors, -- OwnerName}); +- Owner}); - -=item C<%FullTextSearch> - @@ -5618,6 +5740,20 @@ index 59eca8d..0000000 - -Set($MoreAboutRequestorTicketList, "Active"); - +-=item C<$MoreAboutRequestorTicketListFormat> +- +-Control the appearance of the ticket lists in the 'More About Requestors' box. +- +-=cut +- +-Set($MoreAboutRequestorTicketListFormat, q{ +- '<a href="__WebPath__/Ticket/Display.html?id=__id__">__id__</a>', +- '__Owner__', +- '<a href="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a>', +- '__Status__', +-}); +- +- -=item C<$MoreAboutRequestorExtraInfo> - -By default, the 'More about requestor' box on Ticket/Display.html @@ -5679,6 +5815,12 @@ index 59eca8d..0000000 -alleviate the sometimes huge owner list for installations where many -users have the OwnTicket right. - +-Autocompleter is automatically turned on if list contains more than +-50 users, but penalty of executing potentially slow query is still paid. +- +-Drop down doesn't show unprivileged users. If your setup allows unprivileged +-to own ticket then you have to enable autocompleting. +- -=cut - -Set($AutocompleteOwners, 0); @@ -5693,15 +5835,19 @@ index 59eca8d..0000000 - -Set($AutocompleteOwnersForSearch, 0); - --=item C<$UserAutocompleteFields> +-=item C<$UserSearchFields> +- +-Used by the User Autocompleter as well as the User Search. - --Specifies which fields of L<RT::User> to match against and how to --match each field when autocompleting users. Valid match methods are --LIKE, STARTSWITH, ENDSWITH, =, and !=. +-Specifies which fields of L<RT::User> to match against and how to match +-each field when autocompleting users. Valid match methods are LIKE, +-STARTSWITH, ENDSWITH, =, and !=. Valid search fields are the core User +-fields, as well as custom fields, which are specified as "CF.1234" or +-"CF.Name" - -=cut - --Set($UserAutocompleteFields, { +-Set($UserSearchFields, { - EmailAddress => 'STARTSWITH', - Name => 'STARTSWITH', - RealName => 'LIKE', @@ -5709,14 +5855,31 @@ index 59eca8d..0000000 - -=item C<$AllowUserAutocompleteForUnprivileged> - --Should unprivileged users be allowed to autocomplete users. Setting --this option to 1 means unprivileged users will be able to search all --your users. +-Should unprivileged users (users of SelfService) be allowed to +-autocomplete users. Setting this option to 1 means unprivileged users +-will be able to search all your users. - -=cut - -Set($AllowUserAutocompleteForUnprivileged, 0); - +-=item C<$TicketAutocompleteFields> +- +-Specifies which fields of L<RT::Ticket> to match against and how to match each +-field when autocompleting users. Valid match methods are LIKE, STARTSWITH, +-ENDSWITH, C<=>, and C<!=>. +- +-Not all Ticket fields are publically accessible and hence won't work for +-autocomplete unless you override their accessibility using a local overlay or a +-plugin. Out of the box the following fields are public: id, Subject. +- +-=cut +- +-Set( $TicketAutocompleteFields, { +- id => 'STARTSWITH', +- Subject => 'LIKE', +-}); +- -=item C<$DisplayTicketAfterQuickCreate> - -Enable this to redirect to the created ticket display page @@ -5823,15 +5986,6 @@ index 59eca8d..0000000 -Set($MessageBoxWidth, undef); -Set($MessageBoxHeight, 15); - --=item C<$MessageBoxWrap> -- --Wrapping is disabled when using MessageBoxRichText because of a bad --interaction between IE and wrapping with the Rich Text Editor. -- --=cut -- --Set($MessageBoxWrap, "SOFT"); -- -=item C<$MessageBoxRichText> - -Should "rich text" editing be enabled? This option lets your users @@ -5861,7 +6015,7 @@ index 59eca8d..0000000 -=item C<$MessageBoxIncludeSignatureOnComment> - -Should your users' signatures (from their Preferences page) be --included in Comments. Setting this to false overrides +-included in Comments. Setting this to 0 overrides -C<$MessageBoxIncludeSignature>. - -=cut @@ -5885,15 +6039,39 @@ index 59eca8d..0000000 - -Set($OldestTransactionsFirst, 1); - --=item C<$DeferTransactionLoading> +-=item C<$ShowHistory> +- +-This option controls how history is shown on the ticket display page. It +-accepts one of three possible modes and is overrideable on a per-user +-preference level. If you regularly deal with long tickets and don't care much +-about the history, you may wish to change this option to C<click>. +- +-=over +- +-=item C<delay> (the default) +- +-When set to C<delay>, history is loaded via javascript after the rest of the +-page has been loaded. This speeds up apparent page load times and generally +-provides a smoother experience. You may notice slight delays before the ticket +-history appears on very long tickets. +- +-=item C<click> - --When set, defers loading ticket history until the user clicks a link. --This should end up serving pages to users quicker, since generating --all the HTML for transaction history can be slow for long tickets. +-When set to C<click>, history is loaded on demand when a placeholder link is +-clicked. This speeds up ticket display page loads and history is never loaded +-if not requested. +- +-=item C<always> +- +-When set to C<always>, history is loaded before showing the page. This ensures +-history is always available immediately, but at the expense of longer page load +-times. This behaviour was the default in RT 4.0. +- +-=back - -=cut - --# Set($DeferTransactionLoading, 1); +-Set($ShowHistory, 'delay'); - -=item C<$ShowBccHeader> - @@ -5923,28 +6101,24 @@ index 59eca8d..0000000 - -Set($AlwaysDownloadAttachments, undef); - --=item C<$AttachmentUnits> -- --Controls the units (kilobytes or bytes) that attachment sizes use for --display. The default is to display kilobytes if the attachment is --larger than 1024 bytes, bytes otherwise. If you set --C<$AttachmentUnits> to C<'k'> then attachment sizes will always be --displayed in kilobytes. If set to C<'b'>, then sizes will be bytes. -- --=cut +-=item C<$PreferRichText> - --Set($AttachmentUnits, undef); +-By default, RT shows rich text (HTML) messages if possible. If +-C<$PreferRichText> is set to 0, RT will show plain text messages in +-preference to any rich text alternatives. - --=item C<$PreferRichText> +-As a security precaution, RT limits the HTML that is displayed to a +-known-good subset -- as allowing arbitrary HTML to be displayed exposes +-multiple vectors for XSS and phishing attacks. If +-L</$TrustHTMLAttachments> is enabled, the original HTML is available for +-viewing via the "Download" link. - --If C<$PreferRichText> is set to 1, RT will show HTML/Rich text messages --in preference to their plain-text alternatives. RT "scrubs" the HTML to --show only a minimal subset of HTML to avoid possible contamination by --cross-site-scripting attacks. +-If the optional L<HTML::Gumbo> dependency is installed, RT will leverage +-this to allow a broader set of HTML through, including tables. - -=cut - --Set($PreferRichText, undef); +-Set($PreferRichText, 1); - -=item C<$MaxInlineBody> - @@ -5967,23 +6141,25 @@ index 59eca8d..0000000 - -Set($ShowTransactionImages, 1); - --=item C<$PlainTextPre> +-=item C<$ShowRemoteImages> - --Normally plaintext attachments are displayed as HTML with line breaks --preserved. This causes space- and tab-based formatting not to be --displayed correctly. By setting $PlainTextPre messages will be --displayed using <pre>. +-By default, RT doesn't show remote images attached to incoming (and outgoing) +-ticket updates inline. Set this variable to 1 if you'd like to enable remote +-image display. Showing remote images may allow spammers and other senders to +-track when messages are viewed and see referer information. - --=cut +-Note that this setting is independent of L</$ShowTransactionImages> above. - --Set($PlainTextPre, 0); +-=cut - +-Set($ShowRemoteImages, 0); - -=item C<$PlainTextMono> - --Set C<$PlainTextMono> to 1 to use monospaced font and preserve --formatting; unlike C<$PlainTextPre>, the text will wrap to fit width --of the browser window; this option overrides C<$PlainTextPre>. +-Normally plaintext attachments are displayed as HTML with line breaks +-preserved. This causes space- and tab-based formatting not to be +-displayed correctly. Set C<$PlainTextMono> to 1 to use a monospaced +-font and preserve formatting. - -=cut - @@ -6010,17 +6186,35 @@ index 59eca8d..0000000 - link after the URL. - -* 'httpurl_overwrite': also detects URLs as 'httpurl' format, but -- replaces the URL with a link. +- replaces the URL with a link. Enabled by default. - -See F<share/html/Elements/MakeClicky> for documentation on how to add -your own styles of link detection. - -=cut - --Set(@Active_MakeClicky, qw()); +-Set(@Active_MakeClicky, qw(httpurl_overwrite)); - --=back +-=item C<$QuoteFolding> - +-Quote folding is the hiding of old replies in transaction history. +-It defaults to on. Set this to 0 to disable it. +- +-=cut +- +-Set($QuoteFolding, 1); +- +-=item C<$AllowLoginPasswordAutoComplete> +- +-Allow browsers to remember the user's password on login (in case the +-browser can do so, and has the appropriate setting enabled). Default +-is 0. +- +-=cut +- +-Set($AllowLoginPasswordAutoComplete, 0); +- +-=back - - -=head1 Application logic @@ -6086,8 +6280,9 @@ index 59eca8d..0000000 -=item C<$ForceApprovalsView> - -Should approval tickets only be viewed and modified through the standard --approval interface? Changing this setting to 1 will redirect any attempt to --use the normal ticket display and modify page for approval tickets. +-approval interface? With this setting enabled (by default), any attempt to use +-the normal ticket display and modify page for approval tickets will be +-redirected. - -For example, with this option set to 1 and an approval ticket #123: - @@ -6097,11 +6292,13 @@ index 59eca8d..0000000 - - /Approval/Display.html?id=123 - +-With this option set to 0, the redirect won't happen. +- -=back - -=cut - --Set($ForceApprovalsView, 0); +-Set($ForceApprovalsView, 1); - -=head1 Extra security - @@ -6113,7 +6310,7 @@ index 59eca8d..0000000 - -=item C<$DisallowExecuteCode> - --If set to a true value, the C<ExecuteCode> right will be removed from +-If set to 1, the C<ExecuteCode> right will be removed from -all users, B<including> the superuser. This is intended for when RT is -installed into a shared environment where even the superuser should not -be allowed to run arbitrary Perl code on the server via scrips. @@ -6124,7 +6321,7 @@ index 59eca8d..0000000 - -=item C<$Framebusting> - --If set to a false value, framekiller javascript will be disabled and the +-If set to 0, framekiller javascript will be disabled and the -X-Frame-Options: DENY header will be suppressed from all responses. -This disables RT's clickjacking protection. - @@ -6134,7 +6331,7 @@ index 59eca8d..0000000 - -=item C<$RestrictReferrer> - --If set to a false value, the HTTP C<Referer> (sic) header will not be +-If set to 0, the HTTP C<Referer> (sic) header will not be -checked to ensure that requests come from RT's own domain. As RT allows -for GET requests to alter state, disabling this opens RT up to -cross-site request forgery (CSRF) attacks. @@ -6145,9 +6342,9 @@ index 59eca8d..0000000 - -=item C<$RestrictLoginReferrer> - --If set to a false value, RT will allow the user to log in from any link +-If set to 0, RT will allow the user to log in from any link -or request, merely by passing in C<user> and C<pass> parameters; setting --it to a true value forces all logins to come from the login box, so the +-it to 1 forces all logins to come from the login box, so the -user is aware that they are being logged in. The default is off, for -backwards compatability. - @@ -6182,6 +6379,17 @@ index 59eca8d..0000000 - -Set(@ReferrerWhitelist, qw()); - +- +-=item C<$BcryptCost> +- +-This sets the default cost parameter used for the C<bcrypt> key +-derivation function. Valid values range from 4 to 31, inclusive, with +-higher numbers denoting greater effort. +- +-=cut +- +-Set($BcryptCost, 10); +- -=back - - @@ -6190,74 +6398,89 @@ index 59eca8d..0000000 - -=over 4 - --=item C<$WebExternalAuth> +-=item C<$WebRemoteUserAuth> - --If C<$WebExternalAuth> is defined, RT will defer to the environment's --REMOTE_USER variable. +-If C<$WebRemoteUserAuth> is defined, RT will defer to the environment's +-REMOTE_USER variable, which should be set by the webserver's +-authentication layer. - -=cut - --Set($WebExternalAuth, undef); +-Set($WebRemoteUserAuth, undef); - --=item C<$WebExternalAuthContinuous> +-=item C<$WebRemoteUserContinuous> - --If C<$WebExternalAuthContinuous> is defined, RT will check for the +-If C<$WebRemoteUserContinuous> is defined, RT will check for the -REMOTE_USER on each access. If you would prefer this to only happen --once (at initial login) set this to a false value. The default --setting will help ensure that if your external authentication system +-once (at initial login) set this to 0. The default +-setting will help ensure that if your webserver's authentication layer -deauthenticates a user, RT notices as soon as possible. - -=cut - --Set($WebExternalAuthContinuous, 1); +-Set($WebRemoteUserContinuous, 1); - --=item C<$WebFallbackToInternalAuth> +-=item C<$WebFallbackToRTLogin> - --If C<$WebFallbackToInternalAuth> is defined, the user is allowed a +-If C<$WebFallbackToRTLogin> is defined, the user is allowed a -chance of fallback to the login screen, even if REMOTE_USER failed. - -=cut - --Set($WebFallbackToInternalAuth, undef); +-Set($WebFallbackToRTLogin, undef); - --=item C<$WebExternalGecos> +-=item C<$WebRemoteUserGecos> - --C<$WebExternalGecos> means to match 'gecos' field as the user --identity); useful with mod_auth_pwcheck and IIS Integrated Windows --logon. +-C<$WebRemoteUserGecos> means to match 'gecos' field as the user +-identity; useful with C<mod_auth_external>. - -=cut - --Set($WebExternalGecos, undef); +-Set($WebRemoteUserGecos, undef); - --=item C<$WebExternalAuto> +-=item C<$WebRemoteUserAutocreate> - --C<$WebExternalAuto> will create users under the same name as --REMOTE_USER upon login, if it's missing in the Users table. +-C<$WebRemoteUserAutocreate> will create users under the same name as +-REMOTE_USER upon login, if they are missing from the Users table. - -=cut - --Set($WebExternalAuto, undef); +-Set($WebRemoteUserAutocreate, undef); - --=item C<$AutoCreate> +-=item C<$UserAutocreateDefaultsOnLogin> - --If C<$WebExternalAuto> is set to 1, C<$AutoCreate> will be passed to --User's Create method. Use it to set defaults, such as creating --Unprivileged users with C<{ Privileged => 0 }> This must be a hashref. +-If C<$WebRemoteUserAutocreate> is set to 1, C<$UserAutocreateDefaultsOnLogin> +-will be passed to L<RT::User/Create>. Use it to set defaults, such as +-creating unprivileged users with C<<{ Privileged => 0 }>>. This must be +-a hashref. - -=cut - --Set($AutoCreate, undef); +-Set($UserAutocreateDefaultsOnLogin, undef); - -=item C<$WebSessionClass> - --C<$WebSessionClass> is the class you wish to use for managing sessions. --It defaults to use your SQL database, except on Oracle, where it --defaults to files on disk. +-C<$WebSessionClass> is the class you wish to use for storing sessions. On +-MySQL, Pg, and Oracle it defaults to using your database, in other cases +-sessions are stored in files using L<Apache::Session::File>. Other installed +-Apache::Session::* modules can be used to store sessions. +- +- Set($WebSessionClass, "Apache::Session::File"); +- +-=cut +- +-Set($WebSessionClass, undef); +- +-=item C<%WebSessionProperties> +- +-C<%WebSessionProperties> is the hash to configure class L</$WebSessionClass> +-in case custom class is used. By default it's empty and values are picked +-depending on the class. Make sure that it's empty if you're using DB as session +-backend. - -=cut - --# Set($WebSessionClass, "Apache::Session::File"); +-Set( %WebSessionProperties ); - -=item C<$AutoLogoff> - @@ -6420,42 +6643,167 @@ index 59eca8d..0000000 - -Set($DefaultTimeUnitsToHours, 0); - --=back +-=item C<$TimeInICal> - +-By default, events in the iCal feed on the ticket search page +-contain only dates, making them all day calendar events. Set +-C<$TimeInICal> if you have start or due dates on tickets that +-have significant time values and you want those times to be +-included in the events in the iCal feed. - +-This option can also be set as an individual user preference. - +-=cut - --=head1 GnuPG integration +-Set($TimeInICal, 0); - --A full description of the (somewhat extensive) GnuPG integration can --be found by running the command `perldoc L<RT::Crypt::GnuPG>` (or --`perldoc lib/RT/Crypt/GnuPG.pm` from your RT install directory). +-=back - --=over 4 - --=item C<%GnuPG> - --Set C<OutgoingMessagesFormat> to 'inline' to use inline encryption and --signatures instead of 'RFC' (GPG/MIME: RFC3156 and RFC1847) format. +-=head1 Cryptography +- +-A complete description of RT's cryptography capabilities can be found in +-L<RT::Crypt>. At this moment, GnuPG (PGP) and SMIME security protocols are +-supported. +- +-=over 4 +- +-=item C<%Crypt> +- +-The following options apply to all cryptography protocols. +- +-By default, all enabled security protocols will analyze each incoming +-email. You may set C<Incoming> to a subset of this list, if some enabled +-protocols do not apply to incoming mail; however, this is usually +-unnecessary. Note that for any verification or decryption to occur for +-incoming mail, the C<Auth::Crypt> mail plugin must be added to +-L</@MailPlugins> as specified in L<RT::Crypt/Handling incoming messages>. +- +-For outgoing emails, the first security protocol from the above list is +-used. Use the C<Outgoing> option to set a security protocol that should +-be used in outgoing emails. At this moment, only one protocol can be +-used to protect outgoing emails. +- +-Set C<RejectOnUnencrypted> to 1 if all incoming email must be +-properly encrypted. All unencrypted emails will be rejected by RT. +- +-Set C<RejectOnMissingPrivateKey> to 0 if you don't want to reject +-emails encrypted for key RT doesn't have and can not decrypt. +- +-Set C<RejectOnBadData> to 0 if you don't want to reject letters +-with incorrect data. - -If you want to allow people to encrypt attachments inside the DB then -set C<AllowEncryptDataInDB> to 1. - --Set C<RejectOnMissingPrivateKey> to false if you don't want to reject --emails encrypted for key RT doesn't have and can not decrypt. +-Set C<Dashboards> to a hash with Encrypt and Sign keys to control +-whether dashboards should be encrypted and/or signed correspondingly. +-By default they are not encrypted or signed. - --Set C<RejectOnBadData> to false if you don't want to reject letters --with incorrect GnuPG data. +-=back - -=cut - --Set(%GnuPG, -- Enable => 1, -- OutgoingMessagesFormat => "RFC", # Inline -- AllowEncryptDataInDB => 0, +-Set( %Crypt, +- Incoming => undef, # ['GnuPG', 'SMIME'] +- Outgoing => undef, # 'SMIME' - +- RejectOnUnencrypted => 0, - RejectOnMissingPrivateKey => 1, - RejectOnBadData => 1, +- +- AllowEncryptDataInDB => 0, +- +- Dashboards => { +- Encrypt => 0, +- Sign => 0, +- }, +-); +- +-=head2 SMIME configuration +- +-A full description of the SMIME integration can be found in +-L<RT::Crypt::SMIME>. +- +-=over 4 +- +-=item C<%SMIME> +- +-Set C<Enable> to 0 or 1 to disable or enable SMIME for +-encrypting and signing messages. +- +-Set C<OpenSSL> to path to F<openssl> executable. +- +-Set C<Keyring> to directory with key files. Key and certificates should +-be stored in a PEM file in this directory named named, e.g., +-F<email.address@xxxxxxxxxxxxxxx>. +- +-Set C<CAPath> to either a PEM-formatted certificate of a single signing +-certificate authority, or a directory of such (including hash symlinks +-as created by the openssl tool C<c_rehash>). Only SMIME certificates +-signed by these certificate authorities will be treated as valid +-signatures. If left unset (and C<AcceptUntrustedCAs> is unset, as it is +-by default), no signatures will be marked as valid! +- +-Set C<AcceptUntrustedCAs> to allow arbitrary SMIME certificates, no +-matter their signing entities. Such mails will be marked as untrusted, +-but signed; C<CAPath> will be used to mark which mails are signed by +-trusted certificate authorities. This configuration is generally +-insecure, as it allows the possibility of accepting forged mail signed +-by an untrusted certificate authority. +- +-Setting C<AcceptUntrustedCAs> also allows encryption to users with +-certificates created by untrusted CAs. +- +-Set C<Passphrase> to a scalar (to use for all keys), an anonymous +-function, or a hash (to look up by address). If the hash is used, the +-'' key is used as a default. +- +-See L<RT::Crypt::SMIME> for details. +- +-=back +- +-=cut +- +-Set( %SMIME, +- Enable => 0, +- OpenSSL => 'openssl', +- Keyring => q{var/data/smime}, +- CAPath => undef, +- AcceptUntrustedCAs => undef, +- Passphrase => undef, +-); +- +-=head2 GnuPG configuration +- +-A full description of the (somewhat extensive) GnuPG integration can +-be found by running the command `perldoc L<RT::Crypt::GnuPG>` (or +-`perldoc lib/RT/Crypt/GnuPG.pm` from your RT install directory). +- +-=over 4 +- +-=item C<%GnuPG> +- +-Set C<Enable> to 0 or 1 to disable or enable GnuPG interfaces +-for encrypting and signing outgoing messages. +- +-Set C<GnuPG> to the name or path of the gpg binary to use. +- +-Set C<Passphrase> to a scalar (to use for all keys), an anonymous +-function, or a hash (to look up by address). If the hash is used, the +-'' key is used as a default. +- +-Set C<OutgoingMessagesFormat> to 'inline' to use inline encryption and +-signatures instead of 'RFC' (GPG/MIME: RFC3156 and RFC1847) format. +- +-=cut +- +-Set(%GnuPG, +- Enable => 0, +- GnuPG => 'gpg', +- Passphrase => undef, +- OutgoingMessagesFormat => "RFC", # Inline -); - -=item C<%GnuPGOptions> @@ -6619,6 +6967,14 @@ index 59eca8d..0000000 - ... - }, - +-The order of items in the listing for each transition line affects +-the order they appear in the drop-down. If you change the config +-for 'open' state listing to: +- +- open => [qw(stalled rejected deleted resolved)], +- +-then the 'resolved' status will appear as the last item in the drop-down. +- -=head3 Statuses available during ticket creation - -By default users can create tickets with a status of new, @@ -6721,8 +7077,8 @@ index 59eca8d..0000000 - -Unless there is an explicit mapping between statuses in two different -lifecycles, you can not move tickets between queues with these --lifecycles. This is true even if the different lifecycles use the exact --same set of statuses. Such a mapping is defined as follows: +-lifecycles -- even if both use the exact same set of statuses. +-Such a mapping is defined as follows: - - __maps__ => { - 'from lifecycle -> to lifecycle' => { @@ -6750,64 +7106,32 @@ index 59eca8d..0000000 - }, - - transitions => { -- '' => [qw(new open resolved)], +- "" => [qw(new open resolved)], - - # from => [ to list ], -- new => [qw(open stalled resolved rejected deleted)], -- open => [qw(new stalled resolved rejected deleted)], -- stalled => [qw(new open rejected resolved deleted)], -- resolved => [qw(new open stalled rejected deleted)], -- rejected => [qw(new open stalled resolved deleted)], -- deleted => [qw(new open stalled rejected resolved)], +- new => [qw( open stalled resolved rejected deleted)], +- open => [qw(new stalled resolved rejected deleted)], +- stalled => [qw(new open rejected resolved deleted)], +- resolved => [qw(new open stalled rejected deleted)], +- rejected => [qw(new open stalled resolved deleted)], +- deleted => [qw(new open stalled rejected resolved )], - }, - rights => { - '* -> deleted' => 'DeleteTicket', - '* -> *' => 'ModifyTicket', - }, - actions => [ -- 'new -> open' => { -- label => 'Open It', # loc -- update => 'Respond', -- }, -- 'new -> resolved' => { -- label => 'Resolve', # loc -- update => 'Comment', -- }, -- 'new -> rejected' => { -- label => 'Reject', # loc -- update => 'Respond', -- }, -- 'new -> deleted' => { -- label => 'Delete', # loc -- }, -- -- 'open -> stalled' => { -- label => 'Stall', # loc -- update => 'Comment', -- }, -- 'open -> resolved' => { -- label => 'Resolve', # loc -- update => 'Comment', -- }, -- 'open -> rejected' => { -- label => 'Reject', # loc -- update => 'Respond', -- }, -- -- 'stalled -> open' => { -- label => 'Open It', # loc -- }, -- 'resolved -> open' => { -- label => 'Re-open', # loc -- update => 'Comment', -- }, -- 'rejected -> open' => { -- label => 'Re-open', # loc -- update => 'Comment', -- }, -- 'deleted -> open' => { -- label => 'Undelete', # loc -- }, +- 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label} +- 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} +- 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} +- 'new -> deleted' => { label => 'Delete', }, # loc{label} +- 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label} +- 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} +- 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} +- 'stalled -> open' => { label => 'Open It', }, # loc{label} +- 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} +- 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} +- 'deleted -> open' => { label => 'Undelete', }, # loc{label} - ], - }, -# don't change lifecyle of the approvals, they are not capable to deal with @@ -6841,49 +7165,17 @@ index 59eca8d..0000000 - '* -> *' => 'ModifyTicket', - }, - actions => [ -- 'new -> open' => { -- label => 'Open It', # loc -- update => 'Respond', -- }, -- 'new -> resolved' => { -- label => 'Resolve', # loc -- update => 'Comment', -- }, -- 'new -> rejected' => { -- label => 'Reject', # loc -- update => 'Respond', -- }, -- 'new -> deleted' => { -- label => 'Delete', # loc -- }, -- -- 'open -> stalled' => { -- label => 'Stall', # loc -- update => 'Comment', -- }, -- 'open -> resolved' => { -- label => 'Resolve', # loc -- update => 'Comment', -- }, -- 'open -> rejected' => { -- label => 'Reject', # loc -- update => 'Respond', -- }, -- -- 'stalled -> open' => { -- label => 'Open It', # loc -- }, -- 'resolved -> open' => { -- label => 'Re-open', # loc -- update => 'Comment', -- }, -- 'rejected -> open' => { -- label => 'Re-open', # loc -- update => 'Comment', -- }, -- 'deleted -> open' => { -- label => 'Undelete', # loc -- }, +- 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label} +- 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} +- 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} +- 'new -> deleted' => { label => 'Delete', }, # loc{label} +- 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label} +- 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label} +- 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label} +- 'stalled -> open' => { label => 'Open It', }, # loc{label} +- 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} +- 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label} +- 'deleted -> open' => { label => 'Undelete', }, # loc{label} - ], - }, -); @@ -6900,7 +7192,7 @@ index 59eca8d..0000000 - -RT can show administrators a feed of recent RT releases and other -related announcements and information from Best Practical on the top --level Configuration page. This feature helps you stay up to date on +-level Admin page. This feature helps you stay up to date on -RT security announcements and version updates. - -RT provides this feature using an "iframe" on C</Admin/index.html> @@ -6908,7 +7200,7 @@ index 59eca8d..0000000 -Best Practical's website. - -If you'd rather not make this feature available to your --administrators, set C<$ShowRTPortal> to a false value. +-administrators, set C<$ShowRTPortal> to 0. - -=cut - @@ -6926,41 +7218,53 @@ index 59eca8d..0000000 - Queues => - q{'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__Name__</a>/TITLE:Name'} -- .q{,__Description__,__Address__,__Priority__,__DefaultDueIn__,__Disabled__,__Lifecycle__}, +- .q{,__Description__,__Address__,__Priority__,__DefaultDueIn__,__Lifecycle__,__SubjectTag__,__Disabled__}, - - Groups => - q{'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__Name__</a>/TITLE:Name'} -- .q{,'__Description__'}, +- .q{,'__Description__',__Disabled__}, - - Users => - q{'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__Name__</a>/TITLE:Name'} -- .q{,__RealName__, __EmailAddress__}, +- .q{,__RealName__, __EmailAddress__,__Disabled__}, - - CustomFields => - q{'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__Name__</a>/TITLE:Name'} -- .q{,__AppliedTo__, __FriendlyType__, __FriendlyPattern__}, +- .q{,__AddedTo__, __FriendlyType__, __FriendlyPattern__,__Disabled__}, - - Scrips => -- q{'<a href="__WebPath__/Admin/Queues/Scrip.html?id=__id__&Queue=__QueueId__">__id__</a>/TITLE:#'} -- .q{,'<a href="__WebPath__/Admin/Queues/Scrip.html?id=__id__&Queue=__QueueId__">__Description__</a>/TITLE:Description'} -- .q{,__Stage__, __Condition__, __Action__, __Template__}, -- -- GlobalScrips => -- q{'<a href="__WebPath__/Admin/Global/Scrip.html?id=__id__">__id__</a>/TITLE:#'} -- .q{,'<a href="__WebPath__/Admin/Global/Scrip.html?id=__id__">__Description__</a>/TITLE:Description'} -- .q{,__Stage__, __Condition__, __Action__, __Template__}, +- q{'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id____From__">__id__</a>/TITLE:#'} +- .q{,'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id____From__">__Description__</a>/TITLE:Description'} +- .q{,__Condition__, __Action__, __Template__, __Disabled__}, - - Templates => - q{'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__Name__</a>/TITLE:Name'} -- .q{,'__Description__'}, +- .q{,'__Description__','__UsedBy__','__IsEmpty__'}, - Classes => - q{ '<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__id__</a>/TITLE:#'} - .q{,'<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__Name__</a>/TITLE:Name'} -- .q{,__Description__}, +- .q{,__Description__,__Disabled__}, +-); +- +-=item C<%AdminSearchResultRows> +- +-Use C<%AdminSearchResultRows> to define the search result rows in the admin +-interface on a per-RT-class basis. +- +-=cut +- +-Set(%AdminSearchResultRows, +- Queues => 50, +- Groups => 50, +- Users => 50, +- CustomFields => 50, +- Scrips => 50, +- Templates => 50, +- Classes => 50, -); - -=back @@ -7012,7 +7316,7 @@ index 59eca8d..0000000 - -=cut - --Set($DevelMode, "0"); +-Set($DevelMode, 0); - - -=item C<$RecordBaseClass> @@ -7048,7 +7352,7 @@ index 59eca8d..0000000 -logged at. - -Enabling this option will also expose the SQL Queries page in the --Configuration -> Tools menu for SuperUsers. +-Admin -> Tools menu for SuperUsers. - -=cut - @@ -7056,30 +7360,6 @@ index 59eca8d..0000000 - -=back - -- -- -- --=head1 Deprecated options -- --=over 4 -- --=item C<$LinkTransactionsRun1Scrip> -- --RT-3.4 backward compatibility setting. Add/Delete Link used to record --one transaction and run one scrip. Set this value to 1 if you want --only one of the link transactions to have scrips run. -- --=cut -- --Set($LinkTransactionsRun1Scrip, 0); -- --=item C<$ResolveDefaultUpdateType> -- --This option has been deprecated. You can configure this site-wide --with L</Lifecycles> (see L</Labeling and defining actions>). -- --=back -- -=cut - -1; @@ -7279,7 +7559,7 @@ index a9f5dc5..0000000 -exit 0; diff --git a/etc/upgrade/generate-rtaddressregexp b/etc/upgrade/generate-rtaddressregexp deleted file mode 100755 -index c36805c..0000000 +index 44451d2..0000000 --- a/etc/upgrade/generate-rtaddressregexp +++ /dev/null @@ -1,109 +0,0 @@ @@ -7339,7 +7619,7 @@ index c36805c..0000000 - -use RT; -RT::LoadConfig(); --RT->Config->Set('LogToScreen' => 'debug'); +-RT->Config->Set('LogToSTDERR' => 'debug'); -RT::Init(); - -$| = 1; @@ -7394,7 +7674,7 @@ index c36805c..0000000 -} diff --git a/etc/upgrade/split-out-cf-categories b/etc/upgrade/split-out-cf-categories deleted file mode 100755 -index 7aa8dd9..0000000 +index 7dbee50..0000000 --- a/etc/upgrade/split-out-cf-categories +++ /dev/null @@ -1,171 +0,0 @@ @@ -7454,7 +7734,7 @@ index 7aa8dd9..0000000 - -use RT; -RT::LoadConfig(); --RT->Config->Set('LogToScreen' => 'debug'); +-RT->Config->Set('LogToSTDERR' => 'debug'); -RT::Init(); - -$| = 1; @@ -7569,9 +7849,163 @@ index 7aa8dd9..0000000 - -$RT::Handle->Commit; -print "No custom fields with categories found\n" unless $seen; +diff --git a/etc/upgrade/switch-templates-to b/etc/upgrade/switch-templates-to +deleted file mode 100755 +index 138138d..0000000 +--- a/etc/upgrade/switch-templates-to ++++ /dev/null +@@ -1,148 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +-# <sales@xxxxxxxxxxxxxxxxx> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use strict; +-use warnings; +- +-use lib "local/lib"; +-use lib "lib"; +- +-use RT; +- +-my $to = shift || ''; +-my $from; +- +-if ($to =~ /html|text/i) { +- $to = $to =~ /html/i ? 'html' : 'text'; +- $from = $to eq 'html' ? 'text' : 'html'; +-} else { +- print "Usage: $0 [html|text]\n"; +- warn "Please specify if you'd like to switch to HTML or text templates.\n"; +- exit 1; +-} +- +-RT::LoadConfig(); +-RT->Config->Set('LogToSTDERR' => 'info'); +-RT::Init(); +- +-$| = 1; +- +-my @templates = ( +- "Autoreply", +- "Transaction", +- "Admin Correspondence", +- "Correspondence", +- "Admin Comment", +- "Status Change", +- "Resolved", +- "New Pending Approval", +- "Approval Passed", +- "All Approvals Passed", +- "Approval Rejected", +- "Approval Ready for Owner", +-); +- +-$RT::Handle->BeginTransaction(); +- +-use RT::Scrips; +-my $scrips = RT::Scrips->new( RT->SystemUser ); +-$scrips->UnLimit; +- +-for (@templates) { +- $scrips->Limit( +- FIELD => 'Template', +- VALUE => ($to eq 'html' ? $_ : "$_ in HTML"), +- ENTRYAGGREGATOR => 'OR' +- ); +-} +- +-my $switched = 0; +-while ( my $s = $scrips->Next ) { +- my $new = $s->TemplateObj->Name; +- +- if ($to eq 'html') { +- $new .= ' in HTML'; +- } else { +- $new =~ s/ in HTML$//; +- } +- +- print $s->id, ": ", $s->Description, "\n"; +- print " ", $s->TemplateObj->Name, " -> $new\n\n"; +- +- my ($ok, $msg) = $s->SetTemplate($new); +- +- if ($ok) { +- $switched++; +- } else { +- warn " Couldn't switch templates: $msg\n"; +- } +-} +- +-$RT::Handle->Commit; +- +-if ($switched) { +- print <<" EOT"; +-Switched $switched scrips to $to templates. You should now manually port any +-customizations from the old templates to the new templates. +- EOT +- exit 1 if $switched != $scrips->Count; +-} +-elsif ($scrips->Count) { +- print <<" EOT"; +-@{[$scrips->Count]} scrips using $from templates were found, but none were +-successfully switched to $to. See the errors above. +- EOT +- exit 1; +-} +-else { +- print <<" EOT"; +-No scrips were found using the $from templates, so none were switched to +-$to templates. +- EOT +-} +- diff --git a/etc/upgrade/upgrade-articles b/etc/upgrade/upgrade-articles deleted file mode 100755 -index fc480a6..0000000 +index f9938bb..0000000 --- a/etc/upgrade/upgrade-articles +++ /dev/null @@ -1,264 +0,0 @@ @@ -7631,7 +8065,7 @@ index fc480a6..0000000 - -use RT; -RT::LoadConfig(); --RT->Config->Set('LogToScreen' => 'debug'); +-RT->Config->Set('LogToSTDERR' => 'debug'); -RT::Init(); - -$| = 1; @@ -7989,10 +8423,10 @@ index 1785fa9..0000000 -} diff --git a/lib/RT/Generated.pm b/lib/RT/Generated.pm deleted file mode 100644 -index 9240880..0000000 +index 7bf374c..0000000 --- a/lib/RT/Generated.pm +++ /dev/null -@@ -1,81 +0,0 @@ +@@ -1,84 +0,0 @@ -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: @@ -8045,7 +8479,8 @@ index 9240880..0000000 -use warnings; -use strict; - --our $VERSION = '4.0.22'; +-our $VERSION = '4.2.9'; +-our ($MAJOR_VERSION, $MINOR_VERSION, $REVISION) = $VERSION =~ /^(\d)\.(\d)\.(\d+)/; - - - @@ -8055,11 +8490,13 @@ index 9240880..0000000 -$SbinPath = 'sbin'; -$VarPath = 'var'; -$LexiconPath = 'share/po'; +-$StaticPath = 'share/static'; -$PluginPath = 'plugins'; -$LocalPath = 'local'; -$LocalEtcPath = 'local/etc'; -$LocalLibPath = 'local/lib'; -$LocalLexiconPath = 'local/po'; +-$LocalStaticPath = 'local/static'; -$LocalPluginPath = 'local/plugins'; -# $MasonComponentRoot is where your rt instance keeps its mason html files -$MasonComponentRoot = 'share/html'; @@ -8076,10 +8513,10 @@ index 9240880..0000000 -1; diff --git a/sbin/rt-attributes-viewer b/sbin/rt-attributes-viewer deleted file mode 100755 -index 0b24928..0000000 +index 7e45615..0000000 --- a/sbin/rt-attributes-viewer +++ /dev/null -@@ -1,122 +0,0 @@ +@@ -1,115 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8132,27 +8569,20 @@ index 0b24928..0000000 -use warnings; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } +- -} - -use Getopt::Long; @@ -8204,10 +8634,10 @@ index 0b24928..0000000 - diff --git a/sbin/rt-clean-sessions b/sbin/rt-clean-sessions deleted file mode 100755 -index 7b18b58..0000000 +index c9f2d3b..0000000 --- a/sbin/rt-clean-sessions +++ /dev/null -@@ -1,190 +0,0 @@ +@@ -1,183 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8260,27 +8690,20 @@ index 7b18b58..0000000 -use warnings; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } +- -} - -use Getopt::Long; @@ -8312,9 +8735,9 @@ index 7b18b58..0000000 -RT::LoadConfig(); - -if( $opt{'debug'} ) { -- RT->Config->Set( LogToScreen => 'debug' ); +- RT->Config->Set( LogToSTDERR => 'debug' ); -} else { -- RT->Config->Set( LogToScreen => undef ); +- RT->Config->Set( LogToSTDERR => undef ); -} - -RT::ConnectToDatabase(); @@ -8400,10 +8823,10 @@ index 7b18b58..0000000 -=cut diff --git a/sbin/rt-dump-metadata b/sbin/rt-dump-metadata deleted file mode 100755 -index 84f5531..0000000 +index 77e655b..0000000 --- a/sbin/rt-dump-metadata +++ /dev/null -@@ -1,357 +0,0 @@ +@@ -1,336 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8460,22 +8883,15 @@ index 84f5531..0000000 -binmode( STDOUT, ":utf8" ); - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; -- my @libs = ( "lib", "local/lib" ); +- require Cwd; +- my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -8510,11 +8926,6 @@ index 84f5531..0000000 - id Created Creator LastUpdated LastUpdatedBy - ) - ], -- Templates => [ -- qw( -- TranslationOf -- ) -- ], -); - -my $SystemUserId = RT->SystemUser->Id; @@ -8532,7 +8943,8 @@ index 84f5531..0000000 - $objects->Limit( - FIELD => 'Domain', - OPERATOR => '=', -- VALUE => 'UserDefined' +- VALUE => 'UserDefined', +- CASESENSITIVE => 0, - ) if $class eq 'Groups'; - - if ( $class eq 'CustomFields' ) { @@ -8675,19 +9087,9 @@ index 84f5531..0000000 - $rv->{GroupDomain} = 'RT::Queue-Role'; - } - } -- if ( $obj->LookupType eq 'RT::Queue-RT::Ticket' ) { -- # XXX-TODO: unused CF's turn into global CF when importing -- # as the sub InsertData in RT::Handle creates a global CF -- # when no queue is specified. -- $rv->{Queue} = []; -- my $applies = $obj->AppliedTo; -- while ( my $queue = $applies->Next ) { -- push @{ $rv->{Queue} }, $queue->Name; -- } -- } - } - -- if ( eval { require RT::Attributes; 1 } ) { +- if ( RT::Attributes->require ) { - my $attributes = $obj->Attributes; - while ( my $attribute = $attributes->Next ) { - my $content = $attribute->Content; @@ -8763,10 +9165,10 @@ index 84f5531..0000000 - diff --git a/sbin/rt-email-dashboards b/sbin/rt-email-dashboards deleted file mode 100755 -index b923e2d..0000000 +index ad34389..0000000 --- a/sbin/rt-email-dashboards +++ /dev/null -@@ -1,173 +0,0 @@ +@@ -1,165 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8819,23 +9221,15 @@ index b923e2d..0000000 -use warnings; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -8860,15 +9254,15 @@ index b923e2d..0000000 -require RT::Interface::CLI; -RT::Interface::CLI->import(qw{ CleanEnv loc }); - --# Clean out all the nasties from the environment --CleanEnv(); -- -# Load the config file -RT::LoadConfig(); - -# Connect to the database and get RT::SystemUser and RT::Nobody loaded -RT::Init(); - +-# Clean out all the nasties from the environment +-CleanEnv(); +- -require RT::Dashboard::Mailer; -RT::Dashboard::Mailer->MailDashboards( - All => $opts{all}, @@ -8942,10 +9336,10 @@ index b923e2d..0000000 - diff --git a/sbin/rt-email-digest b/sbin/rt-email-digest deleted file mode 100755 -index cb4d031..0000000 +index 1b405d0..0000000 --- a/sbin/rt-email-digest +++ /dev/null -@@ -1,380 +0,0 @@ +@@ -1,374 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8997,23 +9391,15 @@ index cb4d031..0000000 -use warnings; -use strict; - --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -9027,9 +9413,9 @@ index cb4d031..0000000 -use RT::Interface::CLI qw( CleanEnv loc ); -use RT::Interface::Email; - --CleanEnv(); -RT::LoadConfig(); -RT::Init(); +-CleanEnv(); - -sub usage { - my ($error) = @_; @@ -9216,7 +9602,7 @@ index cb4d031..0000000 - my $queue = $txn->TicketObj->QueueObj->Name; - # Xxx todo - may clobber if two queues have the same name - foreach my $user ( $txn->DeferredRecipients($frequency) ) { -- $all_digest->{$user}->{$queue}->{$ticket}->{ $txn->id } = $txn->ContentObj; +- $all_digest->{$user}->{$queue}->{$ticket}->{ $txn->id } = $txn; - $sent_transactions->{$user}->{ $txn->id } = $txn; - } - } @@ -9260,12 +9646,14 @@ index cb4d031..0000000 - # Spit out the messages for the transactions on this ticket. - $contents_body .= "\n== $ticket_title\n"; - foreach my $txn ( sort keys %$tkt_txns ) { -- my $msg = $tkt_txns->{$txn}; -- -- # $msg contains an RT::Attachment with our outgoing -- # message. Print a few headers for clarity's sake. -- $contents_body .= "From: " . $msg->GetHeader('From') . "\n"; -- my $date = $msg->GetHeader('Date '); +- my $top = $tkt_txns->{$txn}->Attachments->First; +- +- # $top contains the top-most RT::Attachment with our +- # outgoing message. It may not be the MIME part with +- # the content. Print a few headers from it for +- # clarity's sake. +- $contents_body .= "From: " . $top->GetHeader('From') . "\n"; +- my $date = $top->GetHeader('Date '); - unless ($date) { - my $txn_obj = RT::Transaction->new( RT->SystemUser ); - $txn_obj->Load($txn); @@ -9278,7 +9666,7 @@ index cb4d031..0000000 - @{ [ localtime( $date_obj->Unix ) ] } ); - } - $contents_body .= "Date: $date\n\n"; -- $contents_body .= $msg->Content . "\n"; +- $contents_body .= $tkt_txns->{$txn}->ContentObj->Content . "\n"; - $contents_body .= "-------\n"; - } # foreach transaction - } # foreach ticket @@ -9328,10 +9716,10 @@ index cb4d031..0000000 -=back diff --git a/sbin/rt-email-group-admin b/sbin/rt-email-group-admin deleted file mode 100755 -index 176b0b6..0000000 +index 2fa245c..0000000 --- a/sbin/rt-email-group-admin +++ /dev/null -@@ -1,527 +0,0 @@ +@@ -1,520 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -9421,23 +9809,15 @@ index 176b0b6..0000000 -use strict; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -9733,6 +10113,7 @@ index 176b0b6..0000000 - require RT::Scrips; - my $scrips = RT::Scrips->new( RT->SystemUser ); - $scrips->Limit( FIELD => 'ScripAction', VALUE => $action->id ); +- $scrips->FindAllRows; - if ( $scrips->Count ) { - my @sid; - while( my $s = $scrips->Next ) { @@ -9861,10 +10242,10 @@ index 176b0b6..0000000 -=cut diff --git a/sbin/rt-fulltext-indexer b/sbin/rt-fulltext-indexer deleted file mode 100755 -index f5b5dcf..0000000 +index 23f7660..0000000 --- a/sbin/rt-fulltext-indexer +++ /dev/null -@@ -1,479 +0,0 @@ +@@ -1,467 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -9918,27 +10299,20 @@ index f5b5dcf..0000000 -no warnings 'once'; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } +- -} - -BEGIN { @@ -10097,11 +10471,6 @@ index f5b5dcf..0000000 - VALUE => 'deleted' - ); - -- # On newer DBIx::SearchBuilder's, indicate that making the query DISTINCT -- # is unnecessary because the joins won't produce duplicates. This -- # drastically improves performance when fetching attachments. -- $res->{joins_are_distinct} = 1; -- - return goto_specific( - suffix => $type, - error => "Don't know how to find $type attachments", @@ -10344,12 +10713,12 @@ index f5b5dcf..0000000 -=cut - -__DATA__ -diff --git a/sbin/rt-preferences-viewer b/sbin/rt-preferences-viewer +diff --git a/sbin/rt-importer b/sbin/rt-importer deleted file mode 100755 -index 601e638..0000000 ---- a/sbin/rt-preferences-viewer +index d2480c8..0000000 +--- a/sbin/rt-importer +++ /dev/null -@@ -1,149 +0,0 @@ +@@ -1,282 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -10423,8 +10792,295 @@ index 601e638..0000000 - } - unshift @INC, $lib; - } +- +-} +- +-use RT; +-RT::LoadConfig(); +-RT->Config->Set(RecordBaseClass => "DBIx::SearchBuilder::Record"); +-RT::Init(); +- +-use RT::Migrate; +-use RT::Migrate::Importer::File; +-use Getopt::Long; +-use Pod::Usage qw//; +-use Time::HiRes qw//; +- +-my %OPT = (resume => 1); +-GetOptions( +- \%OPT, +- "help|?", +- "quiet|q!", +- "list|l!", +- +- "resume!", +- "originalid|i=s", +- +- "ask", +- "ignore-errors", +- +- "dump=s@", +-) or Pod::Usage::pod2usage(); +- +-Pod::Usage::pod2usage(-verbose => 1) if $OPT{help}; +- +-Pod::Usage::pod2usage() unless @ARGV == 1; +-my ($dir) = @ARGV; +-$dir =~ s|/$||; +-die "No such directory $dir\n" unless -d $dir; +-die "$dir doesn't appear to contain serialized data\n" +- unless -f "$dir/001.dat"; +- +-if ($OPT{dump}) { +- die "Dumping objects only works in conjunction with --list\n" +- unless $OPT{list}; +- +- $OPT{dump} = [ split /,/, join(',', @{$OPT{dump}}) ]; +-} +- +-my $error_handler; +-if ($OPT{ask}) { +- die "Interactive mode (--ask) doesn't work when STDERR and STDIN aren't terminals.\n" +- unless -t STDERR and -t STDIN; +- +- $error_handler = sub { +- my $importer = shift; +- local $| = 1; +- print STDERR "\n", @_, "\n"; +- print STDERR "Hit any key to abort import, or type 'ignore' to continue anyway.\n"; +- print STDERR "Continuing may leave you with a corrupt database. > "; +- chomp( my $resp = <STDIN> ); +- return lc($resp) eq 'ignore'; +- }; +-} +-elsif ($OPT{'ignore-errors'}) { +- $error_handler = sub { +- my $importer = shift; +- warn "Ignoring error: ", @_; +- return 1; +- }; +-} +- +-my $import = RT::Migrate::Importer::File->new( +- Directory => $dir, +- OriginalId => $OPT{originalid}, +- DumpObjects => $OPT{dump}, +- Resume => $OPT{resume}, +- HandleError => $error_handler, +-); +- +-if ($import->Metadata and -t STDOUT and not $OPT{quiet}) { +- $import->Progress( +- RT::Migrate::progress( +- counts => sub { $import->ObjectCount }, +- max => $import->Metadata->{ObjectCount}, +- ) +- ); +-} +- +-my $log = RT::Migrate::setup_logging( $dir => 'importer.log' ); +-print "Logging warnings and errors to $log\n" if $log; +- +-my %counts; +-if ($OPT{list}) { +- %counts = $import->List; +- +- my $org = $import->Organization; +- print "=========== Dump of $org ===========\n\n"; +-} else { +- %counts = $import->Import; +- +- my $org = $import->Organization; +- print "========== Import of $org ==========\n\n"; +-} +- +-print "Total object counts:\n"; +-for (sort {$counts{$b} <=> $counts{$a}} keys %counts) { +- printf "%8d %s\n", $counts{$_}, $_; +-} +- +-my @missing = $import->Missing; +-if (@missing) { +- warn "The following UIDs were expected but never observed:\n"; +- warn " $_\n" for @missing; +-} +- +-my @invalid = $import->Invalid; +-if (@invalid) { +- warn "The following UIDs (serialized => imported) referred to objects missing from the original database:\n"; +- for my $info (@invalid) { +- my $uid = delete $info->{uid}; +- my $obj = $import->LookupObj($uid); +- warn sprintf " %s => %s (%s)\n", +- $uid, +- ($obj && $obj->Id ? $obj->UID : '(not imported)'), +- join(", ", map { "$_ => $info->{$_}" } +- grep { defined $info->{$_} } +- sort keys %$info); +- } +-} +- +-if ($log and -s $log) { +- print STDERR "\n! Some warnings or errors occurred during import." +- ."\n! Please see $log for details.\n\n"; +-} +- +-exit @missing; +- +-=head1 NAME +- +-rt-importer - Import a serialized RT database on top of the current one +- +-=head1 SYNOPSIS +- +- rt-importer path/to/export/directory +- +-This script is used to import the contents of a dump created by +-C<rt-serializer>. It will create all of the objects in the dump in the +-current database; this may include users, queues, and tickets. +- +-It is possible to stop the import process with ^C; it can be later +-resumed by re-running the importer. +- +-=head2 OPTIONS +- +-=over +- +-=item B<--list> +- +-Print a summary of the data contained in the dump. +- +-=item B<--originalid> I<cfname> +- +-Places the original ticket organization and ID into a global custom +-field with the given name. If no global ticket custom field with that +-name is found in the current database, it will create one. +- +-=item B<--ask> +- +-Prompt for action when an error occurs inserting a record into the +-database. This can often happen when importing data from very old RTs +-where some attachments (usually spam) contain invalid UTF-8. +- +-The importer will pause and ask if you want to ignore the error and +-continue on or abort (potentially to restart later). Ignoring errors +-will result in missing records in the database, which may cause database +-integrity problems later. If you ignored any errors, you should run +-C<rt-validator> after import. +- +-=item B<--ignore-errors> +- +-Ignore all record creation errors and continue on when importing. This +-is equivalent to running with C<--ask> and manually typing "ignore" at +-every prompt. You should always run C<rt-validator> after importing +-with errors ignored. +- +-B<This option can be dangerous and leave you with a broken RT!> +- +-=item B<--dump> I<class>[,I<class>] +- +-Prints L<Data::Dumper> representations of the objects of type I<class> in the +-serialized data. This is mostly useful for debugging. +- +-Works only in conjunction with C<--list>. +- +-=back +- +- +-=head1 CLONED DATA +- +-Some dumps may have been taken as complete clones of the RT system, +-which are only suitable for inserting into a schema with no data in it. +-You can setup the required database state for the receiving RT instance +-by running: +- +- sbin/rt-setup-database --action create,schema,acl --prompt-for-dba-password +- +-The normal C<make initdb> step will B<not> work because it also inserts +-core system data. +- +- +-=cut +diff --git a/sbin/rt-preferences-viewer b/sbin/rt-preferences-viewer +deleted file mode 100755 +index 819a938..0000000 +--- a/sbin/rt-preferences-viewer ++++ /dev/null +@@ -1,144 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +-# <sales@xxxxxxxxxxxxxxxxx> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use strict; +-use warnings; +- +-# fix lib paths, some may be relative +-BEGIN { # BEGIN RT CMD BOILERPLATE +- require File::Spec; +- require Cwd; +- my @libs = ("lib", "local/lib"); +- my $bin_path; +- +- for my $lib (@libs) { +- unless ( File::Spec->file_name_is_absolute($lib) ) { +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; +- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); +- } +- unshift @INC, $lib; +- } +- -} - +-BEGIN { +- use RT; +- RT::LoadConfig(); +- RT::Init(); +-}; +- -use Getopt::Long; -my %opt; -GetOptions( \%opt, 'help|h', 'user|u=s', 'option|o=s' ); @@ -10435,10 +11091,6 @@ index 601e638..0000000 - exit; -} - --require RT; --RT::LoadConfig(); --RT::Init(); -- -require RT::Attributes; -my $attrs = RT::Attributes->new( RT->SystemUser ); -$attrs->Limit( FIELD => 'Name', VALUE => 'Pref-RT::System-1' ); @@ -10499,13 +11151,13 @@ index 601e638..0000000 -This script shows user settings of preferences. If a user is using the system -default, it will not be listed. You can limit to a user name or id or to users -with a particular option set. -diff --git a/sbin/rt-server b/sbin/rt-server +diff --git a/sbin/rt-serializer b/sbin/rt-serializer deleted file mode 100755 -index add9d01..0000000 ---- a/sbin/rt-server +index cd89309..0000000 +--- a/sbin/rt-serializer +++ /dev/null -@@ -1,285 +0,0 @@ --#!/usr/bin/perl -w +@@ -1,398 +0,0 @@ +-#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: @@ -10553,17 +11205,11 @@ index add9d01..0000000 -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} --use warnings; -use strict; +-use warnings; - -# fix lib paths, some may be relative -BEGIN { -- die <<EOT if ${^TAINT}; --RT does not run under Perl's "taint mode". Remove -T from the command --line, or remove the PerlTaintCheck parameter from your mod_perl --configuration. --EOT -- - require File::Spec; - my @libs = ("lib", "local/lib"); - my $bin_path; @@ -10587,27 +11233,433 @@ index add9d01..0000000 - -} - +-use RT; +-RT::LoadConfig(); +-RT->Config->Set(RecordBaseClass => "DBIx::SearchBuilder::Record"); +-RT::Init(); +- +-use RT::Migrate; +-use RT::Migrate::Serializer::File; -use Getopt::Long; --no warnings 'once'; +-use Pod::Usage qw//; +-use Time::HiRes qw//; - --if (grep { m/help/ } @ARGV) { -- require Pod::Usage; -- print Pod::Usage::pod2usage( { verbose => 2 } ); -- exit; --} +-my %OPT; +-GetOptions( +- \%OPT, +- "help|?", +- "verbose|v!", +- "quiet|q!", +- +- "directory|d=s", +- "force|f!", +- "size|s=i", +- +- "users!", +- "groups!", +- "deleted!", +- +- "scrips!", +- "tickets!", +- "acls!", +- +- "clone", +- "incremental", +- +- "gc=i", +- "page=i", +-) or Pod::Usage::pod2usage(); +- +-Pod::Usage::pod2usage(-verbose => 1) if $OPT{help}; +- +-my %args; +-$args{Directory} = $OPT{directory}; +-$args{Force} = $OPT{force}; +-$args{MaxFileSize} = $OPT{size} if $OPT{size}; +- +-$args{AllUsers} = $OPT{users} if defined $OPT{users}; +-$args{AllGroups} = $OPT{groups} if defined $OPT{groups}; +-$args{FollowDeleted} = $OPT{deleted} if defined $OPT{deleted}; +- +-$args{FollowScrips} = $OPT{scrips} if defined $OPT{scrips}; +-$args{FollowTickets} = $OPT{tickets} if defined $OPT{tickets}; +-$args{FollowACL} = $OPT{acls} if defined $OPT{acls}; +- +-$args{Clone} = $OPT{clone} if $OPT{clone}; +-$args{Incremental} = $OPT{incremental} if $OPT{incremental}; +- +-$args{GC} = defined $OPT{gc} ? $OPT{gc} : 5000; +-$args{Page} = defined $OPT{page} ? $OPT{page} : 100; +- +-if (($OPT{clone} or $OPT{incremental}) +- and grep { /^(users|groups|deleted|scrips|tickets|acls)$/ } keys %OPT) { +- die "You cannot specify object types when cloning.\n\nPlease see $0 --help.\n"; +-} +- +-my $walker; +- +-my $gnuplot = `which gnuplot`; +-my $msg = ""; +-if (-t STDOUT and not $OPT{verbose} and not $OPT{quiet}) { +- $args{Progress} = RT::Migrate::progress( +- top => \&gnuplot, +- bottom => sub { print "\n$msg"; $msg = ""; }, +- counts => sub { $walker->ObjectCount }, +- max => { estimate() }, +- ); +- $args{MessageHandler} = sub { +- print "\r", " "x60, "\r", $_[-1]; $msg = $_[-1]; +- }; +- $args{Verbose} = 0; +-} +-$args{Verbose} = 0 if $OPT{quiet}; +- +- +-$walker = RT::Migrate::Serializer::File->new( %args ); +- +-my $log = RT::Migrate::setup_logging( $walker->{Directory} => 'serializer.log' ); +-print "Logging warnings and errors to $log\n" if $log; +- +-print "Beginning database serialization..."; +-my %counts = $walker->Export; +- +-my @files = $walker->Files; +-print "Wrote @{[scalar @files]} files:\n"; +-print " $_\n" for @files; +-print "\n"; +- +-print "Total object counts:\n"; +-for (sort {$counts{$b} <=> $counts{$a}} keys %counts) { +- printf "%8d %s\n", $counts{$_}, $_; +-} +- +-if ($log and -s $log) { +- print STDERR "\n! Some warnings or errors occurred during serialization." +- ."\n! Please see $log for details.\n\n"; +-} else { +- unlink $log; +-} +- +-sub estimate { +- $| = 1; +- my %e; +- +- # Expected types we'll serialize +- my @types = map {"RT::$_"} qw/ +- Queue Ticket Transaction Attachment Link +- User Group GroupMember Attribute +- CustomField CustomFieldValue +- ObjectCustomField ObjectCustomFieldValue +- /; +- +- for my $class (@types) { +- print "Estimating $class count..."; +- my $collection = $class . "s"; +- if ($collection->require) { +- my $objs = $collection->new( RT->SystemUser ); +- $objs->FindAllRows; +- $objs->UnLimit; +- $objs->{allow_deleted_search} = 1 if $class eq "RT::Ticket"; +- $e{$class} = $objs->DBIx::SearchBuilder::Count; +- } +- print "\r", " "x60, "\r"; +- } +- +- return %e; +-} +- +- +-sub gnuplot { +- my ($elapsed, $rows, $cols) = @_; +- my $length = $walker->StackSize; +- my $file = $walker->Directory . "/progress.plot"; +- open(my $dat, ">>", $file); +- printf $dat "%10.3f\t%8d\n", $elapsed, $length; +- close $dat; +- +- if ($rows <= 24 or not $gnuplot) { +- print "\n\n"; +- } elsif ($elapsed) { +- my $gnuplot = qx| +- gnuplot -e ' +- set term dumb $cols @{[$rows - 12]}; +- set xlabel "Seconds"; +- unset key; +- set xrange [0:*]; +- set yrange [0:*]; +- set title "Queue length"; +- plot "$file" using 1:2 with lines +- ' +- |; +- if ($? == 0 and $gnuplot) { +- $gnuplot =~ s/^(\s*\n)//; +- print $gnuplot; +- unlink $file; +- } else { +- warn "Couldn't run gnuplot (\$? == $?): $!\n"; +- } +- } else { +- print "\n" for 1..($rows - 13); +- } +-} +- +-=head1 NAME +- +-rt-serializer - Serialize an RT database to disk +- +-=head1 SYNOPSIS +- +- rt-validator --check && rt-serializer +- +-This script is used to write out the entire RT database to disk, for +-later import into a different RT instance. It requires that the data in +-the database be self-consistent, in order to do so; please make sure +-that the database being exported passes validation by L<rt-validator> +-before attempting to use C<rt-serializer>. +- +-While running, it will attempt to estimate the number of remaining +-objects to be serialized; these estimates are pessimistic, and will be +-incorrect if C<--no-users>, C<--no-groups>, or C<--no-tickets> are used. +- +-If the controlling terminal is large enough (more than 25 columns high) +-and the C<gnuplot> program is installed, it will also show a textual +-graph of the queue size over time. +- +-=head2 OPTIONS +- +-=over +- +-=item B<--directory> I<name> +- +-The name of the output directory to write data files to, which should +-not exist yet; it is a fatal error if it does. Defaults to +-C<< ./I<$Organization>:I<Date>/ >>, where I<$Organization> is as set in +-F<RT_SiteConfig.pm>, and I<Date> is today's date. +- +-=item B<--force> +- +-Remove the output directory before starting. +- +-=item B<--size> I<megabytes> +- +-By default, C<rt-serializer> chunks its output into data files which are +-around 32Mb in size; this option is used to set a different threshold +-size, in megabytes. Note that this is the threshold after which it +-rotates to writing a new file, and is as such the I<lower bound> on the +-size of each output file. +- +-=item B<--no-users> +- +-By default, all privileged users are serialized; passing C<--no-users> +-limits it to only those users which are referenced by serialized tickets +-and history, and are thus necessary for internal consistency. +- +-=item B<--no-groups> +- +-By default, all groups are serialized; passing C<--no-groups> limits it +-to only system-internal groups, which are needed for internal +-consistency. +- +-=item B<--no-deleted> +- +-By default, all tickets, including deleted tickets, are serialized; +-passing C<--no-deleted> skips deleted tickets during serialization. +- +-=item B<--scrips> +- +-No scrips or templates are serialized by default; this option forces all +-scrips and templates to be serialized. +- +-=item B<--acls> +- +-No ACLs are serialized by default; this option forces all ACLs to be +-serialized. +- +-=item B<--no-tickets> +- +-Skip serialization of all ticket data. +- +-=item B<--clone> +- +-Serializes your entire database, creating a clone. This option should +-be used if you want to migrate your RT database from one database type +-to another (e.g. MySQL to Postgres). It is an error to combine +-C<--clone> with any option that limits object types serialized. No +-dependency walking is performed when cloning. C<rt-importer> will detect +-that your serialized data set was generated by a clone. +- +-=item B<--incremental> +- +-Will generate an incremenal serialized dataset using the data stored in +-your IncrementalRecords database table. This assumes that you have created +-that table and run RT using the Record_Local.pm shim as documented in +-C<docs/incremental-export/>. +- +-=item B<--gc> I<n> +- +-Adjust how often the garbage collection sweep is done; lower numbers are +-more frequent. See L</GARBAGE COLLECTION>. +- +-=item B<--page> I<n> +- +-Adjust how many rows are pulled from the database in a single query. Disable +-paging by setting this to 0. Defaults to 100. +- +-Keep in mind that rows from RT's Attachments table are the limiting factor when +-determining page size. You should likely be aiming for 60-75% of your total +-memory on an otherwise unloaded box. +- +-=item B<--quiet> +- +-Do not show graphical progress UI. +- +-=item B<--verbose> +- +-Do not show graphical progress UI, but rather log was each row is +-written out. +- +-=back +- +-=head1 GARBAGE COLLECTION +- +-C<rt-serializer> maintains a priority queue of objects to serialize, or +-searches which may result in objects to serialize. When inserting into +-this queue, it does no checking if the object in question is already in +-the queue, or if the search will contain any results. These checks are +-done when the object reaches the front of the queue, or during periodic +-garbage collection. +- +-During periodic garbage collection, the entire queue is swept for +-objects which have already been serialized, occur more than once in the +-queue, and searches which contain no results in the database. This is +-done to reduce the memory footprint of the serialization process, and is +-triggered when enough new objects have been placed in the queue. This +-parameter is tunable via the C<--gc> parameter, which defaults to +-running garbage collection every 5,000 objects inserted into the queue; +-smaller numbers will result in more frequent garbage collection. +- +-The default of 5,000 is roughly tuned based on a database with several +-thousand tickets, but optimal values will vary wildly depending on +-database configuration and size. Values as low as 25 have provided +-speedups with smaller databases; if speed is a factor, experimenting +-with different C<--gc> values may be helpful. Note that there are +-significant boundary condition changes in serialization rate, as the +-queue empties and fills, causing the time estimates to be rather +-imprecise near the start and end of the process. +- +-Setting C<--gc> to 0 turns off all garbage collection. Be aware that +-this will bloat the memory usage of the serializer. Any negative value +-for C<--gc> turns off periodic garbage collection and instead objects +-already serialized or in the queue are checked for at the time they +-would be inserted. +- +-=cut +- +diff --git a/sbin/rt-server b/sbin/rt-server +deleted file mode 100755 +index cd22bb2..0000000 +--- a/sbin/rt-server ++++ /dev/null +@@ -1,181 +0,0 @@ +-#!/usr/bin/perl -w +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +-# <sales@xxxxxxxxxxxxxxxxx> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use warnings; +-use strict; +- +-BEGIN { +- die <<EOT if ${^TAINT}; +-RT does not run under Perl's "taint mode". Remove -T from the command +-line, or remove the PerlTaintCheck parameter from your mod_perl +-configuration. +-EOT +-} +- +-# fix lib paths, some may be relative +-BEGIN { # BEGIN RT CMD BOILERPLATE +- require File::Spec; +- require Cwd; +- my @libs = ("lib", "local/lib"); +- my $bin_path; +- +- for my $lib (@libs) { +- unless ( File::Spec->file_name_is_absolute($lib) ) { +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; +- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); +- } +- unshift @INC, $lib; +- } +- +-} +- +-use Getopt::Long; +-no warnings 'once'; +- +-if (grep { m/help/ } @ARGV) { +- require Pod::Usage; +- print Pod::Usage::pod2usage( { verbose => 2 } ); +- exit; +-} +- +-require RT; +-die "Wrong version of RT $RT::VERSION found; need 4.2.*" +- unless $RT::VERSION =~ /^4\.2\./; - --require RT; -RT->LoadConfig(); -RT->InitPluginPaths(); -RT->InitLogging(); --require Module::Refresh if RT->Config->Get('DevelMode'); - -require RT::Handle; -my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity; - -unless ( $integrity ) { - print STDERR <<EOF; -- +- -RT couldn't connect to the database where tickets are stored. -If this is a new installation of RT, you should visit the URL below -to configure RT and initialize your database. @@ -10650,127 +11702,27 @@ index add9d01..0000000 - undef $RT::Handle; -} - --require RT::Interface::Web::Handler; --my $app = RT::Interface::Web::Handler->PSGIApp; -- --if ($ENV{RT_TESTING}) { -- my $screen_logger = $RT::Logger->remove('screen'); -- require Log::Dispatch::Perl; -- $RT::Logger->add( -- Log::Dispatch::Perl->new( -- name => 'rttest', -- min_level => $screen_logger->min_level, -- action => { -- error => 'warn', -- critical => 'warn' -- } -- ) -- ); -- require Plack::Middleware::Test::StashWarnings; -- $app = Plack::Middleware::Test::StashWarnings->wrap($app); --} -- +-require RT::PlackRunner; -# when used as a psgi file -if (caller) { -- return $app; --} -- -- --# load appropriate server -- --require Plack::Runner; -- --my $is_fastcgi = $0 =~ m/fcgi$/; --my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) : -- $is_fastcgi ? ( server => 'FCGI' ) -- : (), -- env => 'deployment' ); -- --# figure out the port --my $port; -- --# handle "rt-server 8888" for back-compat, but complain about it --if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) { -- warn "Deprecated: please run $0 --port $ARGV[0] instead\n"; -- unshift @ARGV, '--port'; --} -- --my @args = @ARGV; -- --use List::MoreUtils 'last_index'; --my $last_index = last_index { $_ eq '--port' } @args; -- --my $explicit_port; -- --if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) { -- $explicit_port = $args[$last_index+1]; -- $port = $explicit_port; -- -- # inform the rest of the system what port we manually chose -- my $old_app = $app; -- $app = sub { -- my $env = shift; -- -- $env->{'rt.explicit_port'} = $port; -- -- $old_app->($env, @_); -- }; +- return RT::PlackRunner->app; -} --else { -- # default to the configured WebPort and inform Plack::Runner -- $port = RT->Config->Get('WebPort') || '8080'; -- push @args, '--port', $port; --} -- --push @args, '--server', 'Standalone' if RT->InstallMode; --push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args; -- --$r->parse_options(@args); -- --delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything - --unless ($r->{env} eq 'development') { -- push @{$r->{options}}, server_ready => sub { -- my($args) = @_; -- my $name = $args->{server_software} || ref($args); # $args is $server -- my $host = $args->{host} || 0; -- my $proto = $args->{proto} || 'http'; -- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n"; -- }; --} --eval { $r->run($app) }; --if (my $err = $@) { -- handle_startup_error($err); --} - --exit 0; +-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) : +- $0 =~ /standalone/ ? ( server => 'Standalone' ) : +- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" ) +- : ( server => 'Starlet', env => "deployment" ) ); +-$r->parse_options(@ARGV); - --sub handle_startup_error { -- my $err = shift; -- if ( $err =~ /listen/ ) { -- handle_bind_error(); -- } else { -- die -- "Something went wrong while trying to run RT's standalone web server:\n\t" -- . $err; -- } --} -- -- --sub handle_bind_error { -- -- print STDERR <<EOF; --WARNING: RT couldn't start up a web server on port @{[$port]}. --This is often the case if the port is already in use or you're running @{[$0]} --as someone other than your system's "root" user. You may also specify a --temporary port with: $0 --port <port> --EOF +-# Try to clean up wrong-permissions var/ +-$SIG{INT} = sub { +- local $@; +- system("chown", "-R", "www:www", "/opt/rt4/var"); +- exit 0; +-} if $> == 0; - -- if ($explicit_port) { -- print STDERR -- "Please check your system configuration or choose another port\n\n"; -- } --} +-$r->run; - -__END__ - @@ -10792,10 +11744,10 @@ index add9d01..0000000 - rt-server --server Starman --port 8080 diff --git a/sbin/rt-server.fcgi b/sbin/rt-server.fcgi deleted file mode 100755 -index add9d01..0000000 +index cd22bb2..0000000 --- a/sbin/rt-server.fcgi +++ /dev/null -@@ -1,285 +0,0 @@ +@@ -1,181 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -10847,30 +11799,24 @@ index add9d01..0000000 -use warnings; -use strict; - --# fix lib paths, some may be relative -BEGIN { - die <<EOT if ${^TAINT}; -RT does not run under Perl's "taint mode". Remove -T from the command -line, or remove the PerlTaintCheck parameter from your mod_perl -configuration. -EOT +-} - +-# fix lib paths, some may be relative +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -10888,17 +11834,19 @@ index add9d01..0000000 -} - -require RT; +-die "Wrong version of RT $RT::VERSION found; need 4.2.*" +- unless $RT::VERSION =~ /^4\.2\./; +- -RT->LoadConfig(); -RT->InitPluginPaths(); -RT->InitLogging(); --require Module::Refresh if RT->Config->Get('DevelMode'); - -require RT::Handle; -my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity; - -unless ( $integrity ) { - print STDERR <<EOF; -- +- -RT couldn't connect to the database where tickets are stored. -If this is a new installation of RT, you should visit the URL below -to configure RT and initialize your database. @@ -10934,134 +11882,34 @@ index add9d01..0000000 - } -} - --# we must disconnect DB before fork --if ($RT::Handle) { -- $RT::Handle->dbh->disconnect if $RT::Handle->dbh; -- $RT::Handle->dbh(undef); -- undef $RT::Handle; --} -- --require RT::Interface::Web::Handler; --my $app = RT::Interface::Web::Handler->PSGIApp; -- --if ($ENV{RT_TESTING}) { -- my $screen_logger = $RT::Logger->remove('screen'); -- require Log::Dispatch::Perl; -- $RT::Logger->add( -- Log::Dispatch::Perl->new( -- name => 'rttest', -- min_level => $screen_logger->min_level, -- action => { -- error => 'warn', -- critical => 'warn' -- } -- ) -- ); -- require Plack::Middleware::Test::StashWarnings; -- $app = Plack::Middleware::Test::StashWarnings->wrap($app); --} -- --# when used as a psgi file --if (caller) { -- return $app; --} -- -- --# load appropriate server -- --require Plack::Runner; -- --my $is_fastcgi = $0 =~ m/fcgi$/; --my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) : -- $is_fastcgi ? ( server => 'FCGI' ) -- : (), -- env => 'deployment' ); -- --# figure out the port --my $port; -- --# handle "rt-server 8888" for back-compat, but complain about it --if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) { -- warn "Deprecated: please run $0 --port $ARGV[0] instead\n"; -- unshift @ARGV, '--port'; --} -- --my @args = @ARGV; -- --use List::MoreUtils 'last_index'; --my $last_index = last_index { $_ eq '--port' } @args; -- --my $explicit_port; -- --if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) { -- $explicit_port = $args[$last_index+1]; -- $port = $explicit_port; -- -- # inform the rest of the system what port we manually chose -- my $old_app = $app; -- $app = sub { -- my $env = shift; -- -- $env->{'rt.explicit_port'} = $port; -- -- $old_app->($env, @_); -- }; --} --else { -- # default to the configured WebPort and inform Plack::Runner -- $port = RT->Config->Get('WebPort') || '8080'; -- push @args, '--port', $port; --} -- --push @args, '--server', 'Standalone' if RT->InstallMode; --push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args; -- --$r->parse_options(@args); -- --delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything -- --unless ($r->{env} eq 'development') { -- push @{$r->{options}}, server_ready => sub { -- my($args) = @_; -- my $name = $args->{server_software} || ref($args); # $args is $server -- my $host = $args->{host} || 0; -- my $proto = $args->{proto} || 'http'; -- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n"; -- }; --} --eval { $r->run($app) }; --if (my $err = $@) { -- handle_startup_error($err); +-# we must disconnect DB before fork +-if ($RT::Handle) { +- $RT::Handle->dbh->disconnect if $RT::Handle->dbh; +- $RT::Handle->dbh(undef); +- undef $RT::Handle; -} - --exit 0; -- --sub handle_startup_error { -- my $err = shift; -- if ( $err =~ /listen/ ) { -- handle_bind_error(); -- } else { -- die -- "Something went wrong while trying to run RT's standalone web server:\n\t" -- . $err; -- } +-require RT::PlackRunner; +-# when used as a psgi file +-if (caller) { +- return RT::PlackRunner->app; -} - - --sub handle_bind_error { +-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) : +- $0 =~ /standalone/ ? ( server => 'Standalone' ) : +- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" ) +- : ( server => 'Starlet', env => "deployment" ) ); +-$r->parse_options(@ARGV); - -- print STDERR <<EOF; --WARNING: RT couldn't start up a web server on port @{[$port]}. --This is often the case if the port is already in use or you're running @{[$0]} --as someone other than your system's "root" user. You may also specify a --temporary port with: $0 --port <port> --EOF +-# Try to clean up wrong-permissions var/ +-$SIG{INT} = sub { +- local $@; +- system("chown", "-R", "www:www", "/opt/rt4/var"); +- exit 0; +-} if $> == 0; - -- if ($explicit_port) { -- print STDERR -- "Please check your system configuration or choose another port\n\n"; -- } --} +-$r->run; - -__END__ - @@ -11083,10 +11931,10 @@ index add9d01..0000000 - rt-server --server Starman --port 8080 diff --git a/sbin/rt-session-viewer b/sbin/rt-session-viewer deleted file mode 100755 -index 555fc32..0000000 +index 6dcfd4f..0000000 --- a/sbin/rt-session-viewer +++ /dev/null -@@ -1,121 +0,0 @@ +@@ -1,114 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -11139,27 +11987,20 @@ index 555fc32..0000000 -use warnings; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } +- -} - -use Getopt::Long; @@ -11210,10 +12051,10 @@ index 555fc32..0000000 -=cut diff --git a/sbin/rt-setup-database b/sbin/rt-setup-database deleted file mode 100755 -index 0b8be39..0000000 +index b599556..0000000 --- a/sbin/rt-setup-database +++ /dev/null -@@ -1,607 +0,0 @@ +@@ -1,795 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -11268,23 +12109,15 @@ index 0b8be39..0000000 -use vars qw($Nobody $SystemUser $item); - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -11294,11 +12127,11 @@ index 0b8be39..0000000 - -use Term::ReadKey; -use Getopt::Long; +-use Data::GUID; - -$| = 1; # unbuffer all output. - -my %args = ( -- dba => 'root', - package => 'RT', -); -GetOptions( @@ -11307,6 +12140,7 @@ index 0b8be39..0000000 - 'force', 'debug', - 'dba=s', 'dba-password=s', 'prompt-for-dba-password', 'package=s', - 'datafile=s', 'datadir=s', 'skip-create', 'root-password-file=s', +- 'package=s', 'ext-version=s', - 'upgrade-from=s', 'upgrade-to=s', - 'help|h', -); @@ -11324,9 +12158,10 @@ index 0b8be39..0000000 - -# Force warnings to be output to STDERR if we're not already logging -# them at a higher level --RT->Config->Set( LogToScreen => 'warning') -- unless ( RT->Config->Get( 'LogToScreen' ) -- && RT->Config->Get( 'LogToScreen' ) =~ /^(debug|info|notice)$/ ); +-RT->Config->Set( LogToSTDERR => 'warning') +- unless ( RT->Config->Get( 'LogToSTDERR' ) +- && RT->Config->Get( 'LogToSTDERR' ) =~ /^(debug|info|notice)$/ ); +-RT::InitLogging(); - -# get customized root password -my $root_password; @@ -11352,7 +12187,7 @@ index 0b8be39..0000000 - exit(-1); -} -foreach ( @actions ) { -- unless ( /^(?:init|create|drop|schema|acl|coredata|insert|upgrade)$/ ) { +- unless ( /^(?:init|create|drop|schema|acl|indexes|coredata|insert|upgrade)$/ ) { - print STDERR "$0 called with an invalid --action parameter.\n"; - exit(-1); - } @@ -11395,7 +12230,7 @@ index 0b8be39..0000000 - RT->Config->Set( DatabaseName => $db_name ); -} - --my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || $db_user || ''; +-my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || RT->Config->Get('DatabaseAdmin') || ''; -my $dba_pass = $args{'dba-password'} || $ENV{'RT_DBA_PASSWORD'}; - -if ($args{'skip-create'}) { @@ -11415,6 +12250,17 @@ index 0b8be39..0000000 - ."Type:\t$db_type\nHost:\t$db_host\nPort:\t$db_port\nName:\t$db_name\n" - ."User:\t$db_user\nDBA:\t$dba_user" . ($args{'skip-create'} ? ' (No DBA)' : '') . "\n"; - +-my $package = $args{'package'} || 'RT'; +-my $ext_version = $args{'ext-version'}; +-my $full_id = Data::GUID->new->as_string; +- +-my $log_actions = 0; +-if ($args{'package'} ne 'RT') { +- RT->ConnectToDatabase(); +- RT->InitSystemObjects(); +- $log_actions = 1; +-} +- -foreach my $action ( @actions ) { - no strict 'refs'; - my ($status, $msg) = *{ 'action_'. $action }{'CODE'}->( %args ); @@ -11457,8 +12303,28 @@ index 0b8be39..0000000 - my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'schema' ); - return ($status, $msg) unless $status; - +- my $individual_id = Data::GUID->new->as_string(); +- my %upgrade_data = ( +- action => 'schema', +- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''), +- stage => 'before', +- full_id => $full_id, +- individual_id => $individual_id, +- ); +- $upgrade_data{'ext_version'} = $ext_version if $ext_version; +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- - print "Now populating database schema.\n"; -- return RT::Handle->InsertSchema( $dbh, $args{'datafile'} || $args{'datadir'} ); +- my @ret = RT::Handle->InsertSchema( $dbh, $args{'datafile'} || $args{'datadir'} ); +- +- %upgrade_data = ( +- stage => 'after', +- individual_id => $individual_id, +- return_value => [ @ret ], +- ); +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- +- return @ret; -} - -sub action_acl { @@ -11467,8 +12333,63 @@ index 0b8be39..0000000 - my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'acl' ); - return ($status, $msg) unless $status; - +- my $individual_id = Data::GUID->new->as_string(); +- my %upgrade_data = ( +- action => 'acl', +- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''), +- stage => 'before', +- full_id => $full_id, +- individual_id => $individual_id, +- ); +- $upgrade_data{'ext_version'} = $ext_version if $ext_version; +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- - print "Now inserting database ACLs.\n"; -- return RT::Handle->InsertACL( $dbh, $args{'datafile'} || $args{'datadir'} ); +- my @ret = RT::Handle->InsertACL( $dbh, $args{'datafile'} || $args{'datadir'} ); +- +- %upgrade_data = ( +- stage => 'after', +- individual_id => $individual_id, +- return_value => [ @ret ], +- ); +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- +- return @ret; +-} +- +-sub action_indexes { +- my %args = @_; +- RT->ConnectToDatabase; +- my $individual_id = Data::GUID->new->as_string(); +- my %upgrade_data = ( +- action => 'indexes', +- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''), +- stage => 'before', +- full_id => $full_id, +- individual_id => $individual_id, +- ); +- $upgrade_data{'ext_version'} = $ext_version if $ext_version; +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- +- my $dbh = get_admin_dbh(); +- $RT::Handle = RT::Handle->new; +- $RT::Handle->dbh( $dbh ); +- RT::InitLogging(); +- +- print "Now inserting database indexes.\n"; +- my @ret = RT::Handle->InsertIndexes( $dbh, $args{'datafile'} || $args{'datadir'} ); +- +- $RT::Handle = RT::Handle->new; +- $RT::Handle->dbh( undef ); +- RT->ConnectToDatabase; +- %upgrade_data = ( +- stage => 'after', +- individual_id => $individual_id, +- return_value => [ @ret ], +- ); +- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions; +- +- return @ret; -} - -sub action_coredata { @@ -11476,7 +12397,6 @@ index 0b8be39..0000000 - $RT::Handle = RT::Handle->new; - $RT::Handle->dbh( undef ); - RT::ConnectToDatabase(); -- RT::InitLogging(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'coredata' ); - return ($status, $msg) unless $status; - @@ -11488,6 +12408,8 @@ index 0b8be39..0000000 - my %args = @_; - $RT::Handle = RT::Handle->new; - RT::Init(); +- $log_actions = 1; +- - my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'insert' ); - return ($status, $msg) unless $status; - @@ -11496,29 +12418,54 @@ index 0b8be39..0000000 - $file = $RT::EtcPath . "/initialdata" if $init && !$file; - $file ||= $args{'datadir'}."/content"; - -- # Slurp in backcompat -- my %removed; -- my @back = @{$args{backcompat} || []}; -- if (@back) { -- my @lines = do {local @ARGV = @back; <>}; -- for (@lines) { -- s/\#.*//; -- next unless /\S/; -- my ($class, @fields) = split; -- $class->_BuildTableAttributes; -- $RT::Logger->debug("Temporarily removing @fields from $class"); -- $removed{$class}{$_} = delete $RT::Record::_TABLE_ATTR->{$class}{$_} -- for @fields; +- my $individual_id = Data::GUID->new->as_string(); +- my %upgrade_data = ( +- action => 'insert', +- filename => Cwd::abs_path($file), +- stage => 'before', +- full_id => $full_id, +- individual_id => $individual_id +- ); +- $upgrade_data{'ext_version'} = $ext_version if $ext_version; +- +- open my $handle, '<', $file or warn "Unable to open $file: $!"; +- $upgrade_data{content} = do {local $/; <$handle>} if $handle; +- +- RT->System->AddUpgradeHistory($package => \%upgrade_data); +- +- my @ret; +- +- my $upgrade = sub { @ret = $RT::Handle->InsertData( $file, $root_password ) }; +- +- for my $file (@{$args{backcompat} || []}) { +- my $lines = do {local $/; local @ARGV = ($file); <>}; +- my $sub = eval "sub {\n# line 1 $file\n$lines\n}"; +- unless ($sub) { +- warn "Failed to load backcompat $file: $@"; +- next; - } +- my $current = $upgrade; +- $upgrade = sub { $sub->($current) }; - } - -- my @ret = $RT::Handle->InsertData( $file, $root_password ); +- $upgrade->(); +- +- # XXX Reconnecting to insert the history entry +- # until we can sort out removing +- # the disconnect at the end of InsertData. +- RT->ConnectToDatabase(); +- +- %upgrade_data = ( +- stage => 'after', +- individual_id => $individual_id, +- return_value => [ @ret ], +- ); +- +- RT->System->AddUpgradeHistory($package => \%upgrade_data); +- +- my $db_type = RT->Config->Get('DatabaseType'); +- $RT::Handle->Disconnect() unless $db_type eq 'SQLite'; - -- # Put back the fields we chopped off -- for my $class (keys %removed) { -- $RT::Record::_TABLE_ATTR->{$class}{$_} = $removed{$class}{$_} -- for keys %{$removed{$class}}; -- } - return @ret; -} - @@ -11600,15 +12547,62 @@ index 0b8be39..0000000 - } - } - -- print "\nIT'S VERY IMPORTANT TO BACK UP BEFORE THIS STEP\n\n"; -- _yesno() or exit(-2) unless $args{'force'}; +- unless ( $args{'force'} ) { +- print "\nIT'S VERY IMPORTANT TO BACK UP BEFORE THIS STEP\n\n"; +- _yesno() or exit(-2); +- } +- +- RT->ConnectToDatabase(); +- RT->InitSystemObjects(); +- $log_actions = 1; +- +- RT->System->AddUpgradeHistory($package => { +- type => 'full upgrade', +- action => 'upgrade', +- stage => 'before', +- from => $upgrading_from, +- to => $upgrading_to, +- versions => [@versions], +- full_id => $full_id, +- individual_id => $full_id +- }); +- +- # Ensure that the Attributes column is big enough to hold the +- # upgrade steps we're going to add; this step exists in 4.0.6 for +- # mysql, but that may be too late. Run it as soon as possible. +- if (RT->Config->Get('DatabaseType') eq 'mysql' +- and RT::Handle::cmp_version( $upgrading_from, '4.0.6') < 0) { +- my $dbh = get_admin_dbh(); +- # Before the binary switch in 3.7.87, we want to alter text -> +- # longtext, not blob -> longblob +- if (RT::Handle::cmp_version( $upgrading_from, '3.7.87') < 0) { +- $dbh->do("ALTER TABLE Attributes MODIFY Content LONGTEXT") +- } else { +- $dbh->do("ALTER TABLE Attributes MODIFY Content LONGBLOB") +- } +- } - +- my $previous = $upgrading_from; - my ( $ret, $msg ); - foreach my $n ( 0..$#versions ) { - my $v = $versions[$n]; +- my $individual_id = Data::GUID->new->as_string(); +- - my @back = grep {-e $_} map {"$base_dir/$versions[$_]/backcompat"} $n+1..$#versions; - print "Processing $v\n"; +- +- RT->System->AddUpgradeHistory($package => { +- action => 'upgrade', +- type => 'individual upgrade', +- stage => 'before', +- from => $previous, +- to => $v, +- full_id => $full_id, +- individual_id => $individual_id, +- }); +- - my %tmp = (%args, datadir => "$base_dir/$v", datafile => undef, backcompat => \@back); +- - if ( -e "$base_dir/$v/schema.$db_type" ) { - ( $ret, $msg ) = action_schema( %tmp ); - return ( $ret, $msg ) unless $ret; @@ -11617,11 +12611,33 @@ index 0b8be39..0000000 - ( $ret, $msg ) = action_acl( %tmp ); - return ( $ret, $msg ) unless $ret; - } +- if ( -e "$base_dir/$v/indexes" ) { +- ( $ret, $msg ) = action_indexes( %tmp ); +- return ( $ret, $msg ) unless $ret; +- } - if ( -e "$base_dir/$v/content" ) { - ( $ret, $msg ) = action_insert( %tmp ); - return ( $ret, $msg ) unless $ret; - } +- +- # XXX: Another connect since the insert called +- # previous to this step will disconnect. +- +- RT->ConnectToDatabase(); +- +- RT->System->AddUpgradeHistory($package => { +- stage => 'after', +- individual_id => $individual_id, +- }); +- +- $previous = $v; - } +- +- RT->System->AddUpgradeHistory($package => { +- stage => 'after', +- individual_id => $full_id, +- }); +- - return 1; -} - @@ -11810,6 +12826,17 @@ index 0b8be39..0000000 -for 'init' and 'insert': rather than using the default administrative password -for RT's "root" user, use the password in this file. - +-=item package +- +-the name of the entity performing a create or upgrade. Used for logging changes +-in the DB. Defaults to RT, otherwise it should be the fully qualified package name +-of the extension or plugin making changes to the DB. +- +-=item ext-version +- +-current version of extension making a change. Not needed for RT since RT has a +-more elaborate system to track upgrades across multiple versions. +- -=item upgrade-from - -for 'upgrade': specifies the version to upgrade from, and do not prompt @@ -11821,12 +12848,14 @@ index 0b8be39..0000000 -for it if it appears to be a valid version. - -=back +- +-=cut diff --git a/sbin/rt-setup-fulltext-index b/sbin/rt-setup-fulltext-index deleted file mode 100755 -index 871d419..0000000 +index 19d64f0..0000000 --- a/sbin/rt-setup-fulltext-index +++ /dev/null -@@ -1,720 +0,0 @@ +@@ -1,713 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -11880,27 +12909,20 @@ index 871d419..0000000 -no warnings 'once'; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } +- -} - -BEGIN { @@ -11913,7 +12935,7 @@ index 871d419..0000000 -my %DB = ( - type => scalar RT->Config->Get('DatabaseType'), - user => scalar RT->Config->Get('DatabaseUser'), -- admin => 'root', +- admin => scalar RT->Config->Get('DatabaseAdmin'), - admin_password => undef, -); - @@ -11999,7 +13021,7 @@ index 871d419..0000000 - - my $schema = <<END; -CREATE TABLE $table ( -- id INTEGER UNSIGNED NOT NULL, +- id BIGINT NOT NULL, - weight INTEGER NOT NULL, - query VARCHAR(3072) NOT NULL, - INDEX(query) @@ -12549,10 +13571,10 @@ index 871d419..0000000 - diff --git a/sbin/rt-shredder b/sbin/rt-shredder deleted file mode 100755 -index 0198ab0..0000000 +index 14cba1f..0000000 --- a/sbin/rt-shredder +++ /dev/null -@@ -1,325 +0,0 @@ +@@ -1,317 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -12666,23 +13688,15 @@ index 0198ab0..0000000 -use warnings FATAL => 'all'; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -12711,7 +13725,7 @@ index 0198ab0..0000000 - file_name => $opt{'sqldump'}, - from_storage => 0, - } ) }; -- if( $@ ) { +- if( $@ ) { - print STDERR "ERROR: Couldn't open SQL dump file: $@\n"; - exit 1 if $opt{'sqldump'}; - @@ -12719,7 +13733,7 @@ index 0198ab0..0000000 - unless( $opt{'force'} ) { - exit 0 unless prompt_yN( "Do you want to proceed?" ); - } -- } else { +- } else { - print "SQL dump file is '". $plugin->FileName ."'\n"; - } -} @@ -12740,95 +13754,95 @@ index 0198ab0..0000000 - -sub prompt_delete_objs -{ -- my( $objs ) = @_; -- unless( @$objs ) { -- print "Objects list is empty, try refine search options\n"; -- exit 0; -- } -- my $list = "Next ". scalar( @$objs ) ." objects would be deleted:\n"; -- foreach my $o( @$objs ) { -- $list .= "\t". $o->_AsString ." object\n"; -- } -- print $list; -- exit(0) unless prompt_yN( "Do you want to proceed?" ); +- my( $objs ) = @_; +- unless( @$objs ) { +- print "Objects list is empty, try refine search options\n"; +- exit 0; +- } +- my $list = "Next ". scalar( @$objs ) ." objects would be deleted:\n"; +- foreach my $o( @$objs ) { +- $list .= "\t". $o->_AsString ." object\n"; +- } +- print $list; +- exit(0) unless prompt_yN( "Do you want to proceed?" ); -} - -sub prompt_yN -{ -- my $text = shift; -- print "$text [y/N] "; -- unless( <STDIN> =~ /^(?:y|yes)$/i ) { -- return 0; -- } -- return 1; +- my $text = shift; +- print "$text [y/N] "; +- unless( <STDIN> =~ /^(?:y|yes)$/i ) { +- return 0; +- } +- return 1; -} - -sub usage -{ -- require RT::Shredder::POD; -- RT::Shredder::POD::shredder_cli( $0, \*STDOUT ); -- exit 1; +- require RT::Shredder::POD; +- RT::Shredder::POD::shredder_cli( $0, \*STDOUT ); +- exit 1; -} - -sub parse_args -{ -- my $tmp; -- Getopt::Long::Configure( "pass_through" ); -- my @objs = (); -- if( GetOptions( 'object=s' => \@objs ) && @objs ) { -- print STDERR "Option --object had been deprecated, use plugin 'Objects' instead\n"; +- my $tmp; +- Getopt::Long::Configure( "pass_through" ); +- my @objs = (); +- if( GetOptions( 'object=s' => \@objs ) && @objs ) { +- print STDERR "Option --object had been deprecated, use plugin 'Objects' instead\n"; - exit(1); -- } -- -- my @plugins = (); -- if( GetOptions( 'plugin=s' => \@plugins ) && @plugins ) { -- $opt{'plugin'} = \@plugins; -- foreach my $str( @plugins ) { -- if( $str =~ /^\s*list\s*$/ ) { -- show_plugin_list(); -- } elsif( $str =~ /^\s*help-(\w+)\s*$/ ) { -- show_plugin_help( $1 ); -- } elsif( $str =~ /^(\w+)(=.*)?$/ && !$plugins{$1} ) { -- print "Couldn't find plugin '$1'\n"; -- show_plugin_list(); -- } -- } -- } -- -- # other options make no sense without previouse -- usage() unless keys %opt; -- -- if( GetOptions( 'force' => \$tmp ) && $tmp ) { -- $opt{'force'}++; -- } -- $tmp = undef; -- if( GetOptions( 'sqldump=s' => \$tmp ) && $tmp ) { -- $opt{'sqldump'} = $tmp; -- } -- return; +- } +- +- my @plugins = (); +- if( GetOptions( 'plugin=s' => \@plugins ) && @plugins ) { +- $opt{'plugin'} = \@plugins; +- foreach my $str( @plugins ) { +- if( $str =~ /^\s*list\s*$/ ) { +- show_plugin_list(); +- } elsif( $str =~ /^\s*help-(\w+)\s*$/ ) { +- show_plugin_help( $1 ); +- } elsif( $str =~ /^(\w+)(=.*)?$/ && !$plugins{$1} ) { +- print "Couldn't find plugin '$1'\n"; +- show_plugin_list(); +- } +- } +- } +- +- # other options make no sense without previouse +- usage() unless keys %opt; +- +- if( GetOptions( 'force' => \$tmp ) && $tmp ) { +- $opt{'force'}++; +- } +- $tmp = undef; +- if( GetOptions( 'sqldump=s' => \$tmp ) && $tmp ) { +- $opt{'sqldump'} = $tmp; +- } +- return; -} - -sub process_plugins -{ -- my $shredder = shift; -- -- my @res; -- foreach my $str( @{ $opt{'plugin'} } ) { -- my $plugin = RT::Shredder::Plugin->new; -- my( $status, $msg ) = $plugin->LoadByString( $str ); -- unless( $status ) { -- print STDERR "Couldn't load plugin\n"; -- print STDERR "Error: $msg\n"; -- exit(1); -- } +- my $shredder = shift; +- +- my @res; +- foreach my $str( @{ $opt{'plugin'} } ) { +- my $plugin = RT::Shredder::Plugin->new; +- my( $status, $msg ) = $plugin->LoadByString( $str ); +- unless( $status ) { +- print STDERR "Couldn't load plugin\n"; +- print STDERR "Error: $msg\n"; +- exit(1); +- } - if ( lc $plugin->Type eq 'search' ) { - push @res, _process_search_plugin( $shredder, $plugin ); - } - elsif ( lc $plugin->Type eq 'dump' ) { - _process_dump_plugin( $shredder, $plugin ); - } -- } -- return RT::Shredder->CastObjectsToRecords( Objects => \@res ); +- } +- return RT::Shredder->CastObjectsToRecords( Objects => \@res ); -} - -sub _process_search_plugin { @@ -12859,31 +13873,31 @@ index 0198ab0..0000000 - -sub show_plugin_list -{ -- print "Plugins list:\n"; -- print "\t$_\n" foreach( grep !/^Base$/, keys %plugins ); -- exit(1); +- print "Plugins list:\n"; +- print "\t$_\n" foreach( grep !/^Base$/, keys %plugins ); +- exit(1); -} - -sub show_plugin_help -{ -- my( $name ) = @_; -- require RT::Shredder::POD; -- unless( $plugins{ $name } ) { -- print "Couldn't find plugin '$name'\n"; -- show_plugin_list(); -- } -- RT::Shredder::POD::plugin_cli( $plugins{'Base'}, \*STDOUT, 1 ); -- RT::Shredder::POD::plugin_cli( $plugins{ $name }, \*STDOUT ); -- exit(1); +- my( $name ) = @_; +- require RT::Shredder::POD; +- unless( $plugins{ $name } ) { +- print "Couldn't find plugin '$name'\n"; +- show_plugin_list(); +- } +- RT::Shredder::POD::plugin_cli( $plugins{'Base'}, \*STDOUT, 1 ); +- RT::Shredder::POD::plugin_cli( $plugins{ $name }, \*STDOUT ); +- exit(1); -} - -exit(0); diff --git a/sbin/rt-test-dependencies b/sbin/rt-test-dependencies deleted file mode 100755 -index 63a0956..0000000 +index 7da4d31..0000000 --- a/sbin/rt-test-dependencies +++ /dev/null -@@ -1,694 +0,0 @@ +@@ -1,652 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -12950,26 +13964,20 @@ index 63a0956..0000000 - -GetOptions( - \%args, 'v|verbose', -- 'install!', 'with-MYSQL', -- 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', -- 'with-ORACLE', 'with-FASTCGI', -- 'with-MODPERL1', 'with-MODPERL2', -- 'with-STANDALONE', +- 'install!', +- 'with-MYSQL', 'with-PG', 'with-SQLITE', 'with-ORACLE', +- 'with-FASTCGI', 'with-MODPERL1', 'with-MODPERL2', 'with-STANDALONE', - -- 'with-DEV', +- 'with-DEVELOPER', - - 'with-GPG', - 'with-ICAL', -- 'with-SMTP', - 'with-GRAPHVIZ', - 'with-GD', - 'with-DASHBOARDS', - 'with-USERLOGO', -- 'with-SSL-MAILGATE', - 'with-HTML-DOC', - -- 'download=s', -- 'repository=s', - 'list-deps', - 'help|h', -); @@ -12982,20 +13990,17 @@ index 63a0956..0000000 - -# Set up defaults -my %default = ( -- 'with-MASON' => 1, -- 'with-PSGI' => 1, - 'with-CORE' => 1, - 'with-CLI' => 1, - 'with-MAILGATE' => 1, -- 'with-DEV' => 0, +- 'with-DEVELOPER' => 0, - 'with-GPG' => 1, +- 'with-SMIME' => 1, - 'with-ICAL' => 1, -- 'with-SMTP' => 1, - 'with-GRAPHVIZ' => 1, - 'with-GD' => 1, - 'with-DASHBOARDS' => 1, - 'with-USERLOGO' => 1, -- 'with-SSL-MAILGATE' => 0, - 'with-HTML-DOC' => 0, -); -$args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default; @@ -13053,6 +14058,10 @@ index 63a0956..0000000 - 0, $module->{error} ); - } - } +- +- print "\nPerl library path for /usr/bin/perl:\n"; +- print " $_\n" for @INC; +- - exit 1; - } -} @@ -13075,125 +14084,124 @@ index 63a0956..0000000 -} - -$deps{'CORE'} = [ text_to_hash( << '.') ]; +-Apache::Session 1.53 +-CGI 3.38 +-CGI::Cookie 1.20 +-CGI::Emulate::PSGI +-CGI::PSGI 0.12 -Class::Accessor 0.34 +-Crypt::Eksblowfish +-CSS::Squish 0.06 +-Data::GUID +-Date::Extract 0.02 +-Date::Manip -DateTime 0.44 +-DateTime::Format::Natural 0.67 -DateTime::Locale 0.40 +-DBI 1.37 +-DBIx::SearchBuilder 1.65 +-Devel::GlobalDestruction +-Devel::StackTrace 1.19 -Digest::base -Digest::MD5 2.27 -Digest::SHA --DBI 1.37 --Class::ReturnValue 0.40 --DBIx::SearchBuilder 1.59 --Text::Template 1.44 +-Email::Address 1.897 +-Email::Address::List 0.02 +-Encode 2.39 +-Errno +-File::Glob -File::ShareDir -File::Spec 0.8 +-File::Temp 0.19 +-HTML::Entities +-HTML::FormatText::WithLinks 0.14 +-HTML::FormatText::WithLinks::AndTables +-HTML::Mason 1.43 +-HTML::Mason::PSGIHandler 0.52 -HTML::Quoted +-HTML::RewriteAttributes 0.05 -HTML::Scrubber 0.08 --HTML::TreeBuilder --HTML::FormatText --Log::Dispatch 2.23 --Sys::Syslog 0.16 +-HTTP::Message 6.0 +-IPC::Run3 +-JSON +-LWP::Simple +-List::MoreUtils -Locale::Maketext 1.06 +-Locale::Maketext::Fuzzy 0.11 -Locale::Maketext::Lexicon 0.32 --Locale::Maketext::Fuzzy --MIME::Entity 5.425 +-Log::Dispatch 2.30 +-Mail::Header 2.12 -Mail::Mailer 1.57 --Email::Address --Text::Wrapper --Time::ParseDate --Time::HiRes --File::Temp 0.19 --Text::Quoted 2.02 --Tree::Simple 1.04 --UNIVERSAL::require --Regexp::Common --Scalar::Util +-MIME::Entity 5.504 +-Module::Refresh 0.03 -Module::Versions::Report 1.05 --Cache::Simple::TimedExpiry --Encode 2.39 --CSS::Squish 0.06 --File::Glob --Devel::StackTrace 1.19 --Text::Password::Pronounceable --Devel::GlobalDestruction --List::MoreUtils -Net::CIDR +-Plack 1.0002 +-Plack::Handler::Starlet +-Regexp::Common -Regexp::Common::net::CIDR -Regexp::IPv6 --. -- --$deps{'MASON'} = [ text_to_hash( << '.') ]; --HTML::Mason 1.43 --Errno --Digest::MD5 2.27 --CGI::Cookie 1.20 +-Role::Basic 0.12 +-Scalar::Util -Storable 2.08 --Apache::Session 1.53 --XML::RSS 1.05 +-Symbol::Global::Name 0.04 +-Sys::Syslog 0.16 +-Text::Password::Pronounceable +-Text::Quoted 2.07 +-Text::Template 1.44 -Text::WikiFormat 0.76 --CSS::Squish 0.06 --Devel::StackTrace 1.19 --JSON --IPC::Run3 --. -- --$deps{'PSGI'} = [ text_to_hash( << '.') ]; --CGI 3.38 --CGI::PSGI 0.12 --HTML::Mason::PSGIHandler 0.52 --Plack 0.9971 --Plack::Handler::Starlet --CGI::Emulate::PSGI +-Text::Wrapper +-Time::HiRes +-Time::ParseDate +-Tree::Simple 1.04 +-UNIVERSAL::require +-XML::RSS 1.05 -. --set_dep( PSGI => CGI => 4.00 ) if $] > 5.019003; -- +-set_dep( CORE => 'Symbol::Global::Name' => 0.05 ) if $] >= 5.019003; +-set_dep( CORE => CGI => 4.00 ) if $] > 5.019003; - -$deps{'MAILGATE'} = [ text_to_hash( << '.') ]; --Getopt::Long --LWP::UserAgent --Pod::Usage --. -- --$deps{'SSL-MAILGATE'} = [ text_to_hash( << '.') ]; --Crypt::SSLeay --Net::SSL --LWP::UserAgent 6.0 +-Crypt::SSLeay +-Getopt::Long -LWP::Protocol::https +-LWP::UserAgent 6.0 -Mozilla::CA +-Net::SSL +-Pod::Usage -. - -$deps{'CLI'} = [ text_to_hash( << '.') ]; -Getopt::Long 2.24 --LWP -HTTP::Request::Common --Text::ParseWords --Term::ReadLine +-LWP -Term::ReadKey +-Term::ReadLine +-Text::ParseWords -. - --$deps{'DEV'} = [ text_to_hash( << '.') ]; +-$deps{'DEVELOPER'} = [ text_to_hash( << '.') ]; -Email::Abstract --Test::Email --HTML::Form --HTML::TokeParser --WWW::Mechanize 1.52 --Test::WWW::Mechanize 1.30 --Module::Refresh 0.03 --Test::Expect 0.31 --XML::Simple -File::Find --Test::Deep 0 # needed for shredder tests --String::ShellQuote 0 # needed for gnupg-incoming.t --Log::Dispatch::Perl --Test::Warn --Test::Builder 0.90 # needed for is_passing --Test::MockTime +-File::Which +-Locale::PO -Log::Dispatch::Perl --Test::WWW::Mechanize::PSGI +-Mojo::DOM -Plack::Middleware::Test::StashWarnings 0.08 +-Set::Tiny +-String::ShellQuote 0 # needed for gnupg-incoming.t +-Test::Builder 0.90 # needed for is_passing +-Test::Deep 0 # needed for shredder tests +-Test::Email +-Test::Expect 0.31 -Test::LongString +-Test::MockTime -Test::NoWarnings --Locale::PO +-Test::Pod +-Test::Warn +-Test::WWW::Mechanize 1.30 +-Test::WWW::Mechanize::PSGI +-WWW::Mechanize 1.52 +-XML::Simple -. - -$deps{'FASTCGI'} = [ text_to_hash( << '.') ]; @@ -13202,13 +14210,12 @@ index 63a0956..0000000 -. - -$deps{'MODPERL1'} = [ text_to_hash( << '.') ]; --Apache::Request -Apache::DBI 0.92 +-Apache::Request -. - -$deps{'MODPERL2'} = [ text_to_hash( << '.') ]; -Apache::DBI --HTML::Mason 1.36 -. - -$deps{'MYSQL'} = [ text_to_hash( << '.') ]; @@ -13219,7 +14226,7 @@ index 63a0956..0000000 -DBD::Oracle -. - --$deps{'POSTGRESQL'} = [ text_to_hash( << '.') ]; +-$deps{'PG'} = [ text_to_hash( << '.') ]; -DBIx::SearchBuilder 1.66 -DBD::Pg 1.43 -. @@ -13229,22 +14236,25 @@ index 63a0956..0000000 -. - -$deps{'GPG'} = [ text_to_hash( << '.') ]; +-File::Which -GnuPG::Interface -PerlIO::eol -. - --$deps{'ICAL'} = [ text_to_hash( << '.') ]; --Data::ICal +-$deps{'SMIME'} = [ text_to_hash( << '.') ]; +-Crypt::X509 +-File::Which +-String::ShellQuote -. - --$deps{'SMTP'} = [ text_to_hash( << '.') ]; --Net::SMTP +-$deps{'ICAL'} = [ text_to_hash( << '.') ]; +-Data::ICal -. - -$deps{'DASHBOARDS'} = [ text_to_hash( << '.') ]; --HTML::RewriteAttributes 0.05 -MIME::Types -URI 1.59 +-URI::QueryParam -. - -$deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ]; @@ -13254,7 +14264,7 @@ index 63a0956..0000000 - -$deps{'GD'} = [ text_to_hash( << '.') ]; -GD --GD::Graph +-GD::Graph 1.47 -GD::Text -. - @@ -13263,13 +14273,12 @@ index 63a0956..0000000 -. - -$deps{'HTML-DOC'} = [ text_to_hash( <<'.') ]; --Pod::Simple 3.24 -HTML::Entities +-Pod::Simple 3.24 -. - -my %AVOID = ( - 'DBD::Oracle' => [qw(1.23)], -- 'Email::Address' => [qw(1.893 1.894)], - 'Devel::StackTrace' => [qw(1.28 1.29)], -); - @@ -13349,7 +14358,7 @@ index 63a0956..0000000 - } - else { - no warnings 'deprecated'; -- eval "use $module $version ()"; +- eval "{ local \$ENV{__WARN__}; use $module $version () }"; - if ( my $error = $@ ) { - return 0 unless wantarray; - @@ -13357,6 +14366,10 @@ index 63a0956..0000000 - $error =~ s/at \(eval \d+\) line \d+\.$//; - undef $error if $error =~ /this is only/; - +- my $path = $module; +- $path =~ s{::}{/}g; +- undef $error if defined $error and $error =~ /^Can't locate $path\.pm in \@INC/; +- - return ( 0, $error ); - } - @@ -13438,66 +14451,25 @@ index 63a0956..0000000 - return scalar `$ext 1>&2`; -} - --sub download_mods { -- my %modules; -- use CPAN; -- -- foreach my $key (keys %deps) { -- my @deps = (@{$deps{$key}}); -- while (@deps) { -- my $mod = shift @deps; -- my $ver = shift @deps; -- next if ($mod =~ /^(DBD-|Apache-Request)/); -- $modules{$mod} = $ver; -- } -- } -- my @mods = keys %modules; -- CPAN::get(); -- my $moddir = $args{'download'}; -- foreach my $mod (@mods) { -- $CPAN::Config->{'build_dir'} = $moddir; -- CPAN::get($mod); -- } -- -- opendir(DIR, $moddir); -- while ( my $dir = readdir(DIR)) { -- print "Dir is $dir\n"; -- next if ( $dir =~ /^\.\.?$/); -- -- # Skip things we've previously tagged -- my $out = `svn ls $args{'repository'}/tags/$dir`; -- next if ($out); -- -- if ($dir =~ /^(.*)-(.*?)$/) { -- `svn_load_dirs -no_user_input -t tags/$dir -v $args{'repository'} dists/$1 $moddir/$dir`; -- `rm -rf $moddir/$dir`; -- -- } -- -- } -- closedir(DIR); -- exit; --} -- -sub check_perl_version { - section("perl"); -- eval {require 5.008003}; +- eval {require 5.010_001}; - if ($@) { -- print_found("5.8.3", 0,"RT is known to be non-functional on versions of perl older than 5.8.3. Please upgrade to 5.8.3 or newer."); +- print_found("5.10.1", 0, sprintf("RT requires Perl v5.10.1 or newer. Your current Perl is v%vd", $^V)); - exit(1); - } else { -- print_found( sprintf(">=5.8.3(%vd)", $^V), 1 ); +- print_found( sprintf(">=5.10.1(%vd)", $^V), 1 ); - } -} - -sub check_users { - section("users"); -- print_found("rt group (www-data)", defined getgrnam("www-data")); +- print_found("rt group (www)", defined getgrnam("www")); - print_found("bin owner (root)", defined getpwnam("root")); - print_found("libs owner (root)", defined getpwnam("root")); - print_found("libs group (bin)", defined getgrnam("bin")); -- print_found("web owner (www-data)", defined getpwnam("www-data")); -- print_found("web group (www-data)", defined getgrnam("www-data")); +- print_found("web owner (www)", defined getpwnam("www")); +- print_found("web group (www)", defined getgrnam("www")); -} - -1; @@ -13544,35 +14516,35 @@ index 63a0956..0000000 - -=item --with-mysql - -- database interface for mysql +-database interface for mysql - --=item --with-postgresql +-=item --with-pg - -- database interface for postgresql +-database interface for postgresql - --=item with-oracle -- -- database interface for oracle +-=item --with-oracle - --=item with-sqlite +-database interface for oracle - -- database interface and driver for sqlite (unsupported) +-=item --with-sqlite - --=item with-fastcgi +-database interface and driver for sqlite (unsupported) - -- libraries needed to support the fastcgi handler +-=item --with-fastcgi - --=item with-modperl1 +-libraries needed to support the fastcgi handler - -- libraries needed to support the modperl 1 handler +-=item --with-modperl1 - --=item with-modperl2 +-libraries needed to support the modperl 1 handler - -- libraries needed to support the modperl 2 handler +-=item --with-modperl2 - --=item with-dev +-libraries needed to support the modperl 2 handler - -- tools needed for RT development +-=item --with-developer +- +-tools needed for RT development - -=back - @@ -13580,10 +14552,10 @@ index 63a0956..0000000 - diff --git a/sbin/rt-validate-aliases b/sbin/rt-validate-aliases deleted file mode 100755 -index e4be013..0000000 +index 4af6188..0000000 --- a/sbin/rt-validate-aliases +++ /dev/null -@@ -1,343 +0,0 @@ +@@ -1,373 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -13650,6 +14622,7 @@ index e4be013..0000000 - } - unshift @INC, $lib; - } +- -} - -require RT; @@ -13758,7 +14731,7 @@ index e4be013..0000000 - - if (not $value) { - my @other = grep {$_ ne $global{$setting}} @{$seen{lc $q->Name}{$action} || []}; -- warn "CorrespondAddress not set on $qname, but in aliases as " +- warn "$setting not set on $qname, but in aliases as " - .join(" and ", @other) . "\n" if @other; - next; - } @@ -13927,12 +14900,41 @@ index e4be013..0000000 - return (); - } -} +- +-__END__ +- +-=head1 NAME +- +-rt-validate-aliases - Check an MTA alias file against RT queue configuration +- +-=head1 SYNOPSIS +- +-rt-validate-aliases [options] /etc/aliases +- +-=head1 OPTIONS +- +-=over +- +-=item C<--prefix> +- +-An expected address prefix used in the alias file +- +-=item C<--url> +- +-The root URL of your RT server (the same URL you expect to be passed to +-rt-mailgate) +- +-=item C<--host> +- +-The host part of your RT email addresses +- +-=back diff --git a/sbin/rt-validator b/sbin/rt-validator deleted file mode 100755 -index 84208a2..0000000 +index 1210d88..0000000 --- a/sbin/rt-validator +++ /dev/null -@@ -1,1182 +0,0 @@ +@@ -1,1464 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -13985,23 +14987,15 @@ index 84208a2..0000000 -use warnings; - -# fix lib paths, some may be relative --BEGIN { +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -14018,22 +15012,22 @@ index 84208a2..0000000 - 'force', - 'verbose|v', - 'help|h', +- 'links-only', -); - -if ( $opt{help} || !$opt{check} ) { - require Pod::Usage; - print Pod::Usage::pod2usage( { verbose => 2 } ); -- exit; +- exit 2; -} - -usage_warning() if $opt{'resolve'} && !$opt{'force'}; - -- -sub usage_warning { - print <<END; -This utility can fix some issues with DB by creating or updating. In some --cases there is no enough data to resurect a missing record, but records which --refers to a missing can be deleted. It's up to you to decide what to do. +-cases there is not enough data to resurect a missing record, but records which +-refer to a missing record can be deleted. It's up to you to decide what to do. - -In any case it's highly recommended to have a backup before resolving anything. - @@ -14058,6 +15052,7 @@ index 84208a2..0000000 - -my @models = qw( - ACE +- Article - Attachment - Attribute - CachedGroupMember @@ -14073,6 +15068,7 @@ index 84208a2..0000000 - ScripAction - ScripCondition - Scrip +- ObjectScrip - Template - Ticket - Transaction @@ -14095,6 +15091,7 @@ index 84208a2..0000000 - Queues => [], - - Scrips => [], +- ObjectScrips => [], - ScripActions => [], - ScripConditions => [], - Templates => [], @@ -14151,7 +15148,7 @@ index 84208a2..0000000 - ." The script can either create the missing record in Principals" - ." or delete the record in $table."; - my ($type) = ($table =~ /^(.*)s$/); -- check_integrity( +- return check_integrity( - $table, 'id' => 'Principals', 'id', - join_condition => 't.PrincipalType = ?', - bind_values => [ $type ], @@ -14179,7 +15176,7 @@ index 84208a2..0000000 - ." In some cases it's possible to manually resurrect such records," - ." but this utility can only delete records."; - -- check_integrity( +- return check_integrity( - 'Principals', 'id' => $table, 'id', - condition => 's.PrincipalType = ?', - bind_values => [ $table =~ /^(.*)s$/ ], @@ -14194,8 +15191,9 @@ index 84208a2..0000000 -} - -push @CHECKS, 'User <-> ACL equivalence group' => sub { +- my $res = 1; - # from user to group -- check_integrity( +- $res *= check_integrity( - 'Users', 'id' => 'Groups', 'Instance', - join_condition => 't.Domain = ? AND t.Type = ?', - bind_values => [ 'ACLEquivalence', 'UserEquiv' ], @@ -14211,7 +15209,7 @@ index 84208a2..0000000 - }, - ); - # from group to user -- check_integrity( +- $res *= check_integrity( - 'Groups', 'Instance' => 'Users', 'id', - condition => 's.Domain = ? AND s.Type = ?', - bind_values => [ 'ACLEquivalence', 'UserEquiv' ], @@ -14225,25 +15223,27 @@ index 84208a2..0000000 - }, - ); - # one ACL equiv group for each user -- check_uniqueness( +- $res *= check_uniqueness( - 'Groups', - columns => ['Instance'], - condition => '.Domain = ? AND .Type = ?', - bind_values => [ 'ACLEquivalence', 'UserEquiv' ], - ); +- return $res; -}; - -# check integrity of Queue role groups -push @CHECKS, 'Queues <-> Role Groups' => sub { - # XXX: we check only that there is at least one group for a queue - # from queue to group -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - 'Queues', 'id' => 'Groups', 'Instance', - join_condition => 't.Domain = ?', - bind_values => [ 'RT::Queue-Role' ], - ); - # from group to queue -- check_integrity( +- $res *= check_integrity( - 'Groups', 'Instance' => 'Queues', 'id', - condition => 's.Domain = ?', - bind_values => [ 'RT::Queue-Role' ], @@ -14256,19 +15256,21 @@ index 84208a2..0000000 - delete_record( 'Groups', $id ); - }, - ); +- return $res; -}; - -# check integrity of Ticket role groups -push @CHECKS, 'Tickets <-> Role Groups' => sub { - # XXX: we check only that there is at least one group for a queue - # from queue to group -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - 'Tickets', 'id' => 'Groups', 'Instance', - join_condition => 't.Domain = ?', - bind_values => [ 'RT::Ticket-Role' ], - ); - # from group to ticket -- check_integrity( +- $res *= check_integrity( - 'Groups', 'Instance' => 'Tickets', 'id', - condition => 's.Domain = ?', - bind_values => [ 'RT::Ticket-Role' ], @@ -14281,12 +15283,13 @@ index 84208a2..0000000 - delete_record( 'Groups', $id ); - }, - ); +- return $res; -}; - -# additional CHECKS on groups -push @CHECKS, 'Role Groups (Instance, Type) uniqueness' => sub { - # Check that Domain, Instance and Type are unique -- check_uniqueness( +- return check_uniqueness( - 'Groups', - columns => ['Domain', 'Instance', 'Type'], - condition => '.Domain LIKE ?', @@ -14295,7 +15298,7 @@ index 84208a2..0000000 -}; - -push @CHECKS, 'System internal group uniqueness' => sub { -- check_uniqueness( +- return check_uniqueness( - 'Groups', - columns => ['Instance', 'Type'], - condition => '.Domain = ?', @@ -14305,7 +15308,7 @@ index 84208a2..0000000 - -# CHECK that user defined group names are unique -push @CHECKS, 'User Defined Group Name uniqueness' => sub { -- check_uniqueness( +- return check_uniqueness( - 'Groups', - columns => ['Name'], - condition => '.Domain = ?', @@ -14329,7 +15332,8 @@ index 84208a2..0000000 - my $msg = "A record in GroupMembers references an object that doesn't exist." - ." Maybe you deleted a group or principal directly from the database?" - ." Usually it's OK to delete such records."; -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - 'GroupMembers', 'GroupId' => 'Groups', 'id', - action => sub { - my $id = shift; @@ -14338,7 +15342,7 @@ index 84208a2..0000000 - delete_record( 'GroupMembers', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - 'GroupMembers', 'MemberId' => 'Principals', 'id', - action => sub { - my $id = shift; @@ -14347,12 +15351,14 @@ index 84208a2..0000000 - delete_record( 'GroupMembers', $id ); - }, - ); +- return $res; -}; - -# CGM and GM -push @CHECKS, 'CGM vs. GM' => sub { +- my $res = 1; - # all GM record should be duplicated in CGM -- check_integrity( +- $res *= check_integrity( - GroupMembers => ['GroupId', 'MemberId'], - CachedGroupMembers => ['GroupId', 'MemberId'], - join_condition => 't.ImmediateParentId = t.GroupId AND t.Via = t.id', @@ -14375,7 +15381,7 @@ index 84208a2..0000000 - }, - ); - # all first level CGM records should have a GM record -- check_integrity( +- $res *= check_integrity( - CachedGroupMembers => ['GroupId', 'MemberId'], - GroupMembers => ['GroupId', 'MemberId'], - condition => 's.ImmediateParentId = s.GroupId AND s.Via = s.id AND s.GroupId != s.MemberId', @@ -14391,7 +15397,7 @@ index 84208a2..0000000 - }, - ); - # each group should have a CGM record where MemberId == GroupId -- check_integrity( +- $res *= check_integrity( - Groups => ['id', 'id'], - CachedGroupMembers => ['GroupId', 'MemberId'], - join_condition => 't.ImmediateParentId = t.GroupId AND t.Via = t.id', @@ -14418,7 +15424,7 @@ index 84208a2..0000000 - - # and back, each record in CGM with MemberId == GroupId without exceptions - # should reference a group -- check_integrity( +- $res *= check_integrity( - CachedGroupMembers => ['GroupId', 'MemberId'], - Groups => ['id', 'id'], - condition => "s.GroupId = s.MemberId", @@ -14433,7 +15439,7 @@ index 84208a2..0000000 - }, - ); - # Via -- check_integrity( +- $res *= check_integrity( - CachedGroupMembers => 'Via', - CachedGroupMembers => 'id', - action => sub { @@ -14449,7 +15455,7 @@ index 84208a2..0000000 - - # for every CGM where ImmediateParentId != GroupId there should be - # matching parent record (first level) -- check_integrity( +- $res *= check_integrity( - CachedGroupMembers => ['ImmediateParentId', 'MemberId'], - CachedGroupMembers => ['GroupId', 'MemberId'], - join_condition => 't.Via = t.id', @@ -14467,7 +15473,7 @@ index 84208a2..0000000 - - # for every CGM where ImmediateParentId != GroupId there should be - # matching "grand" parent record -- check_integrity( +- $res *= check_integrity( - CachedGroupMembers => ['GroupId', 'ImmediateParentId', 'Via'], - CachedGroupMembers => ['GroupId', 'MemberId', 'id'], - condition => 's.ImmediateParentId != s.GroupId', @@ -14513,6 +15519,7 @@ index 84208a2..0000000 - - my $sth = execute_query( $query ); - while ( my ($g, $m, $via, $ip, $dis) = $sth->fetchrow_array ) { +- $res = 0; - print STDERR "Principal #$m is member of #$ip when #$ip is member of #$g,"; - print STDERR " but there is no cached GM record that $m is member of #$g.\n"; - $action->( @@ -14521,11 +15528,14 @@ index 84208a2..0000000 - ); - } - } +- +- return $res; -}; - -# Tickets -push @CHECKS, 'Tickets -> other' => sub { -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - 'Tickets', 'EffectiveId' => 'Tickets', 'id', - action => sub { - my $id = shift; @@ -14537,19 +15547,34 @@ index 84208a2..0000000 - delete_record( 'Tickets', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - 'Tickets', 'Queue' => 'Queues', 'id', - ); -- check_integrity( +- $res *= check_integrity( - 'Tickets', 'Owner' => 'Users', 'id', +- action => sub { +- my ($id, %prop) = @_; +- return unless my $replace_with = prompt_integer( +- 'Replace', +- "Column Owner should point to a user, but there is record #$id in Tickets\n" +- ."where it's not true. It's ok to replace these wrong references with id of any user.\n" +- ."Note that id you enter is not checked. You can pick any user from your DB, but it's\n" +- ."may be better to create a special user for this, for example 'user_that_has_been_deleted'\n" +- ."or something like that.", +- "Tickets.Owner -> user #$prop{Owner}" +- ); +- update_records( 'Tickets', { id => $id, Owner => $prop{Owner} }, { Owner => $replace_with } ); +- }, - ); - # XXX: check that owner is only member of owner role group +- return $res; -}; - - -push @CHECKS, 'Transactions -> other' => sub { +- my $res = 1; - foreach my $model ( @models ) { -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'ObjectId' => m2t($model), 'id', - condition => 's.ObjectType = ?', - bind_values => [ "RT::$model" ], @@ -14564,13 +15589,13 @@ index 84208a2..0000000 - ); - } - # type = CustomField -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'Field' => 'CustomFields', 'id', - condition => 's.Type = ?', - bind_values => [ 'CustomField' ], - ); - # type = Take, Untake, Force, Steal or Give -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'OldValue' => 'Users', 'id', - condition => 's.Type IN (?, ?, ?, ?, ?)', - bind_values => [ qw(Take Untake Force Steal Give) ], @@ -14584,7 +15609,7 @@ index 84208a2..0000000 - delete_record( 'Transactions', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'NewValue' => 'Users', 'id', - condition => 's.Type IN (?, ?, ?, ?, ?)', - bind_values => [ qw(Take Untake Force Steal Give) ], @@ -14599,7 +15624,7 @@ index 84208a2..0000000 - }, - ); - # type = DelWatcher -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'OldValue' => 'Principals', 'id', - condition => 's.Type = ?', - bind_values => [ 'DelWatcher' ], @@ -14614,7 +15639,7 @@ index 84208a2..0000000 - }, - ); - # type = AddWatcher -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'NewValue' => 'Principals', 'id', - condition => 's.Type = ?', - bind_values => [ 'AddWatcher' ], @@ -14629,22 +15654,11 @@ index 84208a2..0000000 - }, - ); - --# XXX: Links need more love, uri is stored instead of id --# # type = DeleteLink --# check_integrity( --# 'Transactions', 'OldValue' => 'Links', 'id', --# condition => 's.Type = ?', --# bind_values => [ 'DeleteLink' ], --# ); --# # type = AddLink --# check_integrity( --# 'Transactions', 'NewValue' => 'Links', 'id', --# condition => 's.Type = ?', --# bind_values => [ 'AddLink' ], --# ); +-# type = DeleteLink or AddLink +-# handled in 'Links: *' checks as {New,Old}Value store URIs - - # type = Set, Field = Queue -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'NewValue' => 'Queues', 'id', - condition => 's.Type = ? AND s.Field = ?', - bind_values => [ 'Set', 'Queue' ], @@ -14658,7 +15672,7 @@ index 84208a2..0000000 - delete_record( 'Transactions', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'OldValue' => 'Queues', 'id', - condition => 's.Type = ? AND s.Field = ?', - bind_values => [ 'Set', 'Queue' ], @@ -14673,17 +15687,19 @@ index 84208a2..0000000 - }, - ); - # Reminders -- check_integrity( +- $res *= check_integrity( - 'Transactions', 'NewValue' => 'Tickets', 'id', - join_condition => 't.Type = ?', - condition => 's.Type IN (?, ?, ?)', - bind_values => [ 'reminder', 'AddReminder', 'OpenReminder', 'ResolveReminder' ], - ); +- return $res; -}; - -# Attachments -push @CHECKS, 'Attachments -> other' => sub { -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - Attachments => 'TransactionId', Transactions => 'id', - action => sub { - my $id = shift; @@ -14693,7 +15709,7 @@ index 84208a2..0000000 - delete_record( 'Attachments', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - Attachments => 'Parent', Attachments => 'id', - action => sub { - my $id = shift; @@ -14703,64 +15719,75 @@ index 84208a2..0000000 - delete_record( 'Attachments', $id ); - }, - ); -- check_integrity( +- $res *= check_integrity( - Attachments => 'Parent', - Attachments => 'id', - join_condition => 's.TransactionId = t.TransactionId', - ); +- return $res; -}; - -push @CHECKS, 'CustomFields and friends' => sub { +- my $res = 1; - #XXX: ObjectCustomFields needs more love -- check_integrity( +- $res *= check_integrity( - 'CustomFieldValues', 'CustomField' => 'CustomFields', 'id', - ); -- check_integrity( +- $res *= check_integrity( - 'ObjectCustomFieldValues', 'CustomField' => 'CustomFields', 'id', - ); - foreach my $model ( @models ) { -- check_integrity( +- $res *= check_integrity( - 'ObjectCustomFieldValues', 'ObjectId' => m2t($model), 'id', - condition => 's.ObjectType = ?', - bind_values => [ "RT::$model" ], - ); - } +- return $res; -}; - -push @CHECKS, Templates => sub { -- check_integrity( +- return check_integrity( - 'Templates', 'Queue' => 'Queues', 'id', - ); -}; - -push @CHECKS, Scrips => sub { -- check_integrity( -- 'Scrips', 'Queue' => 'Queues', 'id', -- ); -- check_integrity( +- my $res = 1; +- $res *= check_integrity( - 'Scrips', 'ScripCondition' => 'ScripConditions', 'id', - ); -- check_integrity( +- $res *= check_integrity( - 'Scrips', 'ScripAction' => 'ScripActions', 'id', - ); -- check_integrity( -- 'Scrips', 'Template' => 'Templates', 'id', +- $res *= check_integrity( +- 'Scrips', 'Template' => 'Templates', 'Name', - ); +- $res *= check_integrity( +- 'ObjectScrips', 'Scrip' => 'Scrips', 'id', +- ); +- $res *= check_integrity( +- 'ObjectScrips', 'ObjectId' => 'Queues', 'id', +- ); +- return $res; -}; - -push @CHECKS, Attributes => sub { +- my $res = 1; - foreach my $model ( @models ) { -- check_integrity( +- $res *= check_integrity( - 'Attributes', 'ObjectId' => m2t($model), 'id', - condition => 's.ObjectType = ?', - bind_values => [ "RT::$model" ], - ); - } +- return $res; -}; - -# Fix situations when Creator or LastUpdatedBy references ACL equivalence -# group of a user instead of user -push @CHECKS, 'FIX: LastUpdatedBy and Creator' => sub { +- my $res = 1; - my %fix = (); - foreach my $model ( @models ) { - my $class = "RT::$model"; @@ -14790,6 +15817,7 @@ index 84208a2..0000000 - - my $sth = execute_query( $query, 'ACLEquivalence', 'UserEquiv' ); - while ( my ($rid, $gid, $uid) = $sth->fetchrow_array ) { +- $res = 0; - print STDERR "Record #$rid in $table refers to ACL equivalence group #$gid of user #$uid"; - print STDERR " when must reference user.\n"; - $action->( $gid, $uid ); @@ -14812,16 +15840,18 @@ index 84208a2..0000000 - } - $redo_check{'FIX: LastUpdatedBy and Creator'} = 1; - } +- return $res; -}; - -push @CHECKS, 'LastUpdatedBy and Creator' => sub { +- my $res = 1; - foreach my $model ( @models ) { - my $class = "RT::$model"; - my $object = $class->new( RT->SystemUser ); - my $table = $object->Table; - foreach my $column ( qw(LastUpdatedBy Creator) ) { - next unless $object->_Accessible( $column, 'auto' ); -- check_integrity( +- $res *= check_integrity( - $table, $column => 'Users', 'id', - action => sub { - my ($id, %prop) = @_; @@ -14839,13 +15869,209 @@ index 84208a2..0000000 - ); - } - } +- return $res; +-}; +- +-push @CHECKS, 'Links: wrong organization' => sub { +- my $res = 1; +- my @URI_USES = ( +- { model => 'Transaction', column => 'OldValue', Additional => { Type => 'DeleteLink' } }, +- { model => 'Transaction', column => 'NewValue', Additional => { Type => 'AddLink' } }, +- { model => 'Link', column => 'Target' }, +- { model => 'Link', column => 'Base' }, +- ); +- +- my @rt_uris = rt_uri_modules(); +- foreach my $package (@rt_uris) { +- +- my $rt_uri = $package->new( $RT::SystemUser ); +- my $scheme = $rt_uri->Scheme; +- my $prefix = $rt_uri->LocalURIPrefix; +- +- foreach my $use ( @URI_USES ) { +- my $table = m2t( $use->{'model'} ); +- my $column = $use->{'column'}; +- +- my $query = "SELECT id, $column FROM $table WHERE" +- . " $column LIKE ? AND $column NOT LIKE ?"; +- my @binds = ($scheme ."://%", $prefix ."%"); +- +- while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) { +- $query .= " AND $k = ?"; +- push @binds, $v; +- } +- my $sth = execute_query( $query, @binds ); +- while ( my ($id, $value) = $sth->fetchrow_array ) { +- $res = 0; +- print STDERR "Record #$id in $table. Value of $column column most probably is an incorrect link\n"; +- my ($wrong_org) = ( $value =~ m{^\Q$scheme\E://(.+)/[^/]+/[0-9]*$} ); +- next unless my $replace_with = prompt( +- 'Replace', +- "Column $column in $table is a link. Local links has scheme '$scheme'" +- ." followed by organization name from the config file. There is record" +- ." #$id that has scheme '$scheme', but organization is '$wrong_org'." +- ." Most probably you changed organization, but didn't update links." +- ." It's ok to replace these wrong links.\n", +- "Links: wrong organization $wrong_org" +- ); +- +- print "Updating record(s) in $table\n" if $opt{'verbose'}; +- my $wrong_prefix = $scheme . '://'. $wrong_org; +- my $query = "UPDATE $table SET $column = ". sql_concat('?', "SUBSTR($column, ?)") +- ." WHERE $column LIKE ?"; +- execute_query( $query, $prefix, length($wrong_prefix)+1, $wrong_prefix .'/%' ); +- +- $redo_check{'Links: wrong organization'} = 1; +- $redo_check{'Links: LocalX for non-ticket'} = 1; +- last; # plenty of chances we covered all cases with one update +- } +- } +- } # end foreach my $package (@rt_uris) +- return $res; +-}; +- +-push @CHECKS, 'Links: LocalX for non-ticket' => sub { +- my $res = 1; +- my $rt_uri = RT::URI::fsck_com_rt->new( $RT::SystemUser ); +- my $scheme = $rt_uri->Scheme; +- my $prefix = $rt_uri->LocalURIPrefix; +- my $table = m2t('Link'); +- +- foreach my $dir ( 'Target', 'Base' ) { +- # we look only at links with correct organization, previouse check deals +- # with incorrect orgs +- my $where = "Local$dir > 0 AND $dir LIKE ? AND $dir NOT LIKE ?"; +- my @binds = ($prefix ."/%", $prefix ."/ticket/%"); +- +- my $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds ); +- while ( my ($id, $value) = $sth->fetchrow_array ) { +- $res = 0; +- print STDERR "Record #$id in $table. Value of Local$dir is not 0\n"; +- next unless my $replace_with = prompt( +- 'Replace', +- "Column Local$dir in $table should be 0 if $dir column is not link" +- ." to a ticket. It's ok to replace with 0.\n", +- ); +- +- print "Updating record(s) in $table\n" if $opt{'verbose'}; +- execute_query( "UPDATE $table SET Local$dir = 0 WHERE $where", @binds ); +- $redo_check{'Links: wrong organization'} = 1; +- +- last; # we covered all cases with one update +- } +- } +- return $res; +-}; +- +-push @CHECKS, 'Links: LocalX != X' => sub { +- my $res = 1; +- my $rt_uri = RT::URI::fsck_com_rt->new( $RT::SystemUser ); +- my $scheme = $rt_uri->Scheme; +- my $prefix = $rt_uri->LocalURIPrefix .'/ticket/'; +- my $table = m2t('Link'); +- +- foreach my $dir ( 'Target', 'Base' ) { +- # we limit to $dir = */ticket/* so it doesn't conflict with previouse check +- # previouse check is more important as there was a bug in RT when Local$dir +- # was set for not tickets +- # XXX: we have issue with MergedInto links - "LocalX !~ X" +- my $where = "Local$dir > 0 AND $dir LIKE ? AND $dir != ". sql_concat('?', "Local$dir") +- ." AND Type != ?"; +- my @binds = ($prefix ."%", $prefix, 'MergedInto'); +- +- my $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds ); +- while ( my ($id, $value) = $sth->fetchrow_array ) { +- $res = 0; +- print STDERR "Record #$id in $table. Value of $dir doesn't match ticket id in Local$dir\n"; +- next unless my $replace_with = prompt( +- 'Replace', +- "For ticket links column $dir in $table table should end with" +- ." ticket id from Local$dir. It's probably ok to fix $dir column.\n", +- ); +- +- print "Updating record(s) in $table\n" if $opt{'verbose'}; +- execute_query( +- "UPDATE $table SET $dir = ". sql_concat('?', "Local$dir") ." WHERE $where", +- $prefix, @binds +- ); +- +- last; # we covered all cases with one update +- } +- } +- return $res; +-}; +- +-push @CHECKS, 'Links: missing object' => sub { +- my $res = 1; +- my @URI_USES = ( +- { model => 'Transaction', column => 'OldValue', Additional => { Type => 'DeleteLink' } }, +- { model => 'Transaction', column => 'NewValue', Additional => { Type => 'AddLink' } }, +- { model => 'Link', column => 'Target' }, +- { model => 'Link', column => 'Base' }, +- ); +- +- my @rt_uris = rt_uri_modules(); +- foreach my $package (@rt_uris) { +- +- my $rt_uri = $package->new( $RT::SystemUser ); +- my $scheme = $rt_uri->Scheme; +- my $prefix = $rt_uri->LocalURIPrefix; +- +- foreach my $use ( @URI_USES ) { +- my $stable = m2t( $use->{'model'} ); +- my $scolumn = $use->{'column'}; +- +- foreach my $tmodel ( @models ) { +- my $tclass = 'RT::'. $tmodel; +- my $ttable = m2t($tmodel); +- +- my $tprefix = $prefix .'/'. ($tclass eq 'RT::Ticket'? 'ticket' : $tclass) .'/'; +- +- $tprefix = $prefix . '/article/' if $tclass eq 'RT::Article'; +- +- my $query = "SELECT s.id FROM $stable s LEFT JOIN $ttable t " +- ." ON t.id = ". sql_str2int("SUBSTR(s.$scolumn, ?)") +- ." WHERE s.$scolumn LIKE ? AND t.id IS NULL"; +- my @binds = (length($tprefix) + 1, $tprefix.'%'); +- +- while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) { +- $query .= " AND s.$k = ?"; +- push @binds, $v; +- } +- +- my $sth = execute_query( $query, @binds ); +- while ( my ($sid) = $sth->fetchrow_array ) { +- $res = 0; +- print STDERR "Link in $scolumn column in record #$sid in $stable table points" +- ." to not existing object.\n"; +- next unless prompt( +- 'Delete', +- "Column $scolumn in $stable table is a link to an object that doesn't exist." +- ." You can delete such records, however make sure there is no other" +- ." errors with links.\n", +- 'Link to a missing object in $ttable' +- ); +- +- delete_record($stable, $sid); +- } +- } +- } +- } # end foreach my $package (@rt_uris) +- return $res; -}; +- +- -my %CHECKS = @CHECKS; - -@do_check = do { my $i = 1; grep $i++%2, @CHECKS }; - +-if ($opt{'links-only'}) { +- @do_check = grep { /^Links:/ } @do_check; +-} +- +-my $status = 1; -while ( my $check = shift @do_check ) { -- $CHECKS{ $check }->(); +- $status *= $CHECKS{ $check }->(); - - foreach my $redo ( keys %redo_check ) { - die "check $redo doesn't exist" unless $CHECKS{ $redo }; @@ -14854,6 +16080,19 @@ index 84208a2..0000000 - push @do_check, $redo; - } -} +-exit 1 unless $status; +-exit 0; +- +-=head2 check_integrity +- +-Takes two (table name, column(s)) pairs. First pair +-is reference we check and second is destination that +-must exist. Array reference can be used for multiple +-columns. +- +-Returns 0 if a record is missing or 1 otherwise. +- +-=cut - -sub check_integrity { - my ($stable, @scols) = (shift, shift); @@ -14889,15 +16128,21 @@ index 84208a2..0000000 - push @binds, 0; - } - +- my $res = 1; +- - my $sth = execute_query( $query, @binds ); - while ( my ($sid, @set) = $sth->fetchrow_array ) { +- $res = 0; +- - print STDERR "Record #$sid in $stable references a nonexistent record in $ttable\n"; - for ( my $i = 0; $i < @scols; $i++ ) { - print STDERR "\t$scols[$i] => '$set[$i]' => $tcols[$i]\n"; - } - print STDERR "\t". describe( $stable, $sid ) ."\n"; -- $args{'action'}->( $sid, map { $scols[$_] => $set[$_] } (0 .. (@scols-1)) ) if $args{'action'}; +- $args{'action'}->( $sid, map { $scols[$_] => $set[$_] } (0 .. (@scols-1)) ) +- if $args{'action'}; - } +- return $res; -} - -sub describe { @@ -14957,13 +16202,16 @@ index 84208a2..0000000 - $args{'bind_values'}? (@{ $args{'bind_values'} }, @{ $args{'bind_values'} }): (), - $args{'extra_values'}? (@{ $args{'extra_values'} }): () - ); +- my $res = 1; - while ( my ($sid, $tid, @set) = $sth->fetchrow_array ) { +- $res = 0; - print STDERR "Record #$tid in $on has the same set of values as $sid\n"; - for ( my $i = 0; $i < @columns; $i++ ) { - print STDERR "\t$columns[$i] => '$set[$i]'\n"; - } - $args{'action'}->( $tid, map { $columns[$_] => $set[$_] } (0 .. (@columns-1)) ) if $args{'action'}; - } +- return $res; -} - -sub load_record { @@ -15014,6 +16262,24 @@ index 84208a2..0000000 - return $sth; -} - +-sub sql_concat { +- return $_[0] if @_ <= 1; +- +- my $db_type = RT->Config->Get('DatabaseType'); +- if ( $db_type eq 'Pg' || $db_type eq 'SQLite' ) { +- return '('. join( ' || ', @_ ) .')'; +- } +- return sql_concat('CONCAT('. join( ', ', splice @_, 0, 2 ).')', @_); +-} +- +-sub sql_str2int { +- my $db_type = RT->Config->Get('DatabaseType'); +- if ( $db_type eq 'Pg' ) { +- return "($_[0])::integer"; +- } +- return $_[0]; +-} +- -{ my %cached_answer; -sub prompt { - my $action = shift; @@ -15070,6 +16336,20 @@ index 84208a2..0000000 - return $cached_answer{ $token } = $a; -} } - +-# Find all RT::URI modules RT has loaded +- +-sub rt_uri_modules { +- my @uris = grep /^RT\/URI\/.+\.pm$/, keys %INC; +- my @uri_modules; +- foreach my $uri_path (@uris){ +- next if $uri_path =~ /base\.pm$/; # Skip base RT::URI object +- $uri_path = substr $uri_path, 0, -3; # chop off .pm +- push @uri_modules, join '::', split '/', $uri_path; +- } +- +- return @uri_modules; +-} +- -1; - -__END__ @@ -15113,14 +16393,18 @@ index 84208a2..0000000 - - resolve without asking questions - +-=item links-only +- +- only run the Link validation routines, useful if you changed your Organization +- -=back - diff --git a/sbin/standalone_httpd b/sbin/standalone_httpd deleted file mode 100755 -index add9d01..0000000 +index cd22bb2..0000000 --- a/sbin/standalone_httpd +++ /dev/null -@@ -1,285 +0,0 @@ +@@ -1,181 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -15172,30 +16456,24 @@ index add9d01..0000000 -use warnings; -use strict; - --# fix lib paths, some may be relative -BEGIN { - die <<EOT if ${^TAINT}; -RT does not run under Perl's "taint mode". Remove -T from the command -line, or remove the PerlTaintCheck parameter from your mod_perl -configuration. -EOT +-} - +-# fix lib paths, some may be relative +-BEGIN { # BEGIN RT CMD BOILERPLATE - require File::Spec; +- require Cwd; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { -- unless ($bin_path) { -- if ( File::Spec->file_name_is_absolute(__FILE__) ) { -- $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; -- } -- else { -- require FindBin; -- no warnings "once"; -- $bin_path = $FindBin::Bin; -- } -- } +- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1]; - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; @@ -15213,17 +16491,19 @@ index add9d01..0000000 -} - -require RT; +-die "Wrong version of RT $RT::VERSION found; need 4.2.*" +- unless $RT::VERSION =~ /^4\.2\./; +- -RT->LoadConfig(); -RT->InitPluginPaths(); -RT->InitLogging(); --require Module::Refresh if RT->Config->Get('DevelMode'); - -require RT::Handle; -my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity; - -unless ( $integrity ) { - print STDERR <<EOF; -- +- -RT couldn't connect to the database where tickets are stored. -If this is a new installation of RT, you should visit the URL below -to configure RT and initialize your database. @@ -15266,127 +16546,27 @@ index add9d01..0000000 - undef $RT::Handle; -} - --require RT::Interface::Web::Handler; --my $app = RT::Interface::Web::Handler->PSGIApp; -- --if ($ENV{RT_TESTING}) { -- my $screen_logger = $RT::Logger->remove('screen'); -- require Log::Dispatch::Perl; -- $RT::Logger->add( -- Log::Dispatch::Perl->new( -- name => 'rttest', -- min_level => $screen_logger->min_level, -- action => { -- error => 'warn', -- critical => 'warn' -- } -- ) -- ); -- require Plack::Middleware::Test::StashWarnings; -- $app = Plack::Middleware::Test::StashWarnings->wrap($app); --} -- +-require RT::PlackRunner; -# when used as a psgi file -if (caller) { -- return $app; --} -- -- --# load appropriate server -- --require Plack::Runner; -- --my $is_fastcgi = $0 =~ m/fcgi$/; --my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) : -- $is_fastcgi ? ( server => 'FCGI' ) -- : (), -- env => 'deployment' ); -- --# figure out the port --my $port; -- --# handle "rt-server 8888" for back-compat, but complain about it --if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) { -- warn "Deprecated: please run $0 --port $ARGV[0] instead\n"; -- unshift @ARGV, '--port'; +- return RT::PlackRunner->app; -} - --my @args = @ARGV; - --use List::MoreUtils 'last_index'; --my $last_index = last_index { $_ eq '--port' } @args; +-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) : +- $0 =~ /standalone/ ? ( server => 'Standalone' ) : +- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" ) +- : ( server => 'Starlet', env => "deployment" ) ); +-$r->parse_options(@ARGV); - --my $explicit_port; -- --if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) { -- $explicit_port = $args[$last_index+1]; -- $port = $explicit_port; -- -- # inform the rest of the system what port we manually chose -- my $old_app = $app; -- $app = sub { -- my $env = shift; -- -- $env->{'rt.explicit_port'} = $port; -- -- $old_app->($env, @_); -- }; --} --else { -- # default to the configured WebPort and inform Plack::Runner -- $port = RT->Config->Get('WebPort') || '8080'; -- push @args, '--port', $port; --} -- --push @args, '--server', 'Standalone' if RT->InstallMode; --push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args; -- --$r->parse_options(@args); -- --delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything -- --unless ($r->{env} eq 'development') { -- push @{$r->{options}}, server_ready => sub { -- my($args) = @_; -- my $name = $args->{server_software} || ref($args); # $args is $server -- my $host = $args->{host} || 0; -- my $proto = $args->{proto} || 'http'; -- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n"; -- }; --} --eval { $r->run($app) }; --if (my $err = $@) { -- handle_startup_error($err); --} -- --exit 0; -- --sub handle_startup_error { -- my $err = shift; -- if ( $err =~ /listen/ ) { -- handle_bind_error(); -- } else { -- die -- "Something went wrong while trying to run RT's standalone web server:\n\t" -- . $err; -- } --} -- -- --sub handle_bind_error { -- -- print STDERR <<EOF; --WARNING: RT couldn't start up a web server on port @{[$port]}. --This is often the case if the port is already in use or you're running @{[$0]} --as someone other than your system's "root" user. You may also specify a --temporary port with: $0 --port <port> --EOF +-# Try to clean up wrong-permissions var/ +-$SIG{INT} = sub { +- local $@; +- system("chown", "-R", "www:www", "/opt/rt4/var"); +- exit 0; +-} if $> == 0; - -- if ($explicit_port) { -- print STDERR -- "Please check your system configuration or choose another port\n\n"; -- } --} +-$r->run; - -__END__ - @@ -15408,10 +16588,10 @@ index add9d01..0000000 - rt-server --server Starman --port 8080 diff --git a/t/data/configs/apache2.2+fastcgi.conf b/t/data/configs/apache2.2+fastcgi.conf deleted file mode 100644 -index cc1e4fe..0000000 +index bc07e43..0000000 --- a/t/data/configs/apache2.2+fastcgi.conf +++ /dev/null -@@ -1,50 +0,0 @@ +@@ -1,49 +0,0 @@ -ServerRoot %%SERVER_ROOT%% -PidFile %%PID_FILE%% -LockFile %%LOCK_FILE%% @@ -15421,8 +16601,8 @@ index cc1e4fe..0000000 - -<IfModule !mpm_netware_module> -<IfModule !mpm_winnt_module> --User www-data --Group www-data +-User www +-Group www -</IfModule> -</IfModule> - @@ -15448,7 +16628,6 @@ index cc1e4fe..0000000 - -initial-env RT_SITE_CONFIG=%%RT_SITE_CONFIG%% \ - -initial-env RT_TESTING=1 - --Alias /NoAuth/images/ %%DOCUMENT_ROOT%%/NoAuth/images/ -ScriptAlias / %%RT_SBIN_PATH%%/rt-server.fcgi/ - -DocumentRoot "%%DOCUMENT_ROOT%%" @@ -15464,7 +16643,7 @@ index cc1e4fe..0000000 - diff --git a/t/data/configs/apache2.2+mod_perl.conf b/t/data/configs/apache2.2+mod_perl.conf deleted file mode 100644 -index e0ce14c..0000000 +index a17d68d..0000000 --- a/t/data/configs/apache2.2+mod_perl.conf +++ /dev/null @@ -1,67 +0,0 @@ @@ -15495,8 +16674,8 @@ index e0ce14c..0000000 - -<IfModule !mpm_netware_module> -<IfModule !mpm_winnt_module> --User www-data --Group www-data +-User www +-Group www -</IfModule> -</IfModule> - @@ -15536,5 +16715,5 @@ index e0ce14c..0000000 -</Perl> - -- -1.9.3 +2.1.0 diff --git a/0001-Add-Fedora-configuration.patch b/0002-Add-Fedora-configuration.patch similarity index 56% rename from 0001-Add-Fedora-configuration.patch rename to 0002-Add-Fedora-configuration.patch index 508d953..97c7e41 100644 --- a/0001-Add-Fedora-configuration.patch +++ b/0002-Add-Fedora-configuration.patch @@ -1,22 +1,19 @@ -From abe19fcddf23c61c4ba5f4bc627cf70ea74ac21f Mon Sep 17 00:00:00 2001 +From 2eb20220b6acc85e52ff94a2293fa8ea91c6d302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> -Date: Sat, 19 Jan 2013 08:28:35 +0100 -Subject: [PATCH 1/6] Add Fedora configuration. +Date: Tue, 18 Mar 2014 14:44:14 +0100 +Subject: [PATCH 2/8] Add Fedora configuration. --- - etc/RT_SiteConfig.pm | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) + etc/RT_SiteConfig.pm | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/etc/RT_SiteConfig.pm b/etc/RT_SiteConfig.pm -index 4d2ef35..0c09743 100755 +index 390a351..02495f6 100755 --- a/etc/RT_SiteConfig.pm +++ b/etc/RT_SiteConfig.pm -@@ -10,13 +10,14 @@ - # - # The converse is also true, if this file isn't valid perl, you're +@@ -12,11 +12,12 @@ # going to run into trouble. To check your SiteConfig file, use --# this comamnd: -+# this command: + # this command: # -# perl -c /path/to/your/etc/RT_SiteConfig.pm +# perl -c /etc/rt/RT_SiteConfig.pm @@ -28,7 +25,7 @@ index 4d2ef35..0c09743 100755 +Set($WebPath, '/rt'); # You must install Plugins on your own, this is only an example - # of the correct syntax to use when activating them. + # of the correct syntax to use when activating them: -- -1.9.3 +2.1.0 diff --git a/0003-Broken-test-dependencies.patch b/0003-Broken-test-dependencies.patch new file mode 100644 index 0000000..a30e5ad --- /dev/null +++ b/0003-Broken-test-dependencies.patch @@ -0,0 +1,25 @@ +From e65fe99b030e8955f522be7202a2e76f39cc9645 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> +Date: Tue, 18 Mar 2014 14:47:19 +0100 +Subject: [PATCH 3/8] Broken test-dependencies. + +--- + sbin/rt-test-dependencies.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sbin/rt-test-dependencies.in b/sbin/rt-test-dependencies.in +index f8b80b7..b7d19d8 100644 +--- a/sbin/rt-test-dependencies.in ++++ b/sbin/rt-test-dependencies.in +@@ -189,7 +189,7 @@ CGI 3.38 + CGI::Cookie 1.20 + CGI::Emulate::PSGI + CGI::PSGI 0.12 +-Class::Accessor 0.34 ++Class::Accessor::Fast 0.34 + Crypt::Eksblowfish + CSS::Squish 0.06 + Data::GUID +-- +2.1.0 + diff --git a/0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch b/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch similarity index 77% rename from 0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch rename to 0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch index ac80dd5..abec54f 100644 --- a/0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch +++ b/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch @@ -1,24 +1,24 @@ -From b8a30c1a215fd3eaa0f1bc607e71a194c67cbeff Mon Sep 17 00:00:00 2001 +From 9be38aa4c1524a287684f5fa1cd8841385a95722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> -Date: Sat, 19 Jan 2013 08:47:25 +0100 -Subject: [PATCH 3/6] Use /usr/bin/perl instead of /usr/bin/env perl. +Date: Tue, 18 Mar 2014 14:55:18 +0100 +Subject: [PATCH 4/8] Use /usr/bin/perl instead of /usr/bin/env perl. --- devel/tools/change-loc-msgstr | 2 +- + devel/tools/cmd-boilerplate | 2 +- devel/tools/extract-message-catalog | 2 +- - devel/tools/factory | 2 +- devel/tools/license_tag | 2 +- - devel/tools/merge-rosetta.pl | 2 +- devel/tools/rt-apache | 2 +- devel/tools/rt-attributes-editor | 2 +- devel/tools/rt-static-docs | 2 +- devel/tools/tweak-template-locstring | 2 +- etc/upgrade/shrink_cgm_table.pl | 2 +- etc/upgrade/shrink_transactions_table.pl | 2 +- + etc/upgrade/time-worked-history.pl | 2 +- etc/upgrade/upgrade-mysql-schema.pl | 2 +- - sbin/rt-message-catalog | 2 +- + lib/RT/Interface/Web/QueryBuilder.pm | 1 + t/mail/fake-sendmail | 2 +- - 14 files changed, 14 insertions(+), 14 deletions(-) + 14 files changed, 14 insertions(+), 13 deletions(-) diff --git a/devel/tools/change-loc-msgstr b/devel/tools/change-loc-msgstr index bd1892a..ffeb5e1 100755 @@ -30,20 +30,20 @@ index bd1892a..ffeb5e1 100755 # BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: -diff --git a/devel/tools/extract-message-catalog b/devel/tools/extract-message-catalog -index 0afec0b..5c654e0 100755 ---- a/devel/tools/extract-message-catalog -+++ b/devel/tools/extract-message-catalog +diff --git a/devel/tools/cmd-boilerplate b/devel/tools/cmd-boilerplate +index 2c6463d..8fa596c 100755 +--- a/devel/tools/cmd-boilerplate ++++ b/devel/tools/cmd-boilerplate @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/perl + + # BEGIN BPS TAGGED BLOCK {{{ - # - # COPYRIGHT: -diff --git a/devel/tools/factory b/devel/tools/factory -index 5d05d08..38d1fe8 100755 ---- a/devel/tools/factory -+++ b/devel/tools/factory +diff --git a/devel/tools/extract-message-catalog b/devel/tools/extract-message-catalog +index ad9e5f5..9e74b53 100755 +--- a/devel/tools/extract-message-catalog ++++ b/devel/tools/extract-message-catalog @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/perl @@ -60,18 +60,8 @@ index 4cf0917..0d1e5f3 100755 # BEGIN BPS TAGGED BLOCK {{{ -diff --git a/devel/tools/merge-rosetta.pl b/devel/tools/merge-rosetta.pl -index ec587ad..cfd1651 100755 ---- a/devel/tools/merge-rosetta.pl -+++ b/devel/tools/merge-rosetta.pl -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl -+#!/usr/bin/perl - # BEGIN BPS TAGGED BLOCK {{{ - # - # COPYRIGHT: diff --git a/devel/tools/rt-apache b/devel/tools/rt-apache -index 22df8ee..7a39dcf 100755 +index 71b420b..545b3ba 100755 --- a/devel/tools/rt-apache +++ b/devel/tools/rt-apache @@ -1,4 +1,4 @@ @@ -91,7 +81,7 @@ index 92998a4..117f167 100755 # # COPYRIGHT: diff --git a/devel/tools/rt-static-docs b/devel/tools/rt-static-docs -index 2c77711..99335dc 100755 +index ef3dc50..6c6514d 100755 --- a/devel/tools/rt-static-docs +++ b/devel/tools/rt-static-docs @@ -1,4 +1,4 @@ @@ -111,7 +101,7 @@ index ca44d39..b31570b 100755 # # COPYRIGHT: diff --git a/etc/upgrade/shrink_cgm_table.pl b/etc/upgrade/shrink_cgm_table.pl -index fcfe8c5..585b210 100644 +index 7157b20..02f5555 100644 --- a/etc/upgrade/shrink_cgm_table.pl +++ b/etc/upgrade/shrink_cgm_table.pl @@ -1,4 +1,4 @@ @@ -121,7 +111,7 @@ index fcfe8c5..585b210 100644 # # COPYRIGHT: diff --git a/etc/upgrade/shrink_transactions_table.pl b/etc/upgrade/shrink_transactions_table.pl -index 66bdcf5..3e82203 100644 +index 0b78f0f..026a863 100644 --- a/etc/upgrade/shrink_transactions_table.pl +++ b/etc/upgrade/shrink_transactions_table.pl @@ -1,4 +1,4 @@ @@ -130,6 +120,16 @@ index 66bdcf5..3e82203 100644 # BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: +diff --git a/etc/upgrade/time-worked-history.pl b/etc/upgrade/time-worked-history.pl +index 46961aa..666498e 100644 +--- a/etc/upgrade/time-worked-history.pl ++++ b/etc/upgrade/time-worked-history.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/env perl ++#!/usr/bin/perl + # BEGIN BPS TAGGED BLOCK {{{ + # + # COPYRIGHT: diff --git a/etc/upgrade/upgrade-mysql-schema.pl b/etc/upgrade/upgrade-mysql-schema.pl index 8d6615d..204676c 100755 --- a/etc/upgrade/upgrade-mysql-schema.pl @@ -140,12 +140,11 @@ index 8d6615d..204676c 100755 # BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: -diff --git a/sbin/rt-message-catalog b/sbin/rt-message-catalog -index b428369..6effdfd 100755 ---- a/sbin/rt-message-catalog -+++ b/sbin/rt-message-catalog -@@ -1,4 +1,4 @@ --#!/usr/bin/env perl +diff --git a/lib/RT/Interface/Web/QueryBuilder.pm b/lib/RT/Interface/Web/QueryBuilder.pm +index a1b0662..4af51f4 100644 +--- a/lib/RT/Interface/Web/QueryBuilder.pm ++++ b/lib/RT/Interface/Web/QueryBuilder.pm +@@ -1,3 +1,4 @@ +#!/usr/bin/perl # BEGIN BPS TAGGED BLOCK {{{ # @@ -161,5 +160,5 @@ index 44c2377..ab3b912 100755 # captures command line arguments so you can validate # what is being generated in sendmailpipe -- -1.9.3 +2.1.0 diff --git a/0004-Remove-fixperms-font-install.patch b/0005-Remove-fixperms-font-install.patch similarity index 72% rename from 0004-Remove-fixperms-font-install.patch rename to 0005-Remove-fixperms-font-install.patch index 6bb5aa1..0201b52 100644 --- a/0004-Remove-fixperms-font-install.patch +++ b/0005-Remove-fixperms-font-install.patch @@ -1,14 +1,14 @@ -From fff3f340cbf67886b292c77ae8774fe5bd8c4f68 Mon Sep 17 00:00:00 2001 +From ecea9d34aaec6fd23343c785a9f74593cd66baaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> -Date: Sat, 19 Jan 2013 08:28:35 +0100 -Subject: [PATCH 4/6] Remove fixperms, font-install +Date: Tue, 18 Mar 2014 14:59:31 +0100 +Subject: [PATCH 5/8] Remove fixperms, font-install. --- Makefile.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in -index d8c7799..54faca8 100755 +index f9b6402..5a23c85 100755 --- a/Makefile.in +++ b/Makefile.in @@ -260,7 +260,7 @@ upgrade-instruct: @@ -20,18 +20,18 @@ index d8c7799..54faca8 100755 my_with_web_handlers= $(shell $(PERL) -e 'print join " ", map "--with-$$_", grep defined && length, split /,/, "$(WEB_HANDLER)"') testdeps: -@@ -346,9 +346,9 @@ dirs: - $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_PLUGIN_PATH) - $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LEXICON_PATH) +@@ -359,9 +359,9 @@ clean-mason-cache: + rm -rf $(DESTDIR)$(MASON_DATA_PATH)/etc/* + rm -rf $(DESTDIR)$(MASON_DATA_PATH)/obj/* -install: testdeps config-install dirs files-install fixperms instruct +install: testdeps config-install dirs files-install instruct --files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install -+files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install po-install +-files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install static-install ++files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install po-install static-install config-install: @COMMENT_INPLACE_LAYOUT@ $(INSTALL) -m 0755 -o $(BIN_OWNER) -g $(RTGROUP) -d $(DESTDIR)$(CONFIG_FILE_PATH) -- -1.9.3 +2.1.0 diff --git a/0005-Fix-permissions.patch b/0006-Fix-permissions.patch similarity index 89% rename from 0005-Fix-permissions.patch rename to 0006-Fix-permissions.patch index c76bf8f..fffe753 100644 --- a/0005-Fix-permissions.patch +++ b/0006-Fix-permissions.patch @@ -1,7 +1,7 @@ -From 6fd8bcac095f502bb3c196f86a8d2a85715b5f50 Mon Sep 17 00:00:00 2001 +From 83b48cfbc9dbb68e50055b6c51ec3582238e8fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> Date: Tue, 18 Mar 2014 10:00:00 +0100 -Subject: [PATCH 5/6] Fix permissions. +Subject: [PATCH 6/8] Fix permissions. --- Makefile.in | 0 @@ -14,13 +14,12 @@ Subject: [PATCH 5/6] Fix permissions. etc/acl.Oracle | 0 etc/acl.Pg | 0 etc/acl.mysql | 0 - etc/initialdata | 0 etc/schema.Oracle | 0 etc/schema.Pg | 0 etc/schema.SQLite | 0 etc/schema.mysql | 0 etc/upgrade/vulnerable-passwords.in | 0 - 16 files changed, 0 insertions(+), 0 deletions(-) + 15 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 Makefile.in mode change 100755 => 100644 aclocal.m4 mode change 100755 => 100644 config.layout @@ -31,7 +30,6 @@ Subject: [PATCH 5/6] Fix permissions. mode change 100755 => 100644 etc/acl.Oracle mode change 100755 => 100644 etc/acl.Pg mode change 100755 => 100644 etc/acl.mysql - mode change 100755 => 100644 etc/initialdata mode change 100755 => 100644 etc/schema.Oracle mode change 100755 => 100644 etc/schema.Pg mode change 100755 => 100644 etc/schema.SQLite @@ -68,9 +66,6 @@ new mode 100644 diff --git a/etc/acl.mysql b/etc/acl.mysql old mode 100755 new mode 100644 -diff --git a/etc/initialdata b/etc/initialdata -old mode 100755 -new mode 100644 diff --git a/etc/schema.Oracle b/etc/schema.Oracle old mode 100755 new mode 100644 @@ -87,5 +82,5 @@ diff --git a/etc/upgrade/vulnerable-passwords.in b/etc/upgrade/vulnerable-passwo old mode 100755 new mode 100644 -- -1.9.3 +2.1.0 diff --git a/0007-Fix-translation.patch b/0007-Fix-translation.patch new file mode 100644 index 0000000..7f093b8 --- /dev/null +++ b/0007-Fix-translation.patch @@ -0,0 +1,25 @@ +From 08352fe91e355ee16c8531b3ea335c060a005b17 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> +Date: Fri, 23 Jan 2015 04:36:45 +0100 +Subject: [PATCH 7/8] Fix translation. + +--- + share/po/de.po | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/share/po/de.po b/share/po/de.po +index 0eaf1e7..a952f0a 100644 +--- a/share/po/de.po ++++ b/share/po/de.po +@@ -1002,7 +1002,7 @@ msgstr "Alle Tickets" + + #: share/html/User/Prefs.html:171 + msgid "All iCal feeds embed a secret token which authorizes you. If the URL for one of your iCal feeds was exposed to the outside world, you can get a new secret, <b>breaking all existing iCal feeds</b>, below." +-msgstr "Alle iCal-Feeds beinhalten einen geheimen Token durch welchen die Authorisierung erfolgt. Falls die URL für einen dieser iCal-Feeds irrtümlich nach Extern weitergegeben wurde, können Sie unterhalb einen neuen Token erstellen, welcher <b>alle exestierenden iCal-Feeds</b> ungültig werden lässt." ++msgstr "Alle iCal-Feeds beinhalten einen geheimen Token durch welchen die Authorisierung erfolgt. Falls die URL für einen dieser iCal-Feeds irrtümlich nach Extern weitergegeben wurde, können Sie unterhalb einen neuen Token erstellen, welcher <b>alle existierenden iCal-Feeds</b> ungültig werden lässt." + + #: share/html/Admin/Queues/index.html:99 + msgid "All queues matching search criteria" +-- +2.1.0 + diff --git a/0007-Adjust-path-to-html-autohandler.patch b/0008-Adjust-path-to-html-autohandler.patch similarity index 87% rename from 0007-Adjust-path-to-html-autohandler.patch rename to 0008-Adjust-path-to-html-autohandler.patch index 7d332bd..c155f79 100644 --- a/0007-Adjust-path-to-html-autohandler.patch +++ b/0008-Adjust-path-to-html-autohandler.patch @@ -1,7 +1,7 @@ -From 775af7e4827e723ba8b4ccc210dc0eaa876ab797 Mon Sep 17 00:00:00 2001 +From 20ae18d6de75fd426eff2e33ab4bfd84dfdcdfaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> Date: Fri, 23 Jan 2015 04:38:35 +0100 -Subject: [PATCH 7/7] Adjust path to html/autohandler. +Subject: [PATCH 8/8] Adjust path to html/autohandler. --- t/web/query_log.t | 2 +- diff --git a/0009-Work-around-testsuite-failure.patch b/0009-Work-around-testsuite-failure.patch new file mode 100644 index 0000000..66fd1f5 --- /dev/null +++ b/0009-Work-around-testsuite-failure.patch @@ -0,0 +1,47 @@ +From 4ed130621f75bcb8271240b676544693ea9b0cf9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu@xxxxxxxxxxxxxxxxx> +Date: Sat, 24 Jan 2015 04:49:25 +0100 +Subject: [PATCH] Work-around testsuite failure. cf. + https://bugzilla.redhat.com/show_bug.cgi?id=1121601#c36. + +--- + t/mail/html-outgoing.t | 23 ----------------------- + 1 file changed, 23 deletions(-) + +diff --git a/t/mail/html-outgoing.t b/t/mail/html-outgoing.t +index 6a0f2be..18eb9a1 100644 +--- a/t/mail/html-outgoing.t ++++ b/t/mail/html-outgoing.t +@@ -82,29 +82,6 @@ mail_ok { + }; + + +-diag "Failing HTML -> Text conversion"; +-warnings_like { +- my $body = '<table><tr><td><table><tr><td>Foo</td></tr></table></td></tr></table>'; +- mail_ok { +- ($ok, $tmsg) = $t->Correspond( +- MIMEObj => HTML::Mason::Commands::MakeMIMEEntity( +- Body => $body, +- Type => 'text/html', +- ), +- ); +- } { from => qr/RT System/, +- bcc => 'root@localhost', +- subject => qr/\Q[example.com #1] The internet is broken\E/, +- body => qr{Ticket URL: <a href="(http://localhost:\d+/Ticket/Display\.html\?id=1)">\1</a>.+?$body}s, +- 'Content-Type' => qr{text/html}, # TODO +- },{ from => qr/RT System/, +- to => 'enduser@xxxxxxxxxxx', +- subject => qr/\Q[example.com #1] The internet is broken\E/, +- body => qr{<table><tr><td><table><tr><td>Foo</td></tr></table></td></tr></table>}, +- 'Content-Type' => qr{text/html}, # TODO +- }; +-} [(qr/uninitialized value/, qr/Failed to downgrade HTML/)x3]; +- + diag "Admin Comment in HTML"; + mail_ok { + ($ok, $tmsg) = $t->Comment( +-- +2.1.0 + diff --git a/README.fedora.in b/README.fedora.in index ae19e13..09617af 100644 --- a/README.fedora.in +++ b/README.fedora.in @@ -4,9 +4,9 @@ Some random notes on rt on Fedora: Finalizing the installation =========================== -The default configuration is set up for a mysql based rt system. -It requires additional steps to be performed by the sysadmin to be -fully functional. +The default configuration is set up for a mysql based rt system. +It requires additional steps to be performed by the sysadmin to be +fully functional. If you have never set up rt before, proceed as follows: 1. Log-in to the server as root @@ -18,13 +18,13 @@ If you have never set up rt before, proceed as follows: # systemctl start mysqld.service 4. Set up the mysql server. -If not already done, at minimum, you will want to set up a mysql root +If not already done, at minimum, you will want to set up a mysql root password: # mysqladmin -u root password <mysql-root-password> 5. Edit /etc/rt/RT_SiteConfig.pm to meet your demands. You will want to compare RT_SiteConfig.pm against RT_Config.pm and -add customized versions of those settings from RT_Config.pm to +add customized versions of those settings from RT_Config.pm to RT_SiteConfig.pm. In particular, you probably will want to add customized versions of @@ -47,14 +47,14 @@ http:-access to your rt-host: e.g.: <your-favorite-browser> http://<rt-host>/rt -You should be greeted with a login window. Login with +You should be greeted with a login window. Login with Username: root, Password: password. The next step should be to change your rt's "root" account's password, -otherwise anybody with web access to your site will be able to abuse +otherwise anybody with web access to your site will be able to abuse your site. -Afterwards, you should be ready to create user accounts, configure +Afterwards, you should be ready to create user accounts, configure the mail-interface etc. @@ -66,3 +66,6 @@ drwxr-xr-x. root root system_u:object_r:httpd_cache_t:s0 /var/cache/rt If not, perform the following to add the required file context: # semanage fcontext -a -t httpd_cache_t '/var/cache/rt(/.*)?' # restorecon -R -v /var/cache/rt + +Depending on your email-setup you may also need to set: +# setsebool -P httpd_can_sendmail=1 diff --git a/rt.spec b/rt.spec index 32666c6..14c4af2 100644 --- a/rt.spec +++ b/rt.spec @@ -52,10 +52,11 @@ %global RT_LOGDIR %{_localstatedir}/log/%{name} %global RT_CACHEDIR %{_localstatedir}/cache/%{name} %global RT_LOCALSTATEDIR %{_localstatedir}/lib/%{name} +%global RT_STATICDIR %{_datadir}/%{name}/static Name: rt -Version: 4.0.22 -Release: 3%{?dist} +Version: 4.2.9 +Release: 1%{?dist} Summary: Request tracker Group: Applications/Internet @@ -71,13 +72,15 @@ Source3: README.fedora.in # rt's logrotate configuration Source4: rt.logrotate.in -Patch1: 0001-Add-Fedora-configuration.patch -Patch2: 0002-Broken-test-dependencies.patch -Patch3: 0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch -Patch4: 0004-Remove-fixperms-font-install.patch -Patch5: 0005-Fix-permissions.patch -Patch6: 0006-Remove-configure-time-generated-files.patch -Patch7: 0007-Adjust-path-to-html-autohandler.patch +Patch1: 0001-Remove-configure-time-generated-files.patch +Patch2: 0002-Add-Fedora-configuration.patch +Patch3: 0003-Broken-test-dependencies.patch +Patch4: 0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch +Patch5: 0005-Remove-fixperms-font-install.patch +Patch6: 0006-Fix-permissions.patch +Patch7: 0007-Fix-translation.patch +Patch8: 0008-Adjust-path-to-html-autohandler.patch +Patch9: 0009-Work-around-testsuite-failure.patch BuildArch: noarch @@ -94,16 +97,20 @@ BuildRequires: perl(CGI::Emulate::PSGI) BuildRequires: perl(Class::ReturnValue) >= 0.40 BuildRequires: perl(Convert::Color) BuildRequires: perl(CPAN) +BuildRequires: perl(Crypt::Eksblowfish) +BuildRequires: perl(Crypt::SSLeay) +BuildRequires: perl(Crypt::X509) BuildRequires: perl(CSS::Squish) >= 0.06 +BuildRequires: perl(Data::GUID) BuildRequires: perl(Data::ICal) +BuildRequires: perl(Date::Extract) >= 0.02 +BuildRequires: perl(Date::Manip) +BuildRequires: perl(DateTime::Format::Natural) >= 0.67 BuildRequires: perl(Date::Format) BuildRequires: perl(DateTime) >= 0.44 BuildRequires: perl(DateTime::Locale) >= 0.40 %{?with_mysql:BuildRequires: perl(DBD::mysql) >= 2.1018} -# This should be: BuildRequires: perl(DBD::Pg) != 3.3.0 -# cf. RHBZ#1138926 -%{?with_pg:BuildConflicts: perl(DBD::Pg) == 3.3.0} -%{?with_pg:BuildRequires: perl(DBD::Pg)} +%{?with_pg:BuildRequires: perl(DBD::Pg) >= 1.43} BuildRequires: perl(DBI) >= 1.37 BuildRequires: perl(DBIx::SearchBuilder) >= 1.59 BuildRequires: perl(Devel::StackTrace) >= 1.19 @@ -111,6 +118,7 @@ BuildRequires: perl(Devel::GlobalDestruction) BuildRequires: perl(Digest::base) BuildRequires: perl(Digest::MD5) >= 2.27 BuildRequires: perl(Email::Address) +BuildRequires: perl(Email::Address::List) >= 0.02 BuildRequires: perl(Encode) >= 2.39 BuildRequires: perl(Errno) %{?with_devel_mode:BuildRequires: perl(File::Find)} @@ -118,8 +126,9 @@ BuildRequires: perl(File::Glob) BuildRequires: perl(File::ShareDir) BuildRequires: perl(File::Spec) >= 0.8 BuildRequires: perl(File::Temp) >= 0.19 +BuildRequires: perl(File::Which) %{?with_gd:BuildRequires: perl(GD)} -%{?with_gd:BuildRequires: perl(GD::Graph)} +%{?with_gd:BuildRequires: perl(GD::Graph) >= 1.47} %{?with_gd:BuildRequires: perl(GD::Text)} %{?with_gpg:BuildRequires: perl(GnuPG::Interface)} %{?with_graphviz:BuildRequires: perl(GraphViz)} @@ -127,6 +136,8 @@ BuildRequires: perl(Getopt::Long) >= 2.24 BuildRequires: perl(HTML::Entities) %{?with_devel_mode:BuildRequires: perl(HTML::Form)} BuildRequires: perl(HTML::FormatText) +BuildRequires: perl(HTML::FormatText::WithLinks) >= 0.14 +BuildRequires: perl(HTML::FormatText::WithLinks::AndTables) BuildRequires: perl(HTML::Mason) >= 1.43 BuildRequires: perl(HTML::Mason::PSGIHandler) BuildRequires: perl(HTML::Quoted) @@ -136,10 +147,6 @@ BuildRequires: perl(HTML::TreeBuilder) BuildRequires: perl(HTTP::Request::Common) BuildRequires: perl(HTTP::Server::Simple) >= 0.34 BuildRequires: perl(HTTP::Server::Simple::Mason) >= 0.09 -BuildRequires: perl(Imager) -BuildRequires: perl(Imager::File::GIF) -BuildRequires: perl(Imager::File::PNG) -BuildRequires: perl(Imager::File::JPEG) %{?with_graphviz:BuildRequires: perl(IPC::Run)} BuildRequires: perl(IPC::Run3) %{?with_graphviz:BuildRequires: perl(IPC::Run::SafeHandles)} @@ -147,22 +154,26 @@ BuildRequires: perl(JSON) BuildRequires: perl(JavaScript::Minifier) BuildRequires: perl(List::MoreUtils) BuildRequires: perl(Locale::Maketext) >= 1.06 -BuildRequires: perl(Locale::Maketext::Fuzzy) +BuildRequires: perl(Locale::Maketext::Fuzzy) >= 0.11 BuildRequires: perl(Locale::Maketext::Lexicon) >= 0.32 BuildRequires: perl(Locale::PO) BuildRequires: perl(Log::Dispatch) >= 2.23 %{?with_devel_mode:BuildRequires: perl(Log::Dispatch::Perl)} BuildRequires: perl(LWP) BuildRequires: perl(LWP::UserAgent) +BuildRequires: perl(LWP::Protocol::https) BuildRequires: perl(Mail::Mailer) >= 1.57 BuildRequires: perl(MIME::Entity) >= 5.425 BuildRequires: perl(MIME::Types) %{?with_devel_mode:BuildRequires: perl(Module::Refresh) >= 0.03} BuildRequires: perl(Module::Versions::Report) >= 1.05 +BuildRequires: perl(Mozilla::CA) +BuildRequires: perl(Mojo::DOM) BuildRequires: perl(Net::CIDR) BuildRequires: perl(Net::Server) BuildRequires: perl(Net::Server::PreFork) BuildRequires: perl(Net::SMTP) +BuildRequires: perl(Net::SSL) %{?with_gpg:BuildRequires: perl(PerlIO::eol)} BuildRequires: perl(Pod::Usage) BuildRequires: perl(Plack) @@ -171,20 +182,22 @@ BuildRequires: perl(Plack::Handler::Starlet) BuildRequires: perl(Regexp::Common) BuildRequires: perl(Regexp::Common::net::CIDR) BuildRequires: perl(Regexp::IPv6) +BuildRequires: perl(Role::Basic) >= 0.12 BuildRequires: perl(Scalar::Util) +BuildRequires: perl(Set::Tiny) BuildRequires: perl(Storable) >= 2.08 %{?with_devel_mode:BuildRequires: perl(String::ShellQuote)} +BuildRequires: perl(Symbol::Global::Name) >= 0.04 BuildRequires: perl(Term::ReadKey) BuildRequires: perl(Term::ReadLine) -BuildRequires: perl(Term::EditorEdit) %{?with_devel_mode:BuildRequires: perl(Test::Builder) >= 0.77} %{?with_devel_mode:BuildRequires: perl(Test::Deep)} %{?with_devel_mode:BuildRequires: perl(Test::Email)} %{?with_devel_mode:BuildRequires: perl(Email::Abstract)} %{?with_devel_mode:BuildRequires: perl(Test::Expect) >= 0.31} -%{?with_devel_mode:BuildRequires: perl(Test::HTTP::Server::Simple) >= 0.09} %{?with_devel_mode:BuildRequires: perl(Test::MockTime)} %{?with_devel_mode:BuildRequires: perl(Test::NoWarnings)} +%{?with_devel_mode:BuildRequires: perl(Test::Pod) >= 1.14} %{?with_devel_mode:BuildRequires: perl(Test::Warn)} %{?with_devel_mode:BuildRequires: perl(Test::WWW::Mechanize)} %{?with_devel_mode:BuildRequires: perl(Test::WWW::Mechanize::PSGI)} @@ -198,7 +211,6 @@ BuildRequires: perl(Time::HiRes) BuildRequires: perl(Time::ParseDate) BuildRequires: perl(Tree::Simple) >= 1.04 BuildRequires: perl(UNIVERSAL::require) -%{?with_devel_mode:BuildRequires: perl(Web::Scraper)} %{?with_devel_mode:BuildRequires: perl(WWW::Mechanize)} BuildRequires: perl(XML::RSS) >= 1.05 %{?with_devel_mode:BuildRequires: perl(XML::Simple)} @@ -207,10 +219,8 @@ BuildRequires: perl(XML::RSS) >= 1.05 %{?with_runtests:BuildRequires: perl(Test::Warn)} %{?with_runtests:BuildRequires: perl(Test::MockTime)} %{?with_runtests:BuildRequires: perl(String::ShellQuote)} -%{?with_runtests:BuildRequires: perl(Test::Pod) >= 1.14} %{?with_runtests:BuildRequires: perl(PerlIO::eol)} %{?with_runtests:BuildRequires: perl(Test::Expect)} -BuildRequires: perl(Test::Pod) >= 1.14 BuildRequires: /usr/bin/pod2man BuildRequires: /usr/sbin/apachectl @@ -279,7 +289,6 @@ Requires: rt-mailgate # Filter bogus provides %global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(HTML::Mason %global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(IO::Handle::CRLF\\)$ -%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(Log::Dispatch\\)$ %description @@ -317,11 +326,12 @@ Requires: perl(GnuPG::Interface) Requires: perl(GraphViz) Requires: perl(PerlIO::eol) Requires: perl(Plack::Handler::Apache2) -Requires: perl(String::ShellQuote) -Requires: perl(Test::Deep) -Requires: perl(Test::Expect) +Requires: perl(Set::Tiny) +Requires: perl(String::ShellQuote) +Requires: perl(Test::Deep) +Requires: perl(Test::Expect) Requires: perl(Test::MockTime) -Requires: perl(Test::Warn) +Requires: perl(Test::Warn) Obsoletes: rt3-tests < %{version}-%{release} Provides: rt3-tests = %{version}-%{release} @@ -345,6 +355,7 @@ Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) # rpm doesn't catch these: Requires: perl(Test::WWW::Mechanize::PSGI) +Requires: perl(Mojo::DOM) %description -n perl-RT-Test %{summary} @@ -366,6 +377,8 @@ sed -e 's,@RT_LOGDIR@,%{RT_LOGDIR},' %{SOURCE4} \ %patch5 -p1 %patch6 -p1 %patch7 -p1 +%patch8 -p1 +%patch9 -p1 # Propagate rpm's directories to config.layout cat << \EOF >> config.layout @@ -381,6 +394,7 @@ cat << \EOF >> config.layout localstatedir: %{RT_LOCALSTATEDIR} htmldir: %{RT_WWWDIR} fontdir: %{RT_FONTSDIR} + staticdir: %{RT_STATICDIR} logfiledir: %{RT_LOGDIR} masonstatedir: %{RT_CACHEDIR}/mason_data sessionstatedir: %{RT_CACHEDIR}/session_data @@ -465,7 +479,10 @@ for file in bin/*.1 sbin/*.1; do install -m 0644 $file ${RPM_BUILD_ROOT}%{_mandir}/man1 done +# missed by "make install" install -d -m755 ${RPM_BUILD_ROOT}%{RT_LOGDIR} +# missed by "make install" +install -d -m755 ${RPM_BUILD_ROOT}%{RT_LOCALSTATEDIR} # install log rotation stuff mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d @@ -487,14 +504,16 @@ cp -R devel/tools ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/devel cp %{SOURCE1} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name} install -d -m755 ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share ln -s %{RT_WWWDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share/html +ln -s %{RT_STATICDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share/static ln -s %{_bindir} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/bin ln -s %{_sbindir} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/sbin ln -s %{_sysconfdir}/%{name} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/etc ln -s %{RT_LIBDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/lib -# This file should not be installed +# These files should not be installed rm ${RPM_BUILD_ROOT}%{RT_LEXDIR}/*.pot +rm ${RPM_BUILD_ROOT}%{RT_LIBDIR}/RT/Generated.pm.in # Fix permissions find ${RPM_BUILD_ROOT}%{RT_WWWDIR} \ @@ -510,7 +529,9 @@ ${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/split-out-cf-categories \ ${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/4.0-customfield-checkbox-extension \ ${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/vulnerable-passwords \ ${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/upgrade-mysql-schema.pl \ -${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/shrink_cgm_table.pl +${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/shrink_cgm_table.pl \ +${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/switch-templates-to \ +${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/time-worked-history.pl %check # The tests don't work in buildroots, they @@ -536,6 +557,7 @@ fi %{RT_LIBDIR}/* %exclude %{RT_LIBDIR}/RT/Test* %attr(0700,apache,apache) %{RT_LOGDIR} +%attr(0760,apache,apache) %{RT_LOCALSTATEDIR} %dir %{_sysconfdir}/%{name} %attr(-,root,root)%{_datadir}/%{name}/upgrade @@ -559,6 +581,7 @@ fi %{RT_WWWDIR} %{RT_LEXDIR} %{RT_FONTSDIR} +%{RT_STATICDIR} %config(noreplace) %{_sysconfdir}/httpd/conf.d/%{name}.conf @@ -587,38 +610,5 @@ fi %endif %changelog -* Fri Jan 23 2015 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.22-3 -- Fix testsuite failure (Add 0007-Adjust-path-to-html-autohandler.patch) - (From Jason Tibbitts). - -* Thu Jan 22 2015 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.22-2 -- Misc. cosmetical changes. -- Rework --with mysql/pg processing. -- Filter out P: perl(Log::Dispatch). -- Add R: %%{_sysconfdir}/httpd/conf.d. -- Add note on SELinux to README.fedora. - -* Wed Oct 08 2014 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.22-1 -- Upstream update. -- Reflect rt-server being installed to %%{_sbindir}. -- Add BuildConflicts/Conflicts: perl(DBD::Pg) == 3.3.0. -- Install updates into %%{_datadir}. -- Various misc. cosmetic fixes. - -* Sun Sep 07 2014 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.21-4 -- Remove artefacts of installation outside of %%{_bindir}. -- Add optional support for pg. -- Introduce RT_FONTSDIR. -- Require: perl(DBD::Pg) and perl(DBD::mysql). -- Exclude unsupported upgrade files. - -* Wed Aug 20 2014 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.21-3 -- Add rt-attributes-editor. - -* Tue Jul 22 2014 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.21-2 -- Address misc. cosmetical issues. -- Own %%{perl_testdir}. -- Add COPYING to perl-RT-Tests. - -* Mon Jul 21 2014 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.0.21-1 -- Fedora submission. +* Mon Jan 26 2015 Ralf Corsépius <corsepiu@xxxxxxxxxxxxxxxxx> - 4.2.9-1 +- Update to rt-4.2.9. -- Fedora Extras Perl SIG http://www.fedoraproject.org/wiki/Extras/SIGs/Perl perl-devel mailing list perl-devel@xxxxxxxxxxxxxxxxxxxxxxx https://admin.fedoraproject.org/mailman/listinfo/perl-devel