X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=scripts%2FRFID-JSONP-server.pl;h=b3533dab924ad4740c73b6730774b82873885fb6;hb=1f14208133b025b3605a2c9cbd0b96376cac8173;hp=76aa261324e0be3d42d7c2c38ac179de4fee4770;hpb=084dcb66aeddba6c77d3db06126b7bee5e44ad48;p=Biblio-RFID.git diff --git a/scripts/RFID-JSONP-server.pl b/scripts/RFID-JSONP-server.pl index 76aa261..b3533da 100755 --- a/scripts/RFID-JSONP-server.pl +++ b/scripts/RFID-JSONP-server.pl @@ -19,14 +19,27 @@ use JSON::XS; use IO::Socket::INET; use LWP::UserAgent; use URI; +use POSIX qw(strftime); +use Encode; -my $debug = 1; +my $debug = 0; my $listen = '127.0.0.1:9000'; $listen = ':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 => $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, + unsecure => 0xD7, +}; use Getopt::Long; @@ -34,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 { @@ -62,10 +76,59 @@ sub rfid_borrower { } } + +sub sip2_message { + my $send = shift; + + my $sock = $sip2->{sock} || die "no sip2 socket"; + + local $/ = "\r"; + + $send .= "\r" unless $send =~ m/\r$/; + warn "SIP2 >>>> ",dump($send), "\n"; + print $sock $send; + $sock->flush; + + 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/\r$//; + + my $hash; + if ( $in =~ s/^([0-9\s]+)// ) { + $hash->{fixed} = $1; + } + foreach ( split(/\|/, $in ) ) { + my ( $f, $v ) = ( $1, $2 ) if m/([A-Z]{2})(.+)/; + $hash->{$f} = decode('utf-8',$v); + } + + warn "# sip2 hash response ",dump($hash); + + 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; use Biblio::RFID::Reader; my $rfid = Biblio::RFID::Reader->new( shift @ARGV ); +$rfid->debug( $debug ); my $index_html; { @@ -119,7 +182,8 @@ sub http_server { my $size = -s $path; warn "static $path $size bytes\n"; my $content_type = 'text/plain'; - $content_type = 'application/javascript' if $path =~ /\.js/; + $content_type = 'application/javascript' if $path =~ /\.js$/; + $content_type = 'text/html' if $path =~ /\.html$/; print $client "HTTP/1.0 200 OK\r\nContent-Type: $content_type\r\nContent-Length: $size\r\n\r\n"; { local $/ = undef; @@ -165,7 +229,7 @@ sub http_server { warn "PROGRAM $tag $content\n"; $rfid->write_blocks( $tag => $content ); - $rfid->write_afi( $tag => chr( $param->{$p} =~ /^130/ ? 0xDA : 0xD7 ) ); + $rfid->write_afi( $tag => chr( $param->{$p} =~ /^130/ ? $afi->{secure} : $afi->{unsecure} ) ); } print $client "HTTP/1.0 $status $method\r\nLocation: $server_url\r\n\r\n"; @@ -193,6 +257,42 @@ sub http_server { print $client "HTTP/1.0 $status $method\r\nLocation: $server_url\r\n\r\n"; } + } elsif ( $method =~ m{/sip2/(\w+)/(.+)} ) { + my ( $method, $args ) = ( $1, $2 ); + warn "SIP2: $method [$args]"; + + my $ts = strftime('%Y%m%d %H%M%S', localtime()); + my $loc = $sip2->{loc} || die "missing sip->{loc}"; + my $password = $sip2->{password} || die "missing sip->{password}"; + + my $hash; + + if ( $method eq 'patron_info' ) { + my $patron = $args; + $hash = sip2_message("63000${ts} AO$loc|AA$patron|AC$password|"); + + } elsif ( $method eq 'checkout' ) { + my ($patron,$barcode,$sid) = split(/\//, $args, 3); + $hash = sip2_message("11YN${ts} AO$loc|AA$patron|AB$barcode|AC$password|BON|BIN|"); + if ( substr( $hash->{fixed}, 2, 1 ) == 1 ) { + $rfid->write_afi( $sid => chr( $afi->{unsecure} ) ); + } + + } elsif ( $method eq 'checkin' ) { + my ($patron,$barcode,$sid) = split(/\//, $args, 3); + $hash = sip2_message("09N${ts}${ts}AP|AO${loc}|AB$barcode|AC|BIN|"); + if ( substr( $hash->{fixed}, 2, 1 ) == 1 ) { + $rfid->write_afi( $sid => chr( $afi->{secure} ) ); + } + } else { + print $client "HTTP/1.0 500 $method not implemented\r\n\r\n"; + } + + if ( $hash ) { + print $client "HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n", + encode_json( $hash ); + } + } else { print $client "HTTP/1.0 404 Unkown method\r\n\r\n"; } @@ -203,6 +303,7 @@ sub http_server { }; # end of eval if ( $@ ) { + print $client "HTTP/1.0 500 Error\r\n\r\nContent-Type: text/plain\r\n$@"; warn "ERROR: $@"; } @@ -216,19 +317,20 @@ sub rfid_register { foreach ( split(/\n/, `ip addr` ) ) { if ( /^\d:\s(\w+):\s/ ) { - $ip->{last} = $1; + $ip->{_last} = $1; } elsif ( /^\s+inet\s((\d+)\.(\d+)\.(\d+)\.(\d+))\/(\d+)/ ) { - $ip->{ $ip->{last} } = $1; + $ip->{ $ip->{_last} } = $1; } else { - warn "# SKIP [$_]\n"; + #warn "# SKIP [$_]\n"; } - } + warn dump($ip); + my $ua = LWP::UserAgent->new; my $url = URI->new( $rfid_url . '/register.pl'); $url->query_form( - local_ip => $ip->{eth0}, + local_ip => $ip->{eth0} || $ip->{ (keys %$ip)[0] }, ); warn "GET ",$url->as_string; my $response = $ua->get($url); @@ -242,7 +344,7 @@ sub rfid_register { } } -rfid_register; +rfid_register if $rfid_url; http_server; __DATA__