Your IP : 3.15.182.126
Current Path : /opt/webdir/bin/ |
|
Current File : //opt/webdir/bin/bitrix_utils.sh |
export LANG=en_US.UTF-8
export TERM=linux
export NOLOCALE=yes
BASE_DIR=/opt/webdir
LOGS_DIR=$BASE_DIR/logs
TEMP_DIR=$BASE_DIR/temp
CACHE_DIR=$BASE_DIR/tmp
BIN_DIR=$BASE_DIR/bin
bx_process_script=$BIN_DIR/bx-process
bx_sites_script=$BIN_DIR/bx-sites
ansible_wrapper=$BIN_DIR/wrapper_ansible_conf
[[ -z $LOGS_FILE ]] && LOGS_FILE=$LOGS_DIR/pool_menu.log
MENU_SPACER="------------------------------------------------------------------------------------"
[[ -z $LINK_STATUS ]] && LINK_STATUS=1
[[ ! -d $CACHE_DIR ]] && mkdir -m 700 $CACHE_DIR
# get_text variables
[[ -f $BIN_DIR/bitrix_utils.txt ]] && \
. $BIN_DIR/bitrix_utils.txt
get_text(){
local txt="${1}"
local opt1="${2}"
local opt2="${3}"
if [[ -n $opt1 && -z "${opt1##*/*}" ]]; then
opt1=$(echo "$opt1" | sed -e "s:/:\\\/:g")
fi
if [[ -n $opt2 && -z "${opt2##*/*}" ]]; then
opt2=$(echo "$opt2" | sed -e "s:/:\\\/:g")
fi
echo "$txt" | sed -e "s/__OPT1__/$opt1/;s/__OPT2__/$opt2/;"
}
# get ip address of host
get_ip_addr() {
# get firt ip address for host
ip -f inet -o addr show | cut -d\ -f 7 | cut -d/ -f 1 | grep -v '127\.0\.0\.1' | head -1
}
print_color_text(){
_color_text="$1"
_color_name="$2"
_echo_opt="$3"
[[ -z "$_color_name" ]] && _color_name='green'
_color_number=38
case "$_color_name" in
green) _color_number=32 ;;
blue) _color_number=34 ;;
red) _color_number=31 ;;
cyan) _color_number=36 ;;
magenta) _color_number=35 ;;
*) _color_number=39 ;;
esac
echo -en "\\033[1;${_color_number}m"
echo $_echo_opt "$_color_text"
echo -en "\\033[0;39m"
}
# save information in log file
print_log() {
_log_message=$1
_log_file=$2
if [[ -n "$_log_file" ]]; then
log_date=$(date +'%Y-%m-%dT%H:%M:%S')
# exclude test domain
printf "%-14s: %6d: %s\n" "$log_date" "$$" "$_log_message" >> $_log_file
else
printf "%-14s: %6d: %s\n" "$log_date" "$$" "$_log_message"
fi
}
get_os_type(){
OS_TYPE=$(cat /etc/redhat-release | grep CentOS -c)
OS_VERSION=$(cat /etc/redhat-release | \
sed -e "s/CentOS Linux release//;s/CentOS release // " | \
cut -d'.' -f1 |sed -e "s/\s\+//")
# is OpenVZ installation
IS_OPENVZ=$( [[ -f /proc/user_beancounters ]] && echo 1 || echo 0 )
# Hardware type
HW_TYPE=general
[[ $IS_OPENVZ -gt 0 ]] && HW_TYPE=openvz
# x86_64 or i386
IS_X86_64=$(uname -a | grep -wc 'x86_64')
[[ -f /etc/profile ]] && \
BITRIX_ENV_TYPE=$(grep BITRIX_ENV_TYPE /etc/profile | \
awk -F'=' '{print $2}')
[[ -z $BITRIX_ENV_TYPE ]] && BITRIX_ENV_TYPE=general
}
# set logo
get_logo(){
logo="$BU0001"
[[ -z $BITRIX_ENV_TYPE ]] && get_os_type
if [[ $BITRIX_ENV_TYPE == "crm" ]]; then
logo="$BU0002"
fi
logov=$(egrep -o 'BITRIX_VA_VER=[0-9\.]+' /root/.bash_profile | \
awk -F'=' '{print $2}' )
export BITRIX_VA_VER=$logov
export BITRIX_ENV_TYPE
echo -e "\t\t" $logo " version "$logov
}
print_header(){
_header_text=$1
echo -e '\t\t\t' "$_header_text"
echo
}
print_verbose(){
_verbose_type=$1
_verbose_message=$2
[[ -z $VERBOSE ]] && VERBOSE=0
if [[ $VERBOSE -gt 0 ]]; then
print_color_text "$_verbose_type" green -n
echo ": $_verbose_message"
fi
}
# error message for all possible menus
error_pick(){
notice_message="$BU2001" ;
}
# print error message
# as we use cycles, must make sure that the user sees an error
print_message(){
_input_message=${1} # prompt in read output
_print_message=${2} # colored text like a notice
_input_format=${3} # can add option to read
_input_key=${4} # saved variable name
_input_default=${5} # default value for variable
_read_input_key=
_notset_input_key=0 # printf change empty string
[[ -z "$_input_message" ]] && _input_message="$BU1001"
# print notice message
[[ -n "$_print_message" ]] && print_color_text "$_print_message" blue -e
echo
# get variable value from user
# -r If this option is given, backslash does not act as an escape character
read $_input_format -r -p "$_input_message" _read_input_key
if [[ -z "$_read_input_key" ]]; then
_notset_input_key=1
[[ -n "$_input_default" ]] && _notset_input_key=2
[[ $DEBUG -gt 0 ]] && echo "$BU2002; _notset_input_key=$_notset_input_key"
else
# %q - print the associated argument shell-quoted, reusable as input
_read_input_key=$(printf "%q" "$_read_input_key")
fi
# if empty set variable to default value
if [[ $_notset_input_key -eq 2 ]]; then
[[ $DEBUG -gt 0 ]] && echo "_input_key="$_input_default
eval "$_input_key="$_input_default
else
eval "$_input_key="$_read_input_key
[[ $DEBUG -gt 0 ]] && echo "_input_key="$_read_input_key
fi
echo
}
# password can't be empty
ask_password_info(){
_password_key=$1
_password_val=$2
print_color_text "$BU0003" red
echo
_password_set=0
_limit_request=3
_current_tequest=0
local _password_1=
local _password_2=
until [[ ( $_current_tequest -gt $_limit_request ) || ( $_password_set -eq 1 ) ]]; do
_current_tequest=$(( $_current_tequest+1 ))
print_message "$(get_text "$BU0004" "$_password_key")" "" "-s" _password_1
print_message "$(get_text "$BU0005" "$_password_key")" "" "-s" _password_2
echo
[[ ( -n "$_password_1" ) && ( "$_password_1" = "$_password_2" ) ]] && _password_set=1
if [[ "$_password_1" != "$_password_2" ]]; then
print_color_text "$BU2003" red
_password_1=
_password_2=
fi
if [[ -z "$_password_1" ]]; then
print_color_text "$BU2004" red
fi
done
if [[ $_password_set -eq 1 ]]; then
_password_1=$(printf "%q" "$_password_1")
eval "$_password_val="$_password_1
return 0
else
print_message "$BU1001" "$BU2005" "" any_key
return 1
fi
}
# client settings
get_client_settings() {
client_settings_file=/etc/ansible/ansible-roles
IN_POOL=0
if [[ -f $client_settings_file ]]; then
host_data=$(grep -v '^#' $client_settings_file)
CLIENT_ID=$(echo "$host_data" | grep '^host_id ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # login of host for basic auth on master
CLIENT_PASSWD=$(echo "$host_data" | grep '^host_pass ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # password of host for basic auth on master
CLIENT_INT=$(echo "$host_data" | grep '^host_ether ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # management interface name
CLIENT_IP=$(echo "$host_data" | grep '^host_netaddr ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # management ip address
MASTER_IP=$(echo "$host_data" | grep '^master_netaddr ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # master ip address
MASTER_NAME=$(echo "$host_data" | grep '^master ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # master name
MASTER_PORT=$(echo "$host_data" | grep '^master_port ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//')
CLIENT_NAME=$(echo "$host_data" | grep '^hostname ' | awk -F'=' '{print $2}' | \
sed -e 's/^\s\+//;s/\s\+$//') # master name
IS_MASTER=$(echo "$host_data" | grep '^groups' | grep -cwi 'bitrix-mgmt')
IS_PUSH=$(echo "$host_data" | grep '^groups' | grep -cwi 'bitrix-push')
IN_POOL=1
fi
}
# get information about pool configuration
# output:
# short_name:net_address:role1,role2,..:host_id:bx_conn:bx_version:bx_passwd:ip1,ip2...
# example:
# h01w:h01w.bx:mgmt,mysql_master_1,web:1397225355:4.4-51
#
# NOTICE: error stops the execution of the script!!!!
# fill out variable POOL_SERVER_LIST
# fill out variable POOL_UNU_SERVER_LIST ( contains out of day servers )
get_pool_info(){
pool_data=$($ansible_wrapper -a view)
# test error
err=$(echo "$pool_data" | grep '^error:' | sed -e "s/^error://" )
# test message
msg=$(echo "$pool_data" | grep '^message:' | sed -e "s/^message://")
# exit if error found
if [[ -n "$err" ]]; then
print_message "$BU2006" "$msg" "" any_key
exit 1
fi
POOL_SERVER_LIST="" # working servers
POOL_UNU_SERVER_LIST="" # unused servers
# add host info to output
data=$(echo "$pool_data" | grep '^host:' | sed -e "s/^host://")
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $data; do
srv_name=$(echo $srv_info | awk -F':' '{print $1}')
# get additional information
# /opt/webdir/bin/wrapper_ansible_conf -a bx_info -H h01w
# bx_variables:h01w:4.4-51:Apr 01, 2014:eth0=192.168.1.193,eth1=10.1.0.3:5.5.40:5.4.34
srv_bx_info=$($ansible_wrapper -a bx_info -H $srv_name)
srv_err=$(echo "$srv_bx_info" | grep '^error:' | sed -e "s/^error://")
srv_msg=$(echo "$srv_bx_info" | grep '^message:' | sed -e "s/^message://")
srv_conn="N" # connected to server or not by ssh
srv_vers="unk" # version of bitrix env, that installed on the server
srv_base_ver="unk" # main part of version (for test)
srv_pwd="unk" # need to change bitrix password
srv_net="unk" # ip address on the server
srv_bx_uid="unk" # uid for user bitrix
srv_bx_php='unk' # php version on the server
srv_bx_mysql='unk' # mysql version on the server
srv_bx_sph='unk' # sphinx version
[[ -z "$srv_err" ]] && srv_conn="Y"
srv_menu_info=
if [[ -z $srv_err ]]; then
srv_conn="Y"
srv_vers=$( echo "$srv_bx_info" | awk -F':' '{print $3}')
srv_base_ver=$( echo "$srv_vers" | awk -F'.' '{print $1}')
srv_pwd_info=$( echo "$srv_bx_info" | awk -F':' '{print $4}' | grep -ic 'must be changed')
srv_bx_mysql=$( echo "$srv_bx_info" | awk -F':' '{print $7}')
srv_bx_php=$( echo "$srv_bx_info" | awk -F':' '{print $8}')
srv_bx_sph=$( echo "$srv_bx_info" | awk -F':' '{print $14}')
# test root password
if [[ $srv_pwd_info -gt 0 ]]; then
srv_pwd="error"
else
srv_pwd="ok"
fi
srv_net=$(echo "$srv_bx_info" | awk -F':' '{print $5}')
srv_bx_uid=$(echo "$srv_bx_info" | awk -F':' '{print $6}')
srv_menu_info="$srv_info:$srv_conn:$srv_vers:$srv_pwd:$srv_net:$srv_bx_uid"
srv_menu_info=$srv_menu_info":$srv_base_ver:$srv_bx_mysql:$srv_bx_php:$srv_bx_sph"
if [[ ( $srv_base_ver -ge 5 ) && ( $srv_pwd == "ok" ) ]]; then
POOL_SERVER_LIST=$POOL_SERVER_LIST"
$srv_menu_info"
else
srv_menu_info=
fi
fi
if [[ -z $srv_menu_info ]]; then
srv_error_descr=""
if [[ $srv_base_ver -lt 5 ]]; then
srv_error_descr="version,"
fi
if [[ $srv_pwd != "ok" ]]; then
srv_error_descr=$srv_error_descr"password,"
fi
if [[ $srv_conn != 'Y' ]]; then
srv_error_descr=ssh_connection
fi
srv_error_descr=$(echo "$srv_error_descr" | sed -e 's/,$//')
srv_menu_info="$srv_info:$srv_conn:$srv_vers:$srv_pwd:$srv_net:$srv_bx_uid:$srv_error_descr"
POOL_UNU_SERVER_LIST=$POOL_UNU_SERVER_LIST"
$srv_menu_info"
fi
done
}
cache_pool_info(){
POOL_UNU_SERVER_LIST=
POOL_SERVER_LIST=
POOL_SERVERS_CACHE=$CACHE_DIR/pool_servers.cache
POOL_UNUSED_CACHE=$CACHE_DIR/pool_unused.cache
POOL_CACHE_TTL=3600
test_cache_file $POOL_SERVERS_CACHE $POOL_CACHE_TTL
test_cache_servers=$?
test_cache_file $POOL_UNUSED_CACHE $POOL_CACHE_TTL
test_cache_unused=$?
# not create cache while ansible-playbook running
is_ansible_running
if [[ $? -gt 0 ]]; then
get_pool_info
return 0
fi
if [[ ( $test_cache_servers -gt 0 ) || \
( $test_cache_unused -gt 0 ) || ( $DEBUG -gt 0 ) ]]; then
get_pool_info
echo "$POOL_SERVER_LIST" > $POOL_SERVERS_CACHE
echo "$POOL_UNU_SERVER_LIST" > $POOL_UNUSED_CACHE
else
POOL_UNU_SERVER_LIST=$(cat $POOL_UNUSED_CACHE)
POOL_SERVER_LIST=$(cat $POOL_SERVERS_CACHE)
fi
}
# get ansible ssh key
# fill out variables:
# ANSIBLE_SSHKEY_PRIVATE
# ANSIBLE_SSHKEY_PUBLIC
get_ansible_sshkey(){
pool_sshkey_info=$($ansible_wrapper -a key) # get sshkey that used in the pool
pool_sshkey_error=$(echo "$pool_sshkey_info" | grep '^error:' | sed -e 's/^error://')
# test error
if [[ -n "$pool_sshkey_error" ]]; then
print_message "$BU1001" "$BU2007" "" any_key
exit
fi
ANSIBLE_SSHKEY_PRIVATE=$(echo "$pool_sshkey_info" | \
grep '^info:sshkey:' | sed -e 's/^info:sshkey://')
ANSIBLE_SSHKEY_PUBLIC=$ANSIBLE_SSHKEY_PRIVATE".pub"
# test if file exists
for _sshkey in $ANSIBLE_SSHKEY_PRIVATE $ANSIBLE_SSHKEY_PUBLIC; do
if [[ ! -f $ANSIBLE_SSHKEY_PRIVATE ]]; then
print_message "$BU1001" \
"$(get_text "$BU2008" $_sshkey)" "" any_key
fi
done
}
# prints formatted output for POOL_SERVER_LIST
# ex.
# h01w:h01w.bx:mgmt,mysql_master_1,web:1397293177:Y:5.0-2:ok:eth0=192.168.1.193,eth1=10.1.0.4
# m02:192.168.2.17::1397293301:Y:5.0-0:ok:eth0=192.168.2.17,eth1=10.1.0.2
#
print_pool_info(){
srv_rols_exclude=$1 # exclude server with defined role
srv_rols_include=$2 # include only servers with defined role
if [[ -z "$POOL_SERVER_LIST" ]]; then
cache_pool_info
fi
#echo "$POOL_SERVER_LIST"
#exit
print_header "$BU0006"
echo "$MENU_SPACER"
printf "%-25s| %-20s | %4s | %7s | %10s | %3s | %s \n" \
"ServerName" "NetAddress" "Conn" "Ver" "Passwords" "Uid" "Roles"
echo "$MENU_SPACER"
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_SERVER_LIST; do
# 1 - vm04.ksh.bx:
# 2 - 172.17.10.104:
# 3 - mgmt,mysql_master_1,web:
# 4 - 1503919366_V37FzFyfwD:
# 5 - vm04.ksh.bx:
# 6 - tranformer options
# 7 - Y
# 8 - 7.1-0:
# 9 - ok:
# 10 - enp0s3=10.0.2.15,enp0s8=172.17.10.104,enp0s9=192.168.100.36:
# 11 - 600:
# 12 - 7:
# 13 - 5.7.18
# 14 - 7.0.19:
# 15 - not_installed
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # server identifier in ansible inventory
srv_neta=$(echo "$srv_info" | awk -F':' '{print $2}') # netaddress
srv_rols=$(echo "$srv_info" | awk -F':' '{print $3}') # server roles
srv_time=$(echo "$srv_info" | awk -F':' '{print $4}' | awk -F'_' '{print $1}') # creation time
srv_date=$(date -d @$srv_time +"%d-%m-%Y")
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
srv_conn=$(echo "$srv_info" | awk -F':' '{print $7}') # server connected to pool or not
srv_bver=$(echo "$srv_info" | awk -F':' '{print $8}') # version virt env on server
srv_bpwd=$(echo "$srv_info" | awk -F':' '{print $9}') # bitrix user password status
srv_bips=$(echo "$srv_info" | awk -F':' '{print $10}') # host interfaces and ip address
srv_buid=$(echo "$srv_info" | awk -F':' '{print $11}') # uid for bitrix user
srv_base_ver=$(echo "$srv_info" | awk -F':' '{print $12}') # version of bitrix-env
is_printed=0
if [[ -n "$srv_rols_exclude" ]]; then
[[ $(echo "$srv_rols" | grep -c "$srv_rols_exclude") -eq 0 ]] && \
is_printed=1
else
if [[ -n "$srv_rols_include" ]]; then
[[ $(echo "$srv_rols" | grep -c "$srv_rols_include") -gt 0 ]] && \
is_printed=1
else
is_printed=1
fi
fi
if [[ $is_printed -gt 0 ]]; then
printf "%-25s| %-20s | %4s | %7s | %10s | %3s | %s \n" \
"$hostname" "$srv_neta" "$srv_conn" "$srv_bver" \
"$srv_bpwd" "$srv_buid" "$srv_rols"
fi
done
IFS=$IFS_BAK
IFS_BAK=
echo "$MENU_SPACER"
# print unused servers
if [[ -n "$POOL_UNU_SERVER_LIST" ]]; then
echo
print_color_text "$BU0007" red
echo "$MENU_SPACER"
printf "%-25s| %-20s | %s \n" \
"ServerName" "NetAddress" "Errors"
echo "$MENU_SPACER"
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_UNU_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # short server name
srv_neta=$(echo "$srv_info" | awk -F':' '{print $2}') # netaddress
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
srv_bver=$(echo "$srv_info" | awk -F':' '{print $7}') # version virt env on server
srv_error_descr=$(echo "$srv_info" | awk -F':' '{print $11}') # uid for bitrix user
printf "%-25s| %-20s" "$hostname" "$srv_neta"
err_r=1
for err in $(echo "$srv_error_descr" | sed -e 's/,/\n/g'); do
if [[ "$err" == "password" ]]; then
err_message="$BU2009"
elif [[ "$err" == "version" ]]; then
err_message="$BU2010"
elif [[ "$err" == "ssh_connection" ]]; then
err_message="$BU2011"
else
err_message=$err
fi
if [[ $err_r -eq 1 ]]; then
printf " | %02d. %s\n" "$err_r" "$err_message"
else
printf "%-25s| %-20s | %02d. %s\n" "" "" "$err_r" "$err_message"
fi
err_r=$(($err_r+1))
done
done
IFS=$IFS_BAK
IFS_BAK=
echo "$MENU_SPACER"
fi
}
# execute background task and print information about status
exec_pool_task(){
_task_exe=$1
_task_txt=$2
_task_inf=$(eval $_task_exe)
_task_err=$(echo "$_task_inf" | grep '^error:' | sed -e "s/^error://")
_task_msg=$(echo "$_task_inf" | grep '^message:' | sed -e "s/^message://")
_task_dat=$(echo "$_task_inf" | grep '^info:' | sed -e "s/^info://")
if [[ -n "$_task_err" ]]; then
print_message "$(get_text "$BU2012" "$_task_txt")" \
"$_task_msg" "" any_key
exit 1
fi
_task_id=$(echo "$_task_dat" | awk -F':' '{print $2}')
_task_pid=$(echo "$_task_dat" | awk -F':' '{print $3}')
_task_status=$(echo "$_task_dat" | awk -F':' '{print $6}')
echo "$BU2014"
printf "%-10s: %s\n" "$BU2015" "$_task_id"
printf "%-10s: %s\n" "$BU2016" "$_task_pid"
printf "%-10s: %s\n" "$BU2017" "$_task_status"
echo "$(get_text "$BU2013" "$_task_txt")"
_task_exe=
_task_txt=
print_message "$BU1001" "" "" any_key
}
# get list of running tasks filter by type
get_task_by_type(){
_task_type=$1
_task_info_lock=$2
_task_info_var=$3
_process_inf=$($bx_process_script -a list -t $_task_type)
_process_err=$(echo "$_process_inf" | grep '^error:' | sed -e "s/^error://")
_process_msg=$(echo "$_process_msg" | grep '^message:' | sed -e "s/^message://")
_process_data=$(echo "$_process_inf" | \
grep '^info:' | sed -e "s/^info://" | grep -i 'running')
eval "$_task_info_lock=0"
eval "$_task_info_var='$_process_data'"
[[ -n "$_process_data" ]] && eval "$_task_info_lock=1"
}
# print running task information for human
print_task_by_type(){
_p_task_type=$1
_p_task_lock=$2
_p_task_info=$3
if [[ -z "$_p_task_lock" ]]; then
get_task_by_type "$_p_task_type" "_p_task_info" "_p_task_lock"
fi
if [[ $_p_task_lock -eq 1 ]]; then
print_color_text "$(get_text "$BU0063" "$_p_task_type")" red
echo "$MENU_SPACER"
printf "%-25s| %-25s | %s\n" \
"$BU0008" "$BU0009" "$BU0010"
echo "$MENU_SPACER"
IFS_BAK=$IFS
IFS=$'\n'
for line in $_p_task_info; do
_task_iden=$(echo $line| awk -F':' '{print $2}') # task id
_task_time=$(echo $line| awk -F':' '{print $4}') # task started at
_task_date=$(date -d @$_task_time +"%d/%m/%Y %H:%M")
_task_step=$(echo $line| awk -F':' '{print $NF}') # current operations
printf "%-25s| %-25s | %s\n" "$_task_iden" "$_task_date" "$_task_step"
done
IFS=$IFS_BAK
IFS_BAK=
# test
echo $MENU_SPACER
print_color_text "$BU1001" red
fi
}
# get information about network interfaces which is configured on the server
get_local_network(){
local check_link_status="${1:-1}" # test link status: 0 - don't check; 1 - check
EXCLUDE_INT='\(lo\)' # exclude interface names
NONHW_INT='\(ppp\)' # exclude test of interface status by ethtool
HOST_NETWORK=0 # number of IP addresses on the host
HOST_INT_COUNT=0 # number interfaces with IP address on the host
HOST_NETWORK_INFO= # list of information about interfaces on the host
# id#interface_name#mac_address#ipv4 ...
HOST_IPS= # list of matches between the interfaces and IP addresses: int1=ip1 ...
# CLIENT_INT/CLIENT_IP
get_client_settings
[[ $DEBUG -gt 0 ]] &&
echo "Test link status=$check_link_status"
# test openssl installation
OPENVZ_INSTALL=$([[ -f /proc/user_beancounters ]] && echo 1 || echo 0)
local ip_link_list=$(ip link show | egrep -o '^[0-9]+:\s+\S+' | \
sed "s/^\s\+//;s/\s\+$//;s/://g;s/@.*//g" | \
awk '{printf "%s\n", $2}' | grep -v "$EXCLUDE_INT")
[[ $DEBUG -gt 0 ]] &&
echo "ip_link_list=$ip_link_list"
local int_count=$(echo "$ip_link_list" | wc -l)
# test network interfaces
if [[ $int_count -eq 0 ]]; then
print_color_text "$BU2018" red -e
return 1
fi
# header
print_color_text "$BU0012" green
echo "$MENU_SPACER"
printf "%10s | %10s | %12s | %20s | %s\n" \
"$BU0013" "$BU0014" "$BU0015" "$BU0016" "$BU0017"
echo "$MENU_SPACER"
# process interfaces
local int_name=
# eth0, eth1, eth2
for int_name in $ip_link_list; do
local int_speed="not_defined"
local int_link="yes"
local int_mac="void"
local int_data=$(ip addr show $int_name | sed -e 's/^\s\+//')
# test inetrfaces, exclude non-hardware interfaces and openvz interfaces
if [[ ( $(echo "$int_name" | grep -c "$NONHW_INT") -eq 0 ) && \
( $OPENVZ_INSTALL -eq 0 ) ]]; then
ethtool_info=$(ethtool $int_name | egrep -o '(Speed|Link detected):\s+\S+')
int_speed=$(echo "$ethtool_info" | awk -F':' '/Speed/{print $2}' | sed -e 's/://g;s/\s\+//g;')
int_link=$( echo "$ethtool_info" | awk -F':' '/Link/{print $2}' | sed -e 's/://g;s/\s\+//g;' )
int_mac=$(echo "$int_data" | egrep -o "ether\s+\S+" | awk '{print $2}')
[[ $DEBUG -gt 0 ]] && \
echo "+ int_name=$int_name"
else
[[ $DEBUG -gt 0 ]] &&
echo "- int_name=$int_name"
fi
if [[ ( $check_link_status -eq 1 ) && ( "$int_link" != "yes" ) ]]; then
[[ $DEBUG -gt 0 ]] && \
echo "$(get_text "$BU2019" "$int_name" "$int_link")"
continue
fi
# test sub-interfaces
# eth0:1 or eth0 - several times
local int_subs=$(echo "$int_data" | grep '^inet\s\+' | awk '{print $NF}')
local int_subs_count=$(echo "$int_subs" | wc -l)
local int_subs_unique=$(echo "$int_subs" | \
sort | uniq -c | \
sed -e "s/^\s\+//;s/\s\+$//;s/\s\+/=/")
[[ $DEBUG -gt 0 ]] && \
echo "--> int_speed=$int_speed int_link=$int_link int_mac=$int_mac int_subs_count=$int_subs_count"
# processing sub interfaces; different records in HOST_NETWORK_INFO and HOST_IPS lists
if [[ $int_subs_count -gt 1 ]]; then
local sub_name=
for sub_name_info in $int_subs_unique; do
sub_cnt=$(echo "$sub_name_info" | awk -F'=' '{print $1}')
sub_name=$(echo "$sub_name_info" | awk -F'=' '{print $2}')
local sub_addr=$(echo "$int_data" | grep "$sub_name$" | \
egrep -o "inet [0-9\.]+" | awk '{print $2}')
# IPADDR2/PREFIX2 in sysconfig file
if [[ $sub_cnt -gt 1 ]]; then
sub_id=0
local sa=
for sa in $sub_addr; do
[[ $sub_id -gt 0 ]] && continue
[[ $DEBUG -gt 0 ]] && \
echo "----> sub_name=${sub_name}/$sub_id sub_addr=$sa"
if [[ ( -n $sa ) && \
( $(echo "$sa" | awk -F'.' '{print $1}') -ne 127 ) ]]; then
HOST_INT_COUNT=$(($HOST_INT_COUNT+1))
HOST_IPS=$HOST_IPS"$sub_name=$sa "
HOST_NETWORK=$(($HOST_NETWORK+1))
HOST_NETWORK_INFO=$HOST_NETWORK_INFO"$HOST_INT_COUNT#$sub_name#$int_mac#$sa "
if [[ $sub_name == "$CLIENT_INT" ]]; then
status_int=primary
if [[ $sa != "$CLIENT_IP" ]]; then
status_int="primary changed"
fi
printf "%10s | %10s | %12s | %20s | %s ($status_int)\n" \
"$sub_name" "$int_link" "$int_speed" "$int_mac" "$sa"
else
printf "%10s | %10s | %12s | %20s | %s\n" \
"$sub_name" "$int_link" "$int_speed" "$int_mac" "$sa"
fi
fi
sub_id=$(( $sub_id + 1 ))
done
else
[[ $DEBUG -gt 0 ]] && \
echo "----> sub_name=$sub_name sub_addr=$sub_addr"
# ip address is found
if [[ ( -n $sub_addr ) && \
( $(echo "$sub_addr" | awk -F'.' '{print $1}') -ne 127 ) ]]; then
HOST_INT_COUNT=$(($HOST_INT_COUNT+1))
HOST_IPS=$HOST_IPS"$sub_name=$sub_addr "
HOST_NETWORK=$(($HOST_NETWORK+1))
HOST_NETWORK_INFO=$HOST_NETWORK_INFO"$HOST_INT_COUNT#$sub_name#$int_mac#$sub_addr "
if [[ $sub_name == "$CLIENT_INT" ]]; then
status_int=primary
if [[ $sub_addr != "$CLIENT_IP" ]]; then
status_int="primary changed"
fi
printf "%10s | %10s | %12s | %20s | %s ($status_int)\n" \
"$sub_name" "$int_link" "$int_speed" "$int_mac" "$sub_addr"
else
printf "%10s | %10s | %12s | %20s | %s\n" \
"$sub_name" "$int_link" "$int_speed" "$int_mac" "$sub_addr"
fi
fi
# ip address is not found => skip
# Notice: need to add support for inet6
fi
done
else
local int_addr=$(echo "$int_data" | grep "$int_name$" | \
egrep -o "inet [0-9\.]+" | awk '{print $2}')
# ip address is found
if [[ ( -n $int_addr ) && \
( $(echo "$int_addr" | awk -F'.' '{print $1}') -ne 127 ) ]]; then
HOST_INT_COUNT=$(($HOST_INT_COUNT+1))
HOST_IPS=$HOST_IPS"$int_name=$int_addr "
HOST_NETWORK=$(($HOST_NETWORK+1))
HOST_NETWORK_INFO=$HOST_NETWORK_INFO"$HOST_INT_COUNT#$int_name#$int_mac#$int_addr "
if [[ $int_name == "$CLIENT_INT" ]]; then
status_int=primary
if [[ $int_addr != "$CLIENT_IP" ]]; then
status_int="primary changed"
fi
printf "%10s | %10s | %12s | %20s | %s ($status_int)\n" \
"$int_name" "$int_link" "$int_speed" "$int_mac" "$int_addr"
else
printf "%10s | %10s | %12s | %20s | %s\n" \
"$int_name" "$int_link" "$int_speed" "$int_mac" "$int_addr"
fi
fi
# ip address is not found => skip
# Notice: need to add support for inet6
fi
done
echo "$MENU_SPACER"
# skip final spaces
HOST_IPS=$(echo "$HOST_IPS" | sed -e 's/\s\+$//')
HOST_NETWORK_INFO=$(echo "$HOST_NETWORK_INFO" | sed -e 's/\s\+$//')
# return 0
}
# get site password file; there is 2 options:
# my_cnf - my.cnf file for mysql connect
# password_file - plain text file with one string - password
get_site_my_connect() {
local _site_name="${1}"
local _site_root="${2}"
local _tmpdir="${3:-/opt/webdir/tmp}"
local _file_type="${4:-my_cnf}"
$bx_sites_script -a $_file_type \
--site "$_site_name" -r "$_site_root" \
--tmpdir $_tmpdir | grep '^bxSite:db:'
}
# create random string
create_random_string() {
randLength=8
rndStr=</dev/urandom tr -dc A-Za-z0-9 | head -c $randLength
echo $rndStr
}
# test password on localhost and start change process
test_passw_bitrix_localhost() {
test_pwd=$(chage -l bitrix)
_test_Last_password_change=$(echo "$test_pwd" | \
awk -F':' '/Last password change/{print $2}' | \
sed 's/^\s\+//;s/\s\+$//;')
if [[ $(echo "$_test_Last_password_change" | grep -ic 'password must be changed') -gt 0 ]]; then
clear
print_color_text "$BU0018" red
passwd bitrix
if [[ $? -gt 0 ]]; then
print_message "$BU1001" "$BU0018" \
"" any_key
exit 1
fi
fi
}
# send client setting to master
update_client_settings() {
client_address="${1}"
http_url="https://$MASTER_IP:$MASTER_PORT/change?client_ip=$client_address"
http_cmd="/usr/bin/curl -s"
http_conn_time=10
http_max_time=30
http_user_agent="Updater/$CLIENT_NAME"
_update_temp=/tmp/update_$(date +%s)
curl --fail --silent --show-error \
-A $http_user_agent --connect-timeout $http_conn_time --max-time $http_max_time \
--user $CLIENT_ID:$CLIENT_PASSWD \
--insecure --write-out "http_code=%{http_code}" $http_url > $_update_temp 2>&1
curl_exit=$?
if [[ $curl_exit -gt 0 ]]; then
print_log "curl return error code=$curl_exit: $(head -1 $_update_temp)" $LOGS_FILE
UPDATE_SEND=0
# test returned code: 401 (incorrect host login and password)
[[ $curl_exit -eq 22 ]] && UPDATE_SEND=255
rm -f $_update_temp
else
UPDATE_SEND=1
rm -f $_update_temp
fi
#echo $UPDATE_SEND
}
# save master settings in master log
update_master_settings(){
master_address="${1}"
master_id="${2}"
#print_log "$ansible_wrapper -a update_network --host_id $master_id -i $master_address" $LOGS_FILE
update_inf=$($ansible_wrapper -a update_network \
--host_id $master_id -i $master_address)
update_err=$(echo "$update_inf" | grep '^error:' | sed -e 's/^error://')
if [[ -z "$update_err" ]]; then
UPDATE_SEND=1
else
UPDATE_SEND=0
fi
}
# test sites configuration before start create mysql cluster
# STOP_BY_KERNELS - doesn't create cluster because kernel sites > 1
# STOP_BY_SCALE - doesn't create cluster because there are sites without scale module
# STOP_BY_CLUSTER - doesn't create cluster because there are sites without scale module
test_sites_config(){
sites_test=$($bx_sites_script -a cluster_test)
STOP_BY_KERNELS=$(echo "$sites_test" | awk -F':' '/:general:/{print $3}')
STOP_BY_CLUSTER=$(echo "$sites_test" | awk -F':' '/:general:/{print $4}')
STOP_BY_SCALE=$(echo "$sites_test" | awk -F':' '/:general:/{print $5}')
STOP_ALL_CONDITIONS=0
if [[ $STOP_BY_KERNELS -gt 1 ]]; then
print_color_text "$BU0019" blue
print_color_text "$(get_text "$BU0020" "$STOP_BY_KERNELS")" red
echo $MENU_SPACER
printf "%20s | %s\n" "$BU0021" "$BU0022"
echo $MENU_SPACER
for def in $(echo "$sites_test" | awk -F':' '/:kernels:/{print $3}' | sed -e 's/;/ /g;'); do
printf "%20s | %s\n" \
"$(echo $def | awk -F'=' '{print $1}')" \
"$(echo $def | awk -F'=' '{print $2}')"
done
echo $MENU_SPACER
STOP_ALL_CONDITIONS=$(( $STOP_ALL_CONDITIONS+1 ))
fi
if [[ $STOP_BY_SCALE -gt 0 ]]; then
print_color_text "$BU0023" blue
print_color_text "$(get_text "$BU0024" $STOP_BY_SCALE)" red
echo $MENU_SPACER
printf "%20s | %s\n" "$BU0021" "$BU0022"
echo $MENU_SPACER
for def in $(echo "$sites_test" | awk -F':' '/:scale:/{print $3}' | sed -e 's/;/ /g;'); do
printf "%20s | %s\n" \
"$(echo $def | awk -F'=' '{print $1}')" \
"$(echo $def | awk -F'=' '{print $2}')"
done
echo $MENU_SPACER
STOP_ALL_CONDITIONS=$(( $STOP_ALL_CONDITIONS+1 ))
fi
if [[ $STOP_BY_CLUSTER -gt 0 ]]; then
print_color_text "$BU0025" blue
print_color_text "$(get_text "$BU0026" $STOP_BY_CLUSTER)" red
echo $MENU_SPACER
printf "%20s | %s\n" "$BU0021" "$BU0022"
echo $MENU_SPACER
for def in $(echo "$sites_test" | awk -F':' '/:cluster:/{print $3}' | sed -e 's/;/ /g;'); do
printf "%20s | %s\n" \
"$(echo $def | awk -F'=' '{print $1}')" \
"$(echo $def | awk -F'=' '{print $2}')"
done
echo $MENU_SPACER
STOP_ALL_CONDITIONS=$(( $STOP_ALL_CONDITIONS+1 ))
fi
}
# https://tools.ietf.org/html/rfc1034
# http://tools.ietf.org/html/rfc1123
# http://en.wikipedia.org/wiki/Hostname
# The standard characters are:
# the numbers from 0 through 9,
# uppercase and lowercase letters from A through Z,
# and the hyphen (-) character.
# Computer names cannot consist entirely of numbers.
# Preferred name syntax
# 1. test for accepted chars
# 2. test string length (for netbios name)
# IP: egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'
test_hostname() {
q_host="${1}"
q_size="${2:-0}"
q_type="${3:-1}"
# now we forget about 63 octets long
hostname_regexp='^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$'
test_hostname=0
localhost_names='^(localhost|localhost.localdom|localhost.localdomain|ip6-localhost|ip6-loopback)'
number_names='^[0-9]+$'
# test hostname
if [[ -z "${q_host}" ]]; then
[[ $q_type -gt 0 ]] && \
print_message "$BU1002" "$BU2020" "" any_key
return 255
fi
# test initial host name regexp
if [[ $(echo "${q_host}" | egrep -c "$hostname_regexp" ) -gt 0 ]]; then
# test localhost aliases
if [[ $(echo "${q_host}" | egrep -c "$localhost_names") -gt 0 ]]; then
[[ $q_type -gt 0 ]] && \
print_message "$BU1002" "$(get_text "$BU2021" "$q_host")" "" any_key
return 2
# test names cannot consist entirely of numbers.
elif [[ $(echo "${q_host}" | egrep -c "$number_names") -gt 0 ]]; then
[[ $q_type -gt 0 ]] && \
print_message "$BU1002" "$(get_text "$BU2022" "$q_host")" "" any_key
return 3
fi
# alil test passed
# if limit size defined, check it
if [[ ${q_size} -gt 0 ]] 2>/dev/null; then
len_hostname=$(echo -n "${q_host}" | wc -c)
# hostname `test`
# len 4
if [[ $DEBUG -gt 0 ]]; then
echo "Len Hostname: ${len_hostname}"
echo "Limit: ${q_size}"
fi
# all ok
if [[ ${len_hostname} -le ${q_size} ]]; then
test_hostname=1
else
[[ $q_type -gt 0 ]] && \
print_message "$BU1002" \
"$(get_text "$BU2023" "$q_host" "$q_size")" "" "" any_key
return 1
fi
fi
test_hostname=1
else
if [[ $q_type -gt 0 ]]; then
print_color_text "$BU0027"
echo "$BU0028"
echo
print_message "$BU1002" "$(get_text "$BU2024" "$q_host")" "" any_key
fi
return 1
fi
return 0
}
# test cache file
# return 0 - cache file exists and relevant
# return 1 - cache file doesn't exist
# return 2 - cache file is expired
# return 255 - unknown error
test_cache_file(){
local cache_file="${1}"
local cache_lv="${2:-7200}"
# test file existense
[[ ! -f $cache_file ]] && return 1
# test file modification time
local cache_tm=$(stat -c %Y $cache_file)
local tm=$(date +%s)
local diff=$(( $tm - $cache_tm ))
[[ $diff -gt $cache_lv ]] && return 2
# return good answer
return 0
}
# test bitrix-env new version
test_bitrix_update(){
local bitrix_update_cache=$CACHE_DIR/bitrix_update.cache
local bitrix_update_lv=86400
local bitrix_rtn=0
test_cache_file $bitrix_update_cache
if [[ $? -gt 0 ]]; then
yum makecache fast >/dev/null 2>&1
yum check-update | grep -c '^bitrix-env' > $bitrix_update_cache 2>/dev/null
fi
return $(cat $bitrix_update_cache)
}
# print menu
print_menu(){
IFS_BAK=$IFS
IFS=$'\n'
echo "$BU0029"
for menu_item in $menu_list; do
echo -e "\t\t" $menu_item
done
IFS=$IFS_BAK
IFS_BAK=
}
log_to_file(){
log_message="${1}"
notice="${2:-INFO}"
printf "%20s: %5s [%s] %s\n" \
"$(date +"%Y/%m/%d %H:%M:%S")" $$ "$notice" "$log_message" >> $LOGS_FILE
[[ $DEBUG -gt 0 ]] && \
printf "%20s: %5s [%s] %s\n" \
"$(date +"%Y/%m/%d %H:%M:%S")" $$ "$notice" "$log_message" 1>&2
return 0
}
# Centos7:
# mysql-community-server => mysql-community
# Percona-Server-server => percona
# MariaDB-server => MariaDB
# mariadb-server => mariadb
# Centos6:
# mysql-server => mysql
get_mysql_package(){
[[ -n $MYSQL_PACKAGE ]] && return 0
PACKAGES_LIST=$(rpm -qa)
MYSQL_PACKAGE=not_installed
MYSQL_SERVICE=not_installed
MYSQL_VERSION=not_installed
if [[ $(echo "$PACKAGES_LIST" | grep -c '^mysql-community-server') -gt 0 ]]; then
MYSQL_PACKAGE=mysql-community-server
MYSQL_SERVICE=mysqld
# Percona 5.6 && 5.7
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^Percona-Server-server') -gt 0 ]]; then
MYSQL_PACKAGE=Percona-Server-server
MYSQL_SERVICE=mysqld
# Percona 8.0
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^percona-server-server') -gt 0 ]]; then
MYSQL_PACKAGE=percona-server-server
MYSQL_SERVICE=mysqld
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^MariaDB-server') -gt 0 ]]; then
MYSQL_PACKAGE=MariaDB-server
MYSQL_SERVICE=mariadb
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^mariadb-server') -gt 0 ]]; then
MYSQL_PACKAGE=mariadb-server
MYSQL_SERVICE=mariadb
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^mysql-server') -gt 0 ]]; then
MYSQL_PACKAGE=mysql-server
MYSQL_SERVICE=mysqld
else
return 1
fi
MYSQL_VERSION=$(rpm -qa --queryformat '%{version}' ${MYSQL_PACKAGE}* | \
head -1 | awk -F'.' '{printf "%d.%d", $1,$2}' )
MYSQL_MID_VERSION=$(echo "$MYSQL_VERSION" | awk -F'.' '{print $2}')
MYSQL_UNI_VERSION=$(echo "$MYSQL_VERSION" | awk -F'.' '{printf "%s%s", $1,$2}')
# mysql status
[[ -z $OS_VERSION ]] && get_os_type
MYSQL_STATUS=
if [[ $OS_VERSION -eq 7 ]]; then
systemctl is-active $MYSQL_SERVICE >/dev/null 2>&1
status_rtn=$?
else
MYSQL_INIT_SCRIPT=/etc/init.d/mysqld
MYSQL_SERVICE_NAME=mysqld
if [[ -f /etc/init.d/mysql ]]; then
MYSQL_INIT_SCRIPT=/etc/init.d/mysql
MYSQL_SERVICE_NAME=mysql
fi
$MYSQL_INIT_SCRIPT status | grep -wc running >/dev/null 2>&1
status_rtn=$?
fi
if [[ $status_rtn -gt 0 ]]; then
MYSQL_STATUS="stopped"
else
MYSQL_STATUS="running"
fi
}
my_start () {
[[ -z $MYSQL_STATUS ]] && get_mysql_package
[[ -z $OS_VERSION ]] && get_os_type
[[ $MYSQL_STATUS == "running" ]] && return 0
if [[ $OS_VERSION -eq 7 ]]; then
systemctl start $MYSQL_SERVICE
else
service mysqld start
fi
}
# copy-paste from mysql_secure_installation; you can find explanation in that script
basic_single_escape () {
echo "$1" | sed 's/\(['"'"'\]\)/\\\1/g'
}
# generate random password
randpw(){
local len="${1:-20}"
local pt="${2:-0}"
if [[ $pt -eq 0 ]]; then
</dev/urandom tr -dc '?!@&\-_+@%\(\)\{\}\[\]=0-9a-zA-Z' | head -c$len; echo ""
elif [[ $pt -ge 10 ]]; then
</dev/urandom tr -dc '\-_+=0-9a-zA-Z' | head -c$len; echo ""
else
</dev/urandom tr -dc '0-9a-z' | head -c$len; echo ""
fi
}
# generate client mysql config
my_config(){
local cfg="${1:-$MYSQL_CNF}"
echo "# mysql bvat config file" > $cfg
echo "[client]" >> $cfg
echo "user=root" >> $cfg
local esc_pass=$(basic_single_escape "$MYSQL_ROOTPW")
echo "password='$esc_pass'" >> $cfg
echo "socket=/var/lib/mysqld/mysqld.sock" >> $cfg
}
# run query
my_query(){
local query="${1}"
local cfg="${2:-$MYSQL_CNF}"
[[ -z $query ]] && return 1
local tmp_f=$(mktemp /tmp/XXXXX_command)
echo "$query" > $tmp_f
mysql --defaults-file=$cfg < $tmp_f >> $LOGS_FILE 2>&1
mysql_rtn=$?
rm -f $tmp_f
return $mysql_rtn
}
# query and result
my_select(){
local query="${1}"
local cfg="${2:-$MYSQL_CNF}"
[[ -z $query ]] && return 1
local tmp_f=$(mktemp /tmp/XXXXX_command)
echo "$query" > $tmp_f
mysql --defaults-file=$cfg < $tmp_f
mysql_rtn=$?
rm -f $tmp_f
return $mysql_rtn
}
my_additional_security(){
# delete anonymous users
my_query "DELETE FROM mysql.user WHERE User='';"
[[ $? -eq 0 ]] && print_color_text "$BU0030"
# remove remote root
my_query \
"DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
[[ $? -eq 0 ]] && print_color_text "$BU0031"
# remove test database
my_query "DROP DATABASE test;"
[[ $? -eq 0 ]] && print_color_text "$BU0032"
my_query "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
[[ $? -eq 0 ]] && print_color_text "$BU0033"
# flush privileges
my_query "FLUSH PRIVILEGES;"
[[ $? -eq 0 ]] && print_color_text "$BU0034"
}
update_site_settings(){
local path=${1:-/home/bitrix/www/bitrix/.settings.php}
tmp_path=$path.tmp
[[ -z $BX_PASSWORD ]] && return 2
[[ -z $BX_USER ]] && return 2
[[ ! -f $path ]] && return 1
#cp -f $path $path.bak
log_to_file "$(get_text "$BU0036" "$path")"
# 'login' => '__LOGIN__',
# 'password' => '__PASSWORD__',
login_line=$(grep -n "'login'" $path | awk -F':' '{print $1}')
if [[ -z $login_line ]]; then
log_to_file "$(get_text "$BU2025" "$path")"
exit 1
fi
esc_pass=$(basic_single_escape $BX_PASSWORD)
{
head -n $(( $login_line-1 )) $path
echo " 'login' => '$BX_USER',"
echo " 'password' => '$esc_pass',"
tail -n +$(( $login_line+2 )) $path
} > $tmp_path
mv -f $tmp_path $path
chown bitrix:bitrix $path
chmod 640 $path
log_to_file "$(get_text "$BU0035" "$path")"
}
update_site_dbconn(){
local path=${1:-/home/bitrix/www/bitrix/php_interface/dbconn.php}
tmp_path=$path.tmp
[[ -z $BX_PASSWORD ]] && return 2
[[ -z $BX_USER ]] && return 2
[[ ! -f $path ]] && return 1
#cp -f $path $path.bak
log_to_file "$(get_text "$BU0036" "$path")"
login_line=$(grep -n "DBLogin" $path | awk -F':' '{print $1}')
if [[ -z $login_line ]]; then
log_to_file "$BU2025"
exit 1
fi
esc_pass=$(basic_single_escape $BX_PASSWORD)
{
head -n $(( $login_line-1 )) $path
echo "\$DBLogin = '$BX_USER';"
echo "\$DBPassword = '$esc_pass';"
tail -n +$(( $login_line+2 )) $path
} > $tmp_path
mv -f $tmp_path $path
chown bitrix:bitrix $path
chmod 640 $path
log_to_file "$(get_text "$BU0035" "$path")"
}
# create mysql account and database for default site
# MYSQL_USER_BASE
update_site_mysql_data(){
user_select="${1}"
user_tmp=$(mktemp /tmp/XXXXXX_user)
BX_PASSWORD=
BX_USER=
if [[ -n $user_select ]]; then
BX_USER="$user_select"
else
user_id=0
# choose user name
test_limits=20
while [[ ( -z $BX_USER ) && ( $test_limits -gt 0 ) ]]; do
test_user="${MYSQL_USER_BASE}${user_id}"
log_to_file "$(get_text "$BU0037" "$test_user")"
my_select "SELECT User FROM mysql.user WHERE User='$test_user'" > $user_tmp 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2026"
cat $user_tmp >> $LOGS_FILE
rm -f $user_tmp
exit
fi
# if temporary file contains username than request return value and user exists
is_user=$(cat $user_tmp | grep -wc "$test_user")
[[ $is_user -eq 0 ]] && \
BX_USER="$test_user"
user_id=$(( $user_id + 1 ))
test_limits=$(( $test_limits - 1 ))
done
if [[ -z $BX_USER ]]; then
log_to_file "$BU2027"
rm -f $user_tmp
exit 1
fi
log_to_file "$(get_text "$BU0038" "$BX_USER")"
fi
# create/update user
my_query="CREATE"
[[ -n $user_select ]] && my_query="ALTER"
BX_PASSWORD=$(randpw)
esc_db_password=$(basic_single_escape $BX_PASSWORD)
my_query "$my_query USER '$BX_USER'@'localhost' IDENTIFIED BY '$esc_db_password';" > $user_tmp 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "Cannot $my_query $BX_USER"
cat $user_tmp >> $LOGS_FILE
rm -f $user_tmp
exit 1
fi
log_to_file "$my_query mysql user=$BX_USER password=$BX_PASSWORD"
# grant access
my_query "GRANT ALL PRIVILEGES ON $BX_DB.* TO '$BX_USER'@'localhost';" >$user_tmp 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$(get_text "$BU2028" "$BX_USER" "$BX_DB")"
cat $user_tmp >> $LOGS_FILE
rm -f $user_tmp
exit 1
fi
log_to_file "$(get_text "$BU0039" "$BX_USER" "$BX_DB")"
# create database
rm -f $user_tmp
}
my_generate_rootpw(){
[[ -z $MYSQL_VERSION ]] && \
get_mysql_package
# start mysql
my_start
log_to_file "$(get_text "$BU0040" "$MYSQL_VERSION" "$MYSQL_MID_VERSION")"
if [[ ! -f $MYSQL_CNF ]]; then
log_to_file "$(get_text "$BU0041" "$MYSQL_CNF")"
if [[ $MYSQL_MID_VERSION -eq 7 ]]; then
MYSQL_LOG_FILE=/var/log/mysqld.log
MYSQL_ROOTPW=$(grep 'temporary password' $MYSQL_LOG_FILE | awk '{print $NF}')
MYSQL_ROOTPW_TYPE=temporary
else
MYSQL_ROOTPW=
MYSQL_ROOTPW_TYPE=empty
fi
# test root has empty password
local my_temp=$MYSQL_CNF.temp
my_config "$my_temp"
my_query "status;" "$my_temp"
[[ $? -gt 0 ]] && return 1
mysql_update_config=$my_temp
else
log_to_file "$(get_text "$BU0042" "$MYSQL_CNF")"
my_query "status;"
[[ $? -gt 0 ]] && return 2
MYSQL_ROOTPW_TYPE=saved
cp -f $MYSQL_CNF $MYSQL_CNF.temp
mysql_update_config=$MYSQL_CNF.temp
fi
log_to_file "$(get_text "$BU0043" "$MYSQL_ROOTPW_TYPE")"
# generate root password and update mysql settings
MYSQL_ROOTPW=$(randpw)
local esc_pass=$(basic_single_escape "$MYSQL_ROOTPW")
if [[ $MYSQL_MID_VERSION -gt 5 ]]; then
my_query "ALTER USER 'root'@'localhost' IDENTIFIED BY '$esc_pass';" \
"$mysql_update_config"
my_query_rtn=$?
else
my_query \
"UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root'; FLUSH PRIVILEGES;" \
"$mysql_update_config"
my_query_rtn=$?
fi
if [[ $my_query_rtn -eq 0 ]]; then
log_to_file "$BU0044"
rm -f $mysql_update_config
else
log_to_file "$BU0045"
rm -f $mysql_update_config
return 1
fi
# create /root/.my.cnf and save settings
my_config
log_to_file "$BU0046"
# configure additional options
my_additional_security
log_to_file "$BU0047"
}
my_generate_sitepw(){
local site_dir="${1:-/home/bitrix/www}"
local site_dbcon="$site_dir/bitrix/php_interface/dbconn.php"
local site_settings="$site_dir/bitrix/.settings.php"
local site_db=$(cat $site_dbcon | \
grep -v '^#\|^$\|^;' | grep -w DBName | \
awk -F'=' '{print $2}' | sed -e 's/"//g;s/;//;s/\s\+//')
[[ -f $site_dbcon && -f $site_settings ]] || return 1
[[ -z $site_db ]] && return 1
BX_DB="$site_db"
# test root login in config files
dbconn_info=$(cat $site_dbcon | grep -v '\(^$\|^;\|^#\)' | \
grep -w "DBLogin")
settings_info=$(cat $site_settings | grep -v '\(^$\|^;\|^#\)' | \
grep -w "login")
is_root_dbcon=$(echo "$dbconn_info" | grep -wc "root")
is_root_settings=$(echo "$settings_info" | grep -wc "root")
is_bitrix_dbcon=$(echo "$dbconn_info" | grep -c "bitrix")
is_bitrix_settings=$(echo "$settings_info" | grep -c "bitrix")
BX_USER=
if [[ $is_bitrix_dbcon -gt 0 ]]; then
BX_USER=$(echo "$dbconn_info" | awk -F'=' '{print $2}' | \
sed -e "s/^\s\+//;s/\s\+$//" | \
sed -e "s/^'//;s/;$//;s/'$//")
else
[[ ( $is_root_dbcon -eq 0 ) && ( $is_root_settings -eq 0 ) ]] && return 1
fi
# generate user settings
update_site_mysql_data "$BX_USER"
# create db, if not exist
[[ ! -d "/var/lib/mysql/$site_db" ]] && \
my_query "CREATE DATABASE $site_db"
# update configs
update_site_dbconn "$site_dbcon"
update_site_settings "$site_settings"
}
update_crypto_key(){
local site_dir="${1:-/home/bitrix/www}"
local site_settings="$site_dir/bitrix/.settings.php"
[[ -f $site_settings ]] || return 1
secure_key=$(randpw 32 1)
sed -i "s/MYSUPERSECRETPHRASE/$secure_key/" $site_settings
}
generate_push(){
[[ -z $OS_VERSION ]] && get_os_type
if [[ -f /etc/sysconfig/push-server-multi ]]; then
sed -i "/SECURITY_KEY/d" /etc/sysconfig/push-server-multi && \
log_to_file "$BU0048"
# generate configs
/etc/init.d/push-server-multi reset >/dev/null 2>&1
log_to_file "$BU0049"
# publish variables to apache
. /etc/sysconfig/push-server-multi
if [[ $OS_VERSION -eq 7 ]]; then
log_to_file "$BU0050"
# delete current one
sed -i "/BX_PUSH_SECURITY_KEY/d" /etc/httpd/bx/conf/00-environment.conf
echo "SetEnv BX_PUSH_SECURITY_KEY $SECURITY_KEY" >> /etc/httpd/bx/conf/00-environment.conf
else
log_to_file "Update /etc/sysconfig/httpd"
sed -i "/BX_PUSH_SECURITY_KEY/d" /etc/sysconfig/httpd
echo "BX_PUSH_SECURITY_KEY=$SECURITY_KEY" >> /etc/sysconfig/httpd
fi
# settings file
sed -i "s/__SECURITY_KEY__/$SECURITY_KEY/" /home/bitrix/www/bitrix/.settings.php
# restart apache
service httpd restart >/dev/null 2>&1
fi
}
update_bitrix_password(){
BITRIXTMP=$(mktemp /tmp/.password_XXXXXXX)
# generate password
randpw 10 > $BITRIXTMP
# update user
cat $BITRIXTMP | passwd --stdin bitrix >> $LOGS_FILE 2>&1
log_to_file "$BU0051"
# delete temporary file
rm -f $BITRIXTMP
}
update_root_password(){
ROOTPASSWORD=/root/ROOT_PASSWORD
# generate password
ROOTPW=$(randpw 10 1)
# update user
log_to_file "$BU0052"
echo -n "$ROOTPW" | passwd --stdin root >> $LOGS_FILE 2>&1
echo -n "$ROOTPW" > $ROOTPASSWORD
# this password is working for the first logon
chage -d0 root >> $LOGS_FILE 2>&1
# add cleaner to .bash_profile file
echo /opt/webdir/bin/rpm_package/cleaner.sh >> /root/.bash_profile
log_to_file "$BU0053"
}
generate_ansible_inventory(){
ask_user="${1:-0}"
bitrix_type="${2:-general}"
hostident="${3}"
log_to_file "$BU0054"
# get host interfaces
get_local_network 1>/dev/null 2>&1
if [[ $HOST_NETWORK -gt 0 ]]; then
# use the first interface
USED_INT=
USED_IP=
for info in $HOST_IPS; do
if [[ -z $USED_INT ]]; then
USED_INT=$(echo $info | awk -F'=' '{print $1}')
USED_IP=$(echo $info | awk -F'=' '{print $2}')
fi
done
else
log_to_file "$BU2029"
return 1
fi
log_to_file "$(get_text "$BU0055" "$USED_INT" "$USED_IP")"
# get hostname
if [[ -z $hostident ]]; then
USED_HOSTNAME=$(hostname)
else
USED_HOSTNAME="${hostident}"
fi
test_hostname "$USED_HOSTNAME" 0 0
test_hostname_rtn=$?
if [[ $test_hostname_rtn -gt 0 ]]; then
if [[ $ask_user -gt 0 ]]; then
read -r -p "$BU0056" USED_HOSTNAME
[[ -z $USED_HOSTNAME ]] && \
USED_HOSTNAME=server1
else
USED_HOSTNAME=server1
fi
fi
log_to_file "$(get_text "$BU0057" "$USED_HOSTNAME")"
# start creation pool
/opt/webdir/bin/wrapper_ansible_conf -a create \
--bitrix_type $bitrix_type \
-H $USED_HOSTNAME -I $USED_INT >> $LOGS_FILE 2>&1
if [[ $? -gt 0 ]]; then
return 1
fi
log_to_file "$BU0058"
}
# get available memory on board
get_available_memory(){
AVAILABLE_MEMORY=$(free | grep Mem | awk '{print $2}')
if [[ $IS_OPENVZ -gt 0 ]]; then
if [[ -z $AVAILABLE_MEMORY ]]; then
mem4kblock=`cat /proc/user_beancounters | \
grep vmguarpages|awk '{print $4}'`
mem4kblock2=`cat /proc/user_beancounters | \
grep privvmpages|awk '{print $4}'`
if [[ ${mem4kblock2} -gt ${mem4kblock} ]]; then
AVAILABLE_MEMORY=$(echo "${mem4kblock} * 4"|bc)
else
AVAILABLE_MEMORY=$(echo "${mem4kblock2} * 4"|bc)
fi
fi
fi
AVAILABLE_MEMORY_MB=$(( $AVAILABLE_MEMORY / 1024 ))
[[ ( $IS_X86_64 -eq 0 ) && ( $AVAILABLE_MEMORY_MB -gt 4096 ) ]] && \
AVAILABLE_MEMORY_MB=4096
}
get_php_settings(){
PHP_CMD=$(which php)
APACHE_CMD=$(which httpd)
# 5.4, 5.6, 7.0 and etc
PHP_VERSION=$($PHP_CMD -v | \
egrep -o "PHP [0-9\.]+" | awk '{print $2}' | \
awk -F'.' '{printf "%d.%d", $1, $2}')
php_up=$(echo "$PHP_VERSION" | awk -F'.' '{print $1}')
php_mid=$(echo "$PHP_VERSION" | awk -F'.' '{print $2}')
IS_OLDER_PHP=0
[[ ( $php_up -ge 5 && $php_mid -ge 6 ) || ( $php_up -ge 7 ) ]] && \
IS_OLDER_PHP=1
APACHE_VERSION=$($APACHE_CMD -v | \
egrep -o "Apache/[0-9\.]+" | awk -F'/' '{print $2}' | \
awk -F'.' '{printf "%d.%d", $1,$2}')
IS_APCU_PHP=$($PHP_CMD -m 2>/dev/null | grep -wc apcu)
IS_OPCACHE_PHP=$($PHP_CMD -m 2>/dev/null | grep -wc OPcache)
}
# bx_trusted
public_firewalld(){
if [[ $(systemctl is-active firewalld | grep -wc active) -eq 0 ]]; then
# http://jabber.bx/view.php?id=89409
rpm -qi firewalld >/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU0061"
yum -y install firewalld >/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2032"
return 2
fi
fi
systemctl enable firewalld >/dev/null 2>&1
systemctl start firewalld
if [[ $? -gt 0 ]]; then
log_to_file "$BU2033"
return 2
fi
fi
log_to_file "$BU0059"
is_bx_trusted=$(firewall-cmd --get-zones | grep "bx_trusted" -wc)
if [[ $is_bx_trusted -eq 0 ]]; then
firewall-cmd --permanent --new-zone=bx_trusted >/dev/null 2>&1
fi
firewall-cmd --zone=bx_trusted --permanent --add-port=1-65535/tcp >/dev/null 2>&1
firewall-cmd --zone=bx_trusted --permanent --add-port=1-65535/udp >/dev/null 2>&1
firewall-cmd --zone=public --list-interfaces 1>/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2030"
return 2
fi
firewall-cmd --permanent --zone=public --add-service=http >/dev/null 2>&1 && \
firewall-cmd --permanent --zone=public --add-service=https >/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2031"
return 2
fi
log_to_file "$BU0060"
firewall-cmd --reload >/dev/null 2>&1
return 0
}
check_iptables_status() {
iptables_status='disabled'
iptables_tmp=$(mktemp $TMP_DIR/bx_iptables.XXXXX)
iptables_test_port=2222
iptables_test_port_is_good=0
# test if port is close (nobody listen)
while [[ $iptables_test_port_is_good -eq 0 ]]; do
ss -lnp | egrep ":80\s+$iptables_test_port" > $iptables_tmp 2>&1
if [[ $? -gt 0 ]]; then
iptables_test_port_is_good=1
else
iptables_test_port=$(( $iptables_test_port + 1 ))
fi
done
# iptables working (stateless)
iptables -I INPUT -p tcp \
--dport $iptables_test_port -j ACCEPT > $iptables_tmp 2>&1
if [[ $? -eq 0 ]]; then
iptables_status='stateless'
iptables -D INPUT -p tcp \
--dport $iptables_test_port -j ACCEPT > $iptables_tmp 2>&1
fi
# iptables working (stateful)
if [[ $iptables_status == "stateless" ]]; then
iptables -I INPUT -m state --state NEW \
-p tcp --dport $iptables_test_port -j ACCEPT > $iptables_tmp 2>&1
if [[ $? -eq 0 ]]; then
iptables_status='stateful'
iptables -D INPUT -m state --state NEW \
-p tcp --dport $iptables_test_port -j ACCEPT > $iptables_tmp 2>&1
fi
fi
rm -f $iptables_tmp
}
check_firewalld_status(){
firewalld_package="not_installed"
firewalld_status="not_running"
firewalld_bx_type="not_installed"
firewalld_tolerance="non_compatible"
firewalld_tmp=$(mktemp $TMP_DIR/firewalld.XXXXX)
rpm -qi firewalld > $firewalld_tmp 2>&1
if [[ $? -gt 0 ]]; then
rm -f $firewalld_tmp
return 0
fi
firewalld_package="installed"
firewall-cmd --state > $firewalld_tmp 2>&1
if [[ $? -gt 0 ]]; then
rm -f $firewalld_tmp
return 0
fi
if [[ $(grep -c '^running$' $firewalld_tmp) -gt 0 ]]; then
firewalld_status="running"
if [[ $(firewall-cmd --get-active-zones | grep bx_trusted -c) -gt 0 ]]; then
firewalld_bx_type="installed"
fi
systemctl status firewalld > $firewalld_tmp 2>&1
if [[ $(grep -c "ERROR:" $firewalld_tmp) -eq 0 ]]; then
firewalld_tolerance="compatible"
fi
fi
rm -f $firewalld_tmp
}
replace_firewalld_by_iptables(){
[[ -z $OS_VERSION ]] && get_os_type
if [[ $OS_VERSION -eq 7 ]]; then
check_firewalld_status
if [[ $firewalld_package == "installed" ]]; then
yum -y remove firewalld >/dev/null 2>&1
yum -y install iptables-services >/dev/null 2>&1
systemctl enable iptables
systemctl start iptables
fi
if [[ $(systemctl is-active iptables | grep -c "active") -eq 0 ]]; then
echo '*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT' > /etc/sysconfig/iptables
systemctl start iptables
fi
else
chkconfig iptables on
/etc/init.d/iptables restart >/dev/null 2>&1
fi
}
public_stateless_iptables(){
replace_firewalld_by_iptables
is_incorrect_rules=$(grep -c "state NEW" /etc/sysconfig/iptables)
if [[ $is_incorrect_rules -gt 0 ]]; then
echo '*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT' > /etc/sysconfig/iptables
fi
if [[ -f /etc/sysconfig/iptables-config ]]; then
sed -i "/IPTABLES_MODULES_UNLOAD/d" /etc/sysconfig/iptables-config
echo 'IPTABLES_MODULES_UNLOAD="no"' >> /etc/sysconfig/iptables-config
fi
iptables -I INPUT -m tcp -p tcp --dport 80 -j ACCEPT 1>/dev/null 2>&1 && \
iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT 1>/dev/null 2>&1 && \
iptables -I INPUT -p tcp -m tcp --sport 443 -j ACCEPT 1>/dev/null 2>&1 && \
iptables -I INPUT -p tcp -m tcp --sport 80 -j ACCEPT 1>/dev/null 2>&1 &&\
iptables -I INPUT -p udp -m udp --sport 53 -j ACCEPT 1>/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2035"
return 2
fi
iptables-save > /etc/sysconfig/iptables
}
public_stateful_iptables(){
replace_firewalld_by_iptables
iptables -I INPUT -m tcp -p tcp \
-m state --state NEW --dport 80 -j ACCEPT 1>/dev/null 2>&1 && \
iptables -I INPUT -m tcp -p tcp \
-m state --state NEW --dport 443 -j ACCEPT 1>/dev/null 2>&1
if [[ $? -gt 0 ]]; then
log_to_file "$BU2035"
return 2
fi
iptables-save > /etc/sysconfig/iptables
}
configure_firewall_daemon(){
CONFIGURE_IPTABLES=${1:-1}
CONFIGURE_FIREWALLD=${2:-0}
# configure iptables_status
check_iptables_status
log_to_file "testing iptables status return $iptables_status"
if [[ $iptables_status != 'stateful' ]]; then
if [[ $iptables_status == "disabled" ]]; then
log_to_file "$BU2036"
return 255
else
public_stateless_iptables
fi
# support statefull
else
if [[ $OS_VERSION == "7" ]]; then
if [[ $CONFIGURE_FIREWALLD -eq 1 ]]; then
public_firewalld
check_firewalld_status
if [[ $firewalld_tolerance == "non_compatible" ]]; then
log_to_file "$BU2037"
public_stateful_iptables
fi
else
public_stateful_iptables
fi
else
public_stateful_iptables
fi
fi
}
get_server_id(){
local h="${1}"
[[ -z ${h} ]] && return 3
cache_pool_info
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # server identifier in ansible inventory
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $hostname == "$h" ]]; then
echo $srv_name
return 0
fi
if [[ $srv_name == "$h" ]]; then
echo $srv_name
return 0
fi
done
IFS=$IFS_BAK
IFS_BAK=
# print unused servers
if [[ -n "$POOL_UNU_SERVER_LIST" ]]; then
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_UNU_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # short server name
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $hostname == "$h" ]]; then
echo $srv_name
return 1
fi
if [[ $srv_name == "$h" ]]; then
echo $srv_name
return 1
fi
done
IFS=$IFS_BAK
IFS_BAK=
fi
return 2
}
if_hostname_exists_in_the_pool(){
local h="${1}"
cache_pool_info
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # server identifier in ansible inventory
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $hostname == "$h" ]]; then
return 1
fi
done
IFS=$IFS_BAK
IFS_BAK=
# print unused servers
if [[ -n "$POOL_UNU_SERVER_LIST" ]]; then
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_UNU_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # short server name
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $hostname == "$h" ]]; then
return 1
fi
done
IFS=$IFS_BAK
IFS_BAK=
fi
return 0
}
if_serverid_exists_in_the_pool(){
local h="${1}"
cache_pool_info
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # server identifier in ansible inventory
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $srv_name == "$h" ]]; then
return 1
fi
done
IFS=$IFS_BAK
IFS_BAK=
# print unused servers
if [[ -n "$POOL_UNU_SERVER_LIST" ]]; then
IFS_BAK=$IFS
IFS=$'\n'
for srv_info in $POOL_UNU_SERVER_LIST; do
srv_name=$(echo "$srv_info" | awk -F':' '{print $1}') # short server name
hostname=$(echo "$srv_info" | awk -F':' '{print $5}') # server name
if [[ $srv_name == "$h" ]]; then
return 1
fi
done
IFS=$IFS_BAK
IFS_BAK=
fi
return 0
}
print_menu_header(){
clear
echo -e "\t\t\t" $logo
echo -e "\t\t\t" $menu_logo
echo
}
is_ansible_running(){
IS_ANSIBLE_PROCESS=$(ps -ef | grep ansible-playbook | grep -v grep | wc -l)
return $IS_ANSIBLE_PROCESS
}
package_mysql(){
# one-time call
[[ -n $MYSQL_PACKAGE ]] && return 0
PACKAGES_LIST=$(rpm -qa)
if [[ $(echo "$PACKAGES_LIST" | grep -c '^mysql-community-server') -gt 0 ]]; then
MYSQL_PACKAGE=mysql-community-server
MYSQL_SERVICE=mysqld
MYSQL_SYSTEMD=/usr/lib/systemd/system/mysqld.service
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^Percona-Server-server') -gt 0 ]]; then
MYSQL_PACKAGE=Percona-Server-server
MYSQL_SERVICE=mysqld
MYSQL_SYSTEMD=/usr/lib/systemd/system/mysqld.service
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^MariaDB-server') -gt 0 ]]; then
MYSQL_PACKAGE=MariaDB-server
MYSQL_SERVICE=mariadb
MYSQL_SYSTEMD=/usr/lib/systemd/system/mariadb.service
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^mariadb-server') -gt 0 ]]; then
MYSQL_PACKAGE=mariadb-server
MYSQL_SERVICE=mariadb
MYSQL_SYSTEMD=/usr/lib/systemd/system/mariadb.service
elif [[ $(echo "$PACKAGES_LIST" | grep -c '^mysql-server') -gt 0 ]]; then
MYSQL_PACKAGE=mysql-server
MYSQL_SERVICE=mysqld
MYSQL_SYSTEMD=/usr/lib/systemd/system/mysql.service
else
return 1
fi
MYSQL_VERSION=$(rpm -qa --queryformat '%{version}' ${MYSQL_PACKAGE}* | \
head -1 | awk -F'.' '{printf "%d.%d", $1,$2}' )
MYSQL_MID_VERSION=$(echo "$MYSQL_VERSION" | awk -F'.' '{print $2}')
}
bx_alternatives_for_mycnf(){
is_mycnf_alters=$(alternatives --list | grep "^my\.cnf\s\+" -c)
is_percona_alternatives=$(alternatives --list | \
grep "^my\.cnf\s\+" | grep -cv '/etc/bitrix-my.cnf')
[[ $is_mycnf_alters -eq 0 ]] && return 0 # doesn't use alternatives; skip
[[ $is_percona_alternatives -eq 0 ]] && return 0 # already created bitrix alternatives; skip
BACKUP_CFG_DIR=/etc/ansible/roles/mysql/files
package_mysql
BACKUP_CFG_FILE=$BACKUP_CFG_DIR/my.cnf.bx
[[ $MYSQL_MID_VERSION -eq 6 ]] && \
BACKUP_CFG_FILE=$BACKUP_CFG_DIR/my.cnf.bx_mysql56
[[ $MYSQL_MID_VERSION -eq 7 ]] && \
BACKUP_CFG_FILE=$BACKUP_CFG_DIR/my.cnf.bx_mysql57
cp -f $BACKUP_CFG_FILE /etc/bitrix-my.cnf
rm -f /etc/my.cnf
update-alternatives --install /etc/my.cnf my.cnf "/etc/bitrix-my.cnf" 300
}
bx_repo_version(){
repo_file=/etc/yum.repos.d/bitrix.repo
[[ ! -f $repo_file ]] && return 0
is_bitrix_beta="$(cat $repo_file | grep -w bitrix-beta)"
[[ -z "$is_bitrix_beta" ]] && \
is_bitrix="$(cat $repo_file | grep -w bitrix)"
[[ -n $is_bitrix_beta ]] && return 2
[[ -n $is_bitrix ]] && return 1
return 0
}
bx_enable_beta_version(){
get_os_type
echo "[bitrix-beta]
name=Bitrix Env Beta - CentOS-$OS_VERSION - \$basearch
failovermethod=priority
baseurl=https://repos.1c-bitrix.ru/yum-beta/el/$OS_VERSION/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://repos.1c-bitrix.ru/yum/RPM-GPG-KEY-BitrixEnv
" > /etc/yum.repos.d/bitrix.repo
yum clean all >/dev/null 2>&1
}
bx_disable_beta_version(){
get_os_type
echo "[bitrix]
name=Bitrix Env - CentOS-$OS_VERSION - \$basearch
failovermethod=priority
baseurl=https://repos.1c-bitrix.ru/yum/el/$OS_VERSION/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://repos.1c-bitrix.ru/yum/RPM-GPG-KEY-BitrixEnv
" > /etc/yum.repos.d/bitrix.repo
yum clean all >/dev/null 2>&1
}
bx_update_master_network(){
current=${1}
saved=${2}
host=${3}
is_push=${4}
ANSIBLE_CHANGED="/etc/ansible/hosts
/etc/ansible/host_vars/$host
/etc/ansible/group_vars/bitrix-hosts.yml
/etc/ansible/group_vars/bitrix-mysql.yml
/etc/ansible/group_vars/bitrix-web.yml
/etc/ansible/ansible-roles
/etc/hosts
/etc/sysconfig/iptables"
for file in $ANSIBLE_CHANGED; do
if [[ -f $file && $(grep -c "$saved" $file) -gt 0 ]]; then
sed -i "s/$saved/$current/g" $file
log_to_file "Replace IP $current to $saved in $file"
if [[ $file == "/etc/sysconfig/iptables" ]]; then
iptables-restore < /etc/sysconfig/iptables
fi
fi
done
[[ $is_push -eq 0 ]] && return 0
PUSH_CHANGED="/etc/sysconfig/push-server-multi"
for file in $PUSH_CHANGED; do
if [[ -f $file && $(grep -c "$saved" $file) -gt 0 ]]; then
sed -i "s/$saved/$current/g" $file
log_to_file "Replace NET $current to $saved in $file"
fi
done
pushd /etc/push-server >/dev/null 2>&1
for file in *.json; do
if [[ -f $file && $(grep -c "$saved" $file) -gt 0 ]]; then
sed -i "s/$saved/$current/g" $file
log_to_file "Replace NET $current to $saved in $file"
fi
done
popd >/dev/null 2>&1
# push service will be started by autostart option
}
bx_ansible_network(){
get_client_settings
if [[ $IS_MASTER -eq 0 ]]; then
return 1
fi
# CLIENT_INT - interface
# CLIENT_IP - ip address
# IS_PUSH - bitrix-push
# CLIENT_NAME
VISIBLE_INTS=$(ip link | grep '^[0-9]\+:' | grep -v lo | \
awk '{print $2}' | sed -e 's/://')
IS_EXISTEN_INT=$(echo "$VISIBLE_INTS" | grep -cw "^$CLIENT_INT$")
IF_MISMATCH_IP=0
IS_NET_CHANGED=0
if [[ $IS_EXISTEN_INT -gt 0 ]];then
CURRENT_IP=$(ip addr show $CLIENT_INT | \
egrep "inet\s+[0-9\.]+" | awk '{print $2}' | awk -F'/' '{print $1}')
[[ $CURRENT_IP != "$CLIENT_IP" ]] && IF_MISMATCH_IP=1
fi
# case 01
# interface doesn't change and ip doesn't change
if [[ $IS_EXISTEN_INT -gt 0 && $IF_MISMATCH_IP -eq 0 ]]; then
return 0
fi
# case 02
# interface doesn't change but IP is changed
# we need
# 1. change IP address in ansible configs
# 2. change IP address in push-server configs
# 3. update /etc/hosts
# 4. if there is other hosts in the pool run common task
if [[ $IS_EXISTEN_INT -gt 0 && $IF_MISMATCH_IP -eq 1 ]]; then
bx_update_master_network "$CURRENT_IP" "$CLIENT_IP" "$CLIENT_NAME" "$IS_PUSH"
fi
if [[ $IS_EXISTEN_INT -eq 0 ]]; then
CURRENT_INTS=$(ip link list | grep '^[0-9]\+:' | grep -v lo | \
awk '{print $2}' | sed -e 's/://')
CURRENT_INT=
CURRENT_IP=
for int in $CURRENT_INTS; do
[[ -n $CURRENT_IP && -n $CURRENT_INT ]] && continue
ipv4=$(ip addr show $int | \
egrep "inet\s+[0-9\.]+" | awk '{print $2}' | awk -F'/' '{print $1}')
if [[ -n $ipv4 ]]; then
CURRENT_IP=$ipv4
CURRENT_INT=$int
fi
done
if [[ -z $CURRENT_IP && -z $CURRENT_INT ]]; then
log_to_file "There are no active network interfaces"
return 1
fi
bx_update_master_network "$CURRENT_IP" "$CLIENT_IP" "$CLIENT_NAME" "$IS_PUSH"
bx_update_master_network "$CURRENT_INT" "$CLIENT_INT" "$CLIENT_NAME" 0
IS_NET_CHANGED=1
fi
rm -f /opt/webdir/tmp/*
return 0
}