#!/bin/sh # # # TSM Smart Replicator v1.3.1 (2015.05.30) - Ágoston Péter # # # ################################################################# TSMSERVER=tsmserv TSMUSER=tsmadmin TSMPASS=jelszo REPLMAXNUM=4 INFINITERUN=true REFRESHRATE=10 #MINUTES LOGFILE=/var/log/tsm_smart_replicator.log REMEMBER_LAST_NODE=true LAST_NODE_FILE=/tmp/tsm_smart_replicator.last_node EXCLUDENODES='' DSMADMC="dsmadmc -id=$TSMUSER -pa=$TSMPASS -se=$TSMSERVER -dataonly=y -displ=tabl" 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, REPLMAXNUM=$REPLMAXNUM, INFINITERUN=$INFINITERUN, REFRESHRATE=${REFRESHRATE}m)" | tee -a $LOGFILE LAST_NODE=$(cat $LAST_NODE_FILE) FIRSTRUN=true CYCLE=1 ACT_NODE_NUM=0 while [ $INFINITERUN = true ] || [ $FIRSTRUN = true ]; do FIRSTRUN=false STARTTIME=$(date +"%s") STARTTIME=$(($STARTTIME / 60)) echo "$(date "+%Y.%m.%d %H:%M") CYCLE START ($CYCLE)" | tee -a $LOGFILE REPL_NODE_NUM=`$DSMADMC "select count(node_name) from nodes where repl_state='ENABLED' and repl_mode in ('SEND','SYNCSEND')" | sed 's/[^0-9]*//'` $DSMADMC "select node_name from nodes where repl_state='ENABLED' and repl_mode in ('SEND','SYNCSEND') ORDER BY node_name" | while read NODE; do # Megprobaljuk onnan folytatni, ahol utoljara abbahagytuk a kort if [ "$REMEMBER_LAST_NODE" = "true" ] && [ -n "$LAST_NODE" ] && [ "$NODE" != "$LAST_NODE" ]; then echo "$(date "+%Y.%m.%d %H:%M") A $NODE node kihagyasa, mert folytatjuk onnan, ahol abbahagytuk." >> $LOGFILE continue; fi unset LAST_NODE # Ha nem fut meg a node-ra replikacio, elinditjuk ra if [ $($DSMADMC "select count(*) from processes where status like '% $NODE.%'") -eq 0 ] && [ "$(echo $EXCLUDENODES | grep -c $NODE)" -eq 0 ]; then REPLNUM=$($DSMADMC "select count(*) from processes where process='Replicate Node'" | sed 's/[^0-9]//g') ACTREPLNODES=$($DSMADMC "select status from processes where process='Replicate Node'" | grep -v 'AN[SR]' | sed -e 's/\(^.*node.s. \)\([^.]*\)\(.*$\)/\2/' | sed ':a;N;$!ba;s/\n/, /g') echo ${ACTREPLNODES%%,*} > $LAST_NODE_FILE echo "$(date "+%Y.%m.%d %H:%M") Futo replikaciok szama: $REPLNUM ($ACT_NODE_NUM/$REPL_NODE_NUM) | Varakozik: $NODE | Replikacio alatt: $ACTREPLNODES" | tee -a $LOGFILE # Varunk, amig lesz replikacios "slot" while [ $REPLNUM -ge $REPLMAXNUM ]; do echo "$(date "+%Y.%m.%d %H:%M") ${REFRESHRATE}p varakozas..." | tee -a $LOGFILE sleep $(($REFRESHRATE*60)) REPLNUM=$($DSMADMC "select count(*) from processes where process='Replicate Node'" | sed 's/[^0-9]//g') ACTREPLNODES=$($DSMADMC "select status from processes where process='Replicate Node'" | grep -v 'AN[SR]' | sed -e 's/\(^.*node.s. \)\([^.]*\)\(.*$\)/\2/' | sed ':a;N;$!ba;s/\n/, /g') echo "$(date "+%Y.%m.%d %H:%M") Futo replikaciok szama: $REPLNUM ($ACT_NODE_NUM/$REPL_NODE_NUM) | Varakozik: $NODE | Replikacio alatt: $ACTREPLNODES" | tee -a $LOGFILE done $DSMADMC "repl node $NODE maxsess=3" | tee -a $LOGFILE ACT_NODE_NUM=$((ACT_NODE_NUM+1)) # Ha mar csak egy slot van, varunk egy percet, hatha nincs mit replikalni, hogy mehessunk tovabb if [ $(($REPLMAXNUM-$REPLNUM)) -eq 1 ]; then echo "$(date "+%Y.%m.%d %H:%M") 1p varakozas..." | tee -a $LOGFILE;sleep 60; fi else echo "$(date "+%Y.%m.%d %H:%M") A $NODE kihagyasra kerul, mert EXCLUDE-olva van, vagy mar epp fut ra replikacio." | 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_NODE done echo "$(date "+%Y.%m.%d %H:%M") PROGRAM END" | tee -a $LOGFILE