!! Script for Edirectory Backup Based on our [Edirectory Backup Strategy], we use a scrip to perform the backups. The script will perform a FULL backup from both [DSBK] and [LDIF] on the value of variable "FULLBACKUPDOW". Every other day, an Incremental is performed. The LDIF [Incremental Backup] is done based on any entry defined by the variable "LDAPPEOPLEBASE" that was modified in the last day. The DSBK is a [Incremental Backup] as defined by Novell. The script is expected to run on a server with [eDirectory] is installed. The script can backup passwords to an LDIF by using [Dump Password Information Tool-Command Line Options] and setting the variable "PASSBKUP=TRUE". %%error [Use Entirely at Your Own Risk|Standard Disclaimer] [CISUS.COM] nor anyone else is responsible if you use a tool or any information on this site and causes damages to anyone or anything! [You are required to read Our Standard Disclaimer|Standard Disclaimer] %% !! Usage Of course you must modify this to meet your specific needs. {{{ #!/bin/bash # # SCRIPT: willeke-idv-edir-backup.sh # AUTHOR: jim@willeke.com # DATE: 01/03/11 15:04:32 T_VER=3.1B # Script Version Number # # PLATFORM: SPECIFY: Linux # # REQUIREMENTS: # - You must create the directories used in the script: # - You must be certain of the proper settings for the variables in the script. # - Assumes that eDirectory is installed on the server it runs. # # PURPOSE: # Performs a dsbk and an LDIF backup on the server which the script runs. # Does FULL and incremental # # REV LIST: # DATE: 03/06/11 08:12:02 # BY: jim@Willeke.com # MODIFICATION: Describe what was modified, new features, etc-- # # DATE: 2011-08-16-07:02:10 # BY: jim@Willeke.com # MODIFICATION: # Changed the backup directory to point to the san # From BACKUPDIR=/var/backups/edir # to: BACKUPDIR=/export/backups/idm/edir # Changed the backup directory to point to the san # From LOGDIR=/var/log/iam/edir # to: LOGDIR=/export/backups/idm/log # Commented out the Compression commands # Extracted variable DAYSTOKEEP so we could change the number of days to keep files. # Fixed minor bug where /var/backups/edir was hardcoded to use BACKUPDIR. # Changed T_VER=2.3B # DATE: 2011-08-28-07:36:52 # BY: jim@Willeke.com # MODIFICATION: # Added abiity to backup passwords based on PASSBKUP # # set -n # Uncomment to check script syntax, without execution. # # NOTE: Do not forget to put the # comment back in or # # the shell script will never execute! # set -x # Uncomment to debug this shell script # ########################################################## # DEFINE FILES AND VARIABLES HERE ########################################################## # These first values will need to be set or verified for each host. # path to eDIrectory bin directory defult is /opt/novell/eDirectory/bin BINDIR=/opt/novell/eDirectory/bin # Full path the the nds.conf config path # Default for single instances: CONFIGFILE=/etc/opt/novell/eDirectory/conf/nds.conf CONFIGFILE=/etc/opt/novell/eDirectory/conf/nds.conf # Username to access the application server USERNAME=admin.services.willeke.com # LDAP Format Backup User LDAPBACKUPUSER="cn=admin,ou=services,dc=willeke,dc=com" # Username to access the application server e.g. password PASSWORD=itisasecret # Put the backups under here BACKUPDIR=/var/opt/novell/eDirectory/backups # Put the logs files here LOGDIR=/var/opt/novell/eDirectory/backups # How long to allow for DSBK to run in seconds BACKUPPAUSE=100 # LDAP Format of People Container LDAPPEOPLEBASE="ou=people,dc=willeke,dc=com" # Day of week that is full backups FULLBACKUPDOW=Sunday # Maintain DAYSTOKEEP FILES DAYSTOKEEP=14 # Perform password backup PASSBKUP=TRUE # JAVA_HOME JAVA_HOME=/opt/novell/eDirectory/lib/nds-modules/jre1.6.0_20 # Path to dumpup/DumpPasswordInformation.jar DUMPUPPATH=/root/Documents/usr/local/share/willeke/dumpup ########################################################## # The following should not normally need to be changed ########################################################## THIS_SCRIPT=$(basename $0) SINGLEBAR="......................................................................" DOUBLEBAR="======================================================================" APPNAME=EDIRBACKUP TREENAME=UNKNOWN # Host name (or IP address) of application server e.g localhost APPHOST=localhost # Log File Name LOGFILE=$LOGDIR/$APPNAME.log # Set path so we know we always get the right executables PATH=/usr/local/bin:/usr/bin:/bin # Our Standard Date format for files DATE=`date +%Y-%m-%d` # Datestamp e.g 2002-09-21 # Get DOW DOW=`date +%A` # Day of the week e.g. Monday # Get DOM DOM=`date +%d` # Date of the Month e.g. 27 # Get Month Name M=`date +%B` # Month e.g January # GET WEEK NUMBER W=`date +%V` # Week Number e.g 37 # Create a LDAP formated date for yesterday LDAPDATELESSONE="$(date -d 'yesterday' +%Y%m%d)010000Z" ########################################################## # DEFINE FUNCTIONS HERE ########################################################## f_set_hostname() if [ "$APPHOST" = "localhost" ]; then APPHOST=`hostname` fi ########################################################## # Subroutine to gMake sure we have edirectory bin in path ########################################################## f_add_edir_path() if [ -f "$BINDIR/ndspath" ] then . $BINDIR/ndspath else f_write_and_log "WARNING: Could not find . $BINDIR/ndspath" fi ########################################################## # Subroutine to get tree name from CONFIGFILE ########################################################## f_get_treename_from_conf() { TREENAME=`cat $CONFIGFILE | grep "n4u.base.tree-name="|cut -d= -f2`; } ###################################################################### # Subroutine to Log to LOGFILE does not show to console ###################################################################### f_write_log () { if [ -n "$LOGFILE" -a -n "$*" ] then printf "$*\n" >> $LOGFILE fi } ###################################################################### # Sends output to console and to $LOGFILE ###################################################################### f_write_and_log () { if [ -n "$*" ] then f_write_log "$*" printf "$*\n" fi } ###################################################################### # Subroutine to echo & run command # Sends output to console and to $LOGFILE ###################################################################### f_cmd () # arg_1 = Command to run { f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'` $*" cmdOutput=`eval $*`; f_write_and_log "$cmdOutput" } ###################################################################### # Subroutine to remove files older than X days # Sends outpuit to console and to $LOGFILE ###################################################################### f_remove_old_files () { FILEEXTENSION=$2 DELETEFILEPATH=$1 f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Deleting '$DELETEFILEPATH/$FILEEXTENSION' files older than $DAYSTOKEEP days ..." find $DELETEFILEPATH/ -name '$FILEEXTENSION' -mtime +$DAYSTOKEEP >> /tmp/$THIS_SCRIPT.tmp cat /tmp/$THIS_SCRIPT.tmp | while read delfil do f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Deleting file ${delfil}" f_cmd rm ${delfil} done [[ -s /tmp/$THIS_SCRIPT.tmp ]] && { rm /tmp/$THIS_SCRIPT.tmp ;} } ###################################################################### # Subroutine be certain the required directories and files exist ###################################################################### f_checkfilelocations () { if [ ! -d "$BINDIR" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $BINDIR does not exist can not continue" exit 1 fi if [ ! -d "$BACKUPDIR" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $BACKUPDIR does not exist can not continue" exit 1 fi if [ ! -d "$LOGDIR" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $LOGDIR does not exist can not continue" exit 1 fi if [ ! -f "$CONFIGFILE" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $CONFIGFILE does not exist can not continue" exit 1 fi if [ ! -f "/etc/dsbk.conf" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: /etc/dsbk.conf does not exist can not continue" exit 1 fi if [ $PASSBKUP='TRUE' ] then if [ ! -d "$JAVA_HOME" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $JAVA_HOME does not exist can not continue" exit 1 fi if [ ! -d "$DUMPUPPATH" ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: $DUMPUPPATH does not exist can not continue" exit 1 fi fi tcommand=`cat /etc/dsbk.conf` if [ ! -f "$tcommand" ] then `touch $tcommand` fi f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Found required config files and Directories" } ###################################################################### # Subroutine watch file to see if it changes ###################################################################### f_wait_for_no_mods_on_file () { MYCHECKFILE=$1 # Check to see if backup is complete sleep 10 i=`ls -l $MYCHECKFILE | cut -d' ' -f6` sleep 10 i2=`ls -l $MYCHECKFILE | cut -d' ' -f6` while [ $i -ne $i2 ] do sleep 60 i=`ls -l $MYCHECKFILE | cut -d' ' -f6` sleep 60 i2=`ls -l $MYCHECKFILE | cut -d' ' -f6` done } ###################################################################### # Subroutine to dump passwords ###################################################################### f_dump_passwords () { if [ $PASSBKUP='TRUE' ] then f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Captureing Passwords " WHEREIAM=`pwd` $JAVA_HOME/bin/java -jar $DUMPUPPATH/DumpPasswordInformation.jar -dvAL -h 192.168.1.7 -z 30000 -Z tls -D $LDAPBACKUPUSER -w $PASSWORD -b $LDAPPEOPLEBASE >/dev/null # Put the password ldif file in the correct place. mv $WHEREIAM/dumppasswordinformation.ldif $BACKUPDIR/dumppasswordinformation.ldif # add the output to the current log file cat $WHEREIAM/warn.log >> $LOGFILE # remove all the log files for passwords rm $WHEREIAM/debug.log rm $WHEREIAM/warn.log rm $WHEREIAM/error.log rm $WHEREIAM/output.log else f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Captureing Passwords not enabled!" fi } ########################################################## # BEGINNING OF MAIN ########################################################## f_set_hostname f_add_edir_path f_get_treename_from_conf if [ $DOW = "$FULLBACKUPDOW" ]; then BACKUPTYPE=FULL else BACKUPTYPE=INC fi LOGFILE=$LOGDIR/$APPNAME-$BACKUPTYPE.log f_checkfilelocations f_write_and_log "$DOUBLEBAR" f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: STARTED: $0 By User: $USER started $APPNAME on $APPHOST" f_write_and_log "Backup of $APPNAME Server - $APPHOST to $BACKUPDIR See log at:$LOGFILE " # Remove the previous temporary files. rm /tmp/$APPNAME* # Weekly Backup if [ $BACKUPTYPE = "FULL" ]; then f_remove_old_files "$BACKUPDIR" "*.gz" f_remove_old_files "$LOGDIR" "*.log" f_remove_old_files "$BACKUPDIR" "*.dsbk" f_remove_old_files "$BACKUPDIR" "*.ldif" f_write_and_log "$BACKUPTYPE Backup of $APPNAME on $APPHOST" t_thisfile1=$DATE-$DOW-$TREENAME-$APPNAME-$APPHOST-$BACKUPTYPE # CMD="backup -b -e $PASSWORD -f $BACKUPDIR/$t_thisfile1.dsbk -l /tmp/$APPNAME-$BACKUPTYPE.log -t -w" f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: DSBK Backup initiated " # f_write_log "Command used: $CMD" $BINDIR/dsbk backup -b -e $PASSWORD -f $BACKUPDIR/$t_thisfile1.dsbk -l /tmp/$APPNAME-$BACKUPTYPE.log -t -w f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Waiting $BACKUPPAUSE seconds for DSBK backup to finish" sleep $BACKUPPAUSE cat /tmp/$APPNAME-$BACKUPTYPE.log >> $LOGFILE f_write_and_log "$SINGLEBAR" f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: LDIF Backup initiated " $BINDIR/ice -o -l /tmp/$APPNAME-$BACKUPTYPE-LDIF.log -S LDAP -s $APPHOST -p 389 -d $LDAPBACKUPUSER -w $PASSWORD -b "" -F "(objectclass=*)" -c sub -D LDIF -f $BACKUPDIR/$t_thisfile1.ldif cat /tmp/$APPNAME-$BACKUPTYPE-LDIF.log >> $LOGFILE f_write_and_log "$SINGLEBAR" else # Daily Backup f_write_and_log "$BACKUPTYPE Backup of $APPNAME on $APPHOST" t_thisfile1=$DATE-$DOW-$TREENAME-$APPNAME-$APPHOST-$BACKUPTYPE # CMD="backup -i -e $PASSWORD -f $BACKUPDIR/$t_thisfile1.dsbk -l /tmp/$APPNAME-$BACKUPTYPE.log -t -w" # f_write "Command used: $CMD" f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: DSBK Backup initiated " $BINDIR/dsbk backup -i -e $PASSWORD -f $BACKUPDIR/$t_thisfile1.dsbk -l /tmp/$APPNAME-$BACKUPTYPE.log -t -w f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: Waiting $BACKUPPAUSE seconds for backup to finish" sleep $BACKUPPAUSE cat /tmp/$APPNAME-$BACKUPTYPE.log >> $LOGFILE f_write_and_log "$SINGLEBAR" f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: LDIF Backup initiated See log at:$LOGDIR/$APPNAME-$BACKUPTYPE.log " $BINDIR/ice -o -l /tmp/$APPNAME-$BACKUPTYPE-LDIF.log -S LDAP -s $APPHOST -p 389 -d $LDAPBACKUPUSER -w $PASSWORD -b $LDAPPEOPLEBASE -F "(&(objectclass=inetorgperson)(modifytimestamp>=$LDAPDATELESSONE))" -c sub -D LDIF -f $BACKUPDIR/$t_thisfile1.ldif cat /tmp/$APPNAME-$BACKUPTYPE-LDIF.log >> $LOGFILE f_write_and_log "$SINGLEBAR" fi f_dump_passwords f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`:Compressing Files: " f_cmd tar cvzf $BACKUPDIR/$t_thisfile1.tar.gz $BACKUPDIR/$t_thisfile1.* f_cmd rm $BACKUPDIR/$t_thisfile1.dsbk* f_write_and_log "`date '+%Y-%m-%d %H:%M:%S'`: FINISHED: $0 on $APPHOST Check log file: $LOGFILE " f_write_and_log "$DOUBLEBAR" }}} !! More Information There might be more information for this subject on one of the following: [{ReferringPagesPlugin before='*' after='\n' }]