meta data for this page
  •  

TSM kliens riport shell szkript

TSM kliens ütemezések sikerességét riportoló szkript. A riport szabályokat a „tsm_kliens_riport.<TSM sztanza>” fájlokból veszi, aminek a formátuma:

email cím; (sql WHERE feltétel) order by <rendező mező> Pl:

fonok@cegem.hu; (node_name='FONOK_SZERVERE' or schedule_name like 'NAPI_INCR_%') ORDER BY schedule_name

Ha egy email címhez több sor is van, azokat külön szekcióba teszi a riportban. A szabály fájlokat külön dolgozza fel, tehát ha nekem 2 sztanzához tartozó szabály fájlban is van sor az email címemmel, akkor TSM szerverenként külön emailben kapom a riportokat majd. A TSM_SZERVEREK változóban fel kell sorolni a TSM sztanzákat, amiket akarunk, hogy vizsgáljon. Az ebben beállított sztanzák szabályfájljait fogja keresni a „tsm_kliens_riport.<TSM sztanza>” néven.

tsm_kliens_report.sh
#!/bin/sh
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
################################################################
#                                                              #
#  TSM kliens riport - tsm_kliens_riport.sh v1.0 (2015.03.20.) #
#  Keszitette: Agoston Peter (agoston.peter@gmail.com)         #
#                                                              #
################################################################
        SCRIPT_VER="v1.0 (2015.03.20.)"
# TSM admin
        TSM_FELH="readonlytsmadmin"
        TSM_JELSZO="password"
# Riportolando TSM szerver sztanzak
        TSM_SZERVEREK="tsmserver1 tsmserver2"
# HTML formatumu legy-e a level (0/1)
        HTML_EMAIL=1
# Csatolmanykent el legyen-e kuldve a HTML riport, ha egyebkent szoveges levelkent megy a riport (0/1)
        HTML_EMAIL_CSAT=1
# Munkafajl a futas idejere
        TMP_FILE='/tmp/tsm_kliens_riport.tmp'
        TMP_HTML_FILE='/tmp/tsm_kliens_riport.tmp.html'
# Mappa, ahova a futasi eredmenyeket elmenti
        LOG_DIR='/opt/tsm_kliens_riport/riportok'
# Konfig resz vege #########################################################################################################################
# Hasznalt SQL selectek TSM-hez
SQL_Q_FAILED_EVENTS="select substr(node_name,1,20) as \"NODE NAME\", substr(schedule_name,1,23) as \"SCHEDULE NAME\", cast ( SUBSTR ( CHAR ( actual_start ) , 1 , 19 ) as char ( 19 ) ) AS \"ACTUAL START\", case when status='Missed' then '' else substr((completed-scheduled_start)minutes || ' min',1,7) end as \"RUNTIME\", case when result=0 then '  0-Successful' when result=4 then '  4-Skipped Files' when result=8 then '  8-Warnings' when result=12 then ' 12-Failed' when result is NULL then '   -' || substr(status,1,12) else ( case when length(cast(result as char))=1 then '  ' || cast(result as char) || '-' || substr(status,1,12) when length(cast(result as char))=2 then ' ' || cast(result as char) || '-' || substr(status,1,12) else cast(result as char) || '-' || substr(status,1,11) end ) end as \"RESULT\" from events where (current_timestamp - 24 hours)<scheduled_start and scheduled_start<current_timestamp and node_name is not NULL and status not in ('Pending') "
# HTML kodok
HTML_VONAL="<hr align=center noshade style=\"color: #D2D2D2; width: 100%;\" size=\"1\">"
HTML_MODUL_LABLEC="</pre></div>"
HTML_TABLA_FEJLEC="<table style=\"width: 960px; border: 2px solid #D2D2D2;background-color:#F1F1F1; padding: 15px; font-size: 14px; font-family: courier;\"><tr><td style=\"display: inline; text-align: center\">"
HTML_TABLA_LABLEC="</td></tr></table>"
# Fuggvenyek, egyeb valtozok
SSH_OPT="-o BatchMode=yes -o ConnectTimeout=5 -i $SSH_KEY_FILE"
 
read -r -d '' JS_CODE << EOF
<head>
<script language="JavaScript" type="text/javascript">
<!-- Copyright 2005, Sandeep Gangadharan -->
<!-- For more free scripts go to http://www.sivamdesign.com/scripts/ -->
<!--
if (document.getElementById) {
document.writeln('<style type="text/css"><!--')
document.writeln('.texter {display:block} @media print {.texter {display:block;}}')
document.writeln('//--></style>') }
 
function openClose(theID) {
if (document.getElementById(theID).style.display == "block") { document.getElementById(theID).style.display = "none" }
else { document.getElementById(theID).style.display = "block" } }
 
