From: "Johan Decock" <jdecock@abis.be>
To: bacula-users@lists.sourceforge.net
Subject: Re: [Bacula-users] cdwriter
Date: Fri, 30 Jan 2004 17:11:34 +0100

I thought it would be easy to find them in the archives.  I'll post them
again.  I changed some things in them anyway in the mean time.  I also
include the Director config.  Then you see how they are to be used in
Runbefore- and RunafterJobs

I'm interested in any remarks or improvements you might have.  (I'm
still getting started in shell scripting)


#
# Default Bacula Director Configuration file
#
#  The only thing that MUST be changed is to add one or more
#   file or directory names in the Include directive of the
#   FileSet resource.
#
#  For Bacula release 1.32b (14 Oct 2003) -- mandrake (FiveStar)
#
#  You might also want to change the default email address
#   from root to your address.  See the "mail" and "operator"
#   directives in the Messages resource.
#

Director {                  # define myself
  Name = tosfeb33-dir
  DIRport = 9101            # where we listen for UA connections
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/bacula/working"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1
  Password = "abis"         # Console password
  Messages = Standard
}

Job {
  Name = "Tosfeb31AllHDD"
  Type = Backup
  Level = Full
  Client = tosfeb31-fd
  FileSet = "Tosfeb31All"
  Schedule = "Weekdays"
  Messages = Standard
  Pool = HDD
  Storage = HDdrive
  RunBeforeJob = "/etc/bacula/prepare_DVDspool /mnt/backupdaily 1700000"
  Write Bootstrap = "/var/bacula/working/Tosfeb31All.bsr"
  Priority = 10
}

Job {
  Name = "Tosfeb31AllUSB"
  Type = Backup
  Level = Full
  Client = tosfeb31-fd
  FileSet = "Tosfeb31All"
  Schedule = "WeeklyUSB"
  Messages = Standard
  Pool = USB
  Storage = USBdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb31All.bsr"
  Priority = 10
}

Job {
  Name = "Tosfeb31EssentialDVD"
  Type = Backup
  Level = Full
  Client = tosfeb31-fd
  FileSet = "Tosfeb31Essential"
  Schedule = "MonthlyDVD"
  Messages = Standard
  Pool = DVD
  Storage = DVDdrive
  RunBeforeJob = "/etc/bacula/prepare_DVDspool /mnt/backupdaily 4700000"
  Write Bootstrap = "/var/bacula/working/Tosfeb31Essential.bsr"
  RunAfterJob = "/etc/bacula/inventorize_volumes %v"
  Priority = 10
}

Job {
  Name = "Tosfeb31AllCompressedDVD"
  Type = Backup
  Level = Full
  Client = tosfeb31-fd
  FileSet = "Tosfeb31AllCompressed"
  Messages = Standard
  Pool = DVD
  Storage = DVDdrive
  RunBeforeJob = "/etc/bacula/prepare_DVDspool /mnt/backupdaily 4700000"
  Write Bootstrap = "/var/bacula/working/Tosfeb31Essential.bsr"
  RunAfterJob = "/etc/bacula/inventorize_volumes %v"
  Priority = 10
}

Job {
  Name = "Tosfeb32AllHDD"
  Type = Backup
  Level = Full
  Client = tosfeb32-fd
  FileSet = "Tosfeb32All"
  Schedule = "Weekdays"
  Messages = Standard
  Pool = HDD
  Storage = HDdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb32All.bsr"
  Priority = 20
}

Job {
  Name = "Tosfeb32AllUSB"
  Type = Backup
  Level = Full
  Client = tosfeb32-fd
  FileSet = "Tosfeb32All"
  Schedule = "WeeklyUSB"
  Messages = Standard
  Pool = USB
  Storage = USBdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb32All.bsr"
  Priority = 10
}

Job {
  Name = "Tosfeb32EssentialDVD"
  Type = Backup
  Level = Full
  Client = tosfeb32-fd
  FileSet = "Tosfeb32Essential"
  Schedule = "MonthlyDVD"
  Messages = Standard
  Pool = DVD
  Storage = DVDdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb32System.bsr"
  RunAfterJob = "/etc/bacula/inventorize_volumes %v"
  Priority = 20
}

#Job {
#  Name = "Tosfeb30System"
#  Type = Backup
#  Level = Full
#  Client = tosfeb30-fd
#  FileSet = "Tosfeb30System"
#  Schedule = "WeeklyUSB"
#  Messages = Standard
#  Pool = USB
#  Storage = USBdrive
#  Write Bootstrap = "/etc/bacula/working/Tosfeb32System.bsr"
#  Priority = 20
#}

