www.pudn.com > filecollector.rar > LDAP_API.pm


package LDAP_API;

###############################################################################
#
#  @(#) Perl Module:  LDAP_API
#
#  Copyright(C) 2002-2004 BOCO Inter-Telecom DC Team, All Rights Reserved
#
#  Author(s): JiaXiaoLong
#
#  Creation Date: 2003-02-22
#
#  Description: This is a perl library for get cofigure from ldap server (Sun Solaris 2.x)
#
#  LDAP TREE:
#	o=boco
#	   |_ou=ini
#		|__ou=NPM
#			|__ou=MD
#			      |__ou=001
#		|__ou=dsn
#			|__ou=coodkb2
#			|__ou=401
#		|__ou=MQ
#			|__ou=dc.q
#
#	$LDAP_NPM_BASE	="ou=NPM,ou=ini,o=boco"
#	$LDAP_SERVER	="10.0.190.200"
#
###############################################################################

use Data::Dumper;
use Net::LDAP;
use Net::LDAP::LDIF;

use Env qw(LDAP_SERVER LDAP_NPM_BASE LDAP_MD_BASE LDAP_DSN_BASE);

#######################################################################
#
# Function: New
#
# Input: no
#
# Output:  a handle of LDAP_API 
#
# Description: Create a object to LDAP_API.pm
#
#######################################################################

sub new {
	my ($pkg,$ip,$dn,$pwd) = @_;
        my $self={};
	$self->{'ldap_hdl'} = $pkg->Bind2LDAP($ip,$dn,$pwd);
        bless $self,$pkg;
        return undef if(!defined($self->{'ldap_hdl'}));
        $self;
}

#######################################################################
#
# Function: Bind2LDAP
#
# Input: no
#
# Output:  
#
# Description: Bind to LDAP Server
#
#######################################################################

sub Bind2LDAP {
	my ($pkg,$ip,$dn,$pwd) = @_;
	my $ldap_hdl;
	my $lrt;
	if(!defined($ip) and defined($LDAP_SERVER))
	{
		$ip = $LDAP_SERVER;
	}
	$ldap_hdl = Net::LDAP->new("$ip") or return undef;
	if(!defined($dn))
	{
		$lrt = $ldap_hdl->bind() or return undef;
	}
	else
	{
		$lrt = $ldap_hdl->bind(dn=>"$dn",password=>"$pwd") or return undef;
	}
	defined($lrt) || die "Err: LDAP bind fail !!!\n";
	$lrt->code && die "code error!!!\n";

	return($ldap_hdl);
}

#######################################################################
#
# Function: get_md_attr
#
# Input: no
#
# Output: md attribute
#
# Description: 
#
#######################################################################

sub get_md_attr {
	my ($pkg) = @_;
	my $ldap_hdl = $pkg->{'ldap_hdl'};
	
	my @ou_list = split /,/,$LDAP_MD_BASE;
	$ou_list[0] =~ /(\w+)=(\w+)/;
	my $md_attr_hash = $pkg->get_attr_by_DSN("$2",$LDAP_NPM_BASE);
	$md_attr_hash = $md_attr_hash->{$2};
	
	return ($md_attr_hash);
}

#######################################################################
#
# Function: get_mddb_attr
#
# Input: no
#
# Output: md attribute
#
# Description:
#
#######################################################################

sub get_mddb_attr {
	my ($pkg) = @_;

	my $md_attr = $pkg->get_md_attr();
	my $mddb_dsn = $md_attr->{'mddb_dsn'};
	my $mddb_hash = $pkg->get_attr_by_DSN("mddb");
	my $mddb_attr_hash = $mddb_hash->{$mddb_dsn};

	return ($mddb_attr_hash);
}

#######################################################################
#
# Function: get_attr_by_DSN
#
# Input: $dsn , $base_node
#
# Output: all attributes of $dsn_name  ( a hash_ref )
#
# Description: 
#
#######################################################################

