>>> On Tue, Aug 21, 2007 at 11:07 AM, in message
<[EMAIL PROTECTED]>, "David Narayan"
<[EMAIL PROTECTED]> wrote:
> On 8/20/07, Tim Wilson <[EMAIL PROTECTED]> 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
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users
Community help: http://wiki.bestpractical.com
Commercial support: [EMAIL PROTECTED]
Discover RT's hidden secrets with RT Essentials from O'Reilly Media.
Buy a copy at http://rtbook.bestpractical.com