AIX tape device-ok átnevezése beszédesre konfig állomány alapján

A szkript a .cfg fájl alapján végigmegy a tape device-okon (rmt és smc), és legenerálja az AIX-es parancsokat azok átnevezésére, a .cfg-ben deklarált paraméterek alapján.

aix_rendev.cfg
# :: aix_rendev.sh konfig fajl ::
# A NUM oszlopba, changer definicio eseten "LIB"-et kell irni!
# A PREFIX hossza + NUM hossza <= 11 karakter
# Kommentelni #-tel lehet
# Az oszlopok tartalma:
# PREFIX NUM    SERIAL  WWPN
 
#TS3500 BITEP
3584P LIB 0000078A0114 500507630F853001
3584P _01A 0000078D22E6 500507630F453001
3584P _01B 0000078D22E6 500507630F853001
3584P _02A 0000078D22F6 500507630F453002
3584P _02B 0000078D22F6 500507630F853002
3584P _03A 0000078D235B 500507630F453003
3584P _03B 0000078D235B 500507630F853003
3584P _04A 0000078D2393 500507630F453004
3584P _04B 0000078D2393 500507630F853004
aix_rendev.sh
#!/bin/bash
# rmt/smc eszkoz atnevezo szkript v1.1 (20161214)
# Az atnevezeshez hasznalt konfig fajl-t a NAMING_CONF_FILE valtozoban kell beallitani
# A konfig fajlt szerkezeti kriteriumai:
# - A NUM oszlopba, changer definicio eseten "LIB"-et kell irni!
# - A PREFIX hossza + NUM hossza + 4 <= 15 karakter
# - Kommentelni #-tel lehet
# - Az oszlopok tartalma (peldaval):
# PREFIX NUM    SERIAL  WWPN
# JAG4 _01 12344567 1111222233334444
#############################################################################################
 
 
TAPE_DEV_FILE=/home/tsm/scripts/tape_rendev/aix_rendev.tapes.lst
TMP_FILE=/home/tsm/scripts/tape_rendev/aix_rendev.tmp
NAMING_CONF_FILE=/home/tsm/scripts/tape_rendev/aix_rendev.cfg
MACRO_TEMPL_FILE=/home/tsm/scripts/tape_rendev/aix_rendev.mac
 
