3 use base qw(Gearman::Driver::Worker);
5 use Time::HiRes qw(time);
6 use Data::Dump qw(dump);
13 with 'APKPM::Gearman::Client';
14 with 'APKPM::Gearman';
18 sub poll : Job : Encode(e_json) {
19 my ( $self, $job, $workload ) = @_;
21 my $redis = Redis->new;
22 $redis->del( $_ ) foreach $redis->keys('CPE.*');
24 my $start = $self->datetime_now;
26 $redis->set( 'CPE.start' => $start );
28 my $entries = $self->do( 'LDAP_search' => "(&(cn=$workload*)(dhcpStatements=*))" );
30 my $taskset = $self->gc->new_task_set;
33 foreach my $entry ( @$entries ) {
35 my $username = $entry->{cn} || die "no cn in ", dump($entry);
37 if ( $entry->{dhcpStatements} !~ m/fixed-address\s+(\S+)/ ) {
38 $redis->sadd('CPE.error.no-ip' => $username);
43 if ( $entry->{dhcpOption} !~ m/vendor-class-identifier\s\"([^"]+)\"/ ) {
44 $redis->sadd('CPE.error.vendor' => $username);
50 $taskset->add_task('CPE_ping', "$ip $username $vendor", {
51 on_complete => sub { push @$results, ${$_[0]} }
53 $redis->sadd('CPE.queued' => $ip);
55 $vendor =~ s/\s+/_/g; # sadd dies on spaces in keys
56 $redis->sadd("CPE.vendor.$vendor" => $ip); # FIXME
62 my $finish = $self->datetime_now;
63 $redis->set( 'CPE.finish' => $finish );
66 foreach my $k ( $redis->keys('CPE.*') ) {
70 $poll->{$n} = eval { $redis->scard($k) } || $redis->get($k);
73 warn "# poll = ",dump $poll;
74 $self->do_background_json('Store_insert', { _table => 'CPE_poll', %$poll });
76 warn "# results = ", dump $results;
80 sub ping : Job : Decode(d_array) : Encode(e_json) {
81 my ( $self, $job, $workload ) = @_;
83 my ( $ip, $username, $vendor ) = @$workload;
85 my $redis = Redis->new;
87 return { error => "invalid workload", expected => "ip username" } unless $ip && $username;
89 my $p = Net::Ping->new;
92 my ( $ok, $rtt, $ping_ip ) = $p->ping( $ip );
95 $redis->sadd( 'CPE.ping.ok' => $ip );
97 $redis->sadd( 'CPE.ping.error' => $ip );
98 return { error => "ping $ip" };
101 $self->do_background_json( 'Store_insert', {
103 username => $username,
104 timestamp => $self->datetime_now,
109 if ( $vendor =~ m/SAMSUNG/ ) {
110 $redis->sadd( 'CPE.Davolink.queued' => $username );
111 $self->do( 'Davolink_info', "$ip $username adsl" );
112 } elsif ( $vendor =~ m/zte/ ) {
113 $redis->sadd( 'CPE.EasyGateway.queued' => $ip );
115 my $ret = eval { H1::EasyGateway->info( $ip ) };
119 $self->do_background_json( 'Store_insert', {
120 _table => 'easygateway',
122 username => delete $ret->{customerName},
123 timestamp => $self->datetime_now,
124 h => $self->to_hstore( $ret ),
127 $redis->sadd( 'CPE.EasyGateway.ok' => $ip );
130 $redis->sadd( 'CPE.EasyGateway.error' => $ip );
134 $redis->sadd( 'CPE.skipped' => $username );
137 return { ip => $ip, rtt => $rtt };