зеркало из https://github.com/mozilla/pjs.git
280 строки
6.6 KiB
Perl
Executable File
280 строки
6.6 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
#
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
#
|
|
# The contents of this file are subject to the Mozilla Public License Version
|
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
# the License. You may obtain a copy of the License at
|
|
# http://www.mozilla.org/MPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
# for the specific language governing rights and limitations under the
|
|
# License.
|
|
#
|
|
# The Original Code is mozilla.org code.
|
|
#
|
|
# The Initial Developer of the Original Code is
|
|
# Netscape Communications Corporation.
|
|
# Portions created by the Initial Developer are Copyright (C) 1996-2003
|
|
# the Initial Developer. All Rights Reserved.
|
|
#
|
|
# Contributor(s):
|
|
# Mark Smith <MarkCSmithWork@aol.com>
|
|
#
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
# use your version of this file under the terms of the MPL, indicate your
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
# the provisions above, a recipient may use your version of this file under
|
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
#
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
#
|
|
# utc -- Perl 5 script that reads someone's directory entry and tries
|
|
# to go Up The Chain to get their manager's entry (based on the
|
|
# "manager" attribute).
|
|
#
|
|
# Requires: LDAPP (PerlLDAP)
|
|
#
|
|
# Usage: utc <searchstring>
|
|
#
|
|
|
|
use lib '/usr/local/packages/nsperl553/lib/nsPerl5.005_03/lib/site';
|
|
|
|
use Mozilla::LDAP::Conn;
|
|
|
|
|
|
# LDAP server information
|
|
$ldapbase = "dc=example,dc=com";
|
|
$ldaphost = "ldap.example.com";
|
|
$ldapport = "389";
|
|
|
|
# constants
|
|
$unknown = "???";
|
|
$separator = "\n";
|
|
$doRecurse = 1;
|
|
$noRecurse = 0;
|
|
$fillString = " ";
|
|
$attrManager = "manager";
|
|
@attrlist = ( "cn", "uid", "mail", "departmentnumber", "telephonenumber",
|
|
"roomnumber", "postaladdress", "ou", "title", "displayname",
|
|
"description", "labeleduri", $attrManager );
|
|
|
|
# Start of main:
|
|
|
|
# extract base part of this script's name and report usage errors
|
|
($progname) = $0 =~ /([^\/]+)$/;
|
|
usage( $progname ) if ($#ARGV == -1);
|
|
|
|
# open an anonymous connection to the LDAP server
|
|
$ldap = new Mozilla::LDAP::Conn( $ldaphost, $ldapport );
|
|
die "Unable to connect to server at ldap://$ldaphost:$ldapport\n" unless $ldap;
|
|
|
|
while ($#ARGV >= 0) {
|
|
$query = shift @ARGV;
|
|
utc( $ldap, $query );
|
|
}
|
|
|
|
# clean up
|
|
$ldap->close;
|
|
|
|
# End of main.
|
|
|
|
|
|
# Start of usage.
|
|
# Display program usage instructions.
|
|
sub
|
|
usage()
|
|
{
|
|
local( $prog )= @_;
|
|
print " usage: $prog querystring...\n";
|
|
print "example: $prog jimb\n";
|
|
exit 1;
|
|
}
|
|
# End of usage.
|
|
|
|
|
|
# Start of utc:
|
|
# given an LDAP connection and a query string, find a user and
|
|
# then traverse "up the chain"
|
|
sub
|
|
utc {
|
|
local( $ldap, $query ) = @_;
|
|
|
|
local( $entry, $i, @entrydns );
|
|
|
|
# form filter using query string
|
|
if ( $query =~ /^.*=.*/ ) {
|
|
$filter = $query;
|
|
} else {
|
|
$filter = "(&(objectClass=person)(|(sn=$query)(cn=$query)(uid=$query)))";
|
|
}
|
|
|
|
# search it
|
|
$entry = $ldap->search( $ldapbase, "subtree", $filter, 0, @attrlist );
|
|
|
|
# display results
|
|
if ( $entry ) {
|
|
$count = 0;
|
|
while ( $entry ) {
|
|
@entrydns[count] = $entry->{"dn"};
|
|
++$count;
|
|
$entry = $ldap->nextEntry;
|
|
|
|
}
|
|
|
|
if ( $count > 1 ) {
|
|
print $count, " entries matched '$query'\n";
|
|
} else {
|
|
print "One entry matched '$query'\n";
|
|
}
|
|
|
|
for ( $i = 0; $i < $count; ++$i ) {
|
|
readEntry( $ldap, @entrydns[i], $doRecurse, 1 );
|
|
}
|
|
} else {
|
|
print "No entries matched '$query'\n";
|
|
}
|
|
}
|
|
# End of utc.
|
|
|
|
|
|
# Start of readEntry:
|
|
# given a DN, read and display one LDAP entry
|
|
sub
|
|
readEntry {
|
|
local( $ldap, $dn, $recurse, $depth ) = @_;
|
|
|
|
local( $entry, $managerDN );
|
|
|
|
$entry = $ldap->search( $dn, "base", "objectclass=*", 0, @attrlist );
|
|
|
|
if ( $entry ) {
|
|
displayEntry( $entry, $depth );
|
|
if ( $recurse eq $doRecurse && $entry->{$attrManager} ) {
|
|
$managerDN = $entry->{$attrManager}[0];
|
|
# stop if a person is their own manager (!)
|
|
if ( $managerDN ne $dn ) {
|
|
readEntry( $ldap, $entry->{$attrManager}[0],
|
|
$recurse, $depth + 1 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
# End of readEntry.
|
|
|
|
|
|
# Start of displayEntry:
|
|
sub
|
|
displayEntry {
|
|
local( $entry, $depth ) = @_;
|
|
local( $value );
|
|
local( @attrs );
|
|
|
|
@attrs = ( "displayName", "cn" );
|
|
printf( "%*sLogin name: %-8s In real life: %s\n",
|
|
$depth, $fillString,
|
|
getSimpleValue( $entry, "uid" ),
|
|
getFirstValue( $entry, *attrs ));
|
|
|
|
printf( "%*sE-Mail: %-32s Phone: %s\n",
|
|
$depth, $fillString,
|
|
getSimpleValue( $entry, "mail" ),
|
|
getSimpleValue( $entry, "telephonenumber" ));
|
|
|
|
@attrs = ( "ou", "departmentnumber" );
|
|
printf( "%*sDepartment: %-32s Room: %s\n",
|
|
$depth, $fillString,
|
|
getFirstValue( $entry, *attrs ),
|
|
getSimpleValue( $entry, "roomnumber" ));
|
|
|
|
$value = getSimpleValue( $entry, "postaladdress" );
|
|
if ( $value ne $unknown ) {
|
|
printf( "%*sAddress: %s\n",
|
|
$depth, $fillString,
|
|
$value );
|
|
}
|
|
|
|
$value = getSimpleValue( $entry, "title" );
|
|
if ( $value ne $unknown ) {
|
|
printf( "%*sTitle: %s\n",
|
|
$depth, $fillString,
|
|
$value );
|
|
}
|
|
|
|
$value = getSimpleValue( $entry, "description" );
|
|
if ( $value ne $unknown ) {
|
|
printf( "%*sDescription: %s\n",
|
|
$depth, $fillString,
|
|
$value );
|
|
}
|
|
|
|
displayAllValues( $entry, "labeleduri", "URL: ", $depth );
|
|
|
|
printf( "%*sManager: %s\n",
|
|
$depth, $fillString,
|
|
getSimpleValue( $entry, "manager" ));
|
|
|
|
print $separator;
|
|
}
|
|
# End of displayEntry.
|
|
|
|
|
|
# Start of displayAllValues:
|
|
sub
|
|
displayAllValues {
|
|
local( $entry, $attr, $prefix, $indent ) = @_;
|
|
local( $value );
|
|
|
|
if ( $entry->{$attr} ) {
|
|
foreach $value (@{$entry->{$attr}}) {
|
|
printf( "%*s%s%s\n", $indent, $fillString,
|
|
$prefix, $value );
|
|
}
|
|
}
|
|
}
|
|
# End of displayAllValues.
|
|
|
|
# Start of getSimpleValue:
|
|
sub
|
|
getSimpleValue {
|
|
local( $entry, $attr ) = @_;
|
|
local( $value );
|
|
|
|
if ( $entry->{$attr} ) {
|
|
$value = $entry->{$attr}[0];
|
|
} else {
|
|
$value = $unknown;
|
|
}
|
|
|
|
$value;
|
|
}
|
|
# End of getSimpleValue.
|
|
|
|
# Start of getFirstValue:
|
|
sub
|
|
getFirstValue {
|
|
local( $entry, *attrs ) = @_;
|
|
local( $a );
|
|
local( $value );
|
|
|
|
$value = $unknown;
|
|
|
|
foreach $a (@attrs) {
|
|
$value = getSimpleValue( $entry, $a );
|
|
last if ( $value ne $unknown );
|
|
}
|
|
|
|
$value;
|
|
}
|
|
# End of getFirstValue.
|