A szkript két replikációs TSM szervert tud kezelni. (Egy cél és egy hozzá tartozó forrás szerver.) Paraméterként megadott node, vagy node-ok replikációs szerepkörét cseréli meg (megfordítja a node replikációs irányát), törli, vagy teszi szinkron módba.
Működése:
Node lista készítése: Egy fájlba lekérdezi az 1. szerveren lévő, replikációra beállított node-ok listáját. Opcionális paraméterrel szűkíthetjük csak a Send vagy csak a Receive módúakra.
Replikációs irány megfordítása (szerepcsere): A szkript egymás után megy végig a node-okon. (Ha nem egy node-ra futtatjuk). Megállapítja, hogy jelenleg melyik szerveren van küldő és melyiken fogadó szerepkörben. Miután leellenőrizte, hogy nincs futó replikáció, vagy kliens session a node-ra a jelenlegi küldő szerveren (ha van valami, akkor megvárja, míg az befejeződik, de magától nem állítja le), lockolja a node-ot, hogy egy esetleges kliens csatlakozás ne tudjon már bele írni. Ezután futtat egy utolsó replikációt, hogy egy szinkronba kerüljenek a node adatai a két szerveren. Ha ez sikeresen lefutott, törli a replikációs szerepköröket a node-ról mindkét szerveren, majd beállítja, hogy a jelenlegi küldő legyen az új fogadó és fordítva (A SyncSend és SyncReceive paramétereket használva.) Ezután futtat egy „preview” replikációt az új küldő szerveren, hogy lássuk működik-e, majd felengedi a lockolt node-ot, és tovább lép a következő node-ra. (Ha van.)
Replikációs szabály törlése: Leveszi a node-okról a replikációs szabályt. Opcionálisan meg lehet adni, hogy csak az egyik, vagy csak a másik oldalon tegye ezt meg.
Szinkron módba állítás: A node-okat, SyncSend/SyncReceive módba állítja, hogy újra repéikálhatóak legyenek egy replikációs szabály törlés után.
A futást egy fájlba is logolja.
Paraméterként megadhatunk node nevet, fájl nevet (soronként node listával), vagy a „-m” paramétert, mely minden szerveren replikációra beállított node-ra lefuttatja a szerepkör cserét.
#!/bin/bash ################################################################################### # TSM replikacios parameter vezerlo szkript v1.3 # created by Agoston Peter ################################################################################### TSMSRV1=TSM1 # Az egyik TSM szerver sztanza neve TSMSRV2=TSM2 # A másik TSM szerver sztanza neve TSMUSER=tsm_admin # TSM adminisztrátor TSMPASS=jelszo # TSM adminisztrátor jelszava LOG_FILE="/var/log/tsm_change_repl_roles.log" # Futási log fájl neve TMP_FILE="/var/log/tsm_change_repl_roles.tmp" # Futási ideiglenes munkaállomány neve # Innen ne módosíts, csak ha tudod mit csinálsz! DSMADMC1="dsmadmc -id=$TSMUSER -pa=$TSMPASS -se=$TSMSRV1 -dataonly=y -tabdelim" DSMADMC2="dsmadmc -id=$TSMUSER -pa=$TSMPASS -se=$TSMSRV2 -dataonly=y -tabdelim" SQL_REPLNODES="select node_name from nodes where REPL_STATE='ENABLED' order by node_name" white=$(tput bold;tput setaf 7) # bright white text normal=$(tput sgr0) # normal text blue="\033[00;94m" # blue text red=$(tput bold;tput setaf 1) # bright red text function log() { szin=$1 shift echo -e $blue$(date "+%Y.%m.%d %H:%M") $szin$*$normal echo $(date "+%Y.%m.%d %H:%M") $* >> $LOG_FILE } function help() { echo echo "TSM replikacios parameter vezerlo szkript $(grep -o 'v[0-9]\+\.[0-9]\+' $0 | head -n1) - created by Agoston Peter" echo "Hasznalat: $0 [-m|-n NODE_NEV|-f NODE_LISTA.lst] [-c|-d(-ds|-dt)(-r|-s)|-sy(-r|-s)]" echo "Node-ok kijelolese (egyik kotelezoen valasztando):" echo " -m # A -m kapcsolo eseten minden replikalt node-on vegighalad" echo " -n NODE_NEV # A -n kapcsolo utan megadott node-dal fog dolgozni" echo " -f NODE_LISTA.LST # A -f kapcsolo utan megadott fajlban soronkent felsorolt node-okkal fog dolgozni" echo echo "Opciok (egyik kotelezoen valasztando):" echo " -l |--list-repl-nodes # A $TSMSRV1 szerveren listat keszit a tsm_change_repl_roles.[DATUM].[REPL_MODE].txt fajlba a replikaciora beallitott node-okrol" echo " -c |--change-role # A $TSMSRV1 szerveren a [-n/-m/-f] parameterrel deklaralt node-ok repliikacios iranyat megforditja" echo " -d |--del-role # A $TSMSRV1 es $TSMSRV2 szerveren a [-n/-m/-f] parameterrel deklaralt node-okrol torli a replikacios szabalyt" echo " -sy|--set-sync-role # A $TSMSRV1 szerveren a [-n/-m/-f] parameterrel deklaralt node-okon SyncSend, a $TSMSRV2 szerveren SyncReceive modba allitja a node-ot" echo echo "Opcionalis parameterek a -d kapcsolohoz (egyszerre csak az egyik valaszthato):" echo " -ds|--del-source-role # A $TSMSRV1 szerveren a [-n/-m/-f] parameterrel deklaralt node-okrol leveszi a replikacios szabalyt" echo " -dt|--del-target-role # A $TSMSRV2 szerveren a [-n/-m/-f] parameterrel deklaralt node-okrol leveszi a replikacios szabalyt" echo echo "Opcionalis parameterek a -d es -sy kapcsolokhoz (egyszerre csak az egyik valaszthato):" echo " -r|--receive-only # A $TSMSRV1 szerveren RECEIVE replikacios modban levo node-okkal fog csak foglalkozni a [-n/-m/-f] parameterrel deklaralt node-ok kozul" echo " -s|--send-only # A $TSMSRV1 szerveren SEND replikacios modban levo node-okkal fog csak foglalkozni a [-n/-m/-f] parameterrel deklaralt node-ok kozul" echo } # Megnezzuk irhato-e a log es temp fajlunk touch $TMP_FILE if [[ $? -ne 0 ]]; then echo "A $TMP_FILE munkaallomany nem irhato."; exit 1; fi touch $LOG_FILE if [[ $? -ne 0 ]]; then echo "A $LOG_FILE log allomany nem irhato."; exit 1; fi echo "----------------------------------------------------">> $LOG_FILE log $white "Futasi log: \"$LOG_FILE\"" # A forgatando node-ok listajanak elokeszitese a szkriptnek adott parameter alapjan NUMARGS=$# IF_REPL_MODE='tetszoleges replikacios ' for ((i=1 ; i <= NUMARGS ; i++)); do case "$1" in -m) $DSMADMC1 $SQL_REPLNODES > $TMP_FILE log $white "Valasztott node-ok:" log $white "Minden $TSMSRV1 szerveren replikalt node (akar cel, akar forras node)." ;; -f) shift if [[ -f $1 ]]; then log $white "Valasztott node-ok:" log $white "A \"$1\" file-ban felsorolt node-ok:" cat $1 | tee $TMP_FILE cat $1 >> $LOG_FILE else log $red "A $1 fajl nem letezik." log $red "Futas vege." exit 1 fi ;; -n) shift log $white "Valasztott node-ok:" log $white " $1" echo $1 | tee $TMP_FILE >> $LOG_FILE ;; -r|--receive-only) IF_REPL_MODE='RECEIVE' ;; -s|--send-only) IF_REPL_MODE='SEND' ;; -c|--change-role) ROTATE=true ;; -d|--del-role) REMOVE=true ;; -ds|--del-source-role) REMOVE_SOURCE_ONLY=true ;; -dt|--del-target-role) REMOVE_TARGET_ONLY=true ;; -sy|--set-sync-role) SET_SYNC_ROLE=true ;; -l|--list-repl-nodes) LIST_REPL_NODES=true ;; *) ;; esac shift done if [[ $ROTATE ]]; then log $white "Minden $TSMSRV1 szerveren $IF_REPL_MODE modban levo node replikacios iranyat megforditjuk (a valasztott node-ok kozul)." elif [[ $REMOVE ]]; then if [[ $REMOVE_SOURCE_ONLY ]]; then log $white "Minden $TSMSRV1 szerveren $IF_REPL_MODE modban levo node replikacios szabalyat toroljuk (a valasztott node-ok kozul)." elif [[ $REMOVE_TARGET_ONLY ]]; then log $white "Minden $TSMSRV2 szerveren $IF_REPL_MODE modban levo node replikacios szabalyat toroljuk (a valasztott node-ok kozul)." else log $white "Minden $TSMSRV1 es $TSMSRV2 szerveren $IF_REPL_MODE modban levo node replikacios szabalyat toroljuk (a valasztott node-ok kozul)." fi elif [[ $LIST_REPL_NODES ]]; then if [[ 'tetszoleges replikacios ' = $IF_REPL_MODE ]]; then IF_REPL_MODE2="any"; else IF_REPL_MODE2=$IF_REPL_MODE; fi log $white "Minden $TSMSRV1 szerveren $IF_REPL_MODE modban levo node-ot kilistazunk a 'tsm_change_repl_roles.$(date "+%Y%m%d%H%M").$IF_REPL_MODE2.nodes' fajba." elif [[ $SET_SYNC_ROLE ]]; then log $white "Minden $TSMSRV1 szerveren $IF_REPL_MODE modban levo node-ot SyncSend, a $TSMSRV2 szerveren ugyanezeket SyncReceive modba allitjuk (a valasztott node-ok kozul)." fi if [[ $NUMARGS -eq 0 || ! ( $REMOVE || $ROTATE || $SET_SYNC_ROLE || $LIST_REPL_NODES ) ]]; then log $red "Hianyzo parameter! (-c|-d|-sy|-l)" log $red "Futas vege." help exit fi # Itt kezdodik a lenyeg grep -v '^$' $TMP_FILE | while read NODE; do if [[ $ROTATE ]]; then echo -e $blue$(date "+%Y.%m.%d %H:%M") $white-=[ $red$NODE$white ]=-$normal echo $(date "+%Y.%m.%d %H:%M")" -=[ $NODE ]=-" >> $LOG_FILE REPL_MODE=`$DSMADMC1 "select REPL_MODE from nodes where node_name=upper('$NODE')"` # Ha nem olyan modban van, mint amit a program parameterben kapott, megyunk a kovetkezo node-ra if [[ $REPL_MODE != $IF_REPL_MODE && 'tetszoleges replikacios ' != $IF_REPL_MODE ]]; then log $red "A $NODE kihagyasra kerul, mert nem $IF_REPL_MODE modban van (vagy egyeb problema van a node-dal)." continue; fi case $REPL_MODE in SEND) log $white "A jelenlegi replikacios irany: $TSMSRV1 -> $TSMSRV2" # Varunk, mig nincs sessionje while [[ $($DSMADMC1 "select session_id from sessions where CLIENT_NAME='$NODE' and SESSION_TYPE='Node'" | egrep -v 'AN[SR]'| wc -l) -gt 0 ]]; do log $white "A node-nak van aktiv sessionje, megvarjuk..." sleep 30 done # Varunk, mig nincs processe while [[ $($DSMADMC1 "select process_num from processes where STATUS like '%$NODE%'" | egrep -v 'AN[SR]'| wc -l) -gt 0 ]]; do log $white "A node-nak van aktiv processze, megvarjuk...." sleep 30 done # Node lockolasa log $white "Node lockolasa:" $DSMADMC1 lock node $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node lockolasa sikertelen, ezert a node kihagyasra kerul."; continue; fi # Utolso replikacio futtatasa a forgatas elott log $white "Futtatunk egy utolso replikaciot a forgatas elott, hogy biztosan szinkronban legyen a ket oldal..." $DSMADMC1 repl n $NODE wait=y | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node replikalasa sikertelen, ezert a node kihagyasra kerul."; continue; fi # Toroljuk a node-okrol a replikacios szabalyt log $white "Toroljuk a node-rol a replikacios szabalyt mindket szerveren..." log $white "- $TSMSRV1:" $DSMADMC1 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi log $white "- $TSMSRV2:" $DSMADMC2 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi # Beallitjuk az uj replikacios parametereket log $white "Beallitjuk a 'SyncReceive' replikacios parametert a $TSMSRV1 szerveren..." $DSMADMC1 update node $NODE replstate=enabled replmode=syncreceive | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi log $white "Beallitjuk a 'SyncSend' replikacios parametert a $TSMSRV2 szerveren..." $DSMADMC2 update node $NODE replstate=enabled replmode=syncsend | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi # Replikacios szabalyok validalasa #RC=$($DSMADMC2 validate replication $NODE verify=y | grep 'Connection Status' | grep 'Valid Connection' | wc -l) #log $white "Az uj replikacios szabalyok validalasa: RC$RC" #if [[ $RC -ne 0 ]]; then log $white "A $TSMSRV2 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi # Node replikalasa az uj forras oldalon # log $white "Node replikalas inditasa 'preview' modban a $TSMSRV2-n:" # $DSMADMC2 repl node $NODE preview=y wait=y | tee -a $LOG_FILE # RC=${PIPESTATUS[0]} # if [[ $RC -ne 0 ]]; then log $red "A teszt replikacio sikertelen!"; else log $white "A teszt replikacio sikeresnek tunik."; fi # Node felengedese log $white "Node felengedese:" $DSMADMC1 unlock node $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node felengedese sikertelen!"; continue; fi log $white "A replikacio megforditva, az uj irany: $TSMSRV2 -> $TSMSRV1" ;; RECEIVE) log $white "A jelenlegi replikacios irany: $TSMSRV2 -> $TSMSRV1" # Varunk, mig nincs sessionje while [[ $($DSMADMC2 "select session_id from sessions where CLIENT_NAME='$NODE' and SESSION_TYPE='Node'" | egrep -v 'AN[SR]'| wc -l) -gt 0 ]]; do log $white "A node-nak van aktiv sessionje, megvarjuk..." sleep 30 done # Varunk, mig nincs processe while [[ $($DSMADMC2 "select process_num from processes where STATUS like '%$NODE%'" | egrep -v 'AN[SR]'| wc -l) -gt 0 ]]; do log $white "A node-nak van aktiv processze, megvarjuk...." sleep 30 done # Node lockolasa log $white "Node lockolasa:" $DSMADMC2 lock node $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node lockolasa sikertelen, ezert a node kihagyasra kerul."; continue; fi # Utolso replikacio futtatasa a forgatas elott log $white "Futtatunk egy utolso replikaciot a forgatas elott, hogy biztosan szinkronban legyen a ket oldal..." $DSMADMC2 repl n $NODE wait=y | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node replikalasa sikertelen, ezert a node kihagyasra kerul."; continue; fi # Toroljuk a node-okrol a replikacios szabalyt log $white "Toroljuk a node-rol a replikacios szabalyt mindket szerveren..." log $white "- $TSMSRV2:" $DSMADMC2 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi log $white "- $TSMSRV1:" $DSMADMC1 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi # Beallitjuk az uj replikacios parametereket log $white "Beallitjuk a 'SyncReceive' replikacios parametert a $TSMSRV2 szerveren..." $DSMADMC2 update node $NODE replstate=enabled replmode=syncreceive | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi log $white "Beallitjuk a 'SyncSend' replikacios parametert a $TSMSRV1 szerveren..." $DSMADMC1 update node $NODE replstate=enabled replmode=syncsend | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi # Replikacios szabalyok validalasa #RC=$($DSMADMC2 validate replication $NODE verify=y | grep 'Connection Status' | grep 'Valid Connection' | wc -l) #log $white "Az uj replikacios szabalyok validalasa: RC$RC" #if [[ $RC -ne 0 ]]; then log $white "A $TSMSRV2 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi # Node replikalasa az uj forras oldalon log $white "Node replikalas inditasa 'preview' modban a $TSMSRV1-n:" # $DSMADMC1 repl node $NODE preview=y wait=y | tee -a $LOG_FILE # RC=${PIPESTATUS[0]} # if [[ $RC -ne 0 ]]; then log $red "A teszt replikacio sikertelen!"; else log $white "A teszt replikacio sikeresnek tunik."; fi # Node felengedese log $white "Node felengedese:" $DSMADMC2 unlock node $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A node felengedese sikertelen!"; continue; fi log $white "A replikacio megforditva, az uj irany: $TSMSRV1 -> $TSMSRV2" ;; SYNCRECEIVE) log $white "A node szerepkor csere alatt van mar, es a $TSMSRV2 lesz az uj aktiv oldala." ;; SYNCSEND) log $white "A node szerepkor csere alatt van mar, es a $TSMSRV1 lesz az uj aktiv oldala." ;; *) log $red "Ellenorizd a node replikacios allapotat ($REPL_MODE)!" ;; esac log $red "10mp varakozas a kovetkezo node megkezdese elott..." sleep 10 echo elif [[ $REMOVE ]]; then echo -e $blue$(date "+%Y.%m.%d %H:%M") $white-=[ $red$NODE$white ]=-$normal echo $(date "+%Y.%m.%d %H:%M")" -=[ $NODE ]=-" >> $LOG_FILE REPL_MODE=`$DSMADMC1 "select REPL_MODE from nodes where node_name=upper('$NODE')"` # Ha nem olyan modban van, mint amit a program parameterben kapott, megyunk a kovetkezo node-ra if [[ $REPL_MODE != $IF_REPL_MODE ]]; then log $red "A $NODE kihagyasra kerul, mert nem $IF_REPL_MODE modban van (vagy egyeb problema van a node-dal)." continue; fi # Toroljuk a node-okrol a replikacios szabalyt if [[ ! $REMOVE_TARGET_ONLY ]]; then log $white "Toroljuk a node-rol a replikacios szabalyt $TSMSRV1 szerveren..." $DSMADMC1 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi fi if [[ ! $REMOVE_SOURCE_ONLY ]]; then log $white "Toroljuk a node-rol a replikacios szabalyt $TSMSRV2 szerveren..." $DSMADMC2 remove replnode $NODE | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult torolni a replikacios szabalyt a node-rol, ezert a node kihagyasra kerul."; continue; fi fi # Replikációra beállított node-od listájának kiírása fáljba elif [[ $LIST_REPL_NODES ]]; then if [[ $IF_REPL_MODE = 'tetszoleges replikacios ' ]]; then $DSMADMC1 "select node_name from nodes where REPL_STATE='ENABLED' order by node_name" > "tsm_change_repl_roles.$(date "+%Y%m%d%H%M").$IF_REPL_MODE2.nodes" else $DSMADMC1 "select node_name from nodes where REPL_STATE='ENABLED' and REPL_MODE='$IF_REPL_MODE' order by node_name" > "tsm_change_repl_roles.$(date "+%Y%m%d%H%M").$IF_REPL_MODE2.nodes" fi # Beallitjuk a TSM szervereken a SyncSend es SyncReceive modot az ujraszinkronizalashoz elif [[ $SET_SYNC_ROLE ]]; then echo -e $blue$(date "+%Y.%m.%d %H:%M") $white-=[ $red$NODE$white ]=-$normal echo $(date "+%Y.%m.%d %H:%M")" -=[ $NODE ]=-" >> $LOG_FILE REPL_MODE=`$DSMADMC1 "select REPL_MODE from nodes where node_name=upper('$NODE')"` # Ha nem olyan modban van, mint amit a program parameterben kapott, megyunk a kovetkezo node-ra if [[ $REPL_MODE != $IF_REPL_MODE ]]; then log $red "A $NODE kihagyasra kerul, mert nem $IF_REPL_MODE modban van (vagy egyeb problema van a node-dal)." continue; fi log $white "Beallitjuk a 'SyncReceive' replikacios parametert a $TSMSRV2 szerveren..." $DSMADMC2 update node $NODE replstate=enabled replmode=syncreceive | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV2 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi log $white "Beallitjuk a 'SyncReceive' replikacios parametert a $TSMSRV1 szerveren..." $DSMADMC1 update node $NODE replstate=enabled replmode=syncsend | tee -a $LOG_FILE RC=${PIPESTATUS[0]} if [[ $RC -ne 0 ]]; then log $red "A $TSMSRV1 szerveren nem sikerult beallitani az uj replikacios szabalyt, ezert a node kihagyasra kerul."; continue; fi fi done log $white "Futas vege."