call Davolink_info for each available ip
[APKPM.git] / lib / APKPM / Poll.pm
1 package APKPM::Poll;
2
3 use base qw(Gearman::Driver::Worker);
4 use Moose;
5 use Time::HiRes;
6 use Data::Dump qw(dump);
7
8 with 'APKPM::Gearman::Client';
9 with 'APKPM::Gearman';
10
11 sub prefix { 'poll_' }
12
13 sub by_prefix : Job : MinProcesses(1) : MaxProcesses(1) : Encode(e_json) {
14         my ( $self, $job, $workload ) = @_;
15
16         my $entries = $self->do( 'LDAP_search' => "(&(cn=$workload*)(dhcpStatements=*))" );
17
18         my $ip_username;
19         foreach my $entry ( @$entries ) {
20                 $ip_username->{ $entry->{cn} } = $1 if $entry->{dhcpStatements} =~ m/fixed-address\s+(\S+)/;
21         }
22
23         my $taskset = $self->gc->new_task_set;
24         my $results;
25         while (my ($username,$ip) = each %$ip_username) {
26                 $taskset->add_task('poll_ip_username', "$ip $username", {
27                         on_complete => sub { push @$results, ${$_[0]} }
28                 });
29         }
30
31         warn "# wait";
32         $taskset->wait;
33
34         return { ldap => $ip_username, results => $results };
35 }
36
37 sub ip_username : Job : MinProcesses(1) : MaxProcesses(20) : Decode(d_array) : Encode(e_json) {
38         my ( $self, $job, $workload ) = @_;
39
40         my ( $ip, $username ) = @$workload;
41
42         return { error => "invalid workload", expected => "ip username" } unless $ip && $username;
43         my $ping = $self->do('ping', $ip);
44
45         if ( exists $ping->{error} ) {
46                 return $ping;
47         }
48
49         $ping->{username} = $username;
50         $self->do_background_json( 'Store_ping', $ping );
51
52         $self->do_background( 'Davolink_info', "$ip $username adsl" );
53
54         return $ping;
55 }
56
57 1;