xen-tools/mdmxen/lib/libsys.sh

1359 lines
42 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# mdmxen project - library for system and basic algorithms
#putlog
putlog(){
echo "$(date +%Y-%m-%d\ %H:%M:%S ) $1" >> $FLOG
}
#last op test
ltest(){
if [[ $? == "0" ]]
then putlog "SUCCESS" ;
else putlog "FAILURE. error code $?. exit" ; exit 1;
fi
}
#last op test huysnim =)
ltesth(){
if [[ $? == "0" ]]
then putlog "SUCCESS" ;
else putlog "FAILURE. error code $?. skip exit" ;
fi
}
#lock file test
locktest(){
test -f $FLOCK
if [[ $? == "1" ]]
then putlog "SUCCESS" ;
else putlog "FAILURE"; exit 1;
fi
}
#lock file test
locktest_state(){
test -f $FLOCK
if [[ $? == "1" ]]
then putlog "SUCCESS" ;
else
putlog "FAILURE"
putlog "Send state to file"
echo "fail after - locktest" > $STATE_DIR
ltest
exit 1
fi
}
#test backup hdd
hddtest(){
test -f $FBACK
}
#create lock file
lockcreate(){
touch $FLOCK
}
#clear tmp folder
cleartmp(){
rm -rf $TMP_DIR/*
}
#delete lock file
lockdelete(){
rm $FLOCK
}
#create ok file
okcreate(){
touch $TARGET_DIR/ok.txt
}
#ltest with state
ltest_state(){
if [[ $? == "0" ]]
then putlog "SUCCESS" ;
else
putlog "FAILURE. error code $?. exit"
putlog "Send state \"fail ${1}\" to file ${STATE_DIR}"
echo "fail $1" > $STATE_DIR
ltest
exit 1
fi
}
#get error msg from file ${1} and generate alert
ltest_state_continue(){
if [[ ${?} -eq "0" ]]
then putlog "SUCCESS" ;
else
TAIL_BIN="/usr/bin/tail"
send_error_to_log "`cat ${1} | ${TAIL_BIN} -n 1`"
fi
}
#check ip address
check_ip_valid(){
#regular expression
#minimal valid ip: 1.0.0.1
#maximal valid ip: 255.255.255.255
IP_REGEXP="^([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])(.(0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2}.([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
[[ ( -z ${1} || "${1}" =~ ${IP_REGEXP} ) ]]
#after this function you need to use ltest* function
#0 - ip is valid
#1 - no parameter or invalid ip
}
#check integer positive number
check_num_int_pos(){
#minimum value: 1
#maximum value: 65535
REG='^([1-9]|[1-5][0-9]{1,4}|[6-9][0-9]{1,3}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$'
[[ ( -z ${1} || ${1} =~ ${REG} ) ]]
}
#send normal state func
send_state(){
putlog "Send state \"${1}\" to file"
echo "$1" > $STATE_DIR
ltest
}
#send fail state, wait and continue
create_alert(){
#path to cat
CAT_BIN="/usr/bin/cat"
#path to sleep
SLEEP_BIN="/usr/bin/sleep"
#sleep amount
CRAL_ALERT_SLEEP="30"
putlog "Start generating alert"
putlog "Get current backup state"
CRAL_CUR_STATE=`${CAT_BIN} ${STATE_DIR}`
send_state "$1"
putlog "Sleep: ${CRAL_ALERT_SLEEP}"
${SLEEP_BIN} ${CRAL_ALERT_SLEEP}
putlog "Resuming backup. Recovering previous backup state"
send_state "${CRAL_CUR_STATE}"
[[ "1" == "0" ]]
}
#send error message to log file and generate fail code 1
send_error_to_log(){
putlog "ERROR: ${1}"
[[ "1" == "0" ]]
}
#get contents of nfs share
get_files_nfs4_state(){
#default fn status
GFN4S_DEF_FN_STATUS="0"
#current fn status
GFN4S_CUR_FN_STATUS=${GFN4S_DEF_FN_STATUS}
#path to rsync
RSYNC_BIN="/usr/bin/rsync"
#path to rm
RM_BIN="/usr/bin/rm"
#path to echo
ECHO_BIN="/usr/bin/echo"
#path to mount.nfs4
MNTNFS4_BIN="/usr/sbin/mount.nfs4"
#path to umount
UMOUNT_BIN="/usr/bin/umount"
#path to cut bin
CUT_BIN="/usr/bin/cut"
#path to cat
CAT_BIN="/usr/bin/cat"
#path to cp
CP_BIN="/usr/bin/cp"
#path to mkdir
MKDIR_BIN="/usr/bin/mkdir"
#path to awk bin
AWK_BIN="/usr/bin/awk"
#path to head bin
HEAD_BIN="/usr/bin/head"
#path to tail bin
TAIL_BIN="/usr/bin/tail"
#path to sed bin
SED_BIN="/usr/bin/sed"
#date bin
DATE_BIN="/bin/date"
#stat bin
STAT_BIN="/usr/bin/stat"
#path to sleep
SLEEP_BIN="/usr/bin/sleep"
#sleep amount
GFN4S_SLEEP_AMOUNT="180"
#nfs source
GFN4S_NFS_SOURCE="/mnt/nfs"
#cache directory
GFN4S_NFSCACHE_DIR="/tmp"
#path to cache data (NAME WILL BE CHANGED IS SCRIPT BODY!!!)
GFN4S_NFSCACHE="${NFSCACHE_DIR}/default.nfscache"
#path to error data
GFN4S_NFSERROR="${NFSCACHE_DIR}/default.nfserror"
#default nfs port
GFN4S_NFS_PORT_DEFAULT="2049"
#ok file
GFN4S_OKFILE="ok.txt"
#rsync bandwidth
#1200 ~ 100Mbit/s
GFN4S_DLIMIT="12000"
GFN4S_RSYNC_OPTS="--partial --bwlimit=${GFN4S_DLIMIT}"
#check variables
putlog "check variables"
#1.check variables - start
if [[ ! (-z ${1} && -z ${2}) ]]
then
#1.1.variables set - start
GFN4S_SHARE_NAME=${2}
GFN4S_SERV_IP=${1}
#1.2.check parameter 3 - start
if [[ ! ( -z ${3} ) ]]
then
#1.2.1.parameter 3 exist - start
GFN4S_SERV_NAME=`${ECHO_BIN} ${3} | ${SED_BIN} -e 's/\.\.//g'`
#1.2.2.check serv name - start
if [[ "${GFN4S_SERV_NAME}" == "" ]]
then
#1.2.2.1.serv name invalid - start
#generate warning for monitoring
send_error_to_log "Server name empty. Use ip ${GFN4S_SERV_IP} as name"
GFN4S_SERV_NAME=${GFN4S_SERV_IP}
#1.2.2.1.serv name invalid - finish
fi
#1.2.2.check serv name - finish
#1.2.1.parameter 3 exist - finish
else
#1.2.3.parameter 3 not exist - start
GFN4S_SERV_NAME=${GFN4S_SERV_IP}
#1.2.3.parameter 3 not exist - finish
fi
#1.2.check parameter 3 - finish
putlog "Validate ip address"
check_ip_valid ${GFN4S_SERV_IP}
#check ip validation result
if [[ ! (${?} -eq "0") ]]
then
#1.1.1.ip invalid - start
send_error_to_log "IP: ${GFN4S_SERV_IP} invalid. Skipping..."
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.1.ip infalid - finish
else
#1.1.2.ip valid - start
putlog "IP: ${GFN4S_SERV_IP} valid."
#checking share name
if [[ ! (${GFN4S_SHARE_NAME} == "") ]]
then
#1.1.2.0.check parameter 4 - start
if [[ ! ( -z ${4} ) ]]
then
#1.1.2.0.1.parameter 4 exist - start
GFN4S_NFS_PORT=${4}
#1.1.2.0.1.parameter 4 exist - finish
else
#1.1.2.0.2.parameter 4 not exist - start
GFN4S_NFS_PORT=${GFN4S_NFS_PORT_DEFAULT}
#1.1.2.0.2.parameter 4 not exist - finish
fi
#1.1.2.0.check parameter 4 - finish
#1.1.2.1.share name not empty - start
#mount nfs share
#variable not exist
#copy files by direct nfs (unsecure)
#mount share
#!!!!!!!!!!
#1.1.2.2.create caches for nfs - start
putlog "Create caches"
GFN4S_NFSCACHE="${GFN4S_NFSCACHE_DIR}/${GFN4S_SERV_NAME}.nfscache"
GFN4S_NFSERROR="${GFN4S_NFSCACHE_DIR}/${GFN4S_SERV_NAME}.nfserror"
putlog "Create: ${GFN4S_NFSCACHE}"
touch ${GFN4S_NFSCACHE}
ltest_state "Create: ${GFN4S_NFSCACHE}"
putlog "Create: ${GFN4S_NFSERROR}"
touch ${GFN4S_NFSERROR}
ltest_state "Create: ${GFN4S_NFSERROR}"
#1.1.2.2.create caches for nfs - finish
#STDOUT, STDERR, LSTATE
${MNTNFS4_BIN} -o proto=tcp,port=${GFN4S_NFS_PORT} ${GFN4S_SERV_IP}:${GFN4S_SHARE_NAME} ${GFN4S_NFS_SOURCE} > ${GFN4S_NFSCACHE} 2> ${GFN4S_NFSERROR}
#1.1.2.3.check mount status - start
if [[ ${?} -ne "0" ]]
then
#1.1.2.3.1.mount error - start
#generate fail exit code for function
[[ "1" -eq "0" ]]
ltest_state_continue "${GFN4S_NFSERROR}"
#generate fail exit code again
GFN4S_CUR_FN_STATUS="1"
#1.1.2.3.1.mount error - finish
else
#1.1.2.3.2.mount success - start
#1.1.2.3.3.ok test - start
if [[ -f ${GFN4S_NFS_SOURCE}/${GFN4S_OKFILE} ]]
then
#1.1.2.3.3.1.ok file exist - start
putlog "Get current date"
GFN4S_CURDATE=`${DATE_BIN} +%Y-%m-%d` 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
if [[ ${?} -ne "0" ]]
then
[[ "1" == "0" ]]
ltest_state "Get date"
fi
putlog "Get modification date of file: ${GFN4S_NFS_SOURCE}/${GFN4S_OKFILE}"
GFN4S_FILEDATE=`${STAT_BIN} ${GFN4S_NFS_SOURCE}/${GFN4S_OKFILE} | ${GREP_BIN} 'Modify' | ${AWK_BIN} -F ' ' '{print \$2}'` 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFS_ERROR}"
#1.1.2.3.3.2.check dates - start
if [[ ${GFN4S_CURDATE} == ${GFN4S_FILEDATE} ]]
then
#1.1.2.3.3.2.1.dates equivalent - start
#1.1.2.3.3.2.2.check dir - start
if [[ ! -d ${TMP_DIR}/${GFN4S_SERV_NAME} ]]
then
#1.1.2.3.3.2.2.1.dir not exist - start
putlog "mkdir: ${TMP_DIR}/${GFN4S_SERV_NAME}"
${MKDIR_BIN} -p ${TMP_DIR}/${GFN4S_SERV_NAME} > ${GFN4S_NFSCACHE} 2> ${GFN4S_NFSERROR}
#1.1.2.3.3.2.2.2.check mkdir - start
if [[ ${?} -ne "0" ]]
then
#1.1.2.3.3.2.2.2.1.mkdir fail - start
send_error_to_log "Fail to create dir: ${TMP_DIR}/${GFN4S_SERV_NAME}. Skipping share"
#generate fail exit code
[[ "1" -eq "0" ]]
ltest_state_continue "${GFN4S_NFSERROR}"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.2.3.3.2.2.2.1.mkdir fail - finish
else
#1.1.2.3.3.2.2.2.2.mkdir success - start
putlog "Start copy files"
for GFN4S_CURFILE in `ls ${GFN4S_NFS_SOURCE}/ | grep -v "${GFN4S_OKFILE}"`;
do
#1.1.2.3.3.2.2.2.2.1.file copy - start
putlog "Copy file: ${GFN4S_NFS_SOURCE}/${GFN4S_CURFILE}"
#copy - no speed limit, no append download after fail
#${CP_BIN} ${GFN4S_NFS_SOURCE}/${GFN4S_CURFILE} ${TMP_DIR}/${GFN4S_SERV_NAME}/ > ${GFN4S_NFSCACHE} 2> ${GFN4S_NFSERROR}
#rsync - speed limit, append download after fail
${RSYNC_BIN} ${GFN4S_RSYNC_OPTS} ${GFN4S_NFS_SOURCE}/${GFN4S_CURFILE} ${TMP_DIR}/${GFN4S_SERV_NAME}/ > ${GFN4S_NFSCACHE} 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
#set fail status
if [[ ${?} -ne "0" ]]
then
GFN4S_CUR_FN_STATUS="1"
fi
#1.1.2.3.3.2.2.2.2.1.file copy - finish
done
putlog "Copy file: ${GFN4S_NFS_SOURCE}/${GFN4S_OKFILE}"
${CP_BIN} ${GFN4S_NFS_SOURCE}/${GFN4S_OKFILE} ${TMP_DIR}/${GFN4S_SERV_NAME}/ > ${GFN4S_NFSCACHE} 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
if [[ ${?} -ne "0" ]]
then
GFN4S_CUR_FN_STATUS="1"
fi
putlog "Finish copy files"
#1.1.2.3.3.2.2.2.2.mkdir success - finish
fi
#1.1.2.3.3.2.2.2.check mkdir - finish
#1.1.2.3.3.2.2.1.dir not exist - finish
else
#1.1.2.3.3.2.2.3.dir exist - start
send_error_to_log "${TMP_DIR}/${GFN4S_SERV_NAME} exist. Skipping"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.2.3.3.2.2.3.dir exist - finish
fi
#1.1.2.3.3.2.2.check dir - finish
#1.1.2.3.3.2.1.dates equivalent - finish
else
#1.1.2.3.3.2.3.dates not equivalent - start
putlog "TODAY: ${GFN4S_CURDATE}; FILE DATE: ${GFN4S_FILEDATE}; skipping share"
send_error_to_log "backup in progress on remote share ${GFN4S_SERV_NAME}"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.2.3.3.2.3.dates not equivalent - finish
fi
#1.1.2.3.3.2.check dates - finish
#1.1.2.3.3.1.ok file exist - finish
else
#1.1.2.3.3.3.ok file not exist - start
putlog "${GFN4S_OKFILE} not exist. skipping share"
send_error_to_log "File ${GFN4S_OKFILE} not exist"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.2.3.3.3.ok file not exist - finish
fi
#1.1.2.3.3.ok test - finish
#umount share
#1.2.3.3.4.umount - start
putlog "UnMount ${GFN4S_NFS_SOURCE}"
${UMOUNT_BIN} ${GFN4S_NFS_SOURCE} 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
#если не получилось отмонтировать шару, то это очень нехорошая ситуация
#данный факт может оказать негативное влияние на будущие действия по резервированию
if [[ ${?} -ne "0" ]]
then
#если мы оказались здесь, то шару с первой попытки отмонтировать не получилось
#попробуем уснуть и повтороить попытку еще раз
putlog "Wait ${GFN4S_SLEEP_AMOUNT}s for second try..."
${SLEEP_BIN} ${GFN4S_SLEEP_AMOUNT} 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
putlog "UnMount ${GFN4S_NFS_SOURCE} - 2nd try..."
${UMOUNT_BIN} ${GFN4S_NFS_SOURCE} 2> ${GFN4S_NFSERROR}
ltest_state_continue "${GFN4S_NFSERROR}"
#вторая попытка отмонтирования не помогла. ситуация скорее всего очень критичная
#тушим скрипт наглухо
ltest_state "umount ${GFN4S_NFS_SOURCE}"
fi
#
#1.1.2.3.4.umount - finish
#1.1.2.3.2.mount success - finish
fi
#1.1.2.3.check mount status - finish
#remove caches
putlog "Removing caches"
putlog "Remove: ${GFN4S_NFSCACHE}"
${RM_BIN} -rf ${GFN4S_NFSCACHE}
ltest_state "rm ${GFN4S_NFSCACHE}"
putlog "Remove: ${GFN4S_NFSERROR}"
${RM_BIN} -rf ${GFN4S_NFSERROR}
ltest_state "rm ${GFN4S_NFSERROR}"
#1.1.2.1.share name not empty - finish
else
#1.1.2.4.share name empty - start
putlog "Share name empty. Skipping share"
send_error_to_log "share name empty"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.1.2.4.share name empty - finish
fi
#1.1.2.ip valid - finish
fi
#1.1.variables set - finish
else
#1.2.variables not set - start
send_error_to_log "Variables not set. Skipping share"
#generate fail exit code
GFN4S_CUR_FN_STATUS="1"
#1.2.variables not set - finish
fi
#1.check variables - finish
#2.send fn status - start
if [[ ${GFN4S_CUR_FN_STATUS} == ${GFN4S_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#2.send fn status - finish
}
ssh_tunnel_check(){
#default fn status
STCH_DEF_FN_STATUS="0"
#current fn status
STCH_CUR_FN_STATUS=${STCH_DEF_FN_STATUS}
#system binary setup
PS_BIN="/usr/bin/ps"
GREP_BIN="/usr/bin/grep"
#1.check parameter - start
if [[ ! ( -z ${1} ) ]]
then
#1.1.parameter exist - start
STCH_RESULT=`${PS_BIN} faux | ${GREP_BIN} "${1}" | ${GREP_BIN} -v "${GREP_BIN}"`
if [[ ${?} -ne "0" ]]
then
STCH_CUR_FN_STATUS="1"
fi
#if grep has no lines then result code will be 1 - fail
#if grep has any lines then result code will be 0 - ok
#1.1.parameter exist - finish
else
#1.2.parameter not exist - start
#generate fail code
send_error_to_log "TunChk param.not.exist"
#запуск без параметра это критичный вызов. нужно глушить скрипт
ltest_state "TunChk no parameter"
#1.2.parameter not exist - finish
fi
#1.check parameter - finish
#2.send fn status - start
if [[ ${STCH_CUR_FN_STATUS} == ${STCH_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#2.send fn status - finish
}
ssh_tunnel_create(){
#path to echo
ECHO_BIN="/usr/bin/echo"
#path to date
DATE_BIN="/usr/bin/date"
#path to bc
BC_BIN="/usr/bin/bc"
#default fn status
STCR_DEF_FN_STATUS="0"
#current fn status
STCR_CUR_FN_STATUS=${STCR_DEF_FN_STATUS}
SSH_BIN="/usr/bin/ssh"
#timeout value
STCR_SSH_OPTS="-o ConnectTimeout=20 -o PasswordAuthentication=no -o ChallengeResponseAuthentication=no"
STCR_SSH_TUNNEL_CACHE_DIR="/tmp"
STCR_SSH_TUNNEL_ERROR="${STCR_SSH_TUNNEL_CACHE_DIR}/ssh_stderr.cache"
STCR_SSH_TUNNEL_CACHE="${STCR_SSH_TUNNEL_CACHE_DIR}/ssh_stdout.cache"
#1.check parameter 1 - start
if [[ ! ( -z ${1} ) ]]
then
#1.1.parameter 1 exist - start
STCR_SERV_IP=${1}
putlog "Start check ip"
check_ip_valid ${STCR_SERV_IP}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.1.1.ip invalid - start
send_error_to_file "Host ip not valid. Skipping"
#generate fail last code
STCR_CUR_FN_STATUS="1"
#1.1.1.ip invalid - finish
else
#1.1.2.ip valid - start
#1.1.3.parameter 2 exist - start
if [[ ! ( -z ${2} ) ]]
then
#1.1.3.1.local port exist - start
STCR_LOCAL_PORT=${2}
#check valid value
check_num_int_pos ${STCR_LOCAL_PORT}
#1.1.3.2.local port check - start
if [[ ${?} -ne "0" ]]
then
#1.1.3.2.1.local port invalid - start
putlog "Local port invalid. Skipping"
send_error_to_log "Local port invalid ${STCR_LOCAL_PORT}"
#create false code for exit
STCR_CUR_FN_STATUS="1"
#1.1.3.2.1.local port invalid - finish
else
#1.1.3.2.1.local port valid - start
#1.1.3.2.2.parameter 3 check - start
if [[ ! ( -z ${3} ) ]]
then
#1.1.3.2.2.1.remote port exist - start
STCR_REMOTE_PORT=${3}
check_num_int_pos ${STCR_REMOTE_PORT}
#1.1.3.2.2.2.remote port check - start
if [[ ${?} -ne "0" ]]
then
#1.1.3.2.2.2.1.remote port invalid - start
send_error_to_log "Remote port not valid"
STCR_CUR_FN_STATUS="1"
#we created fail exit code
#1.1.3.2.2.2.1.remote port invalid - finih
fi
#1.1.3.2.2.2.remote port check - finish
#1.1.3.2.2.1.remote port exist - finish
else
#1.1.3.2.2.3.remote port not exist - start
STCR_REMOTE_PORT="2049"
#1.1.3.2.2.3.remote port not exist - finish
fi
#1.1.3.2.2.parameter 3 check - finish
#1.1.3.2.1.local port valid - finish
fi
#1.1.3.1.local port exist - finish
else
#1.1.3.3.local port not exist - start
STCR_LOCAL_PORT="2049"
STCR_REMOTE_PORT=${STCR_LOCAL_PORT}
#1.1.3.3.local port not exist - finish
fi
#1.1.3.parameter 2 exist - finish
#
#1.1.4.last operation check - start
if [[ ${?} -ne "0" ]]
then
#1.1.4.1.last operation fail - start
putlog "Skipped ssh tunnel creation procedure"
#create fail code again and exit from function
STCR_CUR_FN_STATUS="1"
#1.1.4.1.last operation fail - finish
else
#1.1.4.2.last operation ok - start
putlog "Checking if tunnel already exists: ${SSH_BIN} ${STCR_SSH_OPTS} -f -N -L ${STCR_LOCAL_PORT}:127.0.0.1:${STCR_REMOTE_PORT} root@${STCR_SERV_IP}"
ssh_tunnel_check "${SSH_BIN} ${STCR_SSH_OPTS} -f -N -L ${STCR_LOCAL_PORT}:127.0.0.1:${STCR_REMOTE_PORT} root@${STCR_SERV_IP}"
#1.1.4.3.check tunnel - start
if [[ ${?} -ne "0" ]]
then
#1.1.4.3.1.ssh tunnel not exist - start
#if we are here then SERV_IP, LOCAL_PORT && REMOTE_PORT - OK
#1.1.4.3.2.ssh tunnel create - start
putlog "Creating ssh tunnel..."
putlog "Try to establish connection: ${SSH_BIN} ${STCR_SSH_OPTS} -f -N -L ${STCR_LOCAL_PORT}:127.0.0.1:${STCR_REMOTE_PORT} root@${STCR_SERV_IP}"
${SSH_BIN} ${STCR_SSH_OPTS} -f -N -L ${STCR_LOCAL_PORT}:127.0.0.1:${STCR_REMOTE_PORT} root@${STCR_SERV_IP} > ${STCR_SSH_TUNNEL_CACHE} 2> ${STCR_SSH_TUNNEL_ERROR}
ltest_state_continue "${STCR_SSH_TUNNEL_ERROR}"
if [[ ${?} -ne "0" ]]
then
STCR_CUR_FN_STATUS="1"
fi
#1.1.4.3.2.ssh tunnel create - finish
#1.1.4.3.1.ssh tunnel not exist - finish
else
#1.1.4.3.3.ssh tunnel exist - start
putlog "ssh tunnel already exist"
#данное событие нельзя однозначно трактовать как ошибку т.к., если туннель нужный нам существует, то можно сразу приступать к следующему этапу
#но пометуку в логе об этом сделать стоит
#1.1.4.3.3.ssh tunnel exist - finish
fi
#1.1.4.3.chechk tunnel - finish
#1.1.4.2.last operation ok - finish
fi
#1.1.4.last operation check - finish
fi
#1.1.parameter 1 exist - finish
else
#1.2.parameter 1 not exist - start
send_error_to_log "Host not set. Skipping"
#generate fail last code
STCR_CUR_FN_STATUS="1"
#1.2.parameter 1 not exist - finish
fi
#1.check parameter 1 - finish
#2.send fn state - start
if [[ ${STCR_CUR_FN_STATUS} == ${STCR_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#2.send fn state - finish
}
process_kill(){
#default function status
PKILL_DEF_FN_STATUS="0"
#current function status
PKILL_CUR_FN_STATUS=${PKILL_DEF_FN_STATUS}
#system binary setup
PS_BIN="/usr/bin/ps"
GREP_BIN="/usr/bin/grep"
KILL_BIN="/usr/bin/kill"
AWK_BIN="/usr/bin/awk"
#1.check parameter 1 - start
if [[ ! ( -z ${1} ) ]]
then
#1.1.parameter 1 exist - start
PKILL_RESULT=`${PS_BIN} faux | ${GREP_BIN} "${1}" | ${GREP_BIN} -v "${GREP_BIN}" | ${AWK_BIN} '{print $2}'`
if [[ "${PKILL_RESULT}" == "" ]]
then
#1.1.1.PID empty - start
send_error_to_log "Process not found. Skipping"
#generate fail exit code
PKILL_CUR_FN_STATUS="1"
#1.1.1.PID empty - finish
else
#1.1.2.PID not empty - start
putlog "Killing process with pid: ${PKILL_RESULT}"
${KILL_BIN} -9 ${PKILL_RESULT}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.1.2.1.KILL fail - start
send_error_to_log "Kill process with pid ${PKILL_RESULT} fail"
#generate fail exit code
PKILL_CUR_FN_STATUS="1"
#1.1.2.1.KILL fail - finish
fi
#1.1.2.PID not empty - finish
fi
#1.1.parameter 1 exist - finish
else
#1.2.parameter 1 not exist - start
#generate fail code
PKILL_CUR_FN_STATUS="1"
#1.2.parameter 1 not exist - finish
fi
#1.check parameter 1 - finish
#2.send fn status - start
if [[ ${PKILL_CUR_FN_STATUS} == ${PKILL_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#2.send fn status - finish
}
ssh_tunnel_destroy(){
#ssh opts
STDR_SSH_OPTS="-o ConnectTimeout=20 -o PasswordAuthentication=no -o ChallengeResponseAuthentication=no"
#default function status
STDR_DEF_FN_STATUS="0"
#current function status
STDR_CUR_FN_STATUS=${STDR_DEF_FN_STATUS}
SSH_BIN="/usr/bin/ssh"
STDR_SSH_TUNNEL_CACHE_DIR="/tmp"
STDR_SSH_TUNNEL_ERROR="${SSH_TUNNEL_CACHE_DIR}/ssh_stderr.cache"
STDR_SSH_TUNNEL_CACHE="${SSH_TUNNEL_CACHE_DIR}/ssh_stdout.cache"
#1.check parameter 1 - start
if [[ ! ( -z ${1} ) ]]
then
#1.1.parameter 1 exist - start
STDR_SERV_IP=${1}
putlog "Start check ip"
#1.2.check ip - start
check_ip_valid ${STDR_SERV_IP}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.2.1.ip invalid - start
send_error_to_log "Host ip not valid. Skipping"
#generate fail last code
STDR_CUR_FN_STATUS="1"
#1.2.1.ip invalid - finish
else
#1.2.2.ip valid - start
#1.2.3.check parameter 2 - start
if [[ ! ( -z ${2} ) ]]
then
#1.2.3.1.parameter 2 exist - start
STDR_LOCAL_PORT=${2}
#1.2.3.2.local port check - start
check_num_int_pos ${STDR_LOCAL_PORT}
if [[ ${?} -ne "0" ]]
then
#1.2.3.2.1.local port invalid - start
send_error_to_log "Local port invalid"
#create false code for exit
STDR_CUR_FN_STATUS="1"
#1.2.3.2.1.local port invalid - finish
else
#1.2.3.2.2.local port valid - start
#1.2.3.2.3.check parameter 3 - start
if [[ ! ( -z ${3} ) ]]
then
#1.2.3.2.3.1.parameter 3 exist - start
STDR_REMOTE_PORT=${3}
#1.2.3.2.3.2.remote port check - start
check_num_int_pos ${STDR_REMOTE_PORT}
if [[ ${?} -ne "0" ]]
then
#1.2.3.2.3.2.1.remote port invalid - start
send_error_to_log "Remote port not valid. Skipping"
STDR_CUR_FN_STATUS="1"
#we created fail exit code
#1.2.3.2.3.2.1.remote port invalid - finish
fi
#1.2.3.2.3.2.remote port check - fnish
#1.2.3.2.3.1.parameter 3 exist - finish
else
#1.2.3.2.3.3.remote port not exist - start
STDR_REMOTE_PORT="2049"
#1.2.3.2.3.3.remote port not exist - finish
fi
#1.2.3.2.3.check paraeter 3 - finish
#1.2.3.2.2.local port valid - finish
fi
#1.2.3.2.local port check - finish
#1.2.3.1.parameter 2 exist - finish
else
#1.2.3.3.parameter 2 not exist - start
STDR_LOCAL_PORT="2049"
STDR_REMOTE_PORT=${STDR_LOCAL_PORT}
#1.2.3.3.parameter 3 not exist - finish
fi
#1.2.3.check parameter 2 - finish
#1.2.4.last operation status - start
if [[ ${?} -ne "0" ]]
then
#1.2.4.1.last operation fail - start
putlog "Skipped ssh tunnel creation procedure"
#create fail code again and exit from function
STDR_CUR_FN_STATUS="1"
#1.2.4.1.last operation fail - finish
else
#1.2.4.2.last operation ok - start
putlog "Checking if tunnel already exists: ${SSH_BIN} ${STDR_SSH_OPTS} -f -N -L ${STDR_LOCAL_PORT}:127.0.0.1:${STDR_REMOTE_PORT} root@${STDR_SERV_IP}"
#1.2.4.3.ssh tunnel check - start
ssh_tunnel_check "${SSH_BIN} ${STDR_SSH_OPTS} -f -N -L ${STDR_LOCAL_PORT}:127.0.0.1:${STDR_REMOTE_PORT} root@${STDR_SERV_IP}"
if [[ ${?} -eq "0" ]]
then
#1.2.4.3.1.ssh tunnel exist - start
#if we are here then STDR_SERV_IP, STDR_LOCAL_PORT && STDR_REMOTE_PORT - OK
#1.2.4.3.2.ssh tunnel destroy - start
putlog "Destroing ssh tunnel..."
process_kill "${SSH_BIN} ${STDR_SSH_OPTS} -f -N -L ${STDR_LOCAL_PORT}:127.0.0.1:${STDR_REMOTE_PORT} root@${STDR_SERV_IP}"
ltest_state "Destroy ssh tunnel"
#ошибка отказа при убийстве туннеля может критично повлиять на грядущие бэкапы
#в связи с этим данную ошибку нельзя игнорировать и нужно прервать выполнение скрипта
#1.2.4.3.2.ssh tunnel destroy - finish
#1.2.4.3.1.ssh tunnel exist - finish
else
#1.1.2.4.3.ssh tunnel not exist - start
putlog "ssh tunnel not exist"
#возможно туннель упал сам к этому моменту
#делаю пометку в лог файл. трактовать это как ошибку не совсем корректно
#1.1.2.4.3.ssh tunnel not exist - finish
fi
#1.2.4.2.last operation ok - finish
fi
#1.2.4.last operation status - finish
fi
#1.2.check ip - finish
#1.1.parameter 1 exist - finish
else
#1.3.parameter 1 not exist - start
send_error_to_log "Host ip not set. Skipping"
#generate fail last code
STDR_CUR_FN_STATUS="1"
#1.3.parameter 1 not exist - finish
fi
#1.check parameter 1 - finish
#2.send fn status - start
if [[ ${STDR_CUR_FN_STATUS} == ${STDR_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
#return 0
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
#return 1
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#2.send fn status - finish
}
get_files_nfs4_ssh_state(){
#check variables
#{1} - server ip
#{2} - share path
#{3} - local port for ssh
#{4} - remote port for ssh
#{5} - server name
#default function status
GFN4SS_DEF_FN_STATUS="0"
#current function status
GFN4SS_CUR_FN_STATUS=${GFN4SS_DEF_FN_STATUS}
#default nfs port
GFN4SS_NFS_PORT_DEFAULT="2049"
#1. check SERV_IP variable exist - start
if [[ ! ( -z ${1} ) ]]
then
#1.1 SERV_IP set - start
GFN4SS_SERV_IP=${1}
check_ip_valid ${GFN4SS_SERV_IP}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.1.1.SERV_IP not valid - start
send_error_to_log "Server ip not valid. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.1.1.SERV_IP not valid - finish
else
#1.1.2.SERV_IP valid - start
if [[ -z ${2} ]]
then
#1.1.2.1.SHARE_NAME not set - start
send_error_to_log "Share name not set. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.1.2.1.SHARE_NAME not set - finish
else
#1.1.2.2.SHARE_NAME set - start
GFN4SS_SHARE_NAME=${2}
if [[ ${GFN4SS_SHARE_NAME} == "" ]]
then
#1.1.2.2.1.SHARE_NAME empty - start
send_error_to_log "Share name empty. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.1.2.2.1.SHARE_NAME empty - finish
else
#1.1.2.2.2.SHARE_NAME not empty - start
if [[ -z ${4} ]]
then
#1.1.2.2.2.1.LOCAL_PORT not exist - start
GFN4SS_LOCAL_PORT="2049"
GFN4SS_REMOTE_PORT=${GFN4SS_LOCAL_PORT}
#1.1.2.2.2.1.LOCAL_PORT not exist - finish
else
#1.1.2.2.2.2.LOCAL_PORT exist - start
GFN4SS_LOCAL_PORT=${4}
check_num_int_pos ${GFN4SS_LOCAL_PORT}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.1.2.2.2.2.1.LOCAL_PORT invalid - start
send_error_to_log "Local port invalid. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.1.2.2.2.2.1.LOCAL_PORT invalid - finish
else
#1.1.2.2.2.2.2.LOCAL_PORT valid - start
if [[ -z ${5} ]]
then
#1.1.2.2.2.2.2.1.REMOTE_PORT not exist - start
GFN4SS_REMOTE_PORT=${GFN4SS_NFS_PORT_DEFAULT}
#1.1.2.2.2.2.2.1.REMOTE_PORT not exist - finish
else
#1.1.2.2.2.2.2.2.REMOTE_PORT exist - start
GFN4SS_REMOTE_PORT=${5}
check_num_int_pos ${GFN4SS_REMOTE_PORT}
if [[ ! ( ${?} -eq "0" ) ]]
then
#1.1.2.2.2.2.2.2.1.REMOTE_PORT invalid - start
send_error_to_log "Remote port invalid. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.1.2.2.2.2.2.2.1.REMOTE_PORT invalid - finish
fi
#1.1.2.2.2.2.2.2.REMOTE_PORT exist - finish
fi
#1.1.2.2.2.2.2.LOCAL_PORT valid - finish
fi
#1.1.2.2.2.2.LOCAL_PORT exist - finish
fi
#1.1.2.2.2.SHARE_NAME not empty - finish
#1.1.2.2.3.check parameter 5 - start
if [[ ! ( -z ${3} ) ]]
then
#1.1.2.2.3.1.parameter 5 exist - start
GFN4SS_SERV_NAME=${3}
#1.1.2.2.3.1.parameter 5 exist - finish
else
#1.1.2.2.3.2.parameter 5 not exist - start
GFN4SS_SERV_NAME=${GFN4SS_SERV_IP}
#1.1.2.2.3.2.parameter 5 not exist - finish
fi
#1.1.2.2.3.check parameter 5 - finish
fi
#1.1.2.2.SHARE_NAME set - finish
fi
#1.1.2.SERV_IP valid - finish
fi
#1.1.SERV_IP set - finish
else
#1.2.SERV_IP not set - start
send_error_to_log "Server ip not set. Skipping"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#1.2.SERV_IP not set - finish
fi
#1. check SERV_IP variable exist - finish
#
#2. check 1. step status - start
#if 0 then - ok
#if 1 then - variables settings error - fail - exit
if [[ ${GFN4SS_CUR_FN_STATUS} == ${GFN4SS_DEF_FN_STATUS} ]]
then
#2.1.variable settings status - ok - start
#create ssh tunnel
#putlog "exec: ssh_tunnel_create ${GFN4SS_SERV_IP} ${GFN4SS_LOCAL_PORT} ${GFN4SS_REMOTE_PORT}"
ssh_tunnel_create ${GFN4SS_SERV_IP} ${GFN4SS_LOCAL_PORT} ${GFN4SS_REMOTE_PORT}
if [[ ! ( ${?} -eq "0" ) ]]
then
#2.1.1.ssh tunnel create fail - start
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#2.1.1.ssh tunnel create fail - finish
else
#2.1.2.ssh tunnel create ok - start
#execute get_files_nfs4_state()
get_files_nfs4_state "127.0.0.1" ${GFN4SS_SHARE_NAME} ${GFN4SS_SERV_NAME} ${GFN4SS_LOCAL_PORT}
#check fn status
if [[ ${?} -ne "0" ]]
then
#функция выполнилась с нефаталными ошибками
GFN4SS_CUR_FN_STATUS="1"
fi
#destroy ssh tunnel
#putlog "Destroy tunnel: ssh_tunnel_destroy ${GFN4SS_SERV_IP} ${GFN4SS_LOCAL_PORT} ${GFN4SS_REMOTE_PORT}"
ssh_tunnel_destroy ${GFN4SS_SERV_IP} ${GFN4SS_LOCAL_PORT} ${GFN4SS_REMOTE_PORT}
if [[ ! ( ${?} -eq "0" ) ]]
then
#2.1.2.1.ssh tunnel destroy fail - start
send_error_to_log "Fail to destroy ssh tunnel"
#generate fail exit code
GFN4SS_CUR_FN_STATUS="1"
#2.1.2.1.ssh tunnel destroy fail - finish
fi
#2.1.2.ssh tunnel create ok - finish
fi
#2.1.variable settings status - ok - finish
fi
#2. check 1. step status - finish
#3. send FN status - start
if [[ ${GFN4SS_CUR_FN_STATUS} == ${GFN4SS_DEF_FN_STATUS} ]]
then
#3.1.status ok - start
#return 0
[[ "1" == "1" ]]
#3.1.status ok - finish
else
#3.2.status fail - start
#return 1
[[ "1" == "0" ]]
#3.2.status fail - finish
fi
#3. send FN status - finish
}
#get contents of smb share
get_files_smb_state(){
#default fn status
GFSS_DEF_FN_STATUS="0"
#current fn status
GFSS_CUR_FN_STATUS=${GFSS_DEF_FN_STATUS}
#path to rm
RM_BIN="/usr/bin/rm"
#path to echo
ECHO_BIN="/usr/bin/echo"
#path to cat
CAT_BIN="/usr/bin/cat"
#path to wc
WC_BIN="/usr/bin/wc"
#path to grep
GREP_BIN="/usr/bin/grep"
#path to mkdir
MKDIR_BIN="/usr/bin/mkdir"
#path to smbclient
SMBCLIENT_BIN="/usr/bin/smbclient"
#path to cut bin
CUT_BIN="/usr/bin/cut"
#path to awk bin
AWK_BIN="/usr/bin/awk"
#path to head bin
HEAD_BIN="/usr/bin/head"
#path to tail bin
TAIL_BIN="/usr/bin/tail"
#path to sed bin
SED_BIN="/usr/bin/sed"
#cache directory
GFSS_SMBCACHE_DIR="/tmp"
#path to cache data (NAME WILL BE CHANGED IS SCRIPT BODY!!!)
GFSS_SMBCACHE="${SMBCACHE_DIR}/default.smbcache"
#path to error data
GFSS_SMBERROR="${SMBCACHE_DIR}/default.smberror"
#path to ok-file
GFSS_OKFILE="bone.txt"
#check variables
putlog "check variables"
if [[ ! (-z ${1} && -z ${2} && -z ${3}) ]]
then
#all variables are set (ok)
GFSS_SHARE_NAME=`${ECHO_BIN} ${2} | ${CUT_BIN} -d '_' -f 2`
GFSS_SERV_IP=${1}
GFSS_USER_NAME=${2}
GFSS_PASS=${3}
putlog "Validate ip address"
check_ip_valid ${GFSS_SERV_IP}
#check ip validation result
if [[ ! (${?} -eq "0") ]]
then
#invalid ip address
send_error_to_log "IP: ${GFSS_SERV_IP} invalid. Skipping..."
GFSS_CUR_FN_STATUS="1"
else
#valid ip address
putlog "IP: ${GFSS_SERV_IP} valid."
#checking share name
if [[ ! (${GFSS_SHARE_NAME} == "") ]]
then
#share name not empty string
#we need to create data cache file and check connection
putlog "Creating caches: generate filenames"
GFSS_SMBCACHE="${GFSS_SMBCACHE_DIR}/`${ECHO_BIN} ${GFSS_SHARE_NAME} | ${SED_BIN} -e 's/\\.\\.//g'`.smbcache"
if [[ ${?} -ne "0" ]]
then
GFSS_CUR_FN_STATUS="1"
fi
#and create file with stderr messages
GFSS_SMBERROR="${GFSS_SMBCACHE_DIR}/`${ECHO_BIN} ${GFSS_SHARE_NAME} | ${SED_BIN} -e 's/\\.\\.//g'`.smberror"
if [[ ${?} -ne "0" ]]
then
GFSS_CUR_FN_STATUS="1"
fi
#промежуточная проверка. если на этом этапе возникла ошибка, то она связана только с процессом генерации имен
#временных файлов. неправильно сгенерированные имена файлов в процессе работы скрипта могут привести к непредвиденным
#последствиям. по-этому, перестраховываюсь и прекращаю работу скрипта
if [[ ${GFSS_CUR_FN_STATUS} != ${GFSS_DEF_FN_STATUS} ]]
then
[[ "1" == "0" ]]
fi
ltest_state "generate filenames"
#if we cannot create file we must stop the script and send state
putlog "Create file: ${GFSS_SMBCACHE}"
touch ${GFSS_SMBCACHE}
ltest_state "create ${GFSS_SMBCACHE}"
putlog "Create file: ${GFSS_SMBERROR}"
touch ${GFSS_SMBERROR}
ltest_state "create ${GFSS_SMBERROR}"
#touch это локальная операция. если не получилось записать в файловую систему, то
#велика вероятность того что все последующие операции резервирования шар будут неудачны
#в свзяи с этим тушим скрипт окончательно
#аналогично для файла с ошибками
putlog "Get contents of ${GFSS_SHARE_NAME} share"
${SMBCLIENT_BIN} -e //${GFSS_SERV_IP}/${GFSS_SHARE_NAME} -U ${GFSS_USER_NAME}\%${GFSS_PASS} -I ${GFSS_SERV_IP} -c "ls" > ${GFSS_SMBCACHE} 2> ${GFSS_SMBERROR}
#if we cannot get contents we need to:
#1) create alert with error
#2) wait some seconds
#3) skip and continue with other share
if [[ ${?} -ne "0" ]]
then
#we got some error
#errors in smbclient go through STDOUT
#warnings in smbclient go through STDERR
[[ "1" == "0" ]]
ltest_state_continue "${GFSS_SMBCACHE}"
GFSS_CUR_FN_STATUS="1"
else
#ok
#check smbcache
#if wc -l > 0 and bone exist - ok
#if wc -l > 0 and bone ! exist - warn
#if wc -l = 0 skip
${CAT_BIN} ${GFSS_SMBCACHE} | ${TAIL_BIN} -n +3 | ${HEAD_BIN} -n -2 | ${GREP_BIN} -e ".*" > /dev/null 2>&1
#if [ ! -s ${GFSS_SMBCACHE} ]
#if [[ $( ${CAT_BIN} ${GFSS_SMBCACHE} | ${WC_BIN} -l ) -eq 0 ]]
if [[ ${?} -eq "1" ]]
then
#empty share
putlog "empty share. skip"
else
#share not empty
${CAT_BIN} ${GFSS_SMBCACHE} | ${GREP_BIN} ${GFSS_OKFILE} > ${GFSS_SMBERROR} 2>&1
if [[ ${?} -eq "0" ]]
then
#bone exist. copy files
#нужно проверить существует ли уже каталог
if [[ ! -d ${TMP_DIR}/${ARCH}/${GFSS_SHARE_NAME} ]]
then
#каталога не существует. создаем и резервируемся
putlog "mkdir: ${TMP_DIR}/${GFSS_SHARE_NAME}"
${MKDIR_BIN} -p ${TMP_DIR}/${GFSS_SHARE_NAME}
ltest_state "mkdir: ${TMP_DIR}/${GFSS_SHARE_NAME}"
putlog "start copy files"
for GFSS_CURFILE in `${CAT_BIN} ${GFSS_SMBCACHE} | ${TAIL_BIN} -n +3 | ${HEAD_BIN} -n -2 | ${AWK_BIN} '{print \$1}'`;
do
putlog "copy file: ${GFSS_CURFILE}"
${SMBCLIENT_BIN} -e //${GFSS_SERV_IP}/${GFSS_SHARE_NAME} -U ${GFSS_USER_NAME}\%${GFSS_PASS} -I ${GFSS_SERV_IP} -c "get ${GFSS_CURFILE} ${TMP_DIR}/${GFSS_SHARE_NAME}/${GFSS_CURFILE}" > ${GFSS_SMBERROR} 2>1
ltest_state_continue "${GFSS_SMBERROR}"
if [[ ${?} -ne "0" ]]
then
GFSS_CUR_FN_STATUS="1"
fi
done
putlog "copy files done"
else
#каталог уже существует
send_error_to_log "${TMP_DIR}/${GFSS_SHARE_NAME} exist. Skipping"
GFSS_CUR_FN_STATUS="1"
fi
else
#files exist but bone.txt not exist
#generate alert sleep and skip
send_error_to_log "Backup is in progress on remote share ${GFSS_SHARE_NAME}"
GFSS_CUR_FN_STATUS="1"
fi
fi
fi
putlog "Destroy ${GFSS_SMBCACHE}"
${RM_BIN} -rf ${GFSS_SMBCACHE}
ltest_state "rm ${GFSS_SMBCACHE}"
putlog "Destroy ${GFSS_SMBERROR}"
${RM_BIN} -rf ${GFSS_SMBERROR}
ltest_state "rm ${GFSS_SMBERROR}"
else
#share name empty string
putlog "share name empty. skipping"
GFSS_CUR_FN_STATUS="1"
fi
fi
else
#one or more variables not exist
send_error_to_log "Ip addr or/and share name or/and password not set"
GFSS_CUR_FN_STATUS="1"
fi
#2.send fn status - start
if [[ ${GFSS_CUR_FN_STATUS} == ${GFSS_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
#
#2.send fn status - finish
}
get_nfs_backups_state(){
#path to cat
CAT_BIN="/usr/bin/cat"
#path to cut
CUT_BIN="/usr/bin/cut"
#path to grep
GREP_BIN="/usr/bin/grep"
#path to wc
WC_BIN="/usr/bin/wc"
GNB_DEF_FN_STATUS="0"
GNB_CUR_FN_STATUS="${GNB_DEF_FN_STATUS}"
if [[ -f ${1} ]]
then
#file exists
if [[ $( ${CAT_BIN} ${1} | ${GREP_BIN} -v -e '^$' | ${WC_BIN} -l ) -ne 0 ]]
then
#exist lines
putlog "Start backup NFS shares"
for CUR_NFS_SHARE in `cat ${NFS_BASE}`
do
#parsing file
CUR_HOST=`echo ${CUR_NFS_SHARE} | ${CUT_BIN} -d ';' -f 1`
CUR_SHARE=`echo ${CUR_NFS_SHARE} | ${CUT_BIN} -d ';' -f 2`
CUR_SERV_NAME=`echo ${CUR_NFS_SHARE} | ${CUT_BIN} -d ';' -f3`
CUR_LPORT=`echo ${CUR_NFS_SHARE} | ${CUT_BIN} -d ';' -f 4`
CUR_RPORT=`echo ${CUR_NFS_SHARE} | ${CUT_BIN} -d ';' -f 5`
#execute backup
putlog "Try to backup ${CUR_HOST}:${CUR_SHARE}"
#putlog "Cur lport: ${CUR_LPORT}; Cur rport: ${CUR_RPORT}"
if [[ ! ( -z ${CUR_LPORT} ) ]]
then
#lport defined
if [[ ! ( -z ${CUR_RPORT} ) ]]
then
#rport defined
#putlog "exec: get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME} ${CUR_LPORT} ${CUR_RPORT}"
get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME} ${CUR_LPORT} ${CUR_RPORT}
else
#rport not defined
#putlog "exec: get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME} ${CUR_LPORT}"
get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME} ${CUR_LPORT}
fi
else
#lport not defined
#putlog "exec: get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME}"
get_files_nfs4_ssh_state ${CUR_HOST} ${CUR_SHARE} ${CUR_SERV_NAME}
fi
#get_files_smb_state ${CUR_HOST} ${CUR_USER} ${CUR_PASS}
if [[ ${?} -ne "0" ]]
then
#изменить статус, если хотя бы один вызов функции выполнился с некритичными ошибками
GNB_CUR_FN_STATUS="1"
fi
done
putlog "Finish backup nfs shares"
else
send_error_to_log "no valid lines in ${NFS_BASE}. skip nfs"
GNB_CUR_FN_STATUS="1"
fi
else
send_error_to_log "File not exist: ${1}"
GNB_CUR_FN_STATUS="1"
fi
if [[ ${GNB_CUR_FN_STATUS} == ${GNB_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
}
get_smb_backups_state(){
#path to cat
CAT_BIN="/usr/bin/cat"
#path to cut
CUT_BIN="/usr/bin/cut"
#path to grep
GREP_BIN="/usr/bin/grep"
#path to wc
WC_BIN="/usr/bin/wc"
GSB_DEF_FN_STATUS="0"
GSB_CUR_FN_STATUS="${GSB_DEF_FN_STATUS}"
if [[ -f ${1} ]]
then
#file exists
if [[ $( ${CAT_BIN} ${SMB_BASE} | ${GREP_BIN} -v -e '^$' | ${WC_BIN} -l ) -ne 0 ]]
then
#exist lines
putlog "Start backup smb shares"
for CUR_SMB_SHARE in `cat ${SMB_BASE}`
do
#parsing file
CUR_HOST=`echo ${CUR_SMB_SHARE} | ${CUT_BIN} -d ';' -f 1`
CUR_USER=`echo ${CUR_SMB_SHARE} | ${CUT_BIN} -d ';' -f 2`
CUR_PASS=`echo ${CUR_SMB_SHARE} | ${CUT_BIN} -d ';' -f 3`
#execute backup
putlog "Try to backup `echo ${CUR_USER} | ${CUT_BIN} -d '_' -f 2`"
get_files_smb_state ${CUR_HOST} ${CUR_USER} ${CUR_PASS}
if [[ ${?} -ne "0" ]]
then
#изменить статус, если хотя бы один вызов функции выполнился с некритичными ошибками
GSB_CUR_FN_STATUS="1"
fi
done
putlog "Finish backup smb shares"
else
putlog "no valid lines in ${SMB_BASE}. skip smb"
GSB_CUR_FN_STATUS="1"
fi
else
#smb_base not exist
putlog "no smb_base file. skip smb"
GSB_CUR_FN_STATUS="1"
fi
if [[ ${GSB_CUR_FN_STATUS} == ${GSB_DEF_FN_STATUS} ]]
then
#2.1.status ok - start
[[ "1" == "1" ]]
#2.1.status ok - finish
else
#2.2.status fail - start
[[ "1" == "0" ]]
#2.2.status fail - finish
fi
}