Here is the script I use to kick of backups of not-always-there
machines. It's a little hacky, but does the job for me.

Some assumptions: 

     The client foo is the bacula file demon foo-fd

     You want to run Differential backups of foo every day it is
     actually available to be backed up.

     You have a job which is sheduled never to run automatically which
     when run by this script will do today's backup. For stupid shell
     reasons it is important that the job name not contain spaces. In
     the example below, FooJob.

     The bacula console config on host bachost is 

         /usr/local/etc/bacula-bachost.conf

I have been thinking of extending this to be able to run a full backup
every month or similar, if anyone actually thinks this is interesting
enough to be worth working on I'll give it a go.


I run this every hour from root's crontab on the bacula director's
machine as follows.

      bacula_backup_if_ready bachost foo-fd 1 FooJob

Meaning `talk to the bacula console on bachost and if foo has not been
backed up for at least 1 day, and it is up and available, back it up
by running FooJob.

I have only run this on FreeBSD, so there could be minor issues with
where things are related on other systems.

--- 8< --- 8< --- CUT HERE for bacula_backup_if_ready --- 8< --- 8< ---
#!/bin/sh

if [ $# -lt 3 ]
        then
        echo "Use: $0 HOST CLIENT DAYS" JOB1 JOB2...
        exit 1
fi

# set -x

host=${1-`hostname`}

host=`expr "$host" : '^\([^.]*\).*'`

exec > /var/log/bacula_oportunistic-$host 2>&1

conf=/usr/local/etc/bacula-$host.conf

client="$2"
days="$3"

shift 3

client_host=`expr "$client" : '\(.*\)-fd'`

# Shell function which runs a command via the 
# bacula console.

bacula_command()
{
t="$1"
c="$2"

shift 2

{ echo "$c"; for a in "$@" ; do echo "$a"; done; } | /usr/local/sbin/console -c 
"$conf"&

bacula_pid=$!

(sleep $t; kill $bacula_pid 2>/dev/null >&2)&

wait $bacula_pid
}

# Check timestamp to see if we are due a backup.

[ -d /var/bacula_timestamps ] || mkdir /var/bacula_timestamps

timestamp=`find /var/bacula_timestamps -name $client -mtime -$days`

echo timestamp=$timestamp

if [ -z "$timestamp" ]
        then
        if /sbin/ping -c 1 $client_host && bacula_command 10 "status 
client=$client"
                then
                for job in "$@"
                        do
                        if bacula_command 10 "run \"$job\"" "mod" "1" "4" "yes"
                                then
                                echo -n > /var/bacula_timestamps/$client
                        fi
                done
        fi
fi
        

--- 8< --- 8< --- bacula_backup_if_ready end --- 8< --- 8< ---


      ^_^
     (O O) 
     \_/@@\
      \\~~/ 
        ~~
                - RJC


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to