X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=blobdiff_plain;f=scripts%2FRFID-JSONP-server.pl;h=06576d212a0b549fca0a8232539a7fc2819f4b13;hp=c5b07f7f61e529711aca1b3d4ab0238fa725e599;hb=4eac75a7fb5666f3ac4c2fe5259dcaf1fe769a34;hpb=431ef752883869816f880f431349bdab07728bc0 diff --git a/scripts/RFID-JSONP-server.pl b/scripts/RFID-JSONP-server.pl index c5b07f7..06576d2 100755 --- a/scripts/RFID-JSONP-server.pl +++ b/scripts/RFID-JSONP-server.pl @@ -19,23 +19,22 @@ use JSON::XS; use IO::Socket::INET; use LWP::UserAgent; use URI; +use URI::Escape; use POSIX qw(strftime); use Encode; -my $debug = 1; -my $listen = '127.0.0.1:9000'; -$listen = ':9000'; +my $debug = 0; +my $listen = $ENV{HTTP_LISTEN} || 'localhost:9000'; my $reader; -my $koha_url = 'http://ffzg.koha-dev.rot13.org:8080'; +my $koha_url = $ENV{KOHA_URL}; +warn "$koha_url"; # internal URL so we can find local address of machine and vmware NAT -my $rfid_url = 'http://rfid.koha-dev.vbz.ffzg.hr'; +my $rfid_url = $ENV{RFID_URL}; my $sip2 = { - server => '10.60.0.11:6002', # must be IP! -# user => 'sip2-user', -# password => 'sip2-passwd', - user => 'sip2user', - password => 'viva2koha', - loc => 'FFZG', + server => $ENV{SIP2_SERVER}, # '10.60.0.11:6002' must be IP! + user => $ENV{SIP2_USER}, + password => $ENV{SIP2_PASSWORD}, + loc => $ENV{SIP2_LOC}, }; my $afi = { secure => 0xDA, @@ -48,9 +47,10 @@ GetOptions( 'debug!' => \$debug, 'listen=s', => \$listen, 'reader=s', => \$reader, - 'koha=s', => \$koha_url, ) || die $!; +die "need KOHA_URL, eg. http://ffzg.koha-dev.rot13.org:8080" unless $koha_url; + our $rfid_sid_cache; sub rfid_borrower { @@ -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; @@ -193,8 +216,16 @@ sub http_server { } close($fh); } - } elsif ( $method =~ m{/scan} ) { - my @tags = $rfid->tags; + } elsif ( $method =~ m{/scan(/only/(.+))?} ) { + my $only = $2; + my @tags = $rfid->tags( reader => sub { + my $reader = shift; + return 1 unless $only; + if ( ref($reader) =~ m/$only/i ) { + return 1; + } + return 0; + }); my $json = { time => time() }; foreach my $tag ( @tags ) { my $hash = $rfid->to_hash( $tag ); @@ -285,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 ) { @@ -293,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; @@ -329,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); @@ -344,7 +386,7 @@ sub rfid_register { } } -rfid_register; +rfid_register if $rfid_url; http_server; __DATA__