Shell Programming Examples: Difference between revisions

From RoggeWiki
Jump to navigation Jump to search
No edit summary
 
(8 intermediate revisions by the same user not shown)
Line 14: Line 14:


===sshhost===
===sshhost===
  #!/bin/bash
  #!/bin/bash
  #
  #
Line 33: Line 34:
   
   
===copypublic.sh===
===copypublic.sh===
  #!/usr/bin/ksh
  #!/usr/bin/ksh
  #
  #
Line 45: Line 47:


===postman===
===postman===
How to proces a mail
How to proces a mail


Line 61: Line 64:


===mksysb===
===mksysb===
Create a mksysb and remove older versions. The script runs on the NIM master and an NIM machine resource for the host to be backed up is needed.
The mksysb is pulled from the NIM client.


  #/usr/bin/ksh
  #/usr/bin/ksh
  #
  #
  # Make mksysb
  #       Make mksysb
  #
  #
  # Arguments Hostname and Suffix
  #       Arguments Hostname and Suffix
# Pick YYMMDD as suffix.
  #
  #
  # Run the mksysb and cleanup older versions
  #       Run the mksysb
#              - Make the mksysb
#              - Check for success
#                      - Ok
#                      - Incomplete
#                      - Failed
#      Cleanup older mksysb files
  #
  #
  P=/backups/mksysb/
  P=/backups/mksysb/
Line 77: Line 83:
  if [ $? = 0 ]
  if [ $? = 0 ]
  then
  then
        echo NIM backup for ${1} completed successfully
        echo "NIM backup for ${1} completed successfully"
        gzip $P${1}-${2}.mksysb &
        gzip $P${1}-${2}.mksysb &
  else
  else
        echo NIM backup for ${1} failed, rc=$?
        grep "0512-003 savevg may not have been able to archive some files" $P${1}-${2}.log >/dev/null 2>&1
        if [ $? = 0 ]
        then
                echo "NIM backup for ${i} completed, but not all files are archived (0512-003)"
        else
                echo "NIM backup for ${1} failed, rc=$?"
                echo "=== Error log begin ==="
                cat $P${1}-${2}.err
                echo "=== Error log end  ==="
        fi
  fi
  fi
  #
  #
Line 92: Line 107:
  do
  do
  #      nim -o remove -a rm_image=yes ${i}      # Image renamed by gzip to .gz
  #      nim -o remove -a rm_image=yes ${i}      # Image renamed by gzip to .gz
        nim -o remove ${i}
        nim -o remove ${i}
        if [ $? = 0 ]
        if [ $? = 0 ]
        then
        then
                echo NIM resource ${i} deleted
                echo NIM resource ${i} deleted
                echo Available files:
                echo Available files:
                ls -l $P${1}*
                ls -l $P${1}*
                echo Removing files:
                echo Removing files:
                ls -l $P${i}*
                ls -l $P${i}*
                echo rm    $P${i}*
                echo rm    $P${i}*
        else
        else
                echo "Error during remove NIM resource ${i}, rc=$?"
                echo "Error during remove NIM resource ${i}, rc=$?"
        fi
        fi
done
 
===mksysb.all===
 
#/usr/bin/ksh
#
#      Maak van alle LPARs een mksysb
#      Ruim alle oude files op
#      Maak een backup van de VIO servers
#      Roep chksystems script aan
#      Collect mci van alle LPARs
#      Collect vgdata van alle LPARs
#
Date=$(date "+%Y%m%d")
Logfile=/backups/mksysb/mksysb.log
for  Host in $(cat /root/bin/lpars.list)
do
        echo $(date "+%Y-%m-%d %H:%M:%S") mksysb for $Host $Date started >>$Logfile
        /root/bin/mksysb.sh $Host $Date                                  >>$Logfile
        echo $(ls -l /backups/mksysb/${Host}-mksysb-${Date}*)            >>$Logfile
        echo $(date "+%Y-%m-%d %H:%M:%S") mksysb for $Host $Date ended  >>$Logfile
