--- /dev/null
+package APKPM::LDAP;
+
+use base qw(Gearman::Driver::Worker);
+use Moose;
+use Time::HiRes;
+use JSON::XS;
+use Data::Dump qw(dump);
+
+with 'APKPM::Config';
+
+use Net::LDAP;
+
+sub prefix { 'LDAP_' }
+
+sub process_name {
+ my ( $self, $orig, $job_name ) = @_;
+ warn "# process_name $orig $job_name\n";
+ return "$orig ($job_name)";
+}
+
+sub search : Job : MinProcesses(1) : MaxProcesses(5) : Encode {
+ my ( $self, $job, $workload ) = @_;
+
+ my $filter = $workload =~ m/\d+\.\d+\.\d+\.\d+/ ?
+ "dhcpStatements=fixed-address $workload" :
+ "cn=$workload*"
+ ;
+ warn "# search ",dump($filter);
+
+ my $ldap = Net::LDAP->new($self->config('ldaphost')) or die $@;
+ my $mesg = $ldap->bind($self->config('ldapusername'),Password => $self->config('ldappasswd'));
+ $mesg = $ldap->search(base => $self->config('ldapbase'), filter => $filter);
+ warn "# found ", $mesg->count, " entries";
+ my $entries;
+ for ( my $i = 0; $i < $mesg->count; $i++ ) {
+ my $entry = $mesg->entry($i);
+ my $e = { dn => $entry->dn };
+ foreach my $attr ( $entry->attributes ) {
+ $e->{$attr} = join("\n", $entry->get_value($attr));
+ }
+ push @$entries, $e;
+ }
+# warn "## entries = ",dump $entries;
+ return $entries;
+}
+
+sub encode {
+ my ( $self, $result ) = @_;
+ my $json = JSON::XS::encode_json($result);
+ warn "## ", dump $json;
+ return $json;
+}
+
+1;
--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+use Test::More tests => 3;
+use Data::Dump qw(dump);
+
+use lib 'lib';
+
+use_ok 'APKPM::LDAP';
+
+ok my $o = APKPM::LDAP->new, 'new';
+
+my $login = $ENV{LOGIN} || 'ttest7';
+
+ok my $r = $o->search( 'job', $login ), "search $login";
+diag dump($r);
+
+my $ip = $ENV{IP} || '10.16.13.24';
+
+ok my $r = $o->search( 'job', $ip ), "search $ip";
+diag dump($r);