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