[prev in list] [next in list] [prev in thread] [next in thread] 

List:       fedora-directory-devel
Subject:    [389-devel] New Support Tool:  dseconv.pl (dse.ldif file parser)
From:       Mark Reynolds <mareynol () redhat ! com>
Date:       2012-02-06 21:52:18
Message-ID: 4F304B92.6050504 () redhat ! com
[Download RAW message or body]

Hi All,

This was a side project of mine for some time, and I just ported it to 
DS 389.  It basically parses the dse.ldif into a readable format.  It 
groups all the backend info together.  So each backend lists its own 
indexes, config, replication info, etc.  It checks for non default 
config settings as well.

It's basically a great way to take a quick look at a customers config:

Here is some sample output:

Reading 
/tmp/dse.ldif............................................................................................................



----------------------------------------------------------
  Config File Processing Statistics
----------------------------------------------------------

     Total Entries:      164
     Skipped Entries:    19
     ------------------------
     Processed Entries:  145


----------------------------------------------------------
  Cache Sizes
----------------------------------------------------------

     Total DB Cache:     9,765 Kb  (10000000 bytes)
     Total Entry Cache:  10,240 Kb  (10485760 bytes)
     --------------------------------------------------
     Total Cache Size:   19 Mb,  20,005 Kb,  (20485760 bytes)



----------------------------------------------------------
  Main Configuration
----------------------------------------------------------

      -> errorlog-level: 65536
     accesslog-logging-enabled: on
     accesslog-logrotationsync-enabled: off
     accesslog-logrotationsynchour: 0
     accesslog-logrotationsyncmin: 0
     accesslog-logrotationtime: 1
     accesslog-logrotationtimeunit: day
     accesslog-maxlogsize: 100
     accesslog-maxlogsperdir: 10
     accesslog-mode: 600
     accesslog: /var/log/dirsrv/slapd-localhost/access
     allow-anonymous-access: on
     allow-unauthenticated-binds: off
     auditlog-logging-enabled: on
     auditlog-logrotationtime: 1
     auditlog-logrotationtimeunit: day
     auditlog-maxlogsize: 100
     auditlog-mode: 600
     auditlog: /var/log/dirsrv/slapd-localhost/audit
     bakdir: /var/lib/dirsrv/slapd-localhost/bak
     certdir: /etc/dirsrv/slapd-localhost
     dn-validate-strict: off
     enquote-sup-oc: off
     errorlog-logging-enabled: on
     errorlog-logrotationsync-enabled: off
     errorlog-logrotationsynchour: 0
     errorlog-logrotationsyncmin: 0
     errorlog-logrotationtime: 1
     errorlog-logrotationtimeunit: week
     errorlog-maxlogsize: 100
     errorlog-maxlogsperdir: 2
     errorlog-mode: 600
     errorlog: /var/log/dirsrv/slapd-localhost/errors
     instancedir: /usr/lib64/dirsrv/slapd-localhost
     ldapifilepath: /var/run/slapd-localhost.socket
     ldapilisten: off
     ldifdir: /var/lib/dirsrv/slapd-localhost/ldif
     localhost: localhost.localdomain
     localssf: 71
     localuser: nobody
     lockdir: /var/lock/dirsrv/slapd-localhost
     max-filter-nest-level: 40
     maxdescriptors: 1024
     minssf: 0
     port: 389
     require-secure-binds: off
     return-exact-case: on
     rewrite-rfc1274: off
     rootdn: cn=dm
     rootpw: {SSHA}VBmupFhRJ90LC3YxnnD+rGTl8xYSPWqumGATiw==
     rundir: /var/run/dirsrv
     schemacheck: on
     schemadir: /etc/dirsrv/slapd-localhost/schema
     ssl-check-hostname: on
     syntaxcheck: on
     tmpdir: /tmp
     validate-cert: warn




----------------------------------------------------------
  LDBM Database Configuration
----------------------------------------------------------

     lookthroughlimit: 5000
     mode: 600
     idlistscanlimit: 4000
     directory: /var/lib/dirsrv/slapd-localhost/db
     dbcachesize: 10000000
     db-logdirectory: /var/lib/dirsrv/slapd-localhost/db
     db-durable-transaction: on
     db-checkpoint-interval: 60
     db-transaction-batch-val: 0
     db-logbuf-size: 0
     db-private-import-mem: on
     import-cache-autosize: -1
     import-cachesize: 20000000
     idl-switch: new
     search-bypass-filter-test: on
     search-use-vlv-index: on
     exclude-from-export: entrydn entryid dncomp parentid 
numSubordinates tombstonenumsubordinates entryusn
     serial-lock: on
     subtree-rename-switch: on
     pagedlookthroughlimit: 0
     pagedidlistscanlimit: 0




----------------------------------------------------------
  Backends (1)
----------------------------------------------------------


[1] "cn=userRoot"
-----------------

     suffix: dc=example,dc=com
     cachesize: -1
     cachememsize: 10485760
     readonly: off
     require-index: off
     directory: /var/lib/dirsrv/slapd-localhost/db/userRoot
     dncachememsize: 10485760

     Indexes:
          cn:  eq
          givenName:  pres eq sub
          mail:  pres eq sub
          mailAlternateAddress:  eq
          mailHost:  eq
          member:  eq
          memberOf:  eq
          ntUniqueId:  eq
          ntUserDomainId:  eq
          owner:  eq
          seeAlso:  eq
          sn:  pres eq sub
          telephoneNumber:  pres eq sub
          uid:  eq
          uniquemember:  eq
        * aci:  pres
        * entrydn:  subtree
        * entryrdn:  subtree
        * entryusn:  eq
                - nsMatchingRule: integerOrderingMatch

        * nscpEntryDN:  eq
        * nsds5ReplConflict:  eq pres
        * nsuniqueid:  eq
        * numsubordinates:  pres
        * objectclass:  eq
        * parentid:  eq


----------------------------------------------------------
  Plugins (72)
----------------------------------------------------------

     [72] "cn=SHA256,cn=Password Storage Schemes"
     --------------------------------------------
     pluginDescription: Secure Hashing Algorithm (SHA256)
     pluginEnabled: on
     pluginId: sha256-password-storage-scheme
     pluginInitfunc: sha256_pwd_storage_scheme_init
     pluginPath: libpwdstorage-plugin
     pluginType: pwdstoragescheme
     pluginVendor: 389 Project
     pluginVersion: 1.2.10.rc1.gita55c91e

