[Rt-commit] rt branch, 4.4/rt-munge-attachments, created. rt-4.4.3-25-gdf998852a
Craig Kaiser
craig at bestpractical.com
Thu Jul 26 21:03:32 EDT 2018
The branch, 4.4/rt-munge-attachments has been created
at df998852a1ae395f5a184af5f02d01108df00fe2 (commit)
- Log -----------------------------------------------------------------
commit 9e335698ac4108097da56a03a5caa89559d0a2d2
Author: Craig Kaiser <craig at bestpractical.com>
Date: Mon Jul 23 15:20:15 2018 -0400
Create rt-munge-attachments executable
diff --git a/Makefile.in b/Makefile.in
index cc418241f..e70406927 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -139,6 +139,7 @@ BINARIES = $(RT_MAILGATE_BIN) \
$(RT_CRON_BIN)
SYSTEM_BINARIES = rt-attributes-viewer \
+ rt-munge-attachments \
rt-clean-sessions \
rt-dump-metadata \
rt-email-dashboards \
diff --git a/sbin/rt-munge-attachments b/sbin/rt-munge-attachments
new file mode 100755
index 000000000..b8f27c54b
--- /dev/null
+++ b/sbin/rt-munge-attachments
@@ -0,0 +1,135 @@
+#!/Users/craigkaiser/perl5/perlbrew/perls/perl-5.24.3/bin/perl
+# BEGIN BPS TAGGED BLOCK {{{
+#
+# COPYRIGHT:
+#
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
+# <sales at bestpractical.com>
+#
+# (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;
+ }
+
+}
+
+# Read in the options
+my %opts;
+use Getopt::Long;
+GetOptions( \%opts, "help|h", "verbose|v", "search=s", "replace=s", );
+
+if ( $opts{'help'} ) {
+ require Pod::Usage;
+ print Pod::Usage::pod2usage( -verbose => 2 );
+ exit;
+}
+
+use RT -init;
+
+RT::Logger->info("Running RT-Munge-Attachments");
+
+if ( $opts{'search'} ) {
+ my $replacement = $opts{'replacement'} || undef;
+
+ my $search = $opts{'search'};
+
+ my $attachments = RT::Attachments->new( RT->SystemUser );
+ $attachments->Limit(
+ FIELD => 'Headers',
+ OPERATOR => 'LIKE',
+ VALUE => $search,
+ );
+
+ while ( my $attachment = $attachments->Next ) {
+ foreach my $header ($attachment->Headers) {
+ if ( $header =~ /$search/ ) {
+ (my $tag) = ($header =~ /^([^\:]+)/);
+ if ($replacement) {
+ my ( $ret, $msg ) = $attachment->SetHeader($tag, $replacement);
+ RT::Logger->info($msg);
+ } else {
+ my ( $ret, $msg ) = $attachment->DelHeader($tag);
+ RT::Logger->info($msg);
+ }
+ }
+ }
+ }
+
+}
+
+=head1 rt-munge-attachments
+
+rt-munge-attachments - Remove references to provided user from attachments table
+
+=head1 DESCRIPTION
+
+rt-munge-attachments is used to remove references to a search string.
+
+=head1 OPTIONS
+
+=over 8
+
+=item --search=SEARCH
+
+Provide a string to search the header column in the attachments table, if a match
+is found the header will be deleted.
+
+=item --replace=REPLACEMENT
+
+Provide a string to replace strings matching the search string in headers from the
+attachments table. Then the Content will be checked for the attachments table where
+a replacement will be used on matching content.
diff --git a/sbin/rt-munge-attachments.in b/sbin/rt-munge-attachments.in
new file mode 100644
index 000000000..9da716c32
--- /dev/null
+++ b/sbin/rt-munge-attachments.in
@@ -0,0 +1,123 @@
+#!@PERL@
+# BEGIN BPS TAGGED BLOCK {{{
+#
+# COPYRIGHT:
+#
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
+# <sales at bestpractical.com>
+#
+# (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 = ( "@RT_LIB_PATH@", "@LOCAL_LIB_PATH@" );
+ 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;
+ }
+
+}
+
+# Read in the options
+my %opts;
+use Getopt::Long;
+GetOptions( \%opts, "help|h", "search=s", "replace=s", );
+
+if ( $opts{'help'} ) {
+ require Pod::Usage;
+ print Pod::Usage::pod2usage( -verbose => 2 );
+ exit;
+}
+
+use RT -init;
+
+if ( $opts{'search'} ) {
+ my $replace = $opts{'replace'} || "";
+ my $search = $opts{'search'};
+
+ my $attachments = RT::Attachments->new(RT->SystemUser);
+
+ my ($ret, $msg) = $attachments->ReplaceAttachments( Search => $search );
+ if ( $ret ) {
+ RT::Logger->info($msg);
+ } else {
+ RT::Logger->error($msg);
+ }
+} else {
+ print "Error: Provide search sting with --SEARCH flag \n";
+}
+
+=head1 rt-munge-attachments
+
+rt-munge-attachments - Remove or replace string from attachments table.
+
+=head1 DESCRIPTION
+
+When a match is found in the Headers column, the header is deleted unless a replacement
+value was provided. If a match is found in the Content column then the matching substing
+will be replaced with a blank or provided value.
+
+=head1 OPTIONS
+
+=over 2
+
+=item --search=SEARCH
+
+Provide a string to search the header and content columns in the attachments table, if a match
+is found the content will be removed.
+
+=item --replace=REPLACEMENT
+
+Provide a string to replace strings matching the search string for the
+attachments table.
+
+=back
\ No newline at end of file
commit 88d0cdd849e8bfa4dab91fcf9410bb2e2c37ef9d
Author: Craig Kaiser <craig at bestpractical.com>
Date: Thu Jul 26 17:56:45 2018 -0400
Add methods ReplaceHeaders ReplaceContent to Attachment.pm
Methods for searching the Headers and Content columns in the
attachments table and replacing any matches that are found.
diff --git a/lib/RT/Attachment.pm b/lib/RT/Attachment.pm
index 4c544301c..e291fcfc5 100644
--- a/lib/RT/Attachment.pm
+++ b/lib/RT/Attachment.pm
@@ -743,6 +743,61 @@ sub SetHeader {
$self->__Set( Field => 'Headers', Value => $newheader);
}
+=head2 ReplaceHeaders ( Search => 'SEARCH', Replacement => 'Replacement' )
+
+Search the attachments table's Header column for the search string provided.
+When a match is found call the SetHeader() method on the header with the match,
+either set the header to empty or a replacement value.
+
+=cut
+
+sub ReplaceHeaders {
+ my $self = shift;
+ my %args = (
+ Search => undef,
+ Replacement => undef,
+ @_,
+ );
+
+ return (0, 'Provide search string for ReplaceHeaders() to search on') unless $args{Search};
+
+ foreach my $header ($self->SplitHeaders) {
+ if ( $header =~ /$args{Search}/ig ) {
+ (my $tag) = ($header =~ /^([^\:]+)/);
+ my ( $ret, $msg ) = $self->SetHeader($tag, $args{Replacement});
+ return ($ret, $msg) unless $ret;
+ }
+ }
+ return (1, 'Headers cleared');
+}
+
+=head2 ReplaceContent ( Search => 'SEARCH', Replacement => 'Replacement' )
+
+Search the attachments table's Content column for the search string provided.
+When a match is found either replace it with the provided replacement string or an
+empty string.
+
+=cut
+
+sub ReplaceContent {
+ my $self = shift;
+ my %args = (
+ Search => undef,
+ Replacement => "",
+ @_,
+ );
+
+ return (0, 'Provide search string for ReplaceContent() to search on') unless $args{Search};
+
+ my $content = $self->Content;
+
+ $content =~ s/\Q$args{Search}\E/$args{Replacement}/ig;
+
+ my ($ret, $msg) = $self->_Set( Field => 'Content', Value => $content );
+ return ($ret, $msg);
+}
+
+
sub _CanonicalizeHeaderValue {
my $self = shift;
my $value = shift;
commit df998852a1ae395f5a184af5f02d01108df00fe2
Author: Craig Kaiser <craig at bestpractical.com>
Date: Thu Jul 26 17:57:15 2018 -0400
Add method ReplaceAttachments to Attachments.pm
Method that calls ReplaceHeaders and ReplaceContent methods on
Attachment objects in the collection.
diff --git a/lib/RT/Attachments.pm b/lib/RT/Attachments.pm
index 8b0608867..d32e76410 100644
--- a/lib/RT/Attachments.pm
+++ b/lib/RT/Attachments.pm
@@ -252,6 +252,52 @@ sub AddRecord {
return $self->SUPER::AddRecord( $record );
}
+=head2 ReplaceAttachments ( Search => 'SEARCH', Replacement => STRING, Header => 1, Content => 1 )
+
+Provide a search string to search the attachments table for. By default the Headers and Content
+columns will both be searched for matches.
+
+=cut
+
+sub ReplaceAttachments {
+ my $self = shift;
+ my %args = (
+ Search => undef,
+ Replacement => '',
+ Headers => 1,
+ Content => 1,
+ @_,
+ );
+
+ return (0, 'Provide a search string to search on') unless $args{Search};
+
+ $self->Limit(
+ FIELD => 'Headers',
+ OPERATOR => 'LIKE',
+ VALUE => $args{Search},
+ ) unless ! $args{Headers};
+
+ $self->Limit(
+ ENTRYAGGREGATOR => 'OR',
+ FIELD => 'Content',
+ OPERATOR => 'LIKE',
+ VALUE => $args{Search},
+ SUBCLAUSE => 'Content',
+ ) unless ! $args{Content};
+
+ while (my $attachment = $self->Next) {
+ if ( $args{Headers} ) {
+ my ($ret, $msg) = $attachment->ReplaceHeaders(Search => $args{Search}, Replacement => $args{Replacement});
+ return ($ret, $msg) unless $ret;
+ }
+ if ( $args{Content} ) {
+ my ($ret, $msg) = $attachment->ReplaceContent(Search => $args{Search}, Replacement => $args{Replacement});
+ return ($ret, $msg) unless $ret;
+ }
+ }
+ return (1, "$args{Search} has been replaced with \"$args{Replacement}\"");
+}
+
RT::Base->_ImportOverlays();
1;
-----------------------------------------------------------------------
More information about the rt-commit
mailing list