function Collapse(ez) {
if (ez.style.color == "gray") { ez.style.color = "#006DC7"; ez.innerHTML=ez.innerHTML.replace("[+]","[-]"); ez.innerHTML=ez.innerHTML.replace("gray","#006DC7")}
else { ez.style.color = "gray"; ez.innerHTML=ez.innerHTML.replace("[-]","[+]"); ez.innerHTML=ez.innerHTML.replace("#006DC7","gray") } }
// -->
</script>
</head>
EOF
 
function szerverver {
        I=0
        for TSM_SZERVER in $TSM_SZERVEREK; do
                I=$((I+1))
                if [ $1 = $TSM_SZERVER ]; then echo $TSM_SZERVER_VER | cut -d" " -f $I; fi
        done
}
 
function level_fejlec {
    STARTTIME=`date "+%s"`
    >$TMP_FILE
    >$TMP_HTML_FILE
    echo "$HTML_TABLA_FEJLEC" >> $TMP_HTML_FILE
    echo '<div style="font-size: 48px; font-weight: bold;">' >> $TMP_HTML_FILE
    echo "TSM kliens riport" | tee -a $TMP_HTML_FILE >> $TMP_FILE
    echo '</div>' >> $TMP_HTML_FILE
    date | tee -a $TMP_HTML_FILE >> $TMP_FILE
    echo "<br>" >> $TMP_HTML_FILE
}
 
function fejlec {
        FEJLEC=`echo $1 | tr '[:lower:]' '[:upper:]'`
        echo "___:: $FEJLEC ::___" >> $TMP_FILE
        RAND_ID=`date '+%s%N'`
        echo "<div onClick=\"openClose('${RAND_ID}');Collapse(this)\" style=\"cursor:hand; cursor:pointer; color: #006DC7;\">___:: [-] $FEJLEC ::___</div>\n<div id=\"${RAND_ID}\" class=\"texter\" style=\"display: block\"><pre style=\"width: 960px; display: inline; margin: 0px 20px 0px 20px; text-align: left\">$HTML_VONAL" >> $TMP_HTML_FILE
}
 
control_c()
# run if user hits control-c
{
        echo -en "\n*** Ouch! Ertem a celzast, maris takaritok... ***\n"
        rm $TMP_FILE 2>/dev/null
        rm $TMP_HTML_FILE 2>/dev/null
        exit 1
}
 
# trap keyboard interrupt (control-c)
trap control_c SIGINT
 
# Hasznlat sztanzak ellenorzese
fejlec "Vizsgalando TSM sztanza konfigok mukodesenek ellenorzese"
for TSM_SZERVER in $TSM_SZERVEREK; do
        VER=$((`dsmadmc -id=$TSM_FELH -pa=$TSM_JELSZO -se=$TSM_SZERVER q opt | sed -n -e 's/Server Version \([0-9]\),.*/\1/p' -e 's/\t\s//g'`))
        if [[ "$VER" != "0" && -f $(dirname $0)/tsm_kliens_riport.$TSM_SZERVER ]]; then
                OK="OK! (v${VER})"
                TSM_SZERVEREK_TMP="$TSM_SZERVEREK_TMP $TSM_SZERVER"
                TSM_SZERVER_VER="$TSM_SZERVER_VER $VER"
        else
                OK="Sikertelen! A szerver kihagyasra kerul a riportbol."
        fi
        echo "${TSM_SZERVER}: $OK" | awk -F'|' '{printf "> @%-35s %-12s\n",$1,$2}' | tee -a $TMP_HTML_FILE | tee -a $TMP_FILE
done
TSM_SZERVEREK=$TSM_SZERVEREK_TMP
 
# Program torzs
if [ `echo $TSM_SZERVEREK | grep -c '[a-zA-Z]'` -eq 0 ]; then
        echo "$(date) Nincs hasznalhato sztanza a konfigomban." >> "$(dirname $0)/tsm_kliens_riport.err"
    rm $TMP_FILE 2>/dev/null
    rm $TMP_HTML_FILE 2>/dev/null
    exit 1
fi
 