...
...
...
...
...
     [1] "cn=ldbm database"
     ----------------------
     plugin-depends-on-type: Syntax
     plugin-depends-on-type: matchingRule
     pluginDescription: high-performance LDAP backend database plugin
     pluginEnabled: on
     pluginId: ldbm-backend
     pluginInitfunc: ldbm_back_init
     pluginPath: libback-ldbm
     pluginType: database
     pluginVendor: 389 Project
     pluginVersion: 1.2.10.rc1.gita55c91e


----------------------------------------------------------
  Last 25 Modified Entries
----------------------------------------------------------

[1]    Sun Feb  2 21:46:58 2012            cn=uniqueid generator,cn=config
[2]    Sun Jan 31 14:57:10 2012            
cn=description,cn=index,cn=userroot
[3]    Sun Jan 30 23:15:36 2012            cn=entrydn,cn=index,cn=userRoot
[4]    Sun Jan 27 18:10:54 2012            cn=cn,cn=index,cn=userRoot
[5]    Sun Jan 11 22:34:36 2012            cn=default instance 
config,cn=chaining database,cn=plugins,cn=config
[6]    Sun Jan 11 22:34:36 2012            cn=replication,cn=config
...
...
...


Please let me know if you find any bugs or have any RFE's

Enjoy,
Mark


["dseconv.pl" (application/x-perl)]

#!/usr/bin/perl 

########################################################
#  389 Directory Server Configuration File Parser (dse.ldif)
#
#  dseconv.pl  v1.1 
#
#  Written By:  Mark Reynolds (mreynolds@redhat.com)
#
########################################################

#############
#  Modules  #
#############

use POSIX qw (asctime);
#use MIME::Base64;

##########################
#  Initialize Variables  #
##########################

$version = "1.0";
$| = 1;
$count = "0";
# $outFile = "newDse.ldif";
$outfile = "";
$skipACI = "no";
$outFile = "";
$skipPlugin = "no";
$entries = "0";
$totalentries = 0;
@buff = [];
my $index = {};
$tt = "";
@buf = [];
my $backend = "";
$skipedEntries = "0";
$verbose = "no";
$showPlugin = "no";
$entryCache = "0";
$dbcache = "0";
$progressCount = "0";
$size = "25";


##################################
#  Define default config values  # 
##################################

#  cn=config

@defaultConfig = (
"accesslog-logging-enabled: on",
"accesslog-maxlogsperdir: 10",
"accesslog-maxlogsize: 100",
"accesslog-logrotationtime: 1",
"accesslog-logrotationtimeunit: day",
"accesslog-logrotationsync-enabled: off",
"accesslog-logrotationsynchour: 0",
"accesslog-logrotationsyncmin: 0",
"enquote-sup-oc: off",
"schemacheck: on",
"rewrite-rfc1274: off",
"return-exact-case: on",
"errorlog-logging-enabled: on",
"errorlog-maxlogsperdir: 2",
"errorlog-maxlogsize: 100",
"errorlog-logrotationtime: 1",
"errorlog-logrotationtimeunit: week",
"errorlog-logrotationsync-enabled: off",
"errorlog-logrotationsynchour: 0",
"errorlog-logrotationsyncmin: 0",
"maxdescriptors: 1024", 
"syntaxcheck: on",
"dn-validate-strict: off",
"ssl-check-hostname: on",
"validate-cert: warn",
"allow-unauthenticated-binds: off",
"require-secure-binds: off",
"allow-anonymous-access: on",
"ldapilisten: off",
"max-filter-nest-level: 40",
"minssf: 0"
);


@defaultIndex = (
"aci:  pres",
"entrydn:  eq",
"entrydn:  subtree",
"entryrdn:  subtree",
"entryusn:  eq",
"nscpentrydn:  eq",
"nsds5replconflict:  eq pres",
"nsuniqueid:  eq",
"numsubordinates:  pres",
"objectclass:  eq",
"parentid:  eq"
);

#  Ldbm Config

@defaultLdbmConfig = (

"lookthroughlimit: 5000",
"mode: 600",
"exclude-from-export: entrydn entryid dncomp parentid numSubordinates \
tombstonenumsubordinates entryusn", "idlistscanlimit: 4000",
"dbcachesize: 10000000",
"db-durable-transaction: on",
"db-checkpoint-interval: 60",
"db-transaction-batch-val: 0",
"db-logbuf-size: 0",
"db-private-import-mem: on",
"import-cache-autosize: -1",
"import-cachesize: 20000000",
"idl-switch: new",
"search-bypass-filter-test: on",
"search-use-vlv-index: on",
"serial-lock: on",
"subtree-rename-switch: on",
"pagedlookthroughlimit: 0",
"pagedidlistscanlimit: 0"
);


#  Backend Config

@defaultBackendConfig = (

"cachesize: -1",
"cachememsize: 10485760",
"readonly: off",
"dncachememsize: 10485760",
"require-index: off"
);

# default instance config - chaining

@defaultInstanceConfig = (
"nstransmittedcontrols: 2.16.840.1.113730.3.4.2",
"nstransmittedcontrols: 2.16.840.1.113730.3.4.9",
"nstransmittedcontrols: 1.2.840.113556.1.4.473",
"nstransmittedcontrols: 1.3.6.1.4.1.1466.29539.12"
);


################################
#  Grab the command line args  # 
################################

if ($#ARGV < 1){
	&displayUsage;
	exit(1);
}


while ($count <= $#ARGV){
        if ($ARGV[$count] eq "-f"){
                $filename = $ARGV[++$count];
        }
	elsif ($ARGV[$count] eq "-o"){
                $outFile = $ARGV[++$count];
                $usingFile = "1";
                open (OUTFILE,">$outFile") || die "Cannot open $outFile!\n";
                select OUTFILE;
        }
	elsif ($ARGV[$count] eq "-aci"){
		$skipACI = "yes";
	}
	elsif ($ARGV[$count] eq "-p"){
		$showPlugin = "yes";
	}
	elsif ($ARGV[$count] eq "-V"){
		$verbose = "yes";
	}
	elsif ($ARGV[$count] eq "-plugin"){
		$skipPlugin = "yes";
	}
	elsif ($ARGV[$count] eq "-s"){
		$size = $ARGV[++$count];
	}
	else {
                print "Invalid switch " . $ARGV[$count] . "\n";
                &displayUsage;
                exit(1);
        }

        $count++;
}


#
# if a outfile is not provided, then use stdout
#

if ($outFile eq ""){
	open(OUTFILE,">-");  
}


###################
#  Print  Header  #
###################

print OUTFILE "\n389 Configuration File Converter\n";
print OUTFILE "Version $version\n\n";

print OUTFILE "Reading $filename...";


###########################################################
#  Read in and process all the entries in the dse.ldif    #
###########################################################

