generate _cpe_vendor and _cpe_parser fields in LDAP_search response
[APKPM.git] / lib / APKPM / LDAP.pm
1 package APKPM::LDAP;
2
3 use base qw(Gearman::Driver::Worker);
4 use Moose;
5 use Time::HiRes;
6 use Data::Dump qw(dump);
7 use Regexp::Common qw(net);
8
9 with 'APKPM::Config';
10 with 'APKPM::Gearman';
11
12 use Net::LDAP;
13
14 sub prefix { 'LDAP_' }
15
16 sub process_name {
17         my ( $self, $orig, $job_name ) = @_;
18         warn "# process_name $orig $job_name\n";
19         return "$orig ($job_name)";
20 }
21
22 sub search : Job : Encode(e_json) : MinProcesses(0) {
23         my ( $self, $job, $workload ) = @_;
24
25         my $filter =
26                 $workload =~ m/$RE{net}{IPv4}/ ? "dhcpStatements=fixed-address $workload" :
27                 $workload =~ m/\w+=/ ? $workload : # have filter specified
28                 "cn=*$workload*" ; # defailt: search for user
29         ;
30         warn "# search ",dump($filter);
31
32         my $ldap = Net::LDAP->new($self->config('ldaphost')) or die $@;
33         my $mesg = $ldap->bind($self->config('ldapusername'),Password => $self->config('ldappasswd'));
34 #       $mesg = $ldap->search(base => $self->config('ldapbase'), filter => $filter);
35         $mesg = $ldap->search(base => 'cn=clientnetVoD,cn=Dhcp,ou=Servers,dc=portus,dc=isp' , filter => $filter);
36         warn "# found ", $mesg->count, " entries";
37         my $entries = [];
38         for ( my $i = 0; $i < $mesg->count; $i++ ) {
39                 my $entry = $mesg->entry($i);
40                 my $e = { dn => $entry->dn };
41                 foreach my $attr ( $entry->attributes ) {
42                         $e->{$attr} = join("\n", $entry->get_value($attr));
43                         if ( $attr =~ m/dhcpOption/ ) {
44                                 my $vendor = (
45                                         grep { /vendor-class-identifier/ }
46                                         $entry->get_value($attr)
47                                 )[0];
48                                 $vendor =~ s/^\S+\s+\"([^"]+)\"/$1/;
49                                 $e->{_cpe_vendor} = $vendor;
50                                 $e->{_cpe_parser} =
51                                         $vendor =~ m/SAMSUNG/ ? 'Davolink' :
52                                         $vendor =~ m/zte/     ? 'EasyGateway' :
53                                         undef;
54                         }
55                 }
56                 push @$entries, $e;
57         }
58 #       warn "## entries = ",dump $entries;
59         return $entries;
60 }
61
62 1;