Job {
  Name = "Tosfeb33SystemHDD"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet = "Tosfeb33System"
  Schedule = "Weekdays"
  Messages = Standard
  Pool = HDD
  Storage = HDdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb33System.bsr"
  Priority = 30
}

Job {
  Name = "Tosfeb33SystemUSB"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet = "Tosfeb33System"
  Schedule = "WeeklyUSB"
  Messages = Standard
  Pool = USB
  Storage = USBdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb33All.bsr"
  Priority = 30
}

Job {
  Name = "Tosfeb33EssentialDVD"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet = "Tosfeb33Essential"
  Schedule = "MonthlyDVD"
  Messages = Standard
  Pool = DVD
  Storage = DVDdrive
  Write Bootstrap = "/var/bacula/working/Tosfeb33Essential.bsr"
  RunAfterJob = "/etc/bacula/inventorize_volumes %v"
  Priority = 30
}

Job {
  Name = "BackupCatalogHDD"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet="Catalog"
  Schedule = "Weekdays"
  Storage = HDdrive
  Messages = Standard
  Pool = HDD
  # This creates an ASCII copy of the catalog
  RunBeforeJob = "/etc/bacula/make_catalog_backup -u bacula"
  # This deletes the copy of the catalog
  RunAfterJob  = "/etc/bacula/delete_catalog_backup"
  Write Bootstrap = "/var/bacula/working/BackupCatalog.bsr"
  Priority = 90                   # run after main backup
}

Job {
  Name = "BackupCatalogUSB"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet="Catalog"
  Schedule = "WeeklyUSB"
  Storage = USBdrive
  Messages = Standard
  Pool = USB
  # This creates an ASCII copy of the catalog
  RunBeforeJob = "/etc/bacula/make_catalog_backup -u bacula"
  # This writes the volume file to the proper USB device
  RunAfterJob  = "/etc/bacula/write_to_USB %v"
#  RunAfterJob  = "/etc/bacula/delete_catalog_backup"
  Write Bootstrap = "/var/bacula/working/BackupCatalog.bsr"
  Priority = 90                   # run after main backup
}

Job {
  Name = "BackupCatalogDVD"
  Type = Backup
  Level = Full
  Client = tosfeb33-fd
  FileSet="Catalog"
  Schedule = "MonthlyDVD"
  Storage = DVDdrive
  Messages = Standard
  Pool = DVD
  # This creates an ASCII copy of the catalog
  RunBeforeJob = "/etc/bacula/make_catalog_backup -u bacula"
  # This writes the volume file to a DVD
  RunAfterJob = "/etc/bacula/write_to_DVD %v"
  Write Bootstrap = "/var/bacula/working/BackupCatalog.bsr"
  Priority = 90                   # run after main backup
}

# Standard Restore template, to be changed by Console program
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client = tosfeb33-fd
  FileSet="Full Set"
  Storage = HDdrive
  Messages = Standard
  Pool = HDD
  Where = /tmp/bacula-restores
}

# List of files to be backed up
FileSet {
  Name = "Full Set"
  Include = signature=MD5 portable=yes {
#
#  Put your list of files here, one per line or include an
#    external list with:
#
#    <file-name
#
#  Note: / backs up everything on the root partition.
#    if you have other partitons such as /usr or /home
#    you will probably want to add them too.
#
#  By default this is defined to point to the Bacula build
#    directory to give a reasonable FileSet to backup to
#    disk storage during initial testing.
#
    /tmp/bacula-1.32b
  }

#
# If you backup the root directory, the following two excluded
#   files can be useful
#
  Exclude = { /proc /tmp /.journal /.fsck }
}

