Your IP : 18.218.149.167


Current Path : /opt/webdir/bin/
Upload File :
Current File : //opt/webdir/bin/bx_backup.sh

#!/bin/bash
# backup site information
# argv:
# $1 - kernel_name  - dbname for site ( create backup for all sites with with db)
# $2 - backup_dir 
# if site is link - backup only files
# if iste is kernel - files + mysql
#set -x

export LANG=en_US.UTF-8
export TERM=linux
PROGNAME=$(basename $0)
PROGPATH=$(dirname $0)

BASE_DIR=/opt/webdir
BITRIX_DIR=/home/bitrix/.webdir
SAVE_LIMIT=7    # save backup for 7 days

. $PROGPATH/bitrix_utils.sh || exit 1

site_menu_dir=$BASE_DIR/bin/menu/06_site
site_menu_fnc=$site_menu_dir/functions.sh
. $site_menu_fnc || exit 1

LOGS_DIR=$BITRIX_DIR/logs
TEMP_DIR=$BITRIX_DIR/temp
CONF_DIR=$BITRIX_DIR/etc
LOGS_FILE=$LOGS_DIR/backup_sites.log
[[ -z $DEBUG ]] && DEBUG=0

# create additional directories
for _dir in $BITRIX_DIR $LOGS_DIR $TEMP_DIR $CONF_DIR; do
  [[ ! -d $_dir ]] && mkdir -p -m 700 $_dir
done


# test options
kernel_name=$1
backup_dir=$2
sql_dir=/home/bitrix
if [[ ( -z "$kernel_name" ) || ( -z $backup_dir ) ]]; then
  echo "Usage: $PROGNAME kernel_name backup_dir"
  echo "Ex."
  echo "$PROGNAME sitemanager0 /home/bitrix/backup/archive"
  echo
  exit 1
fi

[[ ! -d $backup_dir ]] && mkdir $backup_dir

# logging infor to file
log_to_file(){
    _mess=$1

    echo "$(date +"%Y/%m/%d %H:%M:%S") $$ $_mess" | tee -a $LOGS_FILE
}

error(){
    _mess="${1}"

    [[ -f $BACK_DB_MYCNF ]] && rm -f $BACK_DB_MYCNF

    log_to_file "$_mess"
    exit 1
}

# create backup directory that can be access from http(s)
create_wwwbackup_directory(){
    _backup_directory=$1
    if [[ ! -d $_backup_directory ]];then
        mkdir -p $_backup_directory
        echo "<head>
        <meta http-equiv=\"REFRESH\" content=\"0;URL=/bitrix/admin/index.php\">
        </head>
        " > $_backup_directory/index.php
        chown -R bitrix.bitrix $_backup_directory
        chmod -R 0755 $_backup_directory
        [[ $DEBUG -gt 0 ]] && \
            log_to_file "Create backup directory $_backup_directory"
    fi
}

# create mysql dump
create_mysqldump(){
    _dump_conf=$1
    _dump_db=$2
    _dump_char=$3
    _dump_var_files=$4

    # define dump file name
    _dump_file=$sql_dir/mysql_dump_${_dump_db}_${DATE_STR}_${RAND_STR}.sql
    _acon_file=$sql_dir/mysql_dump_${_dump_db}_${DATE_STR}_${RAND_STR}_after_connect.sql

    # create dump
    mysqldump --defaults-file=$_dump_conf --default-character-set=$_dump_char \
        $_dump_db > $_dump_file
    [[ $? -gt 0 ]] && error "mysqldump cmd return error"
    [[ $DEBUG -gt 0 ]] && \
        log_to_file "Create mysqldump db=$_dump_db"

    # for php-restore support
    sed -i "/\/*40101 SET/d;/\/*40103 SET/d;/\!40111 SET/d;/\!40014 SET/d;/\!40000 ALTER/d" \
        $_dump_file

    # Clean mysql log
    if [ "$_dump_char" == "cp1251" ]; then
        echo "SET NAMES 'cp1251' COLLATE 'cp1251_general_ci';" > $_acon_file
    else
        echo "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';" > $_acon_file
    fi

    eval "$_dump_var_files='$_dump_file $_acon_file'"
}