$start = "0";
$full = "0";

open (LDIF,"$filename") || die "Could not open $filename!\n";

        while (<LDIF>){
		$_ =~ s/\r//g;  # remove control M's if any

                if (/^dn: / && $start > "0"){
                        @fullbuff = @buffer;
                        for ($i = 0; $i <= $#buffer; $i++) {$buffer[$i] = "";}
                        $full = "1";
                        $start = "0";
                        $buffer[$start] = $_;
                        $start++;
                }
                elsif (/^dn: / && $start eq "0"){
                        $buffer[$start] = $_;
                        $start++;       
                }
                else {
                        $buffer[$start] = $_;
                        $start++;
                }

                if ($full eq "1"){
                        $full = "0";
                        &processBuff(@fullbuff);
                }

		$progressCount++;
		if ($progressCount eq "20"){
			print STDOUT  ".";
			$progressCount = "0";
		}
        }

&processBuff(@buffer);
close (LDIF);
print "\n";


########################
#  Display the report  #
########################

print OUTFILE "\n\n";
print OUTFILE "----------------------------------------------------------\n";
print OUTFILE " Config File Processing Statistics\n";
print OUTFILE "----------------------------------------------------------\n";
print OUTFILE "\n";
print OUTFILE "\tTotal Entries:      $totalentries\n";
print OUTFILE "\tSkipped Entries:    $skipedEntries\n";
print OUTFILE "\t------------------------\n";
print OUTFILE "\tProcessed Entries:  $entries\n";


print OUTFILE "\n\n";
print OUTFILE "----------------------------------------------------------\n";
print OUTFILE " Cache Sizes\n";
print OUTFILE "----------------------------------------------------------\n\n";

# calcuate the caches 

$cache = $dbcache / 1024;
$cache =~ s/\..*//;

$kcache = $entryCache / 1024;
$kcache =~ s/\..*//;

$totalCache = $dbcache + $entryCache;
$tcache = $totalCache / 1024;
$tcache =~ s/\..*//;

if ($tcache < 1024){
        $megcache = "0";
} else {
	$megcache = $tcache / 1024;
	$megcache =~ s/\..*//;
}

if ($megcache > 1024){
	$gigcache = $megcache / 1024;
	$gigcache =~ s/\..*//;
#	if($gigcache =~ / *([0-9][0-9][0-9]\.[0-9][0-9])/){
#		$gigcache = $1;
#	}
	$yes_to_gig = 1;
}

print OUTFILE "\tTotal DB Cache:     " . commify($cache) . " Kb  ($dbcache bytes)\n";
print OUTFILE "\tTotal Entry Cache:  " . commify($kcache) . " Kb  ($entryCache \
bytes)\n"; print OUTFILE "\t--------------------------------------------------\n";
if ($yes_to_gig){
	print OUTFILE "\tTotal Cache Size:   " . commify($gigcache) . " Gb,  " . \
commify($megcache) . " Mb,  " . commify($tcache) . " Kb,  ($totalCache bytes)\n";   } \
else {  print OUTFILE "\tTotal Cache Size:   " . commify($megcache) . " Mb,  " . \
commify($tcache) . " Kb,  ($totalCache bytes)\n"; }
print OUTFILE "\n\n\n";


$arg = 0;
print OUTFILE "----------------------------------------------------------\n";
print OUTFILE " Main Configuration\n";
print OUTFILE "----------------------------------------------------------\n\n";

psort ("config");


print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
print OUTFILE " LDBM Database Configuration\n";
print OUTFILE "----------------------------------------------------------\n\n";

$arg = 0;
while($ldbmConfig{"ldbm database"}[$arg] && $ldbmConfig{"ldbm database"}[$arg] ne \
"\n"){  if ($ldbmConfig{"ldbm database"}[$arg] =~ m/^-> /){
                print OUTFILE "     " . $ldbmConfig{"ldbm database"}[$arg]  . "\n";
	} else {
		print OUTFILE "\t" . $ldbmConfig{"ldbm database"}[$arg] . "\n";
	}
	$arg++;
}


print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
print OUTFILE " Backends ($backendCount)\n";
print OUTFILE "----------------------------------------------------------\n\n\n";


foreach $bac (sort keys %ldbm){
	$dbac = "[$backendCount] \"$bac\"";
	print OUTFILE "[$backendCount] \"$bac\"\n";
	print OUTFILE "-" x length $dbac;
	print OUTFILE "\n\n";

	$backendCount--;
	$cc = 1;
	while ($ldbm{$bac}[$cc]){
		# grab the suffix name for later use
		if ($ldbm{$bac}[$cc] =~ /suffix: /i){
			$nbac = $ldbm{$bac}[$cc];
			$nbac =~ s/suffix: //i;
			$nbac =~ s/"//;
			$nbac = "cn=" . $nbac;
		}

		if ($ldbm{$bac}[$cc] =~ m/^-> /){
                	print OUTFILE "     " . $ldbm{$bac}[$cc] . "\n";
		} else {
			print OUTFILE "\t$ldbm{$bac}[$cc] \n";
		}
		$cc++;
	}

	$rbac = $nbac;

#
#
#  Don't forget to grab the backend and state from the mapping tree entry!!!!!
#
#

	print OUTFILE "\n\tIndexes: \n";
	foreach $keys (sort keys %index){
		if ($keys eq $bac){
			foreach $indexValue ( sort{ $a cmp $b} keys %{$index{$keys}}){
				print OUTFILE "\t   $indexValue\n";
			}
		}
	}

	# repl config

	$nnbac = $nbac;
	$nbac =~ s/\,.*//; 

	if ($replConfig{$bac} || $replConfig{$nbac} || $replConfig{$nnbac}){
		if ($replConfig{$nbac}{"replType"} ne ""){
			$rType = $replConfig{$nbac}{"replType"};
			delete ($replConfig{$nbac}{"replType"});
		}
		if ($replConfig{$bac}{"replType"} ne ""){      
                        $rType = $replConfig{$bac}{"replType"}; 
                        delete ($replConfig{$bac}{"replType"});        
                }
		if ($replConfig{$rbac}{"replType"} ne ""){
                        $rType = $replConfig{$rbac}{"replType"};
                        delete ($replConfig{$rbac}{"replType"});
                }

			
		print OUTFILE "\n\n\tReplication Configuration: (" . $rType . ")\n";

		foreach $repl (keys %replConfig){
			if ($repl eq $bac || $repl eq $nbac || $repl eq $rbac){
				foreach $replica (sort {$a cmp $b} keys %{$replConfig{$repl}}){
					print OUTFILE "\t   $replica\n";
				}
			}
		}
	}

	# repl agreements

	$rb = "0";
	$ok = "0";
	$rc = "1";

	foreach $replExist (sort keys %replAgr){
		if ($replExist =~ m/^$bac/i || $replExist =~ m/^$nbac/i || $replExist =~ \
m/^$rbac/i){  $ok = "1";
			$rb = $replExist;
			break;
		}
	}

	if ($ok eq "1"){
		$ok = "0";
		print OUTFILE "\n\n\tReplication Agreements\n";

		foreach $ragr (keys %replAgr){
			$ndn = $ragr;
			$ndn =~ s/---[0-9]+//;

			if ($ndn =~ /^$bac/i || $ndn =~ /^$nbac/i || $ndn =~ /^$rbac/i ){
				if ($replAgr{$ragr}{"Fractional"} eq "yes"){
					delete ($replAgr{$ragr}{"Fractional"});

					print OUTFILE "\n\t   [$rc] " .$replAgr{$ragr}{"dn"} . " (Fractional Replication \
                Agreement)" . "\n";
					print OUTFILE "\t   -"  .  "-" x length $replAgr{$ragr}{"dn"} . " (Fractional \
Replication Agreement)" . "--\n";  } else {
					delete ($replAgr{$ragr}{"Fractional"});
					print OUTFILE "\n\t   [$rc] " .$replAgr{$ragr}{"dn"} . "\n";
                        		print OUTFILE "\t   -"  .  "-" x length \
$replAgr{$ragr}{"dn"} . "--\n";  }

				delete ($replAgr{$ragr}{"dn"});
				$rc++;   
				
				foreach $agr ( sort {$a cmp $b}keys %{$replAgr{$ragr}}){
					print OUTFILE "\t   $agr\n";
				}
			}
		}
	} # end of repl stuff
			
	# VLV Stuff
	if ($vlvIndex{$bac} || $vlvIndex{$nbac} || $vlvIndex{$rbac}){
		print OUTFILE "\n\n\tVLV Indexes:\n";

		$vlvRunningCount = "0";
		$vlvRunningCount++;

		foreach $vlvI ( keys %vlvSearch){
			if ($vlvI eq $bac || $vlvI eq $nbac || $vlvI eq $rbac){
				# matched the backend, but which normalization of the backend name...

				if ($vlvI eq $bac){ $vlvBac = $bac;}
				if ($vlvI eq $nbac){ $vlvBac = $nbac;}
				if ($vlvI eq $rbac){ $vlvBac = $rbac;}
				

				foreach $vlvS ( sort {$a cmp $b} keys %{$vlvSearch{$vlvBac}}){

					if ($vlvSearch{$vlvBac}{$vlvS}{"parent"} eq "" ){
						$parentName = $vlvSearch{$vlvBac}{$vlvS}{"name"};

						print OUTFILE "\n\n\n\t   " . "[" . $vlvRunningCount . "]  \"cn=" . \
$vlvSearch{$vlvBac}{$vlvS}{"name"} . "\"\n";  $vlvRunningCount++;

						print OUTFILE "\t   " . "-" x length $vlvRunningCount . "]  \"cn=" . \
$vlvSearch{$vlvBac}{$vlvS}{"name"} . "\"\n";  print OUTFILE "\n";

						delete ($vlvSearch{$vlvBac}{$vlvS}{"name"});

						foreach $vlvAttr (sort keys %{$vlvSearch{$vlvBac}{$vlvS}}){
							print OUTFILE "\t\t        $vlvAttr\n";
						}

						# print its index/child entry
						foreach $vlvChild ( sort {$a cmp $b} keys %{$vlvIndex{$vlvBac}}){
							if ($vlvIndex{$vlvBac}{$vlvChild}{"parent"} eq $parentName){

                                                		delete \
($vlvIndex{$vlvBac}{$vlvChild}{"name"});  delete \
($vlvIndex{$vlvBac}{$vlvChild}{"parent"});

								foreach $vlvAttr (sort keys %{$vlvIndex{$vlvBac}{$vlvChild}}){
                                                        		print OUTFILE "\t\t        \
$vlvAttr\n";  }
							}
						}
					}
				} # end of foreach
			} # end of if
		} # end of foreach


	} #end of vlv Stuff

	

	print OUTFILE "\n\n";
} 


if($referOn eq "yes" || $showPlugin eq "yes"){

        print OUTFILE \
"\n\n\n\n----------------------------------------------------------\n";  print \
                OUTFILE " Referential Integrity Postoperation Plugin\n";
        print OUTFILE \
"----------------------------------------------------------\n\n";

	psort ("referint");

}

if ($change5 eq "1"){
	print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
  print OUTFILE " Changelog\n";
	print OUTFILE "----------------------------------------------------------\n\n";

	psort ("changelog");
}

print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
print OUTFILE " Encryption Configuration\n";
print OUTFILE "----------------------------------------------------------\n\n";

psort ("ssl");

if ($dse{"Password Policy"}){
print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
print OUTFILE " Password Policy\n";
print OUTFILE "----------------------------------------------------------\n\n";

	psort ("Password Policy");
}

#
#  Display all the plugins
#

if ($skipPlugin eq "no"){
print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
print OUTFILE " Plugins (" . $totalPlugins . ")\n";
print OUTFILE "----------------------------------------------------------\n\n";

foreach $plug (keys %plugins){
	$dplug = "[$totalPlugins]\"$plug\"";
	print OUTFILE "\t" . "[$totalPlugins] \"" . $plug . "\"" . "\n";
	print OUTFILE "\t" . "-" x length $dplug . "\n";
	$totalPlugins--;

	foreach $plugs ( sort {$a cmp $b} keys %{$plugins{$plug}}){
		print OUTFILE "\t" . $plugs . "\n";
	}
	print OUTFILE "\n\n";
}

}

#
#  Display the rest of the entries - if there are any
#

if ($verbose eq "yes" && $skipPlugin eq "no"){
	print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
  print OUTFILE " Other Config Entries ($otherCount)\n";
	print OUTFILE "----------------------------------------------------------\n\n";

	foreach $ot (keys %other){
		print OUTFILE "\t" . $ot . "\n";
		print OUTFILE "\t" . "-" x length $ot . "\n";
	
		foreach $oth ( sort {$a cmp $b}keys %{$other{$ot}}){
			print OUTFILE "\t" . $oth . "\n";
		}
		print OUTFILE "\n\n"
	}
	
}  


#
#  Diplsay the last 10 modified entries
#

	print OUTFILE "\n\n\n\n----------------------------------------------------------\n";
  print OUTFILE " Last $size Modified Entries\n";
	print OUTFILE "----------------------------------------------------------\n\n";
	
	$lcount = "1";

	foreach $lm ( sort { $lastmod{$b}{"lastmod"}  <=> $lastmod{$a}{"lastmod"}  } keys \
%lastmod){

		$mlc = "[$lcount]";
		$myTime = $lastmod{$lm}{"lastmod"};
		&getTimestring($myTime);

format OUTFILE = 
@<<<<  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   \
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 $mlc $convTime                $lm
.
write OUTFILE; 

		$lcount++;
		if ($lcount == $size + 1){
			last;
		}

	}
	

print OUTFILE "\n\n";
print STDOUT "\n";

exit;

#############
#  The End  #
#############




sub processBuff
{
 local @buf = @_;
 local $skipACI = $skipACI;
 &catLines;
 $i = 0;

 $totalentries++;
 $buff[$i] =~ s/, /,/g;

###########################
#  Skip unwanted entries  #
###########################

if ($verbose eq "no"){
	# skip the tasks
	if ($buff[$i] =~ m/cn=tasks,cn=config/){
		$skipedEntries++;
		return;
	}

	# skip the monitor stuff
	if ($buff[$i] =~ m/cn=monitor/){
		$skipedEntries++;
		return;
	}

	# skip the international features
	if ($buff[$i] =~ m/cn=internationalizatio/i && $buff[$i] =~ m/cn=features, \
cn=config/ ){  $skipedEntries++;
		return;
	}

	# skip main index entry
	if ($buff[$i] =~ m/^dn: cn=index/i){
		$skipedEntries++;
		return;
	}

	if ($buff[$i] eq "dn: cn=Password Storage Schemes,cn=plugins,cn=config"){
		$skipedEntries++;
                return;
        }
}

	$entries++;


#####################################
# Check and grab the cn=config args #
#####################################

	if ($buff[$i] eq "dn: cn=config"){

		$arg = 0;
		while($buff[$i]){
			$i++;  # move the buffer to the first line in cn=config

			if ($buff[$i] =~ m/^objectClass/i || 
			    $buff[$i] =~ m/^numsubordinates: /i || 
			    $buff[$i] =~ m/^creatorsName/i  ||
			    $buff[$i] =~ m/^modifiersName/i || 
			    $buff[$i] =~ m/^entrydn/i ||
			    $buff[$i] =~ m/^createTimestamp/i || 
		    	    $buff[$i] =~ m/^cn: /i ){

			
			} else {
				
				if ($buff[$i] =~ m/^modifytimestamp/i){
					$buff[$i] =~ s/modifytimestamp: //i;
					$buff =~ s/Z//;
					$lastmod{"cn=config"}{"lastmod"} = $buff[$i];
					next;
				}

				if ($skipACI eq "yes" && $buff[$i] =~ m/^aci: \(/i){  next;  }

				$buff[$i] =~ s/nsslapd-//;

				if ($buff[$i] ne ""){
                                        $result = checkDefault("config", $buff[$i]);

                                        if ($result eq "no"){
                                                $buff[$i] = "-> " . $buff[$i];
                                        }
                                }

				$dse{"config"}[$arg] = $buff[$i];
				$arg++;
			}
		}
		return;
	}

###########################################
#  grab the Referential Integrity Plugin  #
###########################################



	if ($buff[$i] =~ m/^dn: cn=referential integrity postoperation/i){
                $arg = 0;
		$dn = $buff[$i];
                while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i ||
			    $buff[$i] =~ m/^numsubordinates/i ||
                            $buff[$i] =~ m/^creatorsName/i ||
                            $buff[$i] =~ m/^cn: /i ||
                            $buff[$i] =~ m/^modifiersName/i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){
                        } else {
                                $buff[$i] =~ s/nsslapd-//;

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] = s/modifytimestamp: //i;
					$buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
					$lastmod{$dn}{"lastmod"} = $buff[$i];
					next;
				}

                                if ($skipACI eq "yes" && $buff[$i] =~ m/^aci: /i){ \
next;}  if ($skipSig eq "yes" && $buff[$i] =~ m/^ds-plugin/i){ next;}
				if ($buff[$i] =~ /pluginEnabled: off/i){
					$referOn = "off";
				}

                                $dse{"referint"}[$arg] = $buff[$i];
                                $arg++;
                        }
                }
                return;
        }


