about summary refs log tree commit diff stats
path: root/core/scripts/backup-system.sh
blob: 7faf676a2c5e6852974f70c530ccd151063bd8a1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
discard """
  errormsg: "invalid token: trailing underscore"
  file: "tunderscores.nim"
  line: 8
"""
# Bug #502670

var ef_ = 3  #ERROR_MSG invalid token: _
var a__b = 1
var c___d = 2
echo(ab, cd, ef_)
a id='n226' href='#n226'>226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
#!/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
 	    prt-get listinst -v | sed 's/ /#/g' | sed 's/$/.pkg.tar.gz/g' > ${METADATA}/all-installed.pkg 

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

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


		# create list of installed packages 
		prt-get printf "%i %p %n\n" | grep "yes /usr/ports/${NAME}" | cut -d " " -f 3 > ${METADATA}/${NAME}-installed.pkg

		# backup collection packages
		while read line; do
			echo "Backing up package: ${NAME}/${line}"
			# get installed version not version on ports
			PACKAGE="$(cat ${METADATA}/all-installed.pkg | grep "^${line}#")"
			if [ ! -f /usr/ports/packages/${PACKAGE} ]; then
				echo "Building package: ${PACKAGE};\n"
				sudo prt-get update -fr -if -is ${line}
				(cd /usr/ports/${NAME}/${line} \
				       	&& sudo pkgmk -uf)
			fi

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

RELEASE_NAME=$(basename ${DEST_DIR})
cd $(dirname ${DEST_DIR}) && tar -zcpf  ${RELEASE_NAME}.tar.gz ${RELEASE_NAME}/
rm -rf ${DEST_DIR}