about summary refs log blame commit diff stats
path: root/core/scripts/backup-system.sh
blob: ad037ef9d1a1ecd10295540501605ec7fb50b7b6 (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                     


                               


                           
 











                                                      



                                           
 
 


                               
                               





                               
 






                                                                            
 











                                           






                                           












                                                   
             
 


                    

                    
 



                                         
 




                                             

          

                                    




                                                





























                                                                              





                                          
             

          

                                    




                                                




































                                                                                





                                          
             

          

                                    




                                                



















































                                                                                                                                                  




                                          
#!/bin/bash

ROOT_DIR=
DEST_DIR=/root/backup
DEST_SYS="${DEST_DIR}/system"
PORT_PKG="${DEST_SYS}/packages"
PORT_PRT="${DEST_SYS}/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 ..."
}

print_data () {
    echo "ROOT_DIR=${ROOT_DIR}"
    echo "DEST_DIR=${DEST_DIR}"
    echo "DEST_SYS=${DEST_SYS}"
    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
	    DEST_SYS="${DEST_DIR}/system"
	    PORT_PKG="${DEST_SYS}/packages"
	    PORT_PRT="${DEST_SYS}/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}

# Backup system settings
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 \
    .

# User Meta Data
while true
do
    echo "Backup User Metadata ?"
    echo "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"
	    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
            break
            ;;
        *) echo "Please enter only y or n"
    esac
done

# Server Data
while true
do
    echo "Backup Server Data ?"
    echo "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"

	    # 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

	    # 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


	    # 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 \
		.

            break
            ;;
        *) echo "Please enter only y or n"
    esac
done

# Port System
while true
do
    echo "Backup Port System ?" 
    echo "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"

	    # archive pkgutils data
	    tar --xattrs -zcpf $DEST_SYS/pkg-db.tar.gz \
		/var/lib/pkg/db

	    # archive ports data
	    tar --xattrs -zcpf $DEST_SYS/etc_ports.tar.gz \
		    --directory=/etc/ports \
		    .	

	    METADATA=${DEST_SYS}/meta-data
	    mkdir -p $METADATA

	    # must be using gwak instead of sed, xargs and echo
	    prt-get listinst -v | sed -s s/" "/#/g | xargs -i echo {}.pkg.tar.gz > ${METADATA}/all_installed.pkg

	    for filename in /etc/ports/*.git; do
	    	source $filename

		echo "Backing up collection: $NAME"
		# create list of installed packages 
		prt-get printf "%i %p %n#%v-%r.pkg.tar.gz\n" | grep "yes /usr/ports/${NAME}" | cut -d " " -f 3 > ${METADATA}/${NAME}-installed.pkg

		# backup collection ports
		tar --xattrs -zcpf $PORT_PRT/${NAME}-ports.tar.gz \
		--directory=$ROOT_DIR/usr/ports/${NAME} \
		--exclude=.git/ \
		.

		# backup collection packages
		while read line; do
			if [ ! -f /usr/ports/packages/${line} ]; then
				echo "Building package: ${line};\n"
				PORT_NAME=$(echo ${line} | cut -d "#" -f 1)
				sudo prt-get update -fr -if -is ${PORT_NAME}
				(cd /usr/ports/${NAME}/${PORT_NAME} \
				       	&& sudo pkgmk -uf)
			fi

			if [ -f /usr/ports/packages/${line} ]; then
				echo "Backing up package: ${NAME}/${line}"
				echo ${line} >> ${METADATA}/backup.pkg
				#cp /usr/ports/packages/${line} ${PORT_PKG}/${col}/
				tar rvf ${PORT_PKG}/${NAME}.tar \
					--directory=/usr/ports/packages \
					${line}
			else
				echo "Package $PORT_NAME not found: ${line}"
				echo ${line} >> ${METADATA}/${NAME}-notfound.pkg
			fi
		done < ${METADATA}/${NAME}-installed.pkg
	    done
            break
            ;;
        *) echo "Please enter only y or n"
    esac
done