#####################################################################################################
 #  We need to grab all the backends and indexes before grabing the other plugins and \
other entries  # #####################################################################################################



        if ($buff[$i] eq "dn: cn=config,cn=ldbm database,cn=plugins,cn=config"){
		$arg = 0;
		while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i || 
                            $buff[$i] =~ m/^numsubordinates/i || 
                            $buff[$i] =~ m/^creatorsName/i || 
                            $buff[$i] =~ m/^modifiersName/i ||
			    $buff[$i] =~ m/^entrydn/i ||
			    $buff[$i] =~ m/^cn: /i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){
				} else {
				$buff[$i] =~ s/nsslapd-//;

				if ($buff[$i] =~ /dbcachesize: *([0-9]+)/i ){
					$dbcache = $dbcache + $1;
				}

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
					$buff[$i] =~ s/Z//;
					$lastmod{"cn=config,cn=ldbm database,cn=plugins,cn=config"}{"lastmod"} = \
$buff[$i];  next;	
				}

				# check for default value - if different flag attr/value

				if ($buff[$i] ne ""){
					$result = checkDefault("ldbm", $buff[$i]);

					if ($result eq "no"){
						$buff[$i] = "-> " . $buff[$i];
					}
				}


                                $ldbmConfig{"ldbm database"}[$arg] = $buff[$i];
                                $arg++;
                        }
                }
                return;
	}

	$tmp = ",cn=ldbm database,cn=plugins,cn=config";
	@buffOrig = @buff;

	if ($buff[$i] =~ m/$tmp/i ){
		$arg = 0;
		$dn = $buff[$i];
		$buff[$i] =~ s/,cn=ldbm database,cn=plugins,cn=config//;
		$buff[$i] =~ s/^dn: //;
		$entry = $buff[$i];
		if ($entry =~ m/,/ || $entry =~ m/cn=monitor/i){
			
		} else {
		$backendCount++;

		while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i || 
                            $buff[$i] =~ m/^numsubordinates/i || 
                            $buff[$i] =~ m/^creatorsName/i ||
                            $buff[$i] =~ m/^modifiersName/i ||
			    $buff[$i] =~ m/^entrydn/i ||
#			    $buff[$i] =~ m/^cn: /i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){
				} else {

				 if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
					next;
				}

				if ($buff[$i] =~ /nsslapd-cachememsize: *([0-9]+)/i ){
                                        $entryCache = $entryCache + $1;
                                }

				$buff[$i] =~ s/nsslapd-//;

                                if ($buff[$i] ne ""){
                                        $result = checkDefault("backend", $buff[$i]);

                                        if ($result eq "no"){
                                                $buff[$i] = "-> " . $buff[$i];
                                        }
                                }

				$ldbm{$entry} = $entry;
                                $ldbm{$entry}[$arg] = $buff[$i];
                                $arg++;
                        }
                }
                return;
		}
        }

	
	#  Grab the indexes for each backend
	

	if ($buff[$i] =~ m/,cn=index,/i ){ 
		$systemIndex = "no";
		$arg = 0;
		$dn = $buff[$i];
		# strip out unnecessary dn comps
		$buff[$i] =~ s/,cn=ldbm database,cn=plugins,cn=config//;
		$buff[$i] =~ s/,cn=index//;

		if ($buff[$i] =~ /cn= *([A-Z0-9]+)/i){
			$myindex = $1;
		}

		$buff[$i] =~ s/cn=$myindex,//;
		$backend = $buff[$i];
		$indexBuff = "";
		$indexOtherBuff = "";
		$indexTypeBuff = "";

		while($buff[$i]){
                        $i++; 
			if ($buff[$i] =~ m/^objectclass/i || 
                            $buff[$i] =~ m/^numsubordinates/i || 
                            $buff[$i] =~ m/^creatorsName/i ||
                            $buff[$i] =~ m/^modifiersName/i ||
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){
				} else {
				if ($buff[$i] =~ m/^nsSystemIndex: true/i){
					$systemIndex = "yes";
					next;
				}
				if ($buff[$i] =~ m/^nsSystemIndex: false/i){
                                        next;
                                }

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
                                        next;
                                }

				if ($buff[$i] =~ m/^cn: /i){
					$buff[$i] =~ s/^cn: //;
					$indexBuff = $indexBuff . "" . $buff[$i] ;
				} elsif ($buff[$i] =~ m/nsindextype: /i){
					if ($buff[$i] =~ /nsIndexType: *([a-z]+)/i){
						$type = $1;
					}
					$indexTypeBuff = $indexTypeBuff . " " .$type;
				} elsif ($buff[$i] ne "") {	
					$indexOtherBuff = $indexOtherBuff  . "\t\t- " . $buff[$i]. "\n";

				}
                        }
                }
		if ($systemIndex eq "yes"){
			$match = "no";
			$match = checkDefault("index",$indexBuff . ": " . $indexTypeBuff);
			if($match eq "yes"){
				$indexBuff = "* " . $indexBuff;
			} else {
				$indexBuff = "! " . $indexBuff;
			}
		} else {
			$indexBuff = "  " . $indexBuff;
		}

		if ($indexOtherBuff ne ""){
			$indexOtherBuff = "\n" . $indexOtherBuff;
		}

		$indexBuff = $indexBuff . ": " . $indexTypeBuff . $indexOtherBuff;

		if ($systemIndex eq "yes" && $match eq "no"){
			$indexBuff = $indexBuff . " --> Not Default Value";   
			$systemIndex = "no";
		}

		$index{$backend}{$indexBuff}++;
                return;
        }

	#
	#  Grab the vlv stuff
	#

