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








                            
 
















                                                      
 































                                                                              

 
 

                 



                                                








                                                                                                                          
 





                                                                                                                                                                                                                                        
                 
 

















                                                                        
              




                                                                      

 
                  
 






                                                               
 



                                                        

 
                     
 
                                  
 






                                                      


         
























                                                                  

                                                      





                                                                      
 








                               
 






                                                                            
 





























                                                   
             
 


                    

                    
 
                   
             
             
 






















































                                                              
#!/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