The daily cron job does little bit more, actually.
- create gzipped tar with /etc and other named directories
- it creates list of extra installed packages from repositories
- copy backup over LAN or Internet, checks if NFS disk is mounted or remote directory exists
- it uses tar, cp and rsync commands
You can add it to cron via this commands:
touch /etc/cron.daily/backup-configuration
chown root:root /etc/cron.daily/backup-configuration
chmod 755 /etc/cron.daily/backup-configuration
/etc/cron.daily/backup-configuration
#!/bin/bash
## global variables
# change variables according to your needs
# destination remote directory to save backups
remote_directory=/disk/backup/home-desktop
# destination local NFS mount point
local_mount_point=/disk
# source local directory to store backups
local_directory=/var/backups
# destination SSH login and server name to save backups
remote_server_login=jan@faix.cz
# list of configuration directories and files you want to backup
backup_list="/etc \
/usr/local/bin \
/usr/local/etc \
/var/spool/cron \
/var/backups/*.0 \
/var/backups/*.bak
/var/backups/*.txt"
# parameter the script was launched with or set default LAN
if [ -z "$1" ]; then
parameter=-LAN
else
parameter="$1"
fi
# do not change following variables
# local server name
machine_name=`hostname -s`
## functions
bck_cfg() {
aptitude -F %p search "?and(?installed,?not(?automatic))" > $local_directory/pkglist.txt
tar -czPf $local_directory/$machine_name.tar.gz $backup_list
}
start_job() { printf "\nStarting configuration backup job at `date +%c` ...\n"
}
job_complete() { printf "\nConfiguration backup job successfuly completed on host `hostname` at `date +%c`.\n"
}
dir_not() { printf "\nConfiguration backup job failed on host `hostname` at `date +%c`, $dir_loc does not exist.\n"
}
# check if local_directory does not exist, print error message and exit
if [ ! -d $local_directory ]; then
dir_loc="local directory $local_directory"
dir_not && exit
fi
# in case the parameter -LAN or -Internet is used, start configuration backup
case $parameter in
-LAN)
## configuration backup job inside LAN
dir_loc="local directory $local_directory"
if [ ! -d $remote_directory ]; then
mount $local_mount_point
fi
if [ -d $remote_directory ]; then
start_job && bck_cfg
cp $local_directory/$machine_name.tar.gz $remote_directory
job_complete
else
dir_not
fi
;;
-Internet)
## configuration backup job over Internet
dir_loc="remote directory $remote_directory"
if (ssh $remote_server_login "[ ! -d $remote_directory ]"); then
dir_not_ && exit
fi
if [ -d $local_directory ]; then
start_job && bck_cfg
rsync -azs --stats $local_directory/$machine_name.tar.gz $remote_server_login:$remote_directory/
job_complete
else
dir_not
fi
;;
*)
## print help
printf "\nThis script create machine configuration backup and copy it over network to destination server.\n"
printf "\nConfiguration backup script must be run with one of the floowing parameter:\n"
printf "\n\t-LAN\t\tbackup configuration within LAN to mounted NFS disk"
printf "\n\t-Internet\tbackup configuration over Internet via rsync to destination folder\n"
printf "\t\t\tDon't forget to exchange SSH keys running \"ssh-copy-id $remote_server_login\" from source machine you launch backup configuration script.\n"
printf "\nCheck variables defined in begining of this script:\n"
printf "\n\tremote_directory=$remote_directory"
printf "\n\tlocal_mount_point=$local_mount_point"
printf "\n\tlocal_directory=$local_directory"
printf "\n\tremote_server_login=$remote_server_login"
printf "\n\tbackup_list=$backup_list"
printf "\n\tmachine_name=$machine_name"
printf "\n\tdefault parameter=$parameter"
printf "\n\n"
;;
esac