@buff = @buffOrig;

	if ($buff[$i] =~ m/,cn=ldbm database,cn=plugins,cn=config/i){
		$vv = "0";
	
		# walk the entry and check for the vlv objectclasses
		
		for ($vv = 0; $buff[$vv] <= $#buff && $buff[$vv] ne ""; $vv++){
			if($buff[$vv] =~ /objectClass: vlvSearch/i || $buff[$vv] =~ /objectClass: \
vlvIndex/i){  $vlvCount++;
				$vlvParentName = "";
				$vlvIndexName = "";
				$vlvSrchName = "";
				$dn = $buff[$i];
				$buff[$i] =~ s/,cn=ldbm database,cn=plugins,cn=config//;
				$buff[$i] =~ s/^dn: //;

				# grab the vlv index or search name

				if($buff[$vv] =~ /objectClass: vlvSearch/i){
					if ($buff[$i] =~ /cn= *([A-Z0-9_ ]+)/i){
						$vlvSrchName = $1;
					}
					$buff[$i] =~ s/cn=$vlvSrchName,//i;

					$backend = $buff[$i];	
					$vlvSearch{$backend}{$vlvSrchName}{"name"} = $vlvSrchName;
				} else {
					if ($buff[$i] =~ /cn= *([A-Z0-9 _]+)/i){
                                                $vlvIndexName = $1;
                                        }
                                        $buff[$i] =~ s/cn=$vlvIndexName,//i;     

					if ($buff[$i] =~ /cn= *([A-Z0-9 _]+)/i){
                                                $vlvParentName = $1;
                                        }
					$buff[$i] =~ s/cn=$vlvParentName,//i;

                                        $backend = $buff[$i]; 
					$vlvIndex{$backend}{$vlvIndexName}{"name"} = $vlvIndexName;
				}
	
				# Process the Entry

				while($buff[$i]){
					if ($buff[$i] =~ m/^objectclass/i || 
                            			$buff[$i] =~ m/^numsubordinates/i || 
                           			$buff[$i] =~ m/^creatorsName/i ||
						$buff[$i] =~ m/^cn: /i ||
						$buff[$i] =~ m/^entrydn/i ||
                            			$buff[$i] =~ m/^modifiersName/i ||
                            			$buff[$i] =~ m/^createTimestamp/i )
					{ # do nothing   }
					} else { 
						if ($buff[$i] =~ m/^modifytimestamp/i){
                                        		$buff[$i] =~ s/modifytimestamp: //i;
                                        		$buff[$i] =~ s/Z//;
							$dn =~ s/^dn: //;
                                       			$lastmod{$dn}{"lastmod"} = $buff[$i];
							$i++;
                                        		next;
                                		}

						if ( $vlvIndexName ne "" && $buff[$i] =~ /^vlv/i ){
							$vlvIndex{$backend}{$vlvIndexName}{$buff[$i]}++;
							$vlvIndex{$backend}{$vlvIndexName}{"parent"} = $vlvParentName;
							
						}	

						if ($vlvSrchName ne "" && $buff[$i] =~ /^vlv/i ){
                                                        \
$vlvSearch{$backend}{$vlvSrchName}{$buff[$i]}++;

                                                }

				
					}  # end of else
					$i++;
				} # end of while
			} # end of vlv entry
		} # end of for
#	return;

	} # end of VLV stuff

	$buff[$i] =~ s/,cn=ldbm database,cn=plugins,cn=config//; # need to strip this to \
