From: Bill Erickson Date: Fri, 16 Jan 2015 16:42:09 +0000 (-0500) Subject: JBAS-258 track KCLS print notice generator X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=4b5b1b38459d38e6423b59fed51011afb5af2609;p=working%2FEvergreen.git JBAS-258 track KCLS print notice generator Signed-off-by: Bill Erickson --- diff --git a/KCLS/utility-scripts/send-print-notices.pl b/KCLS/utility-scripts/send-print-notices.pl new file mode 100755 index 0000000000..2e93f8eb31 --- /dev/null +++ b/KCLS/utility-scripts/send-print-notices.pl @@ -0,0 +1,157 @@ +#!/usr/bin/perl + +require "/openils/bin/oils_header.pl"; +use strict; +use Getopt::Long; +use Fcntl q/:flock/; +use POSIX qw/strftime/; +use File::Basename; +use File::Temp; +use DateTime::Format::Strptime; + +use OpenSRF::Utils::Logger qw/:logger/; + +my $SCP_KEY_PATH; +my $SCP_DEST = q{kingco@sftp.unique-mgmt.com:incoming}; +my $LOG_PATH = q{/openils/var/log/print-notices/}; + +my %opts = ( + "config-file" => "/openils/conf/opensrf_core.xml", + "date" => strftime("%F", localtime), +); +my @optdefs = qw/event-def=i date=s config-file=s force prefix=s/; +GetOptions(\%opts, @optdefs); +int($opts{"event-def"}) or die "ERROR: --event-def N\n"; +$opts{"date"} =~ /^\d{4}\-\d{2}\-\d{2}$/ or die "ERROR: --date YYYY-MM-DD\n"; + +osrf_connect($opts{"config-file"}); + +sub get_next_date { + my $date = shift; + return new DateTime::Format::Strptime(pattern => "%F")-> + parse_datetime($date)->add(days => 1)->strftime("%F"); +} + + +sub fetch_event_output_by_date { + my ($event_def, $date) = @_; + + my $e = new OpenILS::Utils::CStoreEditor("xact" => 1); + + my $results = $e->json_query({ + "select" => { + "ateo" => [ + {"column" => "data", "transform" => "distinct"}, + {"column" => "create_time"} + ] + }, + "from" => { + "atev" => { + "ateo" => {"field" => "id", "fkey" => "template_output"} + } + }, + "where" => { + "+atev" => { + "event_def" => $event_def, + "state" => "complete", + "update_time" => { "between" => [$date, get_next_date($date)] } + } + }, + "order_by" => [ + {"class" => "ateo", "field" => "create_time", "direction" => "asc"} + ] + }, {"substream" => 1, timeout => 10800}) or return $e->die_event; + + $e->disconnect; + [map { $_->{"data"} } @$results]; +} + +sub output_path { + if ($_[2]) { + $LOG_PATH . $_[2] . "-" . $_[1]; + } else { + $LOG_PATH . $_[0] . "_" . $_[1]; + } +} + +sub remote_filename { + my ($event_def, $date, $prefix) = @_; + ($prefix ? $prefix : "event-def-$event_def") . "-" . $date . ".xml"; +} + +sub scp { + my ($results, $localfile, $destfile) = @_; + + open SAVE, ">$localfile" or die $!; + flock SAVE, LOCK_EX | LOCK_NB or + die "Another process is writing to $localfile even now.\n"; + + binmode SAVE, ":utf8"; + print SAVE "\n"; + print SAVE $_ for @$results; + print SAVE "\n"; + close SAVE; + + my $scp_cmd = "scp -q " . ($SCP_KEY_PATH ? "-i $SCP_KEY_PATH " : "") . + $localfile . " " . $SCP_DEST . "/" . $destfile; + + my $errorlevel = system($scp_cmd) >> 8; + if ($errorlevel) { + print STDERR "command: $scp_cmd\n"; + return $errorlevel; + } + + 0; +} + +sub main { + my $path = output_path($opts{"event-def"}, $opts{"date"}); + if (-f $path and not $opts{"force"}) { + die "Those events have already been processed by this script for\n" . + "that event-def and date. Use --force if you really mean it.\n"; + } + + open FH, ">$path" or die $!; + flock FH, LOCK_EX | LOCK_NB or + die "Another process is writing to $path even now.\n"; + + my $result = fetch_event_output_by_date($opts{"event-def"}, $opts{"date"}); + my $problem = 0; + + if (oils_is_event($result)) { + oils_event_die($result); + } elsif (not @$result) { + $logger->info( + "print notice upload has nothing to do for " . + $opts{"event-def"} . " " . $opts{"date"} . " (0 events)" + ); + print FH "0 event output(s) combined and uploaded\n"; + close FH; + } else { + my $remote_filename = remote_filename(@opts{qw/event-def date prefix/}); + my $savepath = output_path(@opts{qw/event-def date prefix/}) . ".xml"; + + if ($problem = # assignment + scp($result, $savepath, $remote_filename) + ) { + $logger->warn( + "print notice upload failed for " . $opts{"event-def"} . + " " . $opts{"date"} . " (" . scalar(@$result) . " events)" + ); + close FH; + unlink $path, $savepath; + } else { + $logger->info( + "print notice upload succeed for " . $opts{"event-def"} . + " " . $opts{"date"} . " (" . scalar(@$result) . " events)" + ); + print FH scalar(@$result) . + " event output(s) combined and uploaded as $remote_filename\n"; + close FH; + } + } + + $problem; +} + +main;