store poll.* runtime data in redis
[APKPM.git] / lib / APKPM / Poll.pm
index e6f017a..040c726 100644 (file)
@@ -4,6 +4,7 @@ use base qw(Gearman::Driver::Worker);
 use Moose;
 use Time::HiRes;
 use Data::Dump qw(dump);
+use Redis;
 
 with 'APKPM::Gearman::Client';
 with 'APKPM::Gearman';
@@ -20,12 +21,16 @@ sub by_prefix : Job : MinProcesses(1) : MaxProcesses(1) : Encode(e_json) {
                $ip_username->{ $entry->{cn} } = $1 if $entry->{dhcpStatements} =~ m/fixed-address\s+(\S+)/;
        }
 
+       my $redis = Redis->new;
+       $redis->del( $_ ) foreach $redis->keys('poll.*');
+
        my $taskset = $self->gc->new_task_set;
        my $results;
        while (my ($username,$ip) = each %$ip_username) {
                $taskset->add_task('poll_ip_username', "$ip $username", {
                        on_complete => sub { push @$results, ${$_[0]} }
                });
+               $redis->sadd('poll.queued' => $ip);
        }
 
        warn "# wait";
@@ -42,8 +47,14 @@ sub ip_username : Job : MinProcesses(1) : MaxProcesses(25) : Decode(d_array) : E
        return { error => "invalid workload", expected => "ip username" } unless $ip && $username;
        my $ping = $self->do('ping', $ip);
 
+       my $redis = Redis->new;
+
        if ( exists $ping->{error} ) {
+warn "XXX error: $ip";
+               $redis->sadd( 'poll.ping.error' => $ip );
                return $ping;
+       } else {
+               $redis->sadd( 'poll.ping.ok' => $ip );
        }
 
        $ping->{username} = $username;