#!/bin/bash ROOT_DIR= DEST_DIR=/root/backup PORT_PKG="${DEST_DIR}/crux" PORT_PRT="${DEST_DIR}/ports" DATA_CNF="${DEST_DIR}/conf" DATA_USR="${DEST_DIR}/user" DATA_SRV="${DEST_DIR}/srv" ConfirmOrExit () { while true do echo -n "Please confirm (y or n) :" read CONFIRM case $CONFIRM in y|Y|YES|yes|Yes) break ;; n|N|no|NO|No) echo "Aborting - you entered $CONFIRM" exit ;; *) echo "Please enter only y or n" esac done echo "You entered $CONFIRM. Continuing ..." } mkbk_coll_pkg() { col=$1 # make copy of packages mkdir ${PORT_PKG}/${col} while read line; do if [ ! -f /usr/ports/packages/${line} ]; then echo "Building package: ${line};\n" name=$(echo ${line} | cut -d "#" -f 1) #$sudo prt-get update -fr ${name} fi if [ -f /usr/ports/packages/${line} ]; then echo "Backing up package: ${line}" echo ${line} >> ${DEST_DIR}/backup.pkg cp /usr/ports/packages/${line} ${PORT_PKG}/${col}/ else echo "Package not found: ${line}" echo ${line} >> ${DEST_DIR}/${col}-notfound.pkg fi done < $DEST_DIR/${col}.pkg } mkbk_coll_ports() { col=$1 # tar --xattrs -zcpf $PORT_PRT/${col}-`date '+%Y-%j-%H-%M-%S'`.tar.gz \ # --directory=$ROOT_DIR/usr/ports/${col} \ # . tar --xattrs -zcpf $PORT_PRT/${col}.tar.gz \ --directory=$ROOT_DIR/usr/ports/${col} \ --exclude=.git/ \ . } mkbk_metadata() { # archive pkgutils data tar --xattrs -zcpf $DATA_CNF/pkg-db.tar.gz \ /var/lib/pkg/db # must be using gwak instead of sed, xargs and echo prt-get listinst -v | sed -s s/" "/#/g | xargs -i echo {}.pkg.tar.gz > ${DEST_DIR}/installed.pkg # make list and copy installed core packages prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep "yes /usr/ports/core" | cut -d " " -f 3 > ${DEST_DIR}/core.pkg prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep "yes /usr/ports/opt" | cut -d " " -f 3 > $DEST_DIR/opt.pkg prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep "yes /usr/ports/contrib" | cut -d " " -f 3 > $DEST_DIR/contrib.pkg prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep "yes /usr/ports/xorg" | cut -d " " -f 3 > $DEST_DIR/xorg.pkg prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep -v "yes /usr/ports/core" | grep -v "yes /usr/ports/opt" | grep -v "yes /usr/ports/contrib" | grep -v "yes /usr/ports/xorg" | grep "yes " | cut -d " " -f 3 > $DEST_DIR/other.pkg } mkbk_etc_conf() { tar --xattrs -zcpf $DATA_CNF/etc.tar.gz \ --directory=$ROOT_DIR/etc \ . tar --xattrs -zcpf $DATA_CNF/usr_etc.tar.gz \ --directory=$ROOT_DIR/usr/etc \ . } mkbk_srv_www() { # backup web data first stop php and nginx for pkg_www in ${ROOT_DIR}/srv/www/*; do if [[ ! $(ls ${pkg_www} | grep -v "backup_deploy") = "" ]]; then pkg_back="${DATA_SRV}/www" if [ ! -d ${pkg_back} ]; then mkdir -p ${pkg_back} fi bck_file="${pkg_back}/$(basename ${pkg_www}).tar.gz" exc="${pkg_www}/backup_deploy" tar --exclude ${exc} --xattrs -zcpf ${bck_file} ${pkg_www} fi done } mkbk_srv_pgsql() { # backup database data first dump all databases pkg_back="${DATA_SRV}/pgsql" if [ ! -d ${pkg_back} ]; then mkdir -p ${pkg_back} fi pg_dumpall -U postgres | gzip > ${pkg_back}/cluster_dump.gz tar --xattrs -zcpf "${pkg_back}/pgsql-conf.tar.gz" \ ${ROOT_DIR}/srv/pgsql/data/pg_hba.conf \ ${ROOT_DIR}/srv/pgsql/data/pg_ident.conf \ ${ROOT_DIR}/srv/pgsql/data/postgresql.conf } mkbk_srv_gitolite() { # backup gitolite repositories pkg_back="${DATA_SRV}/gitolite" if [ ! -d ${pkg_back} ]; then mkdir -p ${pkg_back} fi tar --xattrs -zcpf "${pkg_back}/gitolite.tar.gz" \ --directory=${ROOT_DIR}/srv/gitolite \ . } mkbk_user_metadata() { for dir in /home/*; do if [ "${dir}" != "/home/lost+found" ]; then user=$(basename $dir) tar --xattrs -zcpf "${DATA_USR}/meta-${user}.tar.gz" \ $dir/.bash_profile \ $dir/.bashrc \ $dir/.config \ $dir/.gitconfig \ $dir/.gnupg \ $dir/.irssi \ $dir/.lynxrc \ $dir/.mutt \ $dir/.netrc \ $dir/.profile \ $dir/.spectrwm.conf \ $dir/.ssh \ $dir/.tmux.conf \ $dir/.vim \ $dir/.vimrc \ $dir/.xinitrc # encript data #gpg --output "${DATA_USR}/meta-${user}.tar.gz.gpg" \ # --encrypt --recipient user@host \ # "${DATA_USR}/meta-${user}.tar.gz" tar --xattrs -zcpf "${DATA_USR}/gitolite-${user}.tar.gz" \ $dir/gitolite-admin fi done } print_data () { echo "ROOT_DIR=${ROOT_DIR}" echo "DEST_DIR=${DEST_DIR}" echo "PORT_PKG=${PORT_PKG}" echo "PORT_PRT=${PORT_PRT}" echo "DATA_CNF=${DATA_CNF}" echo "DATA_USR=${DATA_USR}" echo "DATA_SRV=${DATA_SRV}" } print_help() { echo "usage: backup-system [options]" echo "options:" echo " -r, --root root directory to backup, default /" echo " -d, --destination save backup, default /root/backup" echo " -h, --help print help and exit" } while [ "$1" ]; do case $1 in -r|--root) ROOT_DIR=$2 if [ ${ROOT_DIR} == "/" ]; then ROOT_DIR="" fi shift ;; -d|--destination) DEST_DIR=$2 # Destination directory PORT_PKG="${DEST_DIR}/crux" PORT_PRT="${DEST_DIR}/ports" DATA_CNF="${DEST_DIR}/conf" DATA_USR="${DEST_DIR}/user" DATA_SRV="${DEST_DIR}/srv" shift ;; -h|--help) print_help exit 0 ;; *) echo "backup-system: invalid option $1" print_help exit 1 ;; esac shift done print_data ConfirmOrExit mkdir -p ${PORT_PKG} mkdir -p ${PORT_PRT} mkdir -p ${DATA_CNF} mkdir -p ${DATA_USR} mkdir -p ${DATA_SRV} # Light backup data mkbk_metadata mkbk_etc_conf while true do echo -n "Backup user metadata ? Please confirm (y or n) :" read CONFIRM case $CONFIRM in n|N|no|NO|No) break ;; y|Y|YES|yes|Yes) echo "Accept - you entered $CONFIRM" mkbk_user_metadata break ;; *) echo "Please enter only y or n" esac done while true do echo -n "Backup server data ? Please confirm (y or n) :" read CONFIRM case $CONFIRM in n|N|no|NO|No) break ;; y|Y|YES|yes|Yes) echo "Accept - you entered $CONFIRM" mkbk_srv_www mkbk_srv_pgsql mkbk_srv_gitolite break ;; *) echo "Please enter only y or n" esac done while true do echo -n "Backup port system ? Please confirm (y or n) :" read CONFIRM case $CONFIRM in n|N|no|NO|No) break ;; y|Y|YES|yes|Yes) echo "Accept - you entered $CONFIRM" mkbk_coll_ports "core" mkbk_coll_pkg "core" mkbk_coll_ports "opt" mkbk_coll_pkg "opt" mkbk_coll_ports "contrib" mkbk_coll_pkg "contrib" mkbk_coll_ports "xorg" mkbk_coll_pkg "xorg" mkbk_coll_pkg "other" break ;; *) echo "Please enter only y or n" esac done