JBAS-258 track KCLS print notice generator
authorBill Erickson <berickxx@gmail.com>
Fri, 16 Jan 2015 16:42:09 +0000 (11:42 -0500)
committerBill Erickson <berickxx@gmail.com>
Thu, 21 Mar 2019 19:46:23 +0000 (15:46 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
KCLS/utility-scripts/send-print-notices.pl [new file with mode: 0755]

diff --git a/KCLS/utility-scripts/send-print-notices.pl b/KCLS/utility-scripts/send-print-notices.pl
new file mode 100755 (executable)
index 0000000..2e93f8e
--- /dev/null
@@ -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 "<notices>\n";
+    print SAVE $_ for @$results;
+    print SAVE "</notices>\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;