push more variables to koha
[Biblio-RFID.git] / scripts / RFID-JSONP-server.pl
index f363d42..06576d2 100755 (executable)
@@ -19,12 +19,12 @@ use JSON::XS;
 use IO::Socket::INET;
 use LWP::UserAgent;
 use URI;
+use URI::Escape;
 use POSIX qw(strftime);
 use Encode;
 
 my $debug = 0;
-my $listen = '127.0.0.1:9000';
-$listen = ':9000';
+my $listen = $ENV{HTTP_LISTEN} || 'localhost:9000';
 my $reader;
 my $koha_url = $ENV{KOHA_URL};
 warn "$koha_url";
@@ -77,14 +77,36 @@ sub rfid_borrower {
 }
 
 
+sub sip2_socket {
+
+       return $sip2->{sock} if exists $sip2->{sock} && $sip2->{sock}->connected;
+
+       if ( my $server = $sip2->{server} ) {
+               my $sock = $sip2->{sock} = IO::Socket::INET->new( $server ) || die "can't connect to $server: $!";
+               warn "SIP2 server ", $sock->peerhost, ":", $sock->peerport, "\n";
+
+               # login
+               if ( sip2_message("9300CN$sip2->{user}|CO$sip2->{password}|")->{fixed} !~ m/^941/ ) {
+                       die "SIP2 login failed";
+               }
+
+       }
+       return $sip2->{sock};
+}
+
 sub sip2_message {
        my $send = shift;
 
-       my $sock = $sip2->{sock} || die "no sip2 socket";
+       my $retry = 0;
+
+send_again:
+       my $sock = sip2_socket || die "no sip2 socket";
 
        local $/ = "\r";
 
        $send .= "\r" unless $send =~ m/\r$/;
+       $send .= "\n" unless $send =~ m/\n$/;
+
        warn "SIP2 >>>> ",dump($send), "\n";
        print $sock $send;
        $sock->flush;
@@ -92,13 +114,24 @@ sub sip2_message {
        my $expect = substr($send,0,2) | 0x01;
 
        my $in = <$sock>;
-       $in =~ s/^\n//;
        warn "SIP2 <<<< ",dump($in), "\n";
 
-       die "expected $expect" unless substr($in,0,2) != $expect;
-
+       $in =~ s/^\n//;
        $in =~ s/\r$//;
 
+       if ( ! $in ) {
+               $retry++;
+               warn "empty read from SIP server, retry: $retry\n";
+               if ( $retry < 10 ) {
+                       close( $sip2->{sock} );
+                       goto send_again;
+               }
+               die "aborted";
+       }
+
+
+       die "expected $expect" unless substr($in,0,2) != $expect;
+
        my $hash;
        if ( $in =~ s/^([0-9\s]+)// ) {
                $hash->{fixed} = $1;
@@ -113,16 +146,6 @@ sub sip2_message {
        return $hash;
 }
 
-if ( my $server = $sip2->{server} ) {
-       my $sock = $sip2->{sock} = IO::Socket::INET->new( $server ) || die "can't connect to $server: $!";
-       warn "SIP2 server ", $sock->peerhost, ":", $sock->peerport, "\n";
-
-       # login
-       if ( sip2_message("9300CN$sip2->{user}|CO$sip2->{password}|")->{fixed} !~ m/^941/ ) {
-               die "SIP2 login failed";
-       }
-
-}
 
 use lib 'lib';
 use Biblio::RFID::RFID501;
@@ -198,7 +221,7 @@ sub http_server {
                                my @tags = $rfid->tags( reader => sub {
                                        my $reader = shift;
                                        return 1 unless $only;
-                                       if ( ref $reader =~ m/\Q$only\E/i ) {
+                                       if ( ref($reader) =~ m/$only/i ) {
                                                return 1;
                                        }
                                        return 0;
@@ -293,7 +316,8 @@ sub http_server {
                                                $rfid->write_afi( $sid => chr( $afi->{secure} ) );
                                        }
                                } else {
-                                       print $client "HTTP/1.0 500 $method not implemented\r\n\r\n";
+                                       print $client "HTTP/1.0 501 $method not implemented\r\n\r\n";
+                                       warn "ERROR 501 $request\n";
                                }
 
                                if ( $hash ) {
@@ -301,11 +325,18 @@ sub http_server {
                                                encode_json( $hash );
                                }
 
+                       } elsif ( $method =~ m{/beep/(.*)} ) {
+                               my $error = uri_unescape($1);
+                               system "beep -f 800 -r 2 -l 100";
+                               print $client "HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n{ beep: '$error' }\n";
+                               print "BEEP $error\n";
                        } else {
                                print $client "HTTP/1.0 404 Unkown method\r\n\r\n";
+                               warn "ERROR 404 $request\n";
                        }
                } else {
                        print $client "HTTP/1.0 500 No method\r\n\r\n";
+                       warn "ERROR 500 $request\n";
                }
                close $client;
 
@@ -337,8 +368,11 @@ sub rfid_register {
 
        my $ua = LWP::UserAgent->new;
        my $url = URI->new( $rfid_url . '/register.pl');
-       $url->query_form(
-               local_ip => $ip->{eth0} || $ip->{ (keys %$ip)[0] },
+       $url->query_form( %$ip,
+               HTTP_LISTEN => $listen,
+               RFID_LISTEN => $ENV{RFID_LISTEN},
+               KOHA_URL => $koha_url,
+               RFID_URL => $rfid_url,
        );
        warn "GET ",$url->as_string;
        my $response = $ua->get($url);