Patch from Joe Atzberger to add a generic SendFile reactor. Can be used for sending...
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 18 Dec 2009 20:59:38 +0000 (20:59 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 18 Dec 2009 20:59:38 +0000 (20:59 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@15199 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Trigger/Reactor/SendFile.pm [new file with mode: 0644]
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/0120.data.reactor_SendFile.sql [new file with mode: 0644]

diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Reactor/SendFile.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Reactor/SendFile.pm
new file mode 100644 (file)
index 0000000..6a89da6
--- /dev/null
@@ -0,0 +1,101 @@
+package   OpenILS::Application::Trigger::Reactor::SendFile;
+use       OpenILS::Application::Trigger::Reactor;
+use base 'OpenILS::Application::Trigger::Reactor';
+
+# use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::Logger qw/:logger/;
+
+use Data::Dumper;
+use Net::uFTP;
+use File::Temp;
+
+$Data::Dumper::Indent = 0;
+
+use strict;
+use warnings;
+
+sub ABOUT {
+    return <<ABOUT;
+
+The SendFile Reactor Module attempts to transfer a file to a remote server.
+Net::uFTP is used, encapsulating the available options of SCP, FTP and SFTP.
+
+No default template is assumed, and all information is expected to be gathered
+by the Event Definition through event parameters:
+   ~ remote_host (required)
+   ~ remote_user
+   ~ remote_password
+   ~ remote_account
+   ~ type (FTP, SFTP or SCP -- default FTP)
+   ~ port
+   ~ debug
+
+The latter three are optionally passed to the Net::uFTP constructor.
+
+Note: none of the parameters are actually required, except remote_host.
+That is because remote_user, remote_password and remote_account can all be 
+extrapolated from other sources, as the Net::FTP docs describe:
+
+    If no arguments are given then Net::FTP uses the Net::Netrc package
+        to lookup the login information for the connected host.
+
+    If no information is found then a login of anonymous is used.
+
+    If no password is given and the login is anonymous then anonymous@
+        will be used for password.
+
+Note that specifying a password will require you to specify a user.
+Similarly, specifying an account requires both user and password.
+That is, there are no assumed defaults when the latter arguments are used.
+
+ABOUT
+}
+
+sub handler {
+    my $self = shift;
+    my $env  = shift;
+    my $params = $env->{params};
+
+    my $host = $params->{remote_host};
+    unless ($host) {
+        $logger->error("No remote_host specified in env");
+        return;
+    }
+
+    my %options = ();
+    foreach (qw/debug type port/) {
+        $options{$_} = $params->{$_} if $params->{$_};
+    }
+    my $ftp = Net::uFTP->new($host, %options);
+
+    # my $conf = OpenSRF::Utils::SettingsClient->new;
+    # $$env{something_hardcoded} = $conf->config_value('category', 'whatever');
+
+    my $text = $self->run_TT($env) or return;
+    my $tmp  = File::Temp->new();    # magical self-destructing tempfile
+    print $tmp $text;
+    $logger->info("SendFile Reactor: using tempfile $tmp");
+
+    my @login_args = ();
+    foreach (qw/remote_user remote_password remote_account/) {
+        push @login_args, $params->{$_} if $params->{$_};
+    }
+    unless ($ftp->login(@login_args)) {
+        $logger->error("SendFile Reactor: failed login to $host w/ args(" . join(',', @login_args) . ")");
+        return;
+    }
+
+    my @put_args = ($tmp);
+    push @put_args, $params->{remote_file} if $params->{remote_file};     # user can specify remote_file name, optionally
+    my $filename = $ftp->put(@put_args);
+    if ($filename) {
+        $logger->info("SendFile Reactor: successfully sent ${host} $filename");
+        return 1;
+    }
+
+    $logger->error("SendFile Reactor: put to $host failed with error: $!");
+    return;
+}
+
+1;
+
index ec33e7d..f25d101 100644 (file)
@@ -51,7 +51,7 @@ CREATE TABLE config.upgrade_log (
     install_date    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
 );
 
-INSERT INTO config.upgrade_log (version) VALUES ('0119'); -- miker
+INSERT INTO config.upgrade_log (version) VALUES ('0120'); -- atz
 
 CREATE TABLE config.bib_source (
        id              SERIAL  PRIMARY KEY,
index 096bc27..c938300 100644 (file)
@@ -2578,6 +2578,16 @@ INSERT INTO action_trigger.environment (event_def, path) VALUES
 
 INSERT INTO action_trigger.reactor (module,description) VALUES ('ApplyPatronPenalty','Applies the conifigured penalty to a patron.  Required named environment variables are "user", which refers to the user object, and "context_org", which refers to the org_unit object that acts as the focus for the penalty.');
 
+INSERT INTO action_trigger.reactor (module,description) VALUES
+(   'SendFile',
+    oils_i18n_gettext(
+        'SendFile',
+        'Build and transfer a file to a remote server.  Required parameter "remote_host" specifying target server.  Optional parameters: remote_user, remote_password, remote_account, port, type (FTP, SFTP or SCP), and debug.',
+        'atreact',
+        'description'
+    )
+);
+
 
 INSERT INTO config.org_unit_setting_type (name, label, description, datatype, fm_class)
     VALUES (
diff --git a/Open-ILS/src/sql/Pg/upgrade/0120.data.reactor_SendFile.sql b/Open-ILS/src/sql/Pg/upgrade/0120.data.reactor_SendFile.sql
new file mode 100644 (file)
index 0000000..b9b8cd0
--- /dev/null
@@ -0,0 +1,16 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0120'); -- atz
+
+INSERT INTO action_trigger.reactor (module,description) VALUES
+(   'SendFile',
+    oils_i18n_gettext(
+        'SendFile',
+        'Build and transfer a file to a remote server.  Required parameter "remote_host" specifying target server.  Optional parameters: remote_user, remote_password, remote_account, port, type (FTP, SFTP or SCP), and debug.',
+        'atreact',
+        'description'
+    )
+);
+
+COMMIT;
+