rm -f $TMP_FILE
rm -f $MACRO_TEMPL_FILE
printf "# A $NAMING_CONF_FILE konfig fajlbol fogok dolgozni. Ellenorzom van-e benne redundans, vagy tul hosszu eszkoz specifikacio..."
while read LINE2; do
        NEW_PRE=$(echo $LINE2 | awk '{print $1}')
        NEW_NUM=$(echo $LINE2 | awk '{print $2}')
        NEW_SER=$(echo $LINE2 | awk '{print $3}')
        NEW_WWN=$(echo $LINE2 | awk '{print $4}')
        if [[ $(grep -i "$NEW_PRE" $NAMING_CONF_FILE | grep -i -c "$NEW_NUM") -gt 1 ]]; then
                echo "Redundans eszkoz specifikacio (Prefix: $NEW_PRE, Nr.: $NEW_NUM)!" >> $TMP_FILE
        fi
        if [[ $(grep -i "$NEW_SER" $NAMING_CONF_FILE | grep -i -c "$NEW_WWN") -gt 1 ]]; then
                echo "Redundans eszkoz specifikacio (SN: $NEW_SER, WWN: $NEW_WWN)!" >> $TMP_FILE
        fi
        if [[ $((4 + ${#NEW_PRE} + ${#NEW_NUM})) -gt 15 && "$NEW_NUM" != "LIB" ]]; then
                echo "Tul hosszu eszkoznev definicio ([rmt/smc]_${NEW_PRE}${NEW_NUM})!" >> $TMP_FILE
        fi
done <<< "`egrep -v '(^#|^$)' $NAMING_CONF_FILE`"
awk '/^[^#$]/{$3=toupper($3);$4=toupper($4)}1' $NAMING_CONF_FILE > $NAMING_CONF_FILE.tmp
mv $NAMING_CONF_FILE.tmp $NAMING_CONF_FILE
echo " kesz."
sort $TMP_FILE | uniq
 
if [[ -e $TMP_FILE && ! "$1" = "-f" ]]; then
        echo "Ha ennek ellenere futtatni szeretned ezzel a konfiggal a szkriptet, hasznald a -f kapcsolot."
        exit 1
fi
 
echo
echo "# Az alabbi PREFIX-eken fogok vegigmenni: $(egrep -v '(^$|^#)' $NAMING_CONF_FILE | awk '{print $1}' | sort | uniq | tr '\n' ';' | sed 's/;/; /g')"
printf "Ha valamelyiket most biztosan nem szeretned vizsgalni, azt ird ide, vagy sorold fel '|' karakterrel elvalasztva: "
read EXCLUDE
 
echo
echo "# Legyujtom az rmt es smc eszkozoket a $TAPE_DEV_FILE fajlba..."
if [[ $(lsdev -Cc tape | wc -l) -eq 0 ]]; then
        echo "Nem egyetlen rmt/smc eszkoz sem. Futtassak egy cfgmgr-t? [i/n]"
        read CFGMGR
        if [[ $CFGMGR='i' || $CFGMGR='I' ]]; then
                cfgmgr
                echo "Kesz."
        fi
fi
DEV_LIST_CHANGED=0
for i in `lsdev -Cc tape | awk '{print $1}'`; do
    if [[ $(grep -c $i $TAPE_DEV_FILE) -eq 0 ]]; then
        DEV_LIST_CHANGED=1
        rm -f $TAPE_DEV_FILE
        break
    fi
done
if [[ ! -e $TAPE_DEV_FILE || $DEV_LIST_CHANGED -eq 1 ]]; then
    m=$(lsdev -Cc tape | wc -l)
    j=0
    for i in `lsdev -Cc tape | awk '{print $1}'`; do
        j=$((j+1))
        printf "$i $(lsattr -El $i | grep ww_name | awk '{print toupper($2)}' | sed 's/^0[Xx]//') " >> $TAPE_DEV_FILE
        lscfg -vl $i | grep Serial | awk '{print toupper(substr($2,22,12))}' >> $TAPE_DEV_FILE
        printf "\r"$(echo "scale=2;$j/$m*100" | bc | sed 's/\..*$//')"\x25"
    done
    echo " kesz."
else
        echo "A $TAPE_DEV_FILE mar letezik, nem kerdezem le ujra. Ha megis ezt szeretned, torold kezzel, es futtass ujra!"
fi
 
# rmt device-ok atnevezese
echo
echo "# Atnevezem azon rmt eszkozoket, amik szerepelnek a konfig fajlban..."
egrep -v "(^#|^$|${EXCLUDE=^#})" $NAMING_CONF_FILE | while read LINE2; do
        NEW_PRE=$(echo $LINE2 | awk '{print $1}')
        NEW_NUM=$(echo $LINE2 | awk '{print $2}')
        NEW_SER=$(echo $LINE2 | awk '{print $3}')
        NEW_WWN=$(echo $LINE2 | awk '{print $4}')
        cat $TAPE_DEV_FILE | grep rmt | while read LINE; do
                ACT_DEV=$(echo $LINE | awk '{print $1}')
                ACT_WWN=$(echo $LINE | awk '{print $2}')
                ACT_SER=$(echo $LINE | awk '{print $3}')
                NEW_NAME="rmt_${NEW_PRE}${NEW_NUM}"
                if [ "$ACT_WWN" = "$NEW_WWN" ] && [ "$ACT_SER" = "$NEW_SER" ]; then
                        echo "rendev -l $ACT_DEV -n ${NEW_NAME}"
                        echo "update path <SRC_NAME> ${NEW_PRE}${NEW_NUM} srct=serv destt=dr libr=<LIBR_NAME> device=/dev/${NEW_NAME}" >> $MACRO_TEMPL_FILE
                fi
        done
done
 
# smc device-ok atnevezese
echo
echo "# Atnevezem azon smc eszkozoket, amik szerepelnek a konfig fajlban..."
egrep -v "(^#|^$|${EXCLUDE=^#})" $NAMING_CONF_FILE | while read LINE2; do
        NEW_PRE=$(echo $LINE2 | awk '{print $1}')
        NEW_NUM=$(echo $LINE2 | awk '{print $2}')
        NEW_SER=$(echo $LINE2 | awk '{print $3}')
        NEW_WWN=$(echo $LINE2 | awk '{print $4}')
        cat $TAPE_DEV_FILE | grep smc | while read LINE; do
                ACT_DEV=$(echo $LINE | awk '{print $1}')
                ACT_WWN=$(echo $LINE | awk '{print $2}')
                ACT_SER=$(echo $LINE | awk '{print $3}')
                NEW_NAME="smc_${NEW_PRE}"
                if [ "$ACT_WWN" = "$NEW_WWN" ] && [ "$ACT_SER" = "$NEW_SER" ]; then
                        echo "rendev -l $ACT_DEV -n ${NEW_NAME}"
                        echo "update path <SRC_NAME> <LIBR_NAME> srct=serv destt=libr device=/dev/${NEW_NAME}" >> $MACRO_TEMPL_FILE
                fi
        done
done