use Redis;
use Net::Ping;
+use lib 'lib';
+use H1::EasyGateway;
+use H1::Davolink;
+
with 'APKPM::Gearman::Client';
with 'APKPM::Gearman';
foreach my $entry ( @$entries ) {
- my $username = $entry->{cn};
+ my $username = $entry->{cn} || die "no cn in ", dump($entry);
if ( $entry->{dhcpStatements} !~ m/fixed-address\s+(\S+)/ ) {
$redis->sadd('CPE.error.no-ip' => $username);
my $vendor = $1;
- $taskset->add_task('CPE_ping', "$ip $username $vendor", {
+ $taskset->add_task('CPE_info', "$ip $username $vendor", {
on_complete => sub { push @$results, ${$_[0]} }
});
$redis->sadd('CPE.queued' => $ip);
- $redis->sadd("_CPE.$vendor" => $ip); # FIXME
+ $vendor =~ s/\s+/_/g; # sadd dies on spaces in keys
+ $redis->sadd("CPE.vendor.$vendor" => $ip); # FIXME
}
warn "# wait";
my $n = $k;
$n =~ s/^CPE\.//;
$n =~ s/\./_/g;
- $poll->{$n} = eval { $redis->scard($k) } || $redis->get($k);
+ $poll->{$n} = eval { $redis->scard($k) } || $redis->get($k) };
}
warn "# poll = ",dump $poll;
return $poll;
}
-sub ping : Job : Decode(d_array) : Encode(e_json) {
+sub info : Job : Decode(d_array) : Encode(e_json) {
my ( $self, $job, $workload ) = @_;
my ( $ip, $username, $vendor ) = @$workload;
});
if ( $vendor =~ m/SAMSUNG/ ) {
- $redis->sadd( 'CPE.vendor.SAMSUNG' => $username );
- $self->do_background( 'Davolink_info', "$ip $username adsl" );
+ $vendor = 'Davolink';
} elsif ( $vendor =~ m/zte/ ) {
- $redis->sadd( 'CPE.vendor.ZTE' => $username );
- $self->do_background( 'EasyGateway_info', $ip );
+ $vendor = 'EasyGateway';
} else {
- $redis->sadd( 'CPE.vendor.error' => $username );
+ $redis->sadd( 'CPE.skipped' => $username );
+ $vendor = undef;
+ }
+
+ if ( $vendor ) {
+ $redis->sadd( "CPE.$vendor.queued" => $ip );
+
+ my $module = 'H1::' . $vendor;
+ my $ret = eval { $module->info( $ip ) };
+
+ warn "# $module ",dump($ret);
+
+ if ( $ret ) {
+ $self->do_background_json( 'Store_insert', {
+ _table => $vendor,
+ ip => $ip,
+ username => $username,
+ timestamp => $self->datetime_now,
+ h => $self->to_hstore( $ret ),
+ });
+ $redis->sadd( "CPE.$vendor.ok" => $ip );
+ } else {
+ $redis->sadd( "CPE.$vendor.error" => $ip );
+ }
}
return { ip => $ip, rtt => $rtt };