done
 
# Cleanup old .log and .err files
find /backups/mksysb/ -name "*.log" -mtime +90 -exec rm {} \;
find /backups/mksysb/ -name "*.err" -mtime +90 -exec rm {} \;
 
# Create backupios files
# Run backupios in vio and write mksysb to nim server via NFS mount
 
Date=$(date "+%Y%m%d")
Logfile=/backups/backupios/backupios.log
echo $(date "+%Y-%m-%d %H:%M:%S") backupios start for the following VIOs    >>$Logfile 2>&1
cat /root/bin/vios.list                                                    >>$Logfile 2>&1
for Vios in $(cat /root/bin/vios.list)
do
        echo '============================================================' >>$Logfile 2>&1
        echo $(date "+%Y-%m-%d %H:%M:%S") backupios for $Vios $Date started >>$Logfile 2>&1
        ssh $Vios mount nl01nm001:/backups/backupios /mnt                  >>$Logfile 2>&1
        ssh $Vios /usr/ios/cli/ioscli backupios -file      \
            /mnt/$Vios-backupios-${Date} -nosvg -nomedialib -mksysb        >>/backups/backupios/$Vios-backupios-${Date}.log 2>&1
        ssh $Vios unmount /mnt                                              >>$Logfile 2>&1
        echo $(date "+%Y-%m-%d %H:%M:%S") backupios for $Vios $Date ended  >>$Logfile 2>&1
done
 
# Bewaar alleen de laatste drie versies van backupios files,
# gooi de rest weg
Version=3
let Arg=$Version+1
echo  $(date "+%Y-%m-%d %H:%M:%S") Delete old vio backups started          >>$Logfile 2>&1
for i in $(ls /backups/backupios|grep -v log|cut -f 1 -d '-'|sort|uniq)
do
    for v in $(ls -t /backups/backupios/${i}*|grep -v log|tail -n +$Arg)
    do
        ls -l ${v}*                                                        >>$Logfile 2>&1
        rm    ${v}*                                                        >>$Logfile 2>&1
    done
done
echo  $(date "+%Y-%m-%d %H:%M:%S") Delete old vio backups ended            >>$Logfile 2>&1
 
# Check systems and send mail
/root/bin/chksystems.sh $Date
 
# Collect machine configuration items for future reference
for Host in $(cat /root/bin/lpars.list)
do
        ssh $Host /root/bin/mci.sh >/var/log/mci/${Host}.mci.log.${Date}
done
 
# Cleanup mci files older than 3 years
find /var/log/mci/ -mtime +1095 -exec rm {} \;
 
#
#      Collect vgdata for all LPARs
#
for Host in $(cat /root/bin/lpars.list)
do
        /root/bin/mkbkpvgdata.sh $Host
  done
  done
# Cleanup vgdata files older than 3 months
find /var/log/vgdata/ -mtime +91 -exec rm {} \;
===mci.sh===


#!/bin/ksh
# Make Config Inventory
#cmd ifconfig -a
#cmd no -a
#cmd netstat -rn
#cmd netstat -an
#cmd netstat -an|wc -l
#cmd netstat -an|grep LIST
#cmd netstat -an|grep LIST|wc -l
#cmd cat /etc/resolv.conf
#cmd cat /etc/hosts
#cmd cat /etc/netsvc.conf
#cmd lsattr -Elinet0
#cmd lsattr -Elsys0
#cmd lsattr -Elpty0
#cmd lspv
#cmd lsvg
#cmd lsvg|lsvg -i
#cmd lsvg|lsvg -il
#cmd df -k
#cmd lsfs -q
#cmd lsdev -Ccdisk
#cmd lsdev -Ccadapter
#cmd smtctl
#cmd ps -ef
#cmd ps -ef|wc -l
#cmd ps -ef|grep ora
#cmd ps -ef|grep ora|wc -l
#cmd ps -ef|grep pmon
#cmd ps -ef|grep pmon|wc -l
#cmd cat /etc/exclude.rootvg
#cmd lscfg -vp
#cmd prtconf
#cmd last -300
printline()
{
    let i=1
    while [ i -lt 80 ]
    do
        printf "*"
        let i=$i+1
    done
    printf "\n"
}
printline
grep "^#cmd" $0
grep "^#cmd" $0 |
while read f c
do
    printline
    echo Command $c $(date)
    printline
    eval $c