sub get_attr_by_DSN {
	my ($pkg,$dsn,$base_node) = @_;

	if (!$base_node) {
		$base_node = $LDAP_DSN_BASE;
	};

	my @dsn = split /,/,$dsn;
	my $hash_ref;

	foreach my $dsn_name (@dsn) {
		#print "Now Search DSN: \nou= $dsn_name \nbase_node= $base_node ...\n\n";
		my $ldap_hdl = $pkg->{'ldap_hdl'};
		my $lrt = $ldap_hdl->search(
               		base    => $base_node,
               		scope   => "sub",
               		filter  => "(ou=$dsn_name)"
        	);
		defined($lrt) or die "Search $dsn_name fail !!\nPlease Chick it\n";
		$lrt->code && next;
		
		my $entry = $lrt->entry(0);
		if(!(defined $entry)) {
#			print "Not Find NE ... \n\n";
			return(0);
		}
		foreach my $attr ($entry->attributes) {
			#print $attr."\t\t\t".$entry->get_value($attr)."\n\n";
                	$hash_ref->{$dsn_name}->{$attr} = $entry->get_value($attr);
		}
        }
	if(!$hash_ref) {
#		print "Not Find NE ... \n\n";
	}
	return($hash_ref);
}

#######################################################################
#
# Function: get_attr_by_Filter
#
# Input: $dsn_filter , $base_node
#
# Output: all attributes of all DSN
#
# Description: 
#	$dsn_filter like "cookdb_obj_class=101 and related_ou=601" or "cookdb_obj_class=101 or related_ou=601" , But not "cookdb_obj_class=101 and related_ou=601 or atop_user=wnms#1".
#	Filter rule: and="&" , or="||" 
#
#######################################################################

sub get_attr_by_Filter {
	my ($pkg,$dsn_filter,$base_node) = @_;

	if (!$dsn_filter) {
		return (1);
	}
	if (!$base_node) {
                $base_node = $LDAP_DSN_BASE;
        };

	my $filters='';
	if ($dsn_filter =~ /\band\b/) {
		my @dsn_filter = split /and/,$dsn_filter;
		for (my $i=0;$i<@dsn_filter;$i++) {
			$dsn_filter[$i] =~ s/\s*//g;
			if ($i==@dsn_filter-1) {
				$filters .= "(".$dsn_filter[$i].")";
			}else {
				$filters .= "&(".$dsn_filter[$i].") ";
			}
		}
	}
	elsif ($dsn_filter =~ /\bor\b/) {
                my @dsn_filter = split /or/,$dsn_filter;
                for (my $i=0;$i<@dsn_filter;$i++) {
                        $dsn_filter[$i] =~ s/\s*//g;
                        if ($i==@dsn_filter-1) {
                                $filters .= "(".$dsn_filter[$i].")";
                        }else {
                                $filters .= "|(".$dsn_filter[$i].") ";
                        }
                }
        }
	else {
		$filters = $dsn_filter;
	}
        #print "\nNow Search DSN: \nFilter= $filters \nbase_node= $base_node ...\n\n";

        my $ldap_hdl = $pkg->{'ldap_hdl'};

        my $lrt = $ldap_hdl->search(
        	base    => $base_node,
        	scope   => "sub",
        	filter  => "$filters"
        );

        defined($lrt) or die "Search failed !!\nPlease Chick it\n";
        $lrt->code && die "Search DSN fail !!\n\n";

	my $hash_ref;
        my $entries = $lrt->{'entries'};
	if (!(defined $entries)) {
		print "Not Find NE ... \n\n";
		return(0);	
	}
	foreach my $entry (@$entries) {
		my ($ou_tmp,$hash_tmp);
        	foreach my $attr ($entry->attributes) {
        		#print $attr."\t\t\t".$entry->get_value($attr)."\n";
			if ($attr =~ /^ou$/) {
				$ou_tmp = $entry->get_value($attr);
			}
               		$hash_tmp->{$attr} = $entry->get_value($attr);
        	}
		$hash_ref->{$ou_tmp} = $hash_tmp;
	}

	if(!$hash_ref) {
		print "Not Find NE ... \n\n";
        }
	return ($hash_ref);
}

