Your JoeDog uses mondorescue for bare-metal Linux restoration. We use mondorestore to recover the OS and Net Backup to recover its content. Since we’re only concerned about archiving the OS for bare-metal recovery, it’s necessary to exclude directories when we run mondoarchive.
My exclude requirement varies from server to server so I wanted to build the list dynamically. As a coder, I have religious aversion to altering scripts for the purpose of configuring them. If we set config variables inside the script, then we have a different version on every server. That’s a paddlin’.
For my mondoarchive script, I developed a pretty slick way to read a configuration file and build an exclude list. The list is configured in a conf file that ignores comment lines and superfluous white space. A typical configuration looks like this:
#
# This file is maintained by the Puppet Master
#
# This is the exclude list for mondoarchive Directories inside
# this list will not be archived for bare metal recovery.
#
/tmp
/export
/usr/src
/var/mail
/var/cache
/var/log
My mondoarchive script builds a string of pipe separated directories like this:
/tmp|/export|/usr/src|/var/mail|/var/cache|/var/log
Since very few of you will have a similar usecase, I wrote an example that reads the file into a sh array. This version will loop through the array and print each one.
#!/bin/sh
# An example script that reads a list from a config
# file into a sh script array.
CONF="haha.conf"
LIST=""
#
# Read the directory list from $CONF
if [[ -e $CONF ]] ; then
while read line ; do
chr=${line:0:1}
# XXX: Use awk's substr on older systems like
# HPUX which don't support the above syntax.
# chr=$(echo $line | awk '{print substr($1,0,1)}')
case $chr in
'#')
# ignore comments
;;
*)
if [[ ${#line} -gt 2 ]] ; then
if [[ -z $LIST ]] ; then
LIST="$line"
else
LIST="$LIST $line"
fi
fi
;;
esac
done < $CONF
else
echo "$0: [error] unable to locate $CONF"
fi
let X=1
for I in $LIST ; do
echo "$X: $I"
let X=$X+1
done
Let’s run this bad boy and see what happens:
$ sh haha
1: /tmp
2: /etc
3: /usr/local
4: /data/mrepo
If some of the concepts listed don’t make sense, then you might want to see our sh scripting cheat sheet. It will help you understand things like ‘-e $CONF’ and sh script arrays. Happy hacking.
UPDATE: Given the introduction to this post, it’s likely that many of you have arrived here in search of a mondoarchive backup script. Well, we won’t let you leave empty handed. You can grab my archive script here: Mondo Rescue Archive Script
This script builds both NFS recoverable archives and DVD images to an NFS mounted volume. Here’s its usage banner:
Usage: archiver [-c|-n]
Requires either a '-c' or a '-n' argument
-c create a CD Rom archive
-n create an NFS archive