continue processing correctly



################################################
#  Grab the replication config and agreements  #
################################################

	if ($buff[$i] =~ m/^dn: cn=replica,/i ){
		$dn = $buff[$i];
		$buff[$i] =~ s/^dn: cn=replica,//i;
		$buff[$i] =~ s/,cn=mapping tree,cn=config//i;
		$replicaBackend = $buff[$i];

		# recontruct the mapping tree name to match the backend name


		$replicaBackend =~ s/^cn=//;
		$replicaBackend =~ s/\\,.*//i;
                $replicaBackend =~ s/^[a-z]*=//i;
		$replicaBackend =~ s/"//g;
		$replicaBackend = "cn=" . $replicaBackend;


		while($buff[$i]){
                        if ($buff[$i] =~ m/^objectclass/i || 
                            $buff[$i] =~ m/^numsubordinates/i || 
                            $buff[$i] =~ m/^creatorsName/i || 
                            $buff[$i] =~ m/^modifiersName/i || 
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^createTimestamp/i  
                            ){ } else {

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
					$i++;
                                        next;
                                }

				$buff[$i] =~ s/nsslapd-//i;
				$buff[$i] =~ s/nsDS5//i;
                                $replConfig{$replicaBackend}{$buff[$i]}++;
			
				#  Grab repl type info

				if ($buff[$i] =~ /Flags/i){
					$buff[$i] =~ s/Flags: //i;
					$flags = $buff[$i];
				}

				if ($buff[$i] =~ /replicaType/i){
					$replType = $buff[$i];
					$replType =~ s/ReplicaType: //i;
				}


                        }
			$i++;
                }

		# set the type:  Master, Hub, Consumer

                if ($flags eq "1" && $replType eq "2"){
                	$replConfig{$replicaBackend}{"replType"} = "Hub";
                } elsif ($replType eq "3"){
                        $replConfig{$replicaBackend}{"replType"} = "Master";
                } elsif ($replType eq "2" && $flags eq "0"){
                        $replConfig{$replicaBackend}{"replType"} = "Consumer";
                } else {
			$replConfig{$replicaBackend}{"replType"} = "Unknown";
		}

                return;
        }

	# replication agreements - don't forget to delete the hash element {}{"dn"} & \
{}{"count"}  #                          after printing it in the report

	if ($buff[$i] =~ m/,cn=replica,/i ){
		$dn = $buff[$i];
		if ($buff[$i] =~ /cn= *([a-z0-9\.\:]+)/i){
			$replName = $1;
		}

		$globalReplCount++;

		$buff[$i] =~ s/,cn=mapping tree,cn=config//i;
		$buff[$i] =~ s/dn: cn=$replName,cn=replica,//i;

		# recontruct the mapping tree name to match the backend name	

		$replBackend = $buff[$i];
		$replBackend =~ s/^cn=//;
		$replBackend =~ s/^[a-z]=//i;
		$replBackend =~ s/\\,.*//i;
		$replBackend =~ s/"//g;
		$replBackend =~ s/\\//g;
		$replBackend = "cn=" . $replBackend . "---" . $globalReplCount;

		$replAgr{$replBackend}{"dn"} = $replName;
		$replAgr{$replBackend}{"Fractional"} = "no";

		while($buff[$i]){
                        $i++;
                        if ($buff[$i] =~ m/^objectclass/i ||
                            $buff[$i] =~ m/^numsubordinates/i ||
                            $buff[$i] =~ m/^creatorsName/i ||
			    $buff[$i] =~ m/^cn: /i ||
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^modifiersName/i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){ } else {

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
                                        next;
                                }


                                $buff[$i] =~ s/nsslapd-//;
				$buff[$i] =~ s/nsDS5//;
                                $replAgr{$replBackend}{$buff[$i]}++;

				if ($buff[$i] =~ m/ds5PartialReplConfiguration/i){
					$replAgr{$replBackend}{"Fractional"} = "yes";
				}	
                        }
                }
                return;

	} 



