Perl Access
Stanford writes and maintains the Stanford::Directory Perl module. This module will maintain ticket files if you are using a keytab for access in addition to connecting to the directory service.
Full documentation of the Stanford::Directory module can be obtained by reading perldoc Stanford::Directory after installing the module The module is available on the timeshare cluster (cardinal.stanford.edu), and for use on the central web service. The module is also available as a debian package from the stanford repository.
Perl CGI script example
############################################################################## # Stanford::Directory CGI Example ############################################################################## use strict; use vars qw($DIR); use CGI qw(:standard); use Stanford::Directory; $DIR = new Stanford::Directory; $DIR->set (ldap_server => "ldap-prod.stanford.edu", mechanism => "GSSAPI", basedn => "cn=people,dc=stanford,dc=edu"); ############################################################################## # Main routine ############################################################################## print header, start_html; my %userinfo; my $person=$ENV{WEBAUTH_USER}; my @entries = $DIR->ldap_query ("(susearchid=$person)"); foreach my $entry (@entries) { foreach my $attr (keys (%{$entry})) { push @{$userinfo{$attr}}, @{$entry->{$attr}}; } } foreach my $attr (sort keys %userinfo) { print strong($attr), ": ", join (", ", @{$userinfo{$attr}}), br; } print end_html;
Interactive Perl Example
#!/usr/bin/perl ############################################################################## # Stanford Directory Example ############################################################################## use Stanford::Directory; use Getopt::Long; use Pod::Usage; use strict; our $opt_base; our $opt_debug; our $opt_help; our $opt_host; our $opt_manual; # Get options GetOptions('debug' => \$opt_debug, 'help' => \$opt_help, 'host=s' => \$opt_host, 'manual' => \$opt_manual); # Provide help pod2usage(-verbose => 0) unless $ARGV[0]; pod2usage(-verbose => 0) if $opt_help || $ARGV[0] eq 'help'; pod2usage(-verbose => 2) if $opt_manual || $ARGV[0] eq 'manual'; # Provide some defaults $opt_host = 'ldap-prod.stanford.edu' unless $opt_host; $opt_base = 'cn=people,dc=stanford,dc=edu' unless $opt_base; my $in = $ARGV[0]; my $dir = new Stanford::Directory; $dir->set(ldap_server => $opt_host, mechanism => "GSSAPI", basedn => $opt_base); my @filter = ("sn=$in", "cn=$in"); my @attrs = ('displayName'); if ($opt_debug) { print "Search parameters\n"; print "-----------------\n"; print "host: $opt_host\n"; print "base dn: $opt_base\n"; print "filters: ".join(', ', @filter)."\n"; print "attributes:".join(', ', @attrs)."\n"; } my %entries = $dir->ldap_query(\@filter, @attrs); if (!%entries) { if ($dir->error) { print "\n" . $dir->error_type . " Error:\n\n " . $dir->error . "\n\n"; } else { print "No match.\n"; } exit; } print "\n"; print "People with last names like '$in':\n"; foreach my $key (keys %entries) { foreach my $entry (@{$entries{$key}}) { print " ", $entry->displayname; print " (Key: $key)" if $opt_debug; print "\n"; } } exit; __END__ =head1 NAME stanford-directory-example =head1 SYNOPSIS stanford-directory-example name-fragment [--host=ldaphost] [--base=dn] [--help] [--manual] [--debug] =head1 DESCRIPTION This script accepts a name fragment and queries an ldap directory for matches to the commonName and surName attributes. =head1 OPTIONS AND ARGUMENTS =over 4 =item --host=hostname The name of an LDAP server. =item --base=dn The base distinguished name to use as a starting point for a subtree search of the directory. =item --debug Generate debugging messages. =item --help A short help message. =item --manual The complete documentation. =back =cut