# Vegigmegyunk az osszes konfig fajlon, ami a TSM_SZERVEREK valtozoban fel van sorolva
for TSM_SZERVER in $TSM_SZERVEREK; do
    KONFIG_FILE="$(dirname $0)/tsm_kliens_riport.$TSM_SZERVER"
    # Minden riport cimzettet felolvasunk az aktualis konfig fajlbol
    awk -F';' '/^[^#]/{print $1}' $KONFIG_FILE | sort -u | while read MAILTO; do
        level_fejlec;
        fejlec "${TSM_SZERVER}"
        echo "NODE NAME                 SCHEDULE NAME                 ACTUAL START             RUNTIME     RESULT" | tee -a $TMP_HTML_FILE >> $TMP_FILE
        echo "---------------------     -------------------------     --------------------     --------    -----------------"| tee -a $TMP_HTML_FILE >> $TMP_FILE
        # Minden adott email cimhez tartozo SQL feltetelt feldolgozunk
        awk -F';' "/$MAILTO/"'{print $2}' $KONFIG_FILE | sort -u | while read SQL_FELTETEL; do
            FSIZE=$(ls -l $TMP_FILE | awk '{print $5}')
            if [[ "$SQL_FELTETEL" = "" ]]; then continue; fi
            dsmadmc -id=$TSM_FELH -pa=$TSM_JELSZO -se=${TSM_SZERVER} -dataonly=y -displ=tabl "$SQL_Q_FAILED_EVENTS AND $SQL_FELTETEL" | egrep -v '(ANS|ANR)' | tee -a $TMP_HTML_FILE >> $TMP_FILE
            FSIZE2=$(ls -l $TMP_FILE | awk '{print $5}')
            if [[ $FSIZE -ne $FSIZE2 ]]; then echo "$HTML_VONAL" >> $TMP_HTML_FILE; fi
        done
        ENDTIME=`date "+%s"`
        echo "$HTML_TABLA_LABLEC" >> $TMP_HTML_FILE
        echo "<p style=\"font-size:smaller;\">[A riport $((($ENDTIME-$STARTTIME)/60)) perc $((($ENDTIME-$STARTTIME)%60)) mp alatt keszult el - TSM riporter $SCRIPT_VER]" | tee -a $TMP_HTML_FILE >> $TMP_FILE
        # Riport kuldese
        DATUM=`date +"%F_%H-%M"`
        mkdir -p $LOG_DIR >/dev/null
        if [ $? -eq 0 ]; then
            cp $TMP_FILE $LOG_DIR/tsm_kliens_riport_${DATUM}_${MAILTO}.log
            echo "<br><br>[A riport szoveges valtozata az alabbi utvonalon helyben is le lett tarolva:<br> "`hostname`":$LOG_DIR/tsm_kliens_riport_${DATUM}_${MAILTO}.log]</p>" >> $TMP_HTML_FILE
            ERR=$?
        fi
        if [[ $ERR -ne 0 || ! $ERR ]]; then
            echo "HIBA: A riportot nem sikerult a $LOG_DIR mappaba menteni!" >>$TMP_HTML_FILE
        fi
        echo "$HTML_MODUL_LABLEC" >> $TMP_HTML_FILE
        # Levelkuldes
        sed -i -e 's/^|//' -e 's/|$//' $TMP_HTML_FILE
        sed -i 's/^.*4-Skipped Files.*$/<font color="#B0A100">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i 's/^.*8-Warnings.*$/<font color="#B0A100">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i 's/^.*12-Errors.*$/<font color="#D70109">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i 's/^.*-Failed.*$/<font color="#D70109">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i 's/^.*-Missed.*$/<font color="#D70109">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i 's/^.*-Started.*$/<font color="#FF6600">&<\/font>/' $TMP_HTML_FILE # TSM sztanza szinzes
        sed -i -e "s/___*[^_]*___*/<div style=\"text-align: center; font-family: Verdana; font-weight:bold; font-size: 12px; color: #006DC7; margin-top: 10px; padding: 0px;\">&<\/div>/" -e 's/___//g' $TMP_HTML_FILE # Szekcio fejlec szinezes
 
        echo -e "<html>${JS_CODE}<body><center><div style=\"font-size: 14px; font-family: courier;\">\n$(cat ${TMP_HTML_FILE})</div></td></tr></body></html>" > $TMP_HTML_FILE
        if [ `echo "$MAILTO" | grep "@.*\."` ]; then
        if [[ `which sendmail` && $HTML_EMAIL -eq 1 ]]; then
            echo -e "To: $MAILTO\nMIME-Version: 1.0\nContent-Type: text/html\nContent-Disposition: inline\nSubject: TSM kliens riport ($TSM_SZERVER)\n$(cat ${TMP_HTML_FILE})" > $TMP_HTML_FILE
            cat $TMP_HTML_FILE | sendmail -B 8BITMIME -t -F "TSM riporter"
        elif [[ ! $HTML_EMAIL -eq 1 && $HTML_EMAIL_CSAT -eq 1 ]]; then
            echo -e "To: $MAILTO\nSubject: TSM kliens riport ($TSM_SZERVER)\n$(cat $TMP_FILE)" > $TMP_FILE
            cp $TMP_HTML_FILE /tmp/tsm_kliens_riport_${DATUM}.html
            cat $TMP_FILE | mailx -a /tmp/tsm_kliens_riport_${DATUM}.html -t
        else
            echo -e "To: $MAILTO\nSubject: TSM kliens riport ($TSM_SZERVER)\n$(cat $TMP_FILE)" > $TMP_FILE
            cat $TMP_FILE | mailx -t
        fi
    fi
    done
done