#######################
#  Get the changelog  #
#######################

	if ($buff[$i] =~ m/dn: cn=changelog5,/i){
		$dn = $buff[$i];
		$arg = 0;
		$change5 = "1";
                while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i ||
                            $buff[$i] =~ m/^numsubordinates/i ||
                            $buff[$i] =~ m/^creatorsName/i ||
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^modifiersName/i ||
                            $buff[$i] =~ m/^cn: /i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){
                                } else {

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
                                        $lastmod{"cn=changelog5"}{"lastmod"} = \
$buff[$i];  next;
                                }

                                $buff[$i] =~ s/nsslapd-//;
                                $dse{"changelog"}[$arg] = $buff[$i];
                                $arg++;
                        }
                }
                return;
        }


#####################
#  Grab the plugins #
#####################
if ($skipPlugin eq "no"){
	if ($buff[$i] =~ m/,cn=plugins,cn=config/i){
		$dn = $buff[$i];
		$entry = $buff[$i];
		$dEntry = $entry ; $dEntry =~ s/^dn: //;
		$enabled = "on";
	
		# strip the DN down to the rdn
		$entry =~ s/,cn=plugins,cn=config//;
		$entry =~ s/^dn: //;

                while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i  || 
                            $buff[$i] =~ m/^numsubordinates/i || 
			    $buff[$i] =~ m/^cn: /i ||
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^creatorsName/i || 
                            $buff[$i] =~ m/^modifiersName/i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){ } else {

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
                                        next;
                                }

				$buff[$i] =~ s/nsslapd-//;
                                if ($skipACI = "yes" && $buff[$i] =~ m/^aci: /i){ \
next};  if ($skipSig eq "yes" && $buff[$i] =~ m/^ds-plugin/i){ next;}

				if ($buff[$i] =~ m/pluginEnabled: off/i){
                                        $enabled = "off";
                                } else {
					$enabled = "on";
				}	

                                $plugins{$entry}{$buff[$i]}++;
			}
		}

		# check for non default config - on or off
                if ($defaultPlugin{$dEntry}){
                        if ($defaultPlugin{$dEntry} ne $enabled){
                                $nonDefault{$dEntry}++;
				$nonDefault{$dEntry}{"option"} = $enabled;
                        }
                } else {
			$nonDefault{$dEntry}++;
                        $nonDefault{$dEntry}{"option"} = $enabled;
		}

		if ($enabled eq "off" && $showPlugin eq "no"){
                         delete ($plugins{$entry});
		} else {
			$totalPlugins++;
		}
		return;
	}

