X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=13b34a64e6e31874343b20a952e68ebaac36680b;hb=3ce74f138c1d92a8de678baa759ac1150102cabe;hp=d01a9e833a41e2fd7c9e0e3af90e83b0755011e2;hpb=14e05c0a1e95b0cc66c8e1752fce4d3edc1b52e1;p=irspy-moved-to-github.git diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index d01a9e8..13b34a6 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.65 2007-02-23 13:14:13 mike Exp $ +# $Id: IRSpy.pm,v 1.68 2007-02-23 16:45:55 mike Exp $ package ZOOM::IRSpy; @@ -132,6 +132,15 @@ sub targets { } +sub find_targets { + my $this = shift(); + my($query) = @_; + + $this->{allrecords} = 0; + $this->{query} = $query; +} + + # Also used by ZOOM::IRSpy::Record sub _parse_target_string { my($target) = @_; @@ -179,7 +188,7 @@ sub initialise { # access point -- not even 1035 "everywhere" -- so instead we # hack together a search that we know will find all records. $this->{query} = "port=?*"; - } else { + } elsif ($this->{targets}) { # Prepopulate the target map with nulls so that after we fill # in what we can from the database query, we know which target # IDs we need new records for. @@ -192,6 +201,7 @@ sub initialise { my $rs = $this->{conn}->search(new ZOOM::Query::CQL($this->{query})); delete $this->{query}; # No longer needed at all $this->log("irspy_debug", "found ", $rs->size(), " target records"); + my $gatherTargets = !$this->{targets}; foreach my $i (1 .. $rs->size()) { my $target = _render_record($rs, $i-1, "id"); my $zeerex = _render_record($rs, $i-1, "zeerex"); @@ -199,7 +209,7 @@ sub initialise { $target2record{lc($target)} = new ZOOM::IRSpy::Record($this, $target, $zeerex); push @{ $this->{targets} }, $target - if $this->{allrecords}; + if $gatherTargets; } # Make records for targets not previously in the database @@ -364,6 +374,7 @@ sub check { } if (!defined $nextaddr) { $conn->log("irspy", "has no more tests: removing"); + ### Does this go wrong if two connections are exhausted? splice @conn, $i0, 1; $this->_rewrite_record($conn); $conn->option(rewrote_record => 1); @@ -397,10 +408,9 @@ sub check { $conn->current_task($task); $task->run(); } - - # Do we need to test $conn->is_idle()? I don't think so! } + NEXT_EVENT: my $i0 = ZOOM::event(\@conn); $this->log("irspy_event", "ZOOM_event(", scalar(@conn), " connections) = $i0"); @@ -421,31 +431,13 @@ sub check { my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); $conn->log("irspy_event", "event $ev ($evstr)"); + goto NEXT_EVENT if $ev != ZOOM::Event::ZEND; my $task = $conn->current_task(); die "$conn has no current task for event $ev ($evstr)" if !$task; - eval { $conn->_check() }; - if ($@ && - ($ev == ZOOM::Event::RECV_DATA || - $ev == ZOOM::Event::ZEND || - ($ev == ZOOM::Event::RECV_APDU && - !$task->isa("ZOOM::IRSpy::Task::Connect")))) { - # An error in, say, a search response, becomes visible to - # ZOOM before the Receive Data event is sent and persists - # until after the End, which means that successive events - # each report the same error. So we just ignore errors on - # "unimportant" events. We can also ignore errors on - # RECV_APDU in most cases, but since there is no RECV_INIT - # event, we need to avoid doing this if the task is - # Connect. Yuck -- special cases. - # ### But this doesn't work for, say, a Connection Refused, - # as the only event that shows us this error is the ZEND. - $conn->log("irspy_event", "ignoring error ", - "on event $ev ($evstr): $@"); - next; - } my $res; + eval { $conn->_check() }; if ($@) { my $sub = $task->{cb}->{exception}; die $@ if !defined $sub; @@ -492,7 +484,7 @@ sub check { $conn->log("irspy_test", "test skipped during task $task"); $conn->current_task(0); $conn->next_task(0); - # I think that's all we need to do + $nskipped++; } else { die "unknown callback return-value '$res'";