show redis info
[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 use Redis;
14
15 sub prefix { 'LDAP_' }
16
17 sub process_name {
18         my ( $self, $orig, $job_name ) = @_;
19         warn "# process_name $orig $job_name\n";
20         return "$orig ($job_name)";
21 }
22
23 sub search : Job : Encode(e_json) : MinProcesses(0) {
24         my ( $self, $job, $workload ) = @_;
25
26         my $filter =
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
30         ;
31         warn "# search ",dump($filter);
32
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";
38         my $entries = [];
39
40         my $redis = Redis->new;
41
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/ ) {
48                                 my $vendor = (
49                                         grep { /vendor-class-identifier/ }
50                                         $entry->get_value($attr)
51                                 )[0];
52                                 $vendor =~ s/^\S+\s+\"([^"]+)\"/$1/;
53                                 $e->{_cpe_vendor} = $vendor;
54                                 $e->{_cpe_parser} =
55                                         $vendor =~ m/SAMSUNG/ ? 'Davolink' :
56                                         $vendor =~ m/zte/     ? 'EasyGateway' :
57                                         undef;
58                         }
59                 }
60                 push @$entries, $e;
61                 $redis->set( 'LDAP.' . $e->{cn} => $self->e_json($e) );
62         }
63 #       warn "## entries = ",dump $entries;
64         return $entries;
65 }
66
67 1;