#!/bin/bash
#
# versione semplice ma inefficiente:
#
#ldapsearch -x -s sub -b "dc=labammsis" "objectClass=dir" | grep "^dn: " | cut -c5- | while read dirname ; do
#	SIZE=0
#	ldapsearch -x -b "$dirname" -s sub "objectClass=file" | grep "^fs: " | cut -c5- | ( while read dim ; do
#		SIZE=$[ $SIZE + $dim ]
#	done
#	echo -e "dn: $dirname\nfs: $SIZE" | ldapmodify -x -D "cn=admin,dc=labammsis" -w admin
#	)	
#done


# versione ricorsiva
export TOTAL=0
export BASE=${1:-"dc=labammsis"}
# come dire:
# if test "$1" then BASE=$1 else BASE="dc=labammsis"

# esploro il singolo livello dell'albero sotto $BASE
# filtrando per sicurezza in base all'objectClass

ldapsearch -x -s one -b "$BASE" '(|(objectClass=file)(objectClass=dir))' | grep "^dn: " | cut -c5- | (
        while read name ; do
		# estraggo i due attributi utili dalla entry
		# il sort -r mi garantisce che si mostri prima objectClass che esiste sempre
		# poi eventualmente fs che c'è solo per i file

		VALORI=`ldapsearch -x -s base -b "$name" | egrep -i "^(objectClass|fs): " | sort -r | awk '{ print $2 }'`
                CLS=`echo $VALORI | awk '{ print $1 }'`
                DIM=`echo $VALORI | awk '{ print $2 }'`

                if test "$CLS" = "dir" ; then
                        if test "$DIM" = "" || test "$DIM" -eq 0 ; then
				# se è una dir non esplorata in precedenza
				# invoco questo stesso script passando il suo DN come parametro
				# --> partirà un'esplorazione ricorsiva del sottoalbero 
				# e restituirà la dimensione totale

                                DIM=`$0 "$name"`
                        fi
                fi

		# giunto qui, DIM è:
		# o la dimensione di un file ("if test ..." era falso)
		# o la dimensione di una subdirectory calcolata per invocazione ricorsiva
		# comunque, la accumulo agli altri contributi di questo livello di entry

                TOTAL=$[ $TOTAL + $DIM ]
        done

	# aggiorno la entry corrispondente alla dir base passata originariamente come parametro
        echo -e "dn: $BASE\nchangetype: modify\nreplace: fs\nfs: $TOTAL" | ldapmodify -x -D "cn=admin,dc=labammsis" -w admin >&2

	# emetto la dimensione a beneficio di chi mi ha invocato (vedi la riga DIM=`$0 "$name"`)
        echo "$TOTAL"
)