#!/bin/sh # # # TSM Circular Backup Storage Pool v1.0 (2016.11.16) - Ágoston Péter # # # ######################################################################### TSMSERVER=tsmserv TSMUSER=tsmadmin TSMPASS=jelszo BACKUPMAXNUM=4 INFINITERUN=true REFRESHRATE=30 #MINUTES PRIM_POOL_WHERE="stgpool_name like '%_T' and stgpool_name like '%_D'" LOGFILE=/var/log/tsm_circular_ba_stg.log LOGMAXLINES=3000 REMEMBER_LAST_POOL=true LAST_POOL_FILE=/tmp/tsm_circular_ba_stg.last_pool EXCLUDEPOOLS='' DSMADMC="dsmadmc -id=$TSMUSER -pa=$TSMPASS -se=$TSMSERVER -dataonly=y -displ=tabl" if [[ $(ps -ef | grep $0 | grep -vc grep) -gt 1 ]]; then echo "$(date "+%Y.%m.%d %H:%M") A PROGRAM MAR FUT EGY PELDANYBAN!" | tee -a $LOGFILE exit 1 fi trap 'echo "$(date "+%Y.%m.%d %H:%M") PROGRAM TERMINATED" | tee -a $LOGFILE;kill $$' SIGINT SIGTERM; echo "$(date "+%Y.%m.%d %H:%M") PROGRAM START (TSMSERVER=$TSMSERVER, BACKUPMAXNUM=$BACKUPMAXNUM, INFINITERUN=$INFINITERUN, REFRESHRATE=${REFRESHRATE}m)" | tee -a $LOGFILE LAST_POOL=$(cat $LAST_POOL_FILE) FIRSTRUN=true CYCLE=1 while [ $INFINITERUN = true ] || [ $FIRSTRUN = true ]; do tail -n$LOGMAXLINES $LOGFILE > $LOGFILE.trunc && mv $LOGFILE.trunc $LOGFILE ACT_POOL_NUM=1 FIRSTRUN=false STARTTIME=$(date +"%s") STARTTIME=$(($STARTTIME / 60)) echo "$(date "+%Y.%m.%d %H:%M") CYCLE START ($CYCLE)" | tee -a $LOGFILE PRIMARY_POOL_NUM=`$DSMADMC "select count(*) from stgpools where ${PRIM_POOL_WHERE} and POOLTYPE='PRIMARY'" | sed 's/[^0-9]*//'` $DSMADMC "select stgpool_name from stgpools where ${PRIM_POOL_WHERE} and POOLTYPE='PRIMARY' ORDER BY stgpool_name" | while read POOL; do # Megprobaljuk onnan folytatni, ahol utoljara abbahagytuk a kort if [ "$REMEMBER_LAST_POOL" = "true" ] && [ -n "$LAST_POOL" ] && [ "$POOL" != "$LAST_POOL" ]; then echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE A $POOL node kihagyasa, mert folytatjuk onnan, ahol abbahagytuk." | tee -a $LOGFILE ACT_POOL_NUM=$((ACT_POOL_NUM+1)) continue; fi unset LAST_POOL # Ha nem fut meg a pool-ra mosolatkeszites, elinditjuk ra if [ $($DSMADMC "select count(*) from processes where status like '% $POOL,%' and process='Backup Storage Pool'") -eq 0 ] && [ "$(echo $EXCLUDEPOOLS | grep -c $POOL)" -eq 0 ]; then BACKUPNUM=$($DSMADMC "select count(*) from processes where process='Backup Storage Pool'" | sed 's/[^0-9]//g') ACTPOOLS=$($DSMADMC "select status from processes where process='Backup Storage Pool'" | grep -v 'AN[SR]' | sed -e 's/\(^.*Primary Pool \)\([^,]*\)\(.*$\)/\2/' | tr '\n' ',') echo ${ACTPOOLS%%,*} > $LAST_POOL_FILE echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE Futo masolatkeszitesek szama: $BACKUPNUM ($ACT_POOL_NUM/$PRIMARY_POOL_NUM) | Varakozik: $POOL | Masolatkeszites alatt: $ACTPOOLS" | tee -a $LOGFILE # Varunk, amig lesz masolatkeszito "slot" while [ $BACKUPNUM -ge $BACKUPMAXNUM ]; do echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE ${REFRESHRATE}p varakozas..." | tee -a $LOGFILE sleep $(($REFRESHRATE*60)) BACKUPNUM=$($DSMADMC "select count(*) from processes where process='Backup Storage Pool'" | sed 's/[^0-9]//g') ACTPOOLS=$($DSMADMC "select status from processes where process='Backup Storage Pool'" | grep -v 'AN[SR]' | sed -e 's/\(^.*Primary Pool \)\([^,]*\)\(.*$\)/\2/' | tr '\n' ',') echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE Futo masolatkeszitesek szama: $BACKUPNUM ($ACT_POOL_NUM/$PRIMARY_POOL_NUM) | Varakozik: $POOL | Masolatkeszites alatt: $ACTPOOLS" | tee -a $LOGFILE done COPYPOOL="${POOL%_[DT]}_C" if [[ $($DSMADMC "select count(*) from stgpools where stgpool_name='$COPYPOOL'" | sed 's/[^0-9]//g') -eq 0 ]]; then echo "$(date "+%Y.%m.%d %H:%M") #${CYCLE} A $POOL-hoz nem letezik $COPYPOOL masolati pool, ezert kihagyjuk" | tee -a $LOGFILE else $DSMADMC "BACKUP STG $POOL $COPYPOOL " | tee -a $LOGFILE fi ACT_POOL_NUM=$((ACT_POOL_NUM+1)) # Ha mar csak egy slot van, varunk egy percet, hatha nincs mit masolni, hogy mehessunk tovabb if [ $(($BACKUPMAXNUM-$BACKUPNUM)) -eq 1 ]; then echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE 1p varakozas..." | tee -a $LOGFILE;sleep 60; fi else echo "$(date "+%Y.%m.%d %H:%M") #$CYCLE A $POOL kihagyasra kerul, mert EXCLUDE-olva van, vagy mar epp fut ra masolatkeszites." | tee -a $LOGFILE fi done ENDTIME=$(date +"%s") ENDTIME=$(($ENDTIME / 60)) RUNTIME=$(($ENDTIME-$STARTTIME)) echo "$(date "+%Y.%m.%d %H:%M") CYCLE END ($CYCLE) | RUNTIME: $(($RUNTIME / 60))h $(($RUNTIME % 60))m" | tee -a $LOGFILE echo | tee -a $LOGFILE echo "$(date "+%Y.%m.%d %H:%M") ${REFRESHRATE}p varakozas..." | tee -a $LOGFILE sleep $(($REFRESHRATE*60)) CYCLE=$(($CYCLE + 1)) unset LAST_POOL done echo "$(date "+%Y.%m.%d %H:%M") PROGRAM END" | tee -a $LOGFILE