done
===lff.sh===
#!/bin/ksh
#
#      Looking for files
#
#      - Exit if an instance of this script is already running.
#      - Find sapevt user in /etc/lff.conf
#      - Directories to check and SAP events are defined in /etc/lff.conf
Message ()
{
        echo $(date +"%Y%m%d-%H%M%S") $1
}
#
#      Check if this instance is already running
#
Scriptname=$(basename $0)
Message "This $Scriptname script is running with PID $$"
sleep 3
ps -ef|grep $Scriptname |grep -v $$ >/tmp/${Scriptname}.ps.out
Message "$Scriptname processes found:"
Message "$(cat /tmp/${Scriptname}.ps.out)"
grep $Scriptname /tmp/${Scriptname}.ps.out
RC=$?
rm /tmp/${Scriptname}.ps.out
if [ $RC = 0 ]
then
        Message "An instance of this script is already running"
        exit 1
else
        Message "No lff.sh instance found, continue"
fi
#
#      Find sapevt user in lff.conf
#
HostName=$(uname -n)
SAPuser=$(awk '/'$HostName'/{print $3}' /etc/lff.conf)
SAPenv=$(echo $SAPuser|cut -b1-3|tr  'a-z'  'A-Z')
SAPinstance=$(basename $(ls /usr/sap/${SAPenv}/SYS/profile/${SAPenv}_DVEBMGS??_${HostName})|cut -b12-13)
Message "SAP user is $SAPuser, environment is $SAPenv and instance is $SAPinstance"
typeset -i Loopcount=0
Loopcount=$(wc -l /var/log/lff/lff.log|awk '{print $1}')
Message "Logfile found with $Loopcount messages"
#
#      Looking for files in directories perpetually
#      and move found files away to temp directory and call sapevt
while true              # Do forever
do
        for Dir in $(egrep -v "^#|filelist" /etc/lff.conf|awk '{print $1}')
        do
                ADir=$(echo $Dir|sed -e 's~/~\\/~'g)
                Sapevt=$(awk '/'$ADir'/ {print $2}' /etc/lff.conf)
                for File in $(ls ${Dir}/*DAT 2>/dev/null)
                do
                        mv $File $Dir/temp/$(basename $File)
                        if [ $? = 0 ]
                        then
                                Message "File $File moved successful, calling sapevt $Sapevt"
                                su - $SAPuser -c  sapevt "$Sapevt" -p "$(/usr/bin/basename $File)" \
                                pf=/usr/sap/${SAPenv}/SYS/profile /${SAPenv}_DVEBMGS${SAPinstance}_${HostName} &
                        else
                                Message "Move $File failed with rc=$?"
                        fi
                        (( Loopcount+=1 ))
                done
        done
        if [ $Loopcount -ge 100000 ]
        then
                Loopcount=0
                cp /var/log/lff/lff.log /var/log/lff/lff.log.old
                echo Logfile copied to lff.log.old at $(date) with rc=$? >/var/log/lff/lff.log
        else
                sleep 1
        fi
done


[[Category:Unix]]
[[Category:Unix]]

Latest revision as of 08:23, 16 April 2019

Ping all hosts in a subnet

subnet=”141.93.169
i=1
while [ $i -lt 255 ]       
do
   ping ${subnet}.${i} 2 1>/dev/null 2>&1
   if   [ $? -ne 0 ] ; then
        echo "${subnet}.${i},down"
   else echo "${subnet}.${i},up"
   fi
   i=$(expr $i + 1 )
done

sshhost

#!/bin/bash
#
# ssh-keygen -t dsa -b 8192
#
Host=`echo $0|cut -d / -f5`
echo "Logon  " `date "+%m/%d/%y %H:%M:%S"` $Host >> $HOME/logs/sshhost.log
# Use escape sequence to modify SecureCrt window title: ESC]; text CTRL-G
printf "\033];$Host\007"
Hmcs="hmc100.hmc200"
Vios="uio200.uio299.uio300.uio399"
User=""
[ ! -z $(echo "$Hmcs" | grep "$Host") ] && User="hscroot@"
[ ! -z $(echo "$Vios" | grep "$Host") ] && User="padmin@"
[ ! -z $(echo "$Host" | grep "vio")   ] && User="padmin@"
ssh $User$Host
printf "\033];`uname -n`\007"
echo "Logof  " `date "+%m/%d/%y %H:%M:%S"` $Host >> $HOME/logs/sshhost.log

copypublic.sh

#!/usr/bin/ksh
#
# Copy public key to another system. Target system is $1.
scp -pr $HOME/.ssh/id_dsa.pub $1:/tmp/
ssh $1 <<EOF
mkdir -m 700 .ssh
cat /tmp/id_dsa.pub >>.ssh/authorized_keys
chmod 600 .ssh/authorized_keys
rm /tmp/id_dsa.pub
EOF

postman

How to proces a mail

$ cat .forward
|/home/roggt/receivemail

$ cat receivemail
#!/usr/bin/ksh
echo $(date) >> aaplog
echo "0" $0  >> aaplog
echo "1" $1  >> aaplog
echo $(env)  >> aaplog
echo Extension $EXTENSION >>aaplog
cat     > aapbody
$

mksysb

#/usr/bin/ksh
#
#       Make mksysb
#
#       Arguments Hostname and Suffix
#
#       Run the mksysb
#               - Make the mksysb
#               - Check for success
#                       - Ok
#                       - Incomplete
#                       - Failed
#       Cleanup older mksysb files
#
P=/backups/mksysb/
nim -o define -t mksysb -a server=master -a source=${1} -a mk_image=yes -a mksysb_flags=ev -a location=$P${1}-${2}.mksysb ${1}-${2} >$P${1}-${2}.log 2>$P${1}-${2}.err
if [ $? = 0 ]
then
       echo "NIM backup for ${1} completed successfully"
       gzip $P${1}-${2}.mksysb &
else
       grep "0512-003 savevg may not have been able to archive some files" $P${1}-${2}.log >/dev/null 2>&1
       if [ $? = 0 ]
       then
               echo "NIM backup for ${i} completed, but not all files are archived (0512-003)"
       else
               echo "NIM backup for ${1} failed, rc=$?"
               echo "=== Error log begin ==="
               cat $P${1}-${2}.err
               echo "=== Error log end   ==="
       fi
fi
#
#       Remove older versions
#       Remove NIM resources and corresponding files
Versions=3      # Number of versions to keep on disk
let Arg=$Versions+1
echo Available NIM resources:
lsnim -t mksysb|grep ${1}|sort
for i in $(lsnim -t mksysb|grep ${1}|sort -r|tail -n +$Arg|awk '{print $1}')
do
#       nim -o remove -a rm_image=yes ${i}      # Image renamed by gzip to .gz
       nim -o remove ${i}
       if [ $? = 0 ]
       then
               echo NIM resource ${i} deleted
               echo Available files:
               ls -l $P${1}*
               echo Removing files:
               ls -l $P${i}*
               echo rm    $P${i}*
       else
               echo "Error during remove NIM resource ${i}, rc=$?"
       fi
done

mksysb.all

#/usr/bin/ksh
#
#       Maak van alle LPARs een mksysb
#       Ruim alle oude files op
#       Maak een backup van de VIO servers
#       Roep chksystems script aan
#       Collect mci van alle LPARs
#       Collect vgdata van alle LPARs
#
Date=$(date "+%Y%m%d")
Logfile=/backups/mksysb/mksysb.log
for  Host in $(cat /root/bin/lpars.list)
do
       echo $(date "+%Y-%m-%d %H:%M:%S") mksysb for $Host $Date started >>$Logfile
       /root/bin/mksysb.sh $Host $Date                                  >>$Logfile
       echo $(ls -l /backups/mksysb/${Host}-mksysb-${Date}*)            >>$Logfile
       echo $(date "+%Y-%m-%d %H:%M:%S") mksysb for $Host $Date ended   >>$Logfile
done
# Cleanup old .log and .err files
find /backups/mksysb/ -name "*.log" -mtime +90 -exec rm {} \;
find /backups/mksysb/ -name "*.err" -mtime +90 -exec rm {} \;
# Create backupios files
# Run backupios in vio and write mksysb to nim server via NFS mount 
Date=$(date "+%Y%m%d")
Logfile=/backups/backupios/backupios.log
echo $(date "+%Y-%m-%d %H:%M:%S") backupios start for the following VIOs    >>$Logfile 2>&1
cat /root/bin/vios.list                                                     >>$Logfile 2>&1
for Vios in $(cat /root/bin/vios.list)
do
       echo '============================================================' >>$Logfile 2>&1
       echo $(date "+%Y-%m-%d %H:%M:%S") backupios for $Vios $Date started >>$Logfile 2>&1
       ssh $Vios mount nl01nm001:/backups/backupios /mnt                   >>$Logfile 2>&1
       ssh $Vios /usr/ios/cli/ioscli backupios -file       \
           /mnt/$Vios-backupios-${Date} -nosvg -nomedialib -mksysb         >>/backups/backupios/$Vios-backupios-${Date}.log 2>&1
       ssh $Vios unmount /mnt                                              >>$Logfile 2>&1
       echo $(date "+%Y-%m-%d %H:%M:%S") backupios for $Vios $Date ended   >>$Logfile 2>&1
done
# Bewaar alleen de laatste drie versies van backupios files,
# gooi de rest weg
Version=3
let Arg=$Version+1
echo  $(date "+%Y-%m-%d %H:%M:%S") Delete old vio backups started           >>$Logfile 2>&1
for i in $(ls /backups/backupios|grep -v log|cut -f 1 -d '-'|sort|uniq)
do
   for v in $(ls -t /backups/backupios/${i}*|grep -v log|tail -n +$Arg)
   do
       ls -l ${v}*                                                         >>$Logfile 2>&1
       rm    ${v}*                                                         >>$Logfile 2>&1
   done
done
echo  $(date "+%Y-%m-%d %H:%M:%S") Delete old vio backups ended             >>$Logfile 2>&1
# Check systems and send mail
/root/bin/chksystems.sh $Date
# Collect machine configuration items for future reference
for Host in $(cat /root/bin/lpars.list)
do
       ssh $Host /root/bin/mci.sh >/var/log/mci/${Host}.mci.log.${Date}
done
# Cleanup mci files older than 3 years
find /var/log/mci/ -mtime +1095 -exec rm {} \;
#
#       Collect vgdata for all LPARs
#
for Host in $(cat /root/bin/lpars.list)
do
       /root/bin/mkbkpvgdata.sh $Host
done
# Cleanup vgdata files older than 3 months
find /var/log/vgdata/ -mtime +91 -exec rm {} \;

mci.sh

#!/bin/ksh
# Make Config Inventory
#cmd ifconfig -a
#cmd no -a
#cmd netstat -rn
#cmd netstat -an
#cmd netstat -an|wc -l
#cmd netstat -an|grep LIST
#cmd netstat -an|grep LIST|wc -l
#cmd cat /etc/resolv.conf
#cmd cat /etc/hosts
#cmd cat /etc/netsvc.conf
#cmd lsattr -Elinet0
#cmd lsattr -Elsys0
#cmd lsattr -Elpty0
#cmd lspv
#cmd lsvg
#cmd lsvg|lsvg -i
#cmd lsvg|lsvg -il
#cmd df -k
#cmd lsfs -q
#cmd lsdev -Ccdisk
#cmd lsdev -Ccadapter
#cmd smtctl
#cmd ps -ef
#cmd ps -ef|wc -l
#cmd ps -ef|grep ora
#cmd ps -ef|grep ora|wc -l
#cmd ps -ef|grep pmon
#cmd ps -ef|grep pmon|wc -l
#cmd cat /etc/exclude.rootvg
#cmd lscfg -vp
#cmd prtconf
#cmd last -300
printline()
{
   let i=1
   while [ i -lt 80 ]
   do
       printf "*"
       let i=$i+1
   done
   printf "\n"
}
printline
grep "^#cmd" $0
grep "^#cmd" $0 |
while read f c
do
   printline
   echo Command $c $(date)
   printline
   eval $c
done

lff.sh

#!/bin/ksh
#
#       Looking for files
#
#       - Exit if an instance of this script is already running.
#       - Find sapevt user in /etc/lff.conf
#       - Directories to check and SAP events are defined in /etc/lff.conf

Message ()
{
       echo $(date +"%Y%m%d-%H%M%S") $1
}

#
#       Check if this instance is already running
#
Scriptname=$(basename $0)
Message "This $Scriptname script is running with PID $$"
sleep 3
ps -ef|grep $Scriptname |grep -v $$ >/tmp/${Scriptname}.ps.out
Message "$Scriptname processes found:"
Message "$(cat /tmp/${Scriptname}.ps.out)"

grep $Scriptname /tmp/${Scriptname}.ps.out
RC=$?
rm /tmp/${Scriptname}.ps.out
if [ $RC = 0 ]
then
       Message "An instance of this script is already running"
       exit 1
else
       Message "No lff.sh instance found, continue"
fi

#
#       Find sapevt user in lff.conf
#
HostName=$(uname -n)
SAPuser=$(awk '/'$HostName'/{print $3}' /etc/lff.conf)
SAPenv=$(echo $SAPuser|cut -b1-3|tr  'a-z'  'A-Z')
SAPinstance=$(basename $(ls /usr/sap/${SAPenv}/SYS/profile/${SAPenv}_DVEBMGS??_${HostName})|cut -b12-13)
Message "SAP user is $SAPuser, environment is $SAPenv and instance is $SAPinstance"

typeset -i Loopcount=0
Loopcount=$(wc -l /var/log/lff/lff.log|awk '{print $1}')
Message "Logfile found with $Loopcount messages"

#
#       Looking for files in directories perpetually
#       and move found files away to temp directory and call sapevt

while true              # Do forever
do
       for Dir in $(egrep -v "^#|filelist" /etc/lff.conf|awk '{print $1}')
       do
               ADir=$(echo $Dir|sed -e 's~/~\\/~'g)
               Sapevt=$(awk '/'$ADir'/ {print $2}' /etc/lff.conf)
               for File in $(ls ${Dir}/*DAT 2>/dev/null)
               do
                       mv $File $Dir/temp/$(basename $File)
                       if [ $? = 0 ]
                       then
                               Message "File $File moved successful, calling sapevt $Sapevt"
                               su - $SAPuser -c  sapevt "$Sapevt" -p "$(/usr/bin/basename $File)" \
                               pf=/usr/sap/${SAPenv}/SYS/profile /${SAPenv}_DVEBMGS${SAPinstance}_${HostName} &
                       else
                               Message "Move $File failed with rc=$?"
                       fi
                       (( Loopcount+=1 ))
               done
       done
       if [ $Loopcount -ge 100000 ]
       then
               Loopcount=0
               cp /var/log/lff/lff.log /var/log/lff/lff.log.old
               echo Logfile copied to lff.log.old at $(date) with rc=$? >/var/log/lff/lff.log
       else
               sleep 1
       fi
done