%# BEGIN BPS TAGGED BLOCK {{{ %# %# COPYRIGHT: %# %# This software is Copyright (c) 1996-2025 Best Practical Solutions, LLC %# %# %# (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 }}} <%ARGS> $Plugin => '' $Search => '' $Wipeout => '' @WipeoutObject => () <& /Admin/Elements/Header, Title => $title &> <& /Elements/Tabs &>
<& /Elements/ListActions, actions => $messages{'Errors'} &> <& /Elements/ListActions, actions => $messages{'Success'} &> <& Elements/DumpFileLink, File => $dump_file &> <& Elements/SelectPlugin, Plugin => $Plugin, %ARGS &>
<& /Elements/Submit, Name => 'Search', Label => loc('Search') &>
% if( $Search || $Wipeout ) { <& Elements/SelectObjects, Objects => \@objs &> % } <%INIT> require RT::Shredder; my $title = loc('Shredder'); my %messages = ( Errors => [], Success => [] ); my ($plugin_obj, @objs); my $catch_non_fatals = sub { require RT::Shredder::Exceptions; if ( my $e = RT::Shredder::Exception::Info->caught ) { push @{ $messages{Errors} }, "$e"; $Search = ''; @objs = (); return 1; } if ( UNIVERSAL::isa( $@, 'Class::Exception' ) ) { $@->rethrow; } else { die $@; } }; if( $Plugin ) { { # use additional block({}) to effectively exit block on errors use RT::Shredder::Plugin; $plugin_obj = RT::Shredder::Plugin->new; my( $status, $msg ) = $plugin_obj->LoadByName( $Plugin ); unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; last; } my %args; foreach my $k( keys %ARGS ) { next unless $k =~ /^\Q$Plugin\E:(.*)$/; $args{ $1 } = $ARGS{$k}; } ( $status, $msg ) = $plugin_obj->HasSupportForArgs( keys %args ); unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; last; } ($status, $msg) = eval { $plugin_obj->TestArgs( %args ) }; $catch_non_fatals->() && last if $@; unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; last; } } } my $dump_file = ''; if( $Plugin && $Wipeout ) { { # use additional block({}) to effectively exit block on errors my $shredder = RT::Shredder->new( force => 1 ); my $backup_plugin = RT::Shredder::Plugin->new; my ($status, $msg) = $backup_plugin->LoadByName('SQLDump'); unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; @objs = (); last; } ($status, $msg) = $backup_plugin->TestArgs; unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; @objs = (); last; } ($dump_file) = $backup_plugin->FileName; push @{ $messages{'Success'} }, "SQL dump file is '$dump_file'"; $shredder->AddDumpPlugin( Object => $backup_plugin ); $shredder->PutObjects( Objects => \@WipeoutObject ); ($status, $msg) = $plugin_obj->SetResolvers( Shredder => $shredder ); unless( $status ) { push @{ $messages{Errors} }, $msg; $Search = ''; @objs = (); last; } eval { $shredder->WipeoutAll }; $catch_non_fatals->() && last if $@; push @{ $messages{Success} }, loc('objects were successfuly removed'); } } if( $Plugin && ( $Search || $Wipeout ) ) { { # use additional block({}) to effectively exit block on errors my $status; ($status, @objs) = eval { $plugin_obj->Run }; $catch_non_fatals->() && last if $@; unless( $status ) { push @{ $messages{Errors} }, $objs[0]; $Search = ''; @objs = (); last; } push @{ $messages{Success} }, loc('executed plugin successfuly'); my $shredder = RT::Shredder->new; foreach my $o( grep defined, splice @objs ) { eval { push @objs, $shredder->CastObjectsToRecords( Objects => $o ) }; $catch_non_fatals->() && last if $@; } unless( @objs ) { push @{ $messages{Success} }, loc('plugin returned empty list'); } else { push @{ $messages{Success} }, loc('see object list below'); } } }