############################
#  Grab the other entries  # 
############################

	if ($buff[$i] =~ m/^dn: /i  && $buff[$i] =~ m/,cn=config/i ){
		$dn = $buff[$i];
		if ($buff[$i] =~ /^dn: /i ){
			$entry = $buff[$i];
			$entry =~ s/^dn: //i;	
		}

                while($buff[$i]){
                        $i++;  # move the buffer to the first line in cn=config

                        if ($buff[$i] =~ m/^objectclass/i || 
                            $buff[$i] =~ m/^numsubordinates/i || 
                            $buff[$i] =~ m/^creatorsName/i ||
			    $buff[$i] =~ m/^cn: /i ||
			    $buff[$i] =~ m/^entrydn/i ||
                            $buff[$i] =~ m/^modifiersName/i ||
                            $buff[$i] =~ m/^createTimestamp/i 
                            ){ } else {

				if ($buff[$i] =~ m/^modifytimestamp/i){
                                        $buff[$i] =~ s/modifytimestamp: //i;
                                        $buff[$i] =~ s/Z//;
					$dn =~ s/^dn: //;
                                        $lastmod{$dn}{"lastmod"} = $buff[$i];
                                        next;
                                }

				$buff[$i] =~ s/nsslapd-//;
                                if ($skipACI = "yes" && $buff[$i] =~ m/^aci: /i){ \
next; } 

                                $other{$entry}{$buff[$i]}++;
			}
		}
		$otherCount++;
		return;
	}
} # end of skipPlugins

} # end of process buff


#
#
#

sub catLines
{
 $catStart = "yes";
 $catCount = "0";

 for ($c = 0; $c <= $#buf; $c++){
  chomp($buf[$c]);
  if ($buf[$c] =~ m/^ / ){
        $buf[$c] =~ s/^ //;
        $base = $base . $buf[$c];
  } else {
        if ($catStart eq "yes"){
                $base = $buf[$c];
                $catStart = "no";

        } else {
                $buff[$catCount] = $base;
                $catCount++;
                $base = $buf[$c];
        }
  }
 }
 chomp($base);
 $buff[$catCount] = $base;
}


sub displayUsage {
	print  "dseconv.pl Usage:\n\n";
	print  "./dseconv.pl -f <dse.ldif> -o <new converted report> [-aci][-sig][-V] \n";
	print  "\n  -aci  -   Skip ACIs in report.\n";
	print  "  -plugin  -  Skips the plugin and misc entries.\n";
	print  "  -p  -  Displays all plugins - regardless if they are enabled.\n";
	print  "  -V  -  verbose - prints all entries\n";
	print  "  -s  -  size limit\n";
}


sub getTimestring {
	$year = substr($myTime,0,4);
	$mon = substr($myTime,4,2);
	$day = substr($myTime,6,2);
	$hour = substr($myTime,8,2);
	$min = substr($myTime,10,2);
	$sec = substr($myTime,12,2);

	$year -= 1900;
	$mon--;

	$convTime = asctime($sec,$min,$hour,$day,$mon,$year,0,0,0);
	$convTime =~ s/\n//;
}


sub commify {
        my $input = shift;
        $input = reverse $input;
        $input =~ s<(\d\d\d)(?=\d)(?!\d*\.)><$1,>g;
        return reverse $input;
}

sub checkDefault
{
	($section, $confValue) = @_;
	
	if ($section eq "index"){
		for ($ii = 0; $ii <= $#defaultIndex; $ii++){
			if (lc($confValue) eq $defaultIndex[$ii]){
				return "yes";
			}
		}
	}

	if ($section eq "config"){
		for ($ii = 0; $ii <= $#defaultConfig; $ii++){

			# also check for system specific attr/value and return match
			if ($confValue =~ m/^accesslog: /i ||
			    $confValue =~ m/^localhost: /i ||	
			    $confValue =~ m/^port: /i ||
			    $confValue =~ m/auditlog/i ||
			    $confValue =~ m/mode: 600/i ||
			    $confValue =~ m/dir: /i ||
			    $confValue =~ m/path: /i ||
			    $confValue =~ m/^errorlog: /i ||
			    $confValue =~ m/^auditlog: /i ||
			    $confValue =~ m/^aci: /i ||
			    $confValue =~ m/^rootdn: /i ||
			    $confValue =~ m/^localuser: /i ||
			    $confValue =~ m/localssf: /i ||
			    $confValue =~ m/^rootpw: /i ||
			    $confValue eq $defaultConfig[$ii] ||             #  this is the actaul match \
we want   $confValue =~ m/^auditlog-logging-enabled: /i ){

				return "yes";
			}
		}
	}

	if ($section eq "ldbm"){
		for ($ii = 0; $ii <= $#defaultLdbmConfig; $ii++){
			
			# also check for system specific attr/value and return match
			if ($confValue =~ m/^directory: /i ||
			    $confValue =~ m/^db-logdirectory: /i ||
			    $confValue =~ m/^db-home-directory: /i ||
			    $confValue eq $defaultLdbmConfig[$ii] ){

				return "yes";
			}
                }

	}

	if ($section eq "backend"){
		for ($ii = 0; $ii <= $#defaultBackendConfig; $ii++){
                        if ($confValue eq $defaultBackendConfig[$ii] ||
			  	$confValue =~ m/^suffix: /i ||
				$confValue =~ m/^directory: /i){

                                return "yes";
                        }
                }

	}

	return "no";
}


sub Hashvalue {
@{$dse{$a}} <=> @{$dse{$b}};
} #hashvalue


sub psort {
	my @a;
	$attrib=pop(@_);
	$arg=0;
	while ($dse{$attrib}[$arg] && $dse{$attrib}[$arg] ne "\n"){
		@a[$arg]=$dse{$attrib}[$arg];
		$arg++;
	}

	# sort and put back into hash
	@a=sort {$a cmp $b}(@a);
	$arg=0;
	while ($dse{$attrib}[$arg] && $dse{$attrib}[$arg] ne "\n"){
		$dse{$attrib}[$arg] = @a[$arg] ;
		$arg++;
	}

	# print array
	$arg=0;
	while ($dse{$attrib}[$arg] && $dse{$attrib}[$arg] ne "\n"){
		if ($dse{$attrib}[$arg] =~ m/^-> /){
			print OUTFILE "     " . $dse{$attrib}[$arg]  . "\n";
        	} else {
			print OUTFILE "\t" . $dse{$attrib}[$arg] ."\n" ;
		}
		$arg++;
	}
}


[Attachment #4 (text/plain)]

--
389-devel mailing list
389-devel@lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/389-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic