[rt-users] Need LDAP scrip help: using a switch statement
Tim Wilson
twilson at buffalo.k12.mn.us
Tue Aug 21 17:26:21 EDT 2007
>>> On Tue, Aug 21, 2007 at 11:07 AM, in message
<806cdffb0708210907h4fc4912em8e3e56c4432a985e at mail.gmail.com>, "David Narayan"
<david.narayan at gmail.com> wrote:
> On 8/20/07, Tim Wilson <twilson at buffalo.k12.mn.us> wrote:
>> I'm trying to adapt the "set custom field with LDAP query" scrip example
>> from the RT book, and I'm stuck. I'm hoping someone has a suggestion. The
>> main problem, I'm afraid, is a lack of perl experience.
> Instead of using switch, try using a hash lookup. For example:
>
> my $ou = $entry- >get_value('ou');
>
> my %building_for = (
> 'DISTRICT SERVICES' => 'DO',
> 'HIGH SCHOOL' => 'HS',
> 'JEFFERSON' => 'JES',
> _DEFAULT_ => 'DO',
> );
>
> # Lookup building. If there was no LDAP entry, use the default
> my $building = $building_for{$ou} || $building_for{_DEFAULT_};
David,
Thanks for the suggestion. That approach seems very straightforward. Unfortunately, RT logs the following when the scrip is executed:
Aug 21 16:08:35 support RT: About to think about scrips for transaction #7940
Aug 21 16:08:36 support RT: Scrip 31 Commit failed: Can't call method "get_value" on an undefined value at (eval 1139) line 11. Stack: [(eval 1139):11] [/usr/local/rt3/lib/RT/ScripAction_Overlay.pm:240] [/usr/local/rt3/lib/RT/Scrip_Overlay.pm:505] [/usr/local/rt3/lib/RT/Scrips_Overlay.pm:193] [/usr/local/rt3/lib/RT/Transaction_Overlay.pm:179] [/usr/local/rt3/lib/RT/Record.pm:1444] [/usr/local/rt3/lib/RT/Ticket_Overlay.pm:744] [/usr/local/rt3/lib/RT/Interface/Email.pm:719] [/usr/local/rt3/share/html/REST/1.0/NoAuth/mail-gateway:59] (/usr/local/rt3/lib/RT/Action/UserDefined.pm:81)
Here's what I have my custom action cleanup code set to now (anonymized):
my $mail = ($self->TicketObj->RequestorAddresses)[0];
my $ldap = Net::LDAP->new( 'my.ldap.server' );
$ldap->bind;
# Do the LDAP search. Note: Our eDirectory server uses "mail" for the
# user's email address.
my $msg = $ldap->search( base => 'o=myOrg',
filter => '(mail=$mail)',
);
my $entry = $msg->entry(0);
my $ou = $entry->get_value('ou');
# Fix up the CF values based on LDAP results
my %building_for = (
'DISTRICT SERVICES' => 'DO',
'HIGH SCHOOL' => 'HS',
'JEFFERSON' => 'JES',
'_DEFAULT_' => 'DO',
);
my $building = $building_for{$ou} || $building_for{_DEFAULT_};
my $cf = RT::CustomField->new( $RT::SystemUser );
$cf->LoadByName( Name => 'Building' );
$self->TicketObj->AddCustomFieldValue( Field => $cf, Value => $building );
return 1;
It looks like the LDAP search is failing. I get this in my eDirectory logs:
(10.1.10.224:59620) (0x002b:0x63) Search request:
base: "o=myOrg"
scope: 2 dereference:2 sizelimit:0 timelimit:0 attrsonly:0
filter: "(mail=$mail)"
no attributes
So it appears that the contents of the $mail variable is not getting put into that LDAP search. If I hardcode the filter in the scrip with my email address then it works perfectly. The LDAP is retrieved, and the custom field gets set properly.
I took most of this code right from the RT book, and I don't understand why $mail isn't getting sent in the LDAP search. So I tried one more thing. I changed to the code to the following, creating the $filter variable in whole before passing it to the LDAP search:
my $filter = "(mail=$mail)";
my $msg = $ldap->search( base => 'o=myOrg',
filter => $filter,
);
This worked! Now... why?
-Tim
--
Tim Wilson, Director of Technology
Buffalo-Hanover-Montrose Schools
214 1st Ave NE Buffalo, MN 55313
ph: 763.682.8740 fax: 763.682.8743 http://www.buffalo.k12.mn.us
More information about the rt-users
mailing list