# get_pool_sites
# POOL_SITES_KERNEL_LIST
# POOL_SITES_LINK_LIST
# POOL_SITES_KETNEL_COUNT
# POOL_SITES_LINK_COUNT
get_kernel_info(){
    # get list of all sites on the server
    get_pool_sites
    # test if site with defined kernelname exists
    found_kernel_name=$(echo "$POOL_SITES_KERNEL_LIST" | grep -c ":$kernel_name:")
    [[ $found_kernel_name -eq 0 ]] && \
        error "Not found sites with defined db=$kernel_name"
    [[ $DEBUG -gt 0 ]] && \
        log_to_file "Get list sites; use information for link sites"

    # kernel info
    BACK_DB=$kernel_name
    # default or alice.bx
    BACK_KERNEL_SITE=$(echo "$POOL_SITES_KERNEL_LIST" | \
        grep ":$kernel_name:" | awk -F':' '{print $1}')
    # /home/bitrix/www
    BACK_KERNEL_ROOT=$(echo "$POOL_SITES_KERNEL_LIST" | \
        grep ":$kernel_name:" | awk -F':' '{print $6}')
    # utf-8| cp1251
    BACK_KERNEL_CHAR=$(echo "$POOL_SITES_KERNEL_LIST" | \
        grep ":$kernel_name:" | awk -F':' '{print $7}')

    # bxSite:db:cp.ksh.bx:dbcp:mysql:localhost:cp:*************::/home/bitrix/.tmp/.my_cnfcyPNwh9_
    DB_INFO=$(get_site_my_connect "$BACK_KERNEL_SITE" "$BACK_KERNEL_ROOT" "$BITRIX_DIR" "my_cnf")
    [[ -z "$DB_INFO" ]] &&  \
        error "Cannot create temporary my.cnf file"
    
    BACK_DB_TYPE=$(echo "$DB_INFO" | awk -F':' '{print $5}')   # mysql
    BACK_DB_HOST=$(echo "$DB_INFO" | awk -F':' '{print $6}')   # h01w
    BACK_DB_MYCNF=$(echo "$DB_INFO" | awk -F':' '{print $NF}')   # /opt/webdir/tmp/.my_cnf2AOOxKwn
    [[ $BACK_DB_TYPE != "mysql" ]] && \
        error "Only work for mysql type of tables. SITE=$BACK_KERNEL_SITE DB_TYPE=$BACK_DB_TYPE"
    [[ $DEBUG -gt 0 ]] && \
        log_to_file "Create temporary my.cnf"

    # get info about links
    BACK_WWW_DIRS="."
    if [[ $POOL_SITES_LINK_COUNT -gt 0 ]]; then
        for _site_info in $(echo "$POOL_SITES_LINK_LIST" | grep ":$kernel_name:"); do
            _site_name=$(echo "$POOL_SITES_LINK_LIST" | \
                grep ":$kernel_name:" | awk -F':' '{print $1}')
            _site_root=$(echo "$POOL_SITES_LINK_LIST" | \
                grep ":$kernel_name:" | awk -F':' '{print $6}')
            _site_status=$(echo "$POOL_SITES_LINK_LIST" | \
                grep ":$kernel_name:" | awk -F':' '{print $4}')
            [[ "$_site_status" == "finished" ]] && \
                BACK_WWW_DIRS=$BACK_WWW_DIRS" $_site_root"
        done
    fi
    [[ $DEBUG -gt 0 ]] && \
        log_to_file "Site directories=$BACK_WWW_DIRS"
}

# clean old backup
# crontab can be different => limit by count
clean_old_backup_files(){
    # there are today's backup 
    TODAYS_FILES=$(find $backup_dir -name "www_backup_${kernel_name}*.tar.gz" -mtime -1 | wc -l)
    if [[ $TODAYS_FILES -gt 0 ]]; then
        find $backup_dir -name "www_backup_${kernel_name}*.tar.gz" -mtime +$SAVE_LIMIT -delete
    fi
}

# create backup archive
# backup_dir/wwww_backup_$kernel_name_$DATE_STR_$RAND_STR.tar
create_backup_archive(){
    BACK_FILE=$backup_dir/www_backup_${kernel_name}_${DATE_STR}_${RAND_STR}.tar

    # create tar archive
    tar -cf $BACK_FILE --exclude-from=$WWW_EXCL_DIR -C $BACK_KERNEL_ROOT \
        $BACK_WWW_DIRS \
        $BACK_SQL_FILES 2>/dev/null
    # 1      Some files differ
    # 2      Fatal error.  This means that some fatal, unrecoverable error occurred.
    [[ $? -eq 2 ]] && \
        error "Cannot create tar archive=$BACK_FILE"

    gzip $BACK_FILE

    # delete sql files; we have added them to archive
    for sql_file in $BACK_SQL_FILES; do
        rm -f $sql_file
        log_to_file "Delete sql file=$sql_file"
    done
}


# get backup info
DATE_STR=$(date +%d.%m.%Y)         # backup date
RAND_STR=$(create_random_string)   # backup random string
WWW_BACK_DIR=/home/bitrix/www/bitrix/backup   # dir can be used by php via http(s)
WWW_EXCL_DIR=$BASE_DIR/bin/ex.txt


# test and create backup directory
create_wwwbackup_directory "$WWW_BACK_DIR"

# get options about sites on for defined kernel
get_kernel_info 

# create mysqldump files - list files in BACK_SQL_FILES
mysql_charset='utf8'
[[ "$BACK_KERNEL_CHAR" == "cp1251" ]] && mysql_charset="cp1251"

# create backup via mysqldump
create_mysqldump "$BACK_DB_MYCNF" "$kernel_name" "$mysql_charset" "BACK_SQL_FILES"
rm -f $BACK_DB_MYCNF

#archive backup in file
create_backup_archive

# clean files from old backups
clean_old_backup_files