e8a24c35f6
Problem: If you tell gather_print_notices.pl to write output to a location you do not have write access to, it will silently fail to write the data, but still mark unsent messages as sent. Solution: This patch adds two lines of defense: 1. Check that the location given for the output is writable 2. use "open() or die" instead of just "open()" when writing the output The first measure should catch most of the potential errors, but I guess a directory can be writable, but the open() still can fail because the disk is full or something similar. To test: - Make sure you have some unsent messages in the message_queue table, that do not have an email adress - Apply the patch - Run the script, pointing at a location you do not have access to write to. Check that the script exits with an appropriate error message, and that the unsent messages are still unsent. Do this both with and without the -s option. - To fake passing the first line of defence, comment out line 62 and put this in instead: if ( !$output_directory || !-d $output_directory ) { - Run the script again as above, check you get an appropriate error and that the message queue is not touched - Reset line 62 to how it was - Run the script against a directory you do have access to write to and check that output is produced as expected and that messages are marked as sent - Sign off Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz> Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de> Passes all tests and QA script. Works as described. Signed-off-by: Galen Charlton <gmc@esilibrary.com>
141 lines
3.9 KiB
Perl
Executable file
141 lines
3.9 KiB
Perl
Executable file
#!/usr/bin/perl -w
|
|
|
|
# Copyright 2009 Jesse Weaver
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it under the
|
|
# terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# Koha 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 Koha; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
BEGIN {
|
|
# find Koha's Perl modules
|
|
# test carefully before changing this
|
|
use FindBin;
|
|
eval { require "$FindBin::Bin/../kohalib.pl" };
|
|
}
|
|
|
|
use
|
|
CGI; # NOT a CGI script, this is just to keep C4::Templates::gettemplate happy
|
|
use C4::Context;
|
|
use C4::Dates;
|
|
use C4::Debug;
|
|
use C4::Letters;
|
|
use C4::Templates;
|
|
use File::Spec;
|
|
use Getopt::Long;
|
|
|
|
sub usage {
|
|
print STDERR <<USAGE;
|
|
Usage: $0 OUTPUT_DIRECTORY
|
|
Will print all waiting print notices to
|
|
OUTPUT_DIRECTORY/notices-CURRENT_DATE.html .
|
|
|
|
-s --split Split messages into separate file by borrower home library to OUTPUT_DIRECTORY/notices-CURRENT_DATE-BRANCHCODE.html
|
|
USAGE
|
|
exit $_[0];
|
|
}
|
|
|
|
my ( $stylesheet, $help, $split );
|
|
|
|
GetOptions(
|
|
'h|help' => \$help,
|
|
's|split' => \$split,
|
|
) || usage(1);
|
|
|
|
usage(0) if ($help);
|
|
|
|
my $output_directory = $ARGV[0];
|
|
|
|
if ( !$output_directory || !-d $output_directory || !-w $output_directory ) {
|
|
print STDERR
|
|
"Error: You must specify a valid and writeable directory to dump the print notices in.\n";
|
|
usage(1);
|
|
}
|
|
|
|
my $today = C4::Dates->new();
|
|
my @all_messages = @{ GetPrintMessages() };
|
|
exit unless (@all_messages);
|
|
|
|
## carriage return replaced by <br/> as output is html
|
|
foreach my $message (@all_messages) {
|
|
local $_ = $message->{'content'};
|
|
s/\n/<br \/>/g;
|
|
s/\r//g;
|
|
$message->{'content'} = $_;
|
|
}
|
|
|
|
my $OUTPUT;
|
|
|
|
if ($split) {
|
|
my %messages_by_branch;
|
|
foreach my $message (@all_messages) {
|
|
push( @{ $messages_by_branch{ $message->{'branchcode'} } }, $message );
|
|
}
|
|
|
|
foreach my $branchcode ( keys %messages_by_branch ) {
|
|
my @messages = @{ $messages_by_branch{$branchcode} };
|
|
my $output_file = File::Spec->catdir( $output_directory,
|
|
"holdnotices-" . $today->output('iso') . "-$branchcode.html" );
|
|
open $OUTPUT, '>', $output_file
|
|
or die "Could not open $output_file: $!";
|
|
|
|
my $template =
|
|
C4::Templates::gettemplate( 'batch/print-notices.tmpl', 'intranet',
|
|
new CGI );
|
|
|
|
$template->param(
|
|
stylesheet => C4::Context->preference("NoticeCSS"),
|
|
today => $today->output(),
|
|
messages => \@messages,
|
|
);
|
|
|
|
print $OUTPUT $template->output;
|
|
|
|
foreach my $message (@messages) {
|
|
C4::Letters::_set_message_status(
|
|
{ message_id => $message->{'message_id'}, status => 'sent' } );
|
|
}
|
|
|
|
close $OUTPUT;
|
|
}
|
|
}
|
|
else {
|
|
my $output_file = File::Spec->catdir( $output_directory,
|
|
"holdnotices-" . $today->output('iso') . ".html" );
|
|
open $OUTPUT, '>', $output_file
|
|
or die "Could not open $output_file: $!";
|
|
|
|
|
|
my $template =
|
|
C4::Templates::gettemplate( 'batch/print-notices.tmpl', 'intranet',
|
|
new CGI );
|
|
|
|
$template->param(
|
|
stylesheet => C4::Context->preference("NoticeCSS"),
|
|
today => $today->output(),
|
|
messages => \@all_messages,
|
|
);
|
|
|
|
print $OUTPUT $template->output;
|
|
|
|
foreach my $message (@all_messages) {
|
|
C4::Letters::_set_message_status(
|
|
{ message_id => $message->{'message_id'}, status => 'sent' } );
|
|
}
|
|
|
|
close $OUTPUT;
|
|
|
|
}
|