simple DSPAM search
[APKPM.git] / lib / APKPM / Poll.pm
index 040c726..ab30f71 100644 (file)
@@ -2,18 +2,25 @@ package APKPM::Poll;
 
 use base qw(Gearman::Driver::Worker);
 use Moose;
-use Time::HiRes;
+use Time::HiRes qw(time);
 use Data::Dump qw(dump);
 use Redis;
 
 with 'APKPM::Gearman::Client';
 with 'APKPM::Gearman';
 
-sub prefix { 'poll_' }
+sub prefix { '' }
 
-sub by_prefix : Job : MinProcesses(1) : MaxProcesses(1) : Encode(e_json) {
+sub poll_prefix : Job : Encode(e_json) {
        my ( $self, $job, $workload ) = @_;
 
+       my $redis = Redis->new;
+       $redis->del( $_ ) foreach $redis->keys('poll.*');
+
+       my $start = $self->datetime_now;
+
+       $redis->set( 'poll.start' => $start );
+
        my $entries = $self->do( 'LDAP_search' => "(&(cn=$workload*)(dhcpStatements=*))" );
 
        my $ip_username;
@@ -21,9 +28,6 @@ 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) {
@@ -36,10 +40,24 @@ sub by_prefix : Job : MinProcesses(1) : MaxProcesses(1) : Encode(e_json) {
        warn "# wait";
        $taskset->wait;
 
-       return { ldap => $ip_username, results => $results };
+       my $finish = $self->datetime_now;
+       $redis->set( 'poll.finish' => $finish );
+
+       my $poll;
+       foreach my $k ( $redis->keys('poll.*') ) {
+               my $n = $k;
+               $n =~ s/^poll\.//;
+               $n =~ s/\./_/g;
+               $poll->{$n} = eval { $redis->scard($k) } || $redis->get($k);
+       }
+
+       warn dump $poll;
+       $self->do_background_json('Store_insert', { _table => 'poll', %$poll });
+
+       return { ldap => $ip_username, results => $results, poll => $poll };
 }
 
-sub ip_username : Job : MinProcesses(1) : MaxProcesses(25) : Decode(d_array) : Encode(e_json) {
+sub poll_ip_username : Job : Decode(d_array) : Encode(e_json) {
        my ( $self, $job, $workload ) = @_;
 
        my ( $ip, $username ) = @$workload;
@@ -58,7 +76,13 @@ warn "XXX error: $ip";
        }
 
        $ping->{username} = $username;
-       $self->do_background_json( 'Store_ping', $ping );
+       $ping->{timestamp} = $self->datetime_now;
+       $self->do_background_json( 'Store_insert', {
+                _table => 'ping',
+               username => $username,
+               timestamp => $self->datetime_now,
+               %$ping
+       });
 
        $self->do_background( 'Davolink_info', "$ip $username adsl" );