backporting redirect fixes: svn merge -r7995:7996 svn://svn.open-ils.org/ILS/trunk/
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 4 Nov 2007 22:35:50 +0000 (22:35 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 4 Nov 2007 22:35:50 +0000 (22:35 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_2@7997 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/examples/apache/startup.pl
Open-ILS/src/perlmods/OpenILS/WWW/Redirect.pm

index e20d9b5..1f730e8 100644 (file)
@@ -5,6 +5,15 @@ use OpenILS::WWW::AddedContent qw( /openils/conf/opensrf_core.xml );
 use OpenILS::Reporter::Proxy ('/openils/conf/opensrf_core.xml');
 
 
+# - Uncoment the following 2 lines to make use of the IP redirection code
+# - The IP file should to contain a map with the following format:
+# - actor.org_unit.shortname <start_ip> <end_ip>
+# - e.g.  LIB123 10.0.0.1 10.0.0.254
+
+#use OpenILS::WWW::Redirect qw(/openils/conf/opensrf_core.xml);
+#OpenILS::WWW::Redirect->parse_ips_file('/openils/conf/lib_ips.txt');
+
+
 
 1;
 
index 7c5fa42..5e3e1d3 100644 (file)
@@ -1,22 +1,21 @@
 package OpenILS::WWW::Redirect;
 use strict; use warnings;
-use Socket;
 
+use Socket;
 use Apache2 ();
 use Apache2::Log;
 use Apache2::Const -compile => qw(OK REDIRECT :log);
 use APR::Const    -compile => qw(:error SUCCESS);
-use Template;
 use Apache2::RequestRec ();
 use Apache2::RequestIO ();
 use CGI ();
 
 use OpenSRF::AppSession;
 use OpenSRF::System;
-use OpenILS::Utils::Fieldmapper;
 use OpenSRF::Utils::Logger qw/$logger/;
 
 use vars '$lib_ips_hash';
+my $lib_ips_hash;
 
 my $bootstrap_config_file;
 sub import {
@@ -28,6 +27,29 @@ sub init {
        OpenSRF::System->bootstrap_client( config_file => $bootstrap_config_file );
 }
 
+sub parse_ips_file {
+    my $class = shift;
+    my $ips_file = shift;
+
+    if( open(F, $ips_file) ) {
+
+       while( my $data = <F> ) {
+         chomp($data);
+
+         my( $shortname, $ip1, $ip2 ) = split(/\s+/, $data);
+         next unless ($shortname and $ip1 and $ip2);
+
+         $lib_ips_hash->{$shortname} = [] unless $lib_ips_hash->{$shortname};
+         push( @{$lib_ips_hash->{$shortname}}, [ $ip1, $ip2 ] );
+       }
+
+       close(F);
+
+    } else {
+        $logger->error("Unable to open lib IP redirector file $ips_file");
+    }
+}
+
 
 sub handler {
 
@@ -47,20 +69,16 @@ sub handler {
 
        $logger->debug("Apache client connecting from $user_ip");
 
-       if( my $lib_data = redirect_libs( $user_ip ) ) {
-               my $region = $lib_data->[0];
-               my $library = $lib_data->[1];
+       if(my $shortname = redirect_libs($user_ip)) {
 
-               $logger->info("Apache redirecting $user_ip to $region / $library");
+               $logger->info("Apache redirecting $user_ip to $shortname");
                my $session = OpenSRF::AppSession->create("open-ils.storage");
-               my $shortname = "$region-$library";
 
                my $org = $session->request(
                        "open-ils.storage.direct.actor.org_unit.search.shortname",
                         $shortname)->gather(1);
 
                if($org) { $url .= "?ol=" . $org->id; }
-
        }
 
        print "Location: $url\n\n"; 
@@ -73,26 +91,23 @@ sub redirect_libs {
        my $source_ip = shift;
        my $aton_binary = inet_aton( $source_ip );
 
-       if( ! $aton_binary ) { return 0; }
+    return 0 unless $aton_binary;
 
        # do this the linear way for now...
-       for my $reg (keys %$lib_ips_hash) {
-
-               for my $lib( keys %{$lib_ips_hash->{$reg}} ) {
-
-                       for my $block (@{$lib_ips_hash->{$reg}->{$lib}}) {
-
-                               if(defined($block->[0]) && defined($block->[1]) ) {
-                                       my $start_binary        = inet_aton( $block->[0] );
-                                       my $end_binary          = inet_aton( $block->[1] );
-                                       unless( $start_binary and $end_binary ) { next; }
-                                       if( $start_binary le $aton_binary and
-                                                       $end_binary ge $aton_binary ) {
-                                               return [ $reg, $lib ];
-                                       }
-                               }
-                       }
-               }
+       for my $shortname (keys %$lib_ips_hash) {
+
+        for my $block (@{$lib_ips_hash->{$shortname}}) {
+
+            if(defined($block->[0]) && defined($block->[1]) ) {
+                my $start_binary       = inet_aton( $block->[0] );
+                my $end_binary         = inet_aton( $block->[1] );
+                next unless( $start_binary and $end_binary );
+                if( $start_binary le $aton_binary and
+                        $end_binary ge $aton_binary ) {
+                    return $shortname;
+                }
+            }
+        }
        }
        return 0;
 }