3 use base qw(Gearman::Driver::Worker);
6 use Data::Dump qw(dump);
7 use Regexp::Common qw(net);
10 with 'APKPM::Gearman';
15 sub prefix { 'LDAP_' }
18 my ( $self, $orig, $job_name ) = @_;
19 warn "# process_name $orig $job_name\n";
20 return "$orig ($job_name)";
23 sub search : Job : Encode(e_json) : MinProcesses(0) {
24 my ( $self, $job, $workload ) = @_;
27 $workload =~ m/$RE{net}{IPv4}/ ? "dhcpStatements=fixed-address $workload" :
28 $workload =~ m/\w+=/ ? $workload : # have filter specified
29 "cn=*$workload*" ; # defailt: search for user
31 warn "# search ",dump($filter);
33 my $ldap = Net::LDAP->new($self->config('ldaphost')) or die $@;
34 my $mesg = $ldap->bind($self->config('ldapusername'),Password => $self->config('ldappasswd'));
35 # $mesg = $ldap->search(base => $self->config('ldapbase'), filter => $filter);
36 $mesg = $ldap->search(base => 'cn=clientnetVoD,cn=Dhcp,ou=Servers,dc=portus,dc=isp' , filter => $filter);
37 warn "# found ", $mesg->count, " entries";
40 my $redis = Redis->new;
42 for ( my $i = 0; $i < $mesg->count; $i++ ) {
43 my $entry = $mesg->entry($i);
44 my $e = { dn => $entry->dn };
45 foreach my $attr ( $entry->attributes ) {
46 $e->{$attr} = join("\n", $entry->get_value($attr));
47 if ( $attr =~ m/dhcpOption/ ) {
49 grep { /vendor-class-identifier/ }
50 $entry->get_value($attr)
52 $vendor =~ s/^\S+\s+\"([^"]+)\"/$1/;
53 $e->{_cpe_vendor} = $vendor;
55 $vendor =~ m/SAMSUNG/ ? 'Davolink' :
56 $vendor =~ m/zte/ ? 'EasyGateway' :
61 $redis->set( 'LDAP.' . $e->{cn} => $self->e_json($e) );
63 # warn "## entries = ",dump $entries;