Tiếp theo ta sẽ nói tới việc xóa các nội dung. Hàm delete ( ) yêu cầu một DN để xác định nội dung cần xóa. Hàm rmtree.pl chấp nhận DN từ dòng lệnh (ví dụ: rmtree.pl "ou=test,dc=plainjoe,dc=org") và xóa các cây tương ứng với DN đó.
Nên thực hiện các đoạn mã đó như thế nào? Tốt nhất là xóa các mục từ phía dưới cây đi lên. Việc này sẽ hạn chế việc để lại nội dung trống trong cây, vì ta xóa từ dưới lên thì không có node nào ở dưới phần ta xóa. Để thực hiện việc xóa từ dưới lên, dùng hàm chương trình con DeleteLdapTree( ), nó sẽ xóa một mục chỉ khi nào các mục con của mục đó đã được xóa.
#!/usr/bin/perl ##
## Usage: ./rmtree.pl DN
##
## Author: Gerald Carter <jerry@plainjoe.org> ##
use Net::LDAP;
#######################################################
## Perform a depth-first search on the $dn, deleting entries from the bottom up. ## Parameters: $handle (handle to Net::LDAP object)
## $dn (DN of entry to remove) sub DeleteLdapTree {
my ( $handle, $dn ) = @_; my ( $result ); my ( $result );
scope => one, filter => "(objectclass=*)" ); if ( $msg->code( ) ) { $msg->error( ); return; }
foreach $entry in ( $msg->all_entries ) { DeleteLdapTree( $handle, $entry->dn( ) ); }
$result = $handle->delete( $dn );
warn $result->error( ) if $result->code( );
print "Removed $dn\n";
return; }
Vòng lặp sẽ lặp lại tới khi nào xóa hết các mục cần thiết, nó là hàm đệ quy, gọi lại chính nó sau mỗi lần xóa.
Để thực hiện đoạn mã này, đầu tiên phải kết nối tới server thư mục và ràng buộc server như một người dùng đặc biệt với các đặc quyền thích hợp. Như vậy, đoạn code sẽ là:
## Connect and bind to the server.
$ldap = Net::LDAP->new ("ldap.plainjoe.org", port =>389, version => 3 )
or die $!;
## Secure data and credentials. $result = $ldap->start_tls( );
die $result->error( ) if $result->code( );
## Bind to the server. The account must have sufficient privileges because you will ## be adding new entries.
$result = $ldap->bind(
"cn=Directory Admin,ou=people,dc=plainjoe,dc=org", password => "secret");
die $result->error( ) if $result->code( );
Để thực hiện việc xóa, đoạn mã sẽ xác nhận DN trong command line có đúng trong thư mục hay không.
$msg = $ldap->search( base => $ARGV[0], scope => base,
filter => "(objectclass=*)" ); die $msg->error( ) if $msg->code( );
Khi đã chắc chắn các nội dung đã có sẵn, đoạn mã chỉ cần gọi chương trình con DeleteLdapTree( )
là xong.
DeleteLdapTree( $ldap, $ARGV[0] );
Sau khi cây con đã được xóa, đoạn mã ngắt kết nối và thoát:
$ldap->unbind( ); exit(0);