Your IP : 18.218.149.167
Current Path : /opt/webdir/bin/ |
|
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