#
# When to do the backups, full backup on first sunday of the month,
FileSet {
  Name = "Tosfeb31All"
  Include = signature=MD5 portable=yes {
# System of Tosfeb31
    "C:/"
# Data1
    "E:/"
# Program
    "F:/"
# Finance
    "G:/"
# Home
    "H:/"
  }
  Exclude = {pagefile.sys, *.[Dd][Mm][Pp]}
}
FileSet {
  Name = "Tosfeb31AllCompressed"
  Include = signature=MD5 compression=GZIP portable=yes {
# System of Tosfeb31
    "C:/"
# Data1
    "E:/"
# Program
    "F:/"
# Finance
    "G:/"
# Home
    "H:/"
  }
  Exclude = {pagefile.sys, *.[Dd][Mm][Pp]}
}
FileSet {
  Name = "Tosfeb31Essential"
  Include = signature=MD5  compression=GZIP portable=yes {
# Data1
    "E:/"
# Finance
    "G:/"
  }
  Exclude = {*.[Tt][Mm][Pp], *.backup.fm, *.backup.book}
}
FileSet {
  Name = "Tosfeb32All"
  Include = signature=MD5 portable=yes {
# System of Tosfeb32
    "C:/"
# NotesData
    "E:/"
# Lib
    "H:/"
  }
  Exclude = {pagefile.sys, *.[Dd][Mm][Pp]}
}
FileSet {
  Name = "Tosfeb32Essential"
  Include = signature=MD5  compression=GZIP portable=yes {
# NotesData
    "E:/"
  }
  Exclude = {*.[Tt][Mm][Pp]}
}

FileSet {
  Name = "Tosfeb33System"
  Include = signature=MD5 portable=yes {
    "/bin"
    "/boot"
    "/etc"
    "/home"
    "/lib"
    "/root"
    "/sbin"
    "/usr"
  }
  Exclude = {/var, /proc}
}

FileSet {
  Name = "Tosfeb33Essential"
  Include = signature=MD5 compression=GZIP portable=yes {
    "/etc"
    "/root"
  }
}

Schedule {
  Name = "Weekdays"
  Run = Full tue-fri at 01:00
}

Schedule {
  Name = "WeeklyUSB"
  Run = Full sat at 01:00
}

Schedule {
  Name = "MonthlyDVD"
  Run = Full 1st sat at 04:00 # These will remain on site
  Run = Full 3rd sat at 04:00 # These will be carried off site
}

# This is the backup of the catalog
FileSet {
  Name = "Catalog"
  Include = signature=MD5 {
     /var/bacula/working/bacula.sql
  }
}

