[open-ils-commits] r13727 - trunk/Open-ILS/src/support-scripts (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Fri Jul 24 12:32:53 EDT 2009


Author: erickson
Date: 2009-07-24 12:32:49 -0400 (Fri, 24 Jul 2009)
New Revision: 13727

Added:
   trunk/Open-ILS/src/support-scripts/marc_stream_importer.pl
Log:
small net::server process to read MARC data from a raw socket and import the data into Evergreen.  It was originally designed for OCLC Connexion imports, but could be used to import MARC from any source

Added: trunk/Open-ILS/src/support-scripts/marc_stream_importer.pl
===================================================================
--- trunk/Open-ILS/src/support-scripts/marc_stream_importer.pl	                        (rev 0)
+++ trunk/Open-ILS/src/support-scripts/marc_stream_importer.pl	2009-07-24 16:32:49 UTC (rev 13727)
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+# Copyright (C) 2008 Equinox Software, Inc.
+# Author: Bill Erickson <erickson at esilibrary.com>
+#
+# This program 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.
+#
+# This program 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.
+
+# ----------------------------------------------------------------------------
+# WARNING:  This script provides no security layer.  Any client that has 
+# access to the server+port can inject MARC records into the system.  
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# marc_stream_importer.pl -- Import MARC records via bare socket connection
+#
+# Usage:
+# ./marc_stream_importer.pl /openils/conf/opensrf_core.xml \
+#   <eg_username> <eg_password> <bib_source> --port <port> --min_servers 2 \
+#   --max_servers 20 --log_file /openils/var/log/marc_net_importer.log &
+#
+# Note: this script has to be run in the same directory as $oils_header.pl
+# 
+
+# ----------------------------------------------------------------------------
+# To use this script with OCLC Connexion:
+#
+# Under Tools -> Options -> Export (tab)
+#   Create -> Choose Connection -> OK -> Leave translation at "None" 
+#       -> Create -> Create -> choose TCP/IP (internet) 
+#       -> Enter hostname and Port, leave 'Use Telnet Protocol' checked 
+#       -> Create/OK your way out of the dialogs
+#   Record Characteristics (button) -> Choose 'UTF-8 Unicode' for 
+#   the Character Set
+#
+# OCLC and Connexion are trademark/service marks of OCLC Online Computer 
+# Library Center, Inc.
+# ----------------------------------------------------------------------------
+
+use strict; use warnings;
+use Net::Server::PreFork;
+use base qw/Net::Server::PreFork/;
+use MARC::Record;
+use MARC::Batch;
+use MARC::File::XML;
+use MARC::File::USMARC;
+use OpenSRF::Utils::Logger qw/$logger/;
+require 'oils_header.pl';
+use vars qw/$apputils/;
+
+my $bufsize = 4096;
+my $wait_time = 5;
+my $osrf_config = shift;
+my $oils_username = shift;
+my $oils_password = shift;
+my $bib_source = shift;
+my $authtoken;
+
+print <<WARNING;
+
+WARNING:  This script provides no security layer.  Any client that has 
+access to the server+port can inject MARC records into the system.  
+
+WARNING
+
+$0 = 'Evergreen MARC Stream Listener';
+
+sub process_request {
+    my $self = shift;
+    my $socket = $self->{server}->{client};
+    my $data = '';
+    my $buf;
+
+    # Reading <STDIN> blocks until the client is closed.  Instead of waiting 
+    # for that, give each inbound record $wait_time seconds to fully arrive
+    # and pull the data directly from the socket
+    eval {
+        local $SIG{ALRM} = sub { die "alarm\n" }; 
+        alarm $wait_time;
+        while(my $n = $socket->sysread($buf, $bufsize)) {
+            $data .= $buf;
+        }
+        alarm 0;
+    };
+
+    my $handle;
+    open $handle, '<', \$data; 
+    my $batch = MARC::Batch->new('USMARC', $handle);
+    $batch->strict_off;
+
+    my $index = 0;
+    while(1) {
+
+        my $rec;
+        $index++;
+
+        eval { $rec = $batch->next; };
+
+        if($@) {
+            $logger->error("Failed parsing MARC record $index");
+            next;
+        }
+
+        last unless $rec;
+
+        my $resp = $apputils->simplereq(
+            'open-ils.cat', 
+            'open-ils.cat.biblio.record.xml.import',
+            $authtoken, 
+            $rec->as_xml_record, 
+            $bib_source
+        );
+
+        # has the session timed out?
+        if(oils_event_equals($resp, 'NO_SESSION')) {
+            set_auth_token();
+            my $resp = $apputils->simplereq(
+                'open-ils.cat', 
+                'open-ils.cat.biblio.record.xml.import',
+                $authtoken, 
+                $rec->as_xml_record, 
+                $bib_source
+            );
+            oils_event_die($resp);
+        } else {
+            oils_event_die($resp);
+        }
+    }
+}
+
+
+# the authtoken will timeout after the configured inactivity period.
+# When that happens, get a new one.
+sub set_auth_token {
+    $authtoken = oils_login($oils_username, $oils_password, 'staff') 
+        or die "Unable to login to Evergreen";
+}
+
+osrf_connect($osrf_config);
+set_auth_token();
+__PACKAGE__->run();
+


Property changes on: trunk/Open-ILS/src/support-scripts/marc_stream_importer.pl
___________________________________________________________________
Name: svn:mergeinfo
   + 



More information about the open-ils-commits mailing list