sub close {
	my ($pkg) = @_;
	my $ldap = $pkg->{'ldap_hdl'};
	$ldap->unbind;
	undef($pkg);
	return($pkg);
}
#======================================================================================================
# Function name	: add_entry
# Description	: add an entry to LDAP
# Input		: $entry_name
#		  $base_node
#		  %attr_hash	
# Return	: 0 : Fail
#		  1 : Success
# Latest Update	: 2003-03-21 10:00
#======================================================================================================
sub add_entry
{
	my ($this,$entry_name,$base_node,%attr_hash) = @_;
	my $ldap	= $this->{'ldap_hdl'};
	my $rc;
	$entry_name	= $entry_name.",".$base_node;
	$rc = $ldap->add(
			$entry_name,
		   	attr=>
			[
			'objectclass'=>'top',
			%attr_hash
			])|| warn "failed to add entry : $!"; 
	return 0 if !$rc;
	return 1;
}
#======================================================================================================
# Function name	: delete_entry
# Description	: delete an entry of LDAP
# Input		: $entry_name
#		  $base_node
# Return	: 0 : Fail
#		  1 : Success
# Latest Update	: 2003-03-21 10:00
#======================================================================================================
sub delete_entry
{
	my ($this,$entry_name,$base_node) = @_;
	my $ldap	= $this->{'ldap_hdl'};
	my $rc;
	$entry_name	= $entry_name.",".$base_node;
	$rc = $ldap->delete ($entry_name) || warn "failed to delete entry : $!"; 
	return 0 if !$rc;
	return 1;
}
#======================================================================================================
# Function name	: modify_attr
# Description	: modify attributes of specified entry
# Input		: $entry_name
#		  $base_node
#		  %attr_hash	
# Return	: 0 : Fail
#		  1 : Success
# Latest Update	: 2003-03-21 10:00
#======================================================================================================
sub modify_attr
{
	my ($this,$entry_name,$base_node,%attr_hash) = @_;
	my @attr_array	= keys(%attr_hash);
	my $ldap	= $this->{'ldap_hdl'};
	my $rc;
	$entry_name	= $entry_name.",".$base_node;
	$rc = $ldap->modify(	$entry_name,
				replace=>{%attr_hash}
			    )|| warn "failed to modify attribute : $!";
	return 0 if !$rc;
	return 1;
}
#======================================================================================================
# Function name	: add_attr
# Description	: add attributes to specified entry
# Input		: $entry_name
#		  $base_node
#		  %attr_hash	
# Return	: 0 : Fail
#		  1 : Success
# Latest Update	: 2003-03-21 10:00
#======================================================================================================
sub add_attr
{
	my ($this,$entry_name,$base_node,%attr_hash) = @_;
	my @attr_array	= keys(%attr_hash);
	my $ldap	= $this->{'ldap_hdl'};
	my $rc;
	$entry_name	= $entry_name.",".$base_node;
	$rc = $ldap->modify($entry_name,
			    add=>{%attr_hash}
			   )|| warn "failed to add attribute : $!";
	return 0 if !$rc;
	return 1;
}
#======================================================================================================
# Function name	: delete_attr
# Description	: delete attributes from specified entry
# Input		: $entry_name
#		  $base_node
#		  @attr_array
# Return	: 0 : Fail
#		  1 : Success
# Latest Update	: 2003-03-21 10:00
#======================================================================================================
sub delete_attr
{
	my ($this,$entry_name,$base_node,@attr_array) = @_;
	my $ldap	= $this->{'ldap_hdl'};
	my $rc;
	$entry_name	= $entry_name.",".$base_node;
	$rc = $ldap->modify(
				$entry_name,
				delete=>[@attr_array]
			   )|| warn "failed to add attribute : $!";
	return 0 if !$rc;
	return 1;
}

1;