# Client (File Services) to backup
Client {
  Name = tosfeb33-fd
  Address = tosfeb33.abis.be
  FDPort = 9102
  Catalog = MyCatalog
  Password = "abis"          # password for FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Client {
  Name = tosfeb30-fd
  Address = tosfeb30.abis.be
  FDPort = 9102
  Catalog = MyCatalog
  Password = "abis"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = tosfeb31-fd
  Address = tosfeb31.abis.be
  FDPort = 9102
  Catalog = MyCatalog
  Password = "abis"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = tosfeb32-fd
  Address = tosfeb32.abis.be
  FDPort = 9102
  Catalog = MyCatalog
  Password = "abis"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

# Definiton of file storage device

Storage {
  Name = HDdrive
  Address = tosfeb33.abis.be
  SDPort = 9103
  Password = "abis"
  Device = HDdriveStorage
  Media Type = File
}

Storage {
  Name = USBdrive
  Address = tosfeb33.abis.be
  SDPort = 9103
  Password = "abis"
  Device = USBdriveStorage
  Media Type = File
}

Storage {
  Name = DVDdrive
  Address = tosfeb33.abis.be
  SDPort = 9103
  Password = "abis"
  Device = DVDdriveStorage
  Media Type = File
}

# Generic catalog service
Catalog {
  Name = MyCatalog
  dbname = bacula; user = bacula; password = ""
}

# Reasonable message delivery -- send most everything to email address
#  and to the console
Messages {
  Name = Standard
  mailcommand = "/usr/sbin/smtp -h tosfeb32.abis.be -f \"\(Bacula\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/smtp -h tosfeb32.abis.be -f \"\(Bacula\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = jdecock@abis.be = all, !skipped
  operator = jdecock@abis.be = mount
  console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
#          time to time as it will grow indefinitely. However, it will
#          also keep all your messages if they scroll off the console.
#
  append = "/etc/bacula/working/log" = all, !skipped
}

# Pool definition for daily backup on hard disk in backup server
Pool {
  Name = HDD
  Pool Type = Backup
  Recycle = yes
#  Recycle Oldest Volume = yes
  Purge Oldest Volume = yes
  Autoprune = yes
  Maximum Volumes = 4 # Monday through Thursday
  Volume Retention = 2 weeks
  Accept Any Volume = yes
  Maximum Volume Jobs = 4 # 31, 32, 33 and Catalog
#  Maximum Volume Files = 2
  Maximum Volume Bytes = 18g
  Volume Use Duration = 1d
  Label Format = "HDDVolume"
}

# Pool definition for weekly backup, first on hard disk,
#then to be copied on removable USB2 hard disk drives in an AfterRunJob
Pool {
  Name = USB
  Pool Type = Backup
  Recycle = yes
  Purge Oldest Volume = yes
  Autoprune = yes
  Maximum Volumes = 3 # We have 3 removable USB2 disks
  Volume Retention = 2 months
  Accept Any Volume = yes
  Maximum Volume Jobs = 4 # 31, 32, 33 and Catalog
  Maximum Volume Bytes = 18g
  Volume Use Duration = 1d
  Label Format = "USBVolume"
}

# Pool definition for monthly backups on DVDspool, to be copied to DVD+/-R media in an AfterRunJob
Pool {
  Name = DVD
  Pool Type = Backup
  Recycle = no
  Autoprune = no
  Volume Retention = 2 years
  Accept Any Volume = yes
  Maximum Volume Bytes = 2147483500 # 2 GB is the maximum size of a file on an ISO9660 file system
  Maximum Volume Jobs = 1 # each backup job gets its own set of volumes
#  Maximum Volume Bytes = 4699990000 # 4 700 000 000 # 4.38 GB is the actual size that will fit on a DVD
  Volume Use Duration = 1d
  Label Format = "DVD${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${NumVols}"
}



prepare_DVDspool:



#!/bin/bash
#
# shell script to initialize environment for creating a backup that will be written to DVD+/-R(W)

# it will need to check whether there is enough space on the path supplied as the first parameter
# and if there isn't it will need to remove some files.

# it will also remove the file where all the volume names are collected during the backup run.

path=$1 # /mnt/backupdaily
quota=$2 # 4700000

#Define global variable to hold return value from function

freespace=

# Define function to determine free space on a mount point

FreeSpace () {
     freespace=`df | grep $path | awk '{print $4}'`
     if [ 0 -ne `expr index "$freespace" %` ] ; then
          freespace=`df | grep $path | awk '{print $3}'`
     fi
     }
#Define global variable to hold return value from function

padded=

# Define function to pad a number with spaces to the left for display

PadSpacesToLeft () {
     stringtopad=$1
     wantedlength=$2

     while [ ${#stringtopad} -lt $wantedlength ]
     do
          stringtopad=" "$stringtopad
     done
     padded=$stringtopad
     }

PadSpacesToLeft $quota 9

echo "How much free space is needed on $path? $padded"

# How much space is there left?

FreeSpace

PadSpacesToLeft $freespace 9

echo "Free space currently available on $path:$padded"

# As long as there isn't enough room, delete the oldest DVD volume files
while [ $freespace -lt $quota ]
do
     # determine which is the oldest DVD volume file in /mnt/backupdaily
     # ls puts the oldest file on top
     # head grabs the first line
     # and awk gets the 9th column of this line, i.e. the file name we were looking for
     oldestfile=`ls -ralt $path/DVD* | head -n 1 | awk '{print $9}'`

     echo "Deleting: $oldestfile"
     rm  -f $oldestfile

     # assess how much space there is now
     FreeSpace
     PadSpacesToLeft $freespace 9
     echo "Free space currently available on $path:$padded"
     # and then we test again.
done

# remove the file where all the volume names will be  collected.
# so we can have a clean run

rm -f /var/bacula/volumes

exit 0


inventorize_volumes:

#!/bin/bash
#
# shell script to inventorize volumes used during a backup
volumes=$1

# Replace | character with spaces (necessary for the for command)

volumes=${volumes//|/ }

# For every volume do

for i in $volumes ; do
     echo $i >> /var/bacula/volumes
done

exit 0



write_to_DVD:

#!/bin/bash
#
# shell script to copy DVD volume files from /mnt/backupdaily to DVD+/-R(W)

# The last volume was not added to the inventory list yet, so we do that first
/etc/bacula/inventorize_volumes $1

supermount -m=/mnt/cdrom disable

umount /mnt/cdrom

# another shell script run as a RunAfterJob has been putting the volume names into a text file
# now we retrieve those names and write them to DVD

# this awk command produces a space delimited list of the lines of the text file and assigns it to $lines

lines=`awk '{print $1}' /var/bacula/volumes`

# now we can iterate over those volume names

let "count=1"
for i in $lines ; do
     if [ $count -le 1 ] ; then
          # When creating a DVD with growisofs one needs to use -Z the first time
          echo "Writing first volume file" $count
          growisofs -Z /dev/scd0 -R -J /mnt/backupdaily/$i
     else
          # and -M the for the next volume files
          echo "Writing another volume file" $count
          growisofs -M /dev/scd0 -R -J /mnt/backupdaily/$i
     fi
     let count="$count+1"
#    sleep 5
     ls -al /mnt/cdrom
#    sleep 5
done

ls -al /mnt/backupdaily
mount /mnt/cdrom
ls -al /mnt/cdrom
umount /mnt/cdrom

#supermount -m=/mnt/cdrom enable

# This is run as a RunAfterJob of the catalog backup. It already had a RunAfterJob, so we execute that here
/etc/bacula/delete_catalog_backup

exit 0




This last one is to write to removable USB-storage.

write_to_USB

#!/bin/bash
#
# shell script to finalize USB backup

volumename=$1
echo "   Creating mount points, if they don't exist"
if ! [ -d /mnt/usbdrv ] ; then
  mkdir /mnt/usbdrv
fi
if ! [ -d /mnt/usbdrv/bacula ] ; then
  mkdir /mnt/usbdrv/bacula
fi
if ! [ -d /mnt/usbdrv/misc ] ; then
  mkdir /mnt/usbdrv/misc
fi
 #unmount all mount points related to USB

echo "   Making sure no USB devices are mounted"
umount /mnt/usbdrv
umount /mnt/usbdrv/bacula
umount /mnt/usbdrv/misc
umount /mnt/removable
umount /mnt/removable2
umount /mnt/removable3

 #determine which /dev/sd? contains the right USBVolume for this backup

echo "   Determining whether the right USB device containing our USBVolume is present physically"

found=nothing
for i in sda sdb sdc; do
  sd=$i"1"
  echo "   Trying with $sd"
  mount /dev/$sd /mnt/usbdrv/bacula -t ext2
  ls -al /mnt/usbdrv/bacula

  if [ -f /mnt/usbdrv/bacula/$volumename ] ; then
    found=/dev/$i
  fi

  umount /mnt/usbdrv/bacula
done

echo
echo "    Found: $found containing $volumename "
echo
if [ $found != nothing ] ; then
   # mount /mnt/usbdrv/bacula and /mnt/usbdrv/misc on /dev/sd?1 and /dev/sd?5 respectively
  mount $found"1" /mnt/usbdrv/bacula -t ext2
  mount $found"5" /mnt/usbdrv/misc -t vfat

   # copy Ghost images of Windows system drives, the contents of /etc/bacula/*
   # and a text file with restore instructions to /mnt/usbdrv/misc

  echo "   Copying Ghost image of TOSFEB31 to /mnt/usbdrv/misc"
  cp -v /mnt/Ghost/PROD/TOSFEB31/SYSTEMAG.GHO /mnt/usbdrv/misc
  echo "   Copying Ghost image of TOSFEB32 to /mnt/usbdrv/misc"
  cp -v /mnt/Ghost/PROD/TOSFEB32/COFTF32.GHO /mnt/usbdrv/misc
  echo "   Copying /etc/bacula to /mnt/usbdrv/misc"
  cp -Rfv /etc/bacula/ /mnt/usbdrv/misc
  echo "   Copying Restore instructions to /mnt/usbdrv/misc"
  cp -v /etc/bacula/How_To_Restore.txt /mnt/usbdrv/misc

   # copy the current USBVolume to /mnt/usbdrv/bacula overwriting the previous volume file
  echo
  echo "   Copying Bacula USB-volume to /mnt/usbdrv/bacula"

#  cp -fv /mnt/spool/$volumename /mnt/usbdrv/bacula

   # give some feedback about what was done

  echo
  echo "   Directory contents of /mnt/usbdrv/bacula"
  ls -al /mnt/usbdrv/bacula
  echo
  echo "   Directory contents of /mnt/usbdrv/misc"
  ls -al /mnt/usbdrv/misc

   # unmount /mnt/usbdrv/bacula and /mnt/usbdrv/misc
  echo
  echo "   Unmounting /mnt/usbdrv/... mount points"
  umount /mnt/usbdrv/bacula
  umount /mnt/usbdrv/misc

else
   # send emails if correct medium is not present
#  /usr/sbin/smtp
  echo "hello"
fi

# This is run as a RunAfterJob of the catalog backup.  It already had a
# RunAfterJob, so we execute that here 

/etc/bacula/delete_catalog_backup

