In addition to backups, it is recommended to configure other tasks to ensure optimum performance of the Informix server.

1 Host time syncronization

Create a file named sys_timesync.sh in the /CONFIG/SCRIPTS directory:

Copy
cat > sys_timesync.sh

And paste the folllowing code:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# sys_timesync.sh: Sincroniza la hora con un servidor de tiempo NTP o rdate
#
# Linux RPM: intimed - Servidor rdate
#            rdate   - Cliente rdate
#            ntp     - Cliente NTP sincronizacion internacional
# Para activar intimed: chkconfig time on; service xinetd restart
# ------------------------------------------------
# Algunos servidores NTP:
# pool.ntp.org
#
# Comandos NTP
# ntpq  -c pee 129.127.28.4 # busca una lista de servidores
# ===========================================================================

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` ---timeserver <host> \| --ntpserver <host> \
                                [--mailto <"user1@domain.es,user2@domain.es,...">] \
                                [--mailerror <"user1@domain.es,user2@domain.es,...">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}


#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1
}
# ************************************************************************
#
# Main
#
# ************************************************************************

echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Sinchronize time with server"                  >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

# -------------------------------------------------------------------
# Parse and verify arguments
# -------------------------------------------------------------------
echo "Arguments:" >> $LOGSYS
echo $* >> $LOGSYS
echo >> $LOGSYS
echo >> $LOGSYS

if [ $# -eq 0 ]; then
     usage "missing arguments"
fi
while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--timeserver|--ntpserver)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;;
       --) break;;
       -*) usage "unknown argument: $1";;
        *) break;;
    esac
    shift
    shift
done

if [ -z $TIMESERVER ] && [ -z $NTPSERVER ]; then
   usage "missing argument --timeserver | --ntpserver"
fi



if [ -n "$TIMESERVER" ]; then
    echo "Using rdate $TIMESERVER"                            >>$LOGSYS

    if [ `uname -s` = "Linux" ]; then
        rdate -s $TIMESERVER >> $LOGSYS 2>&1
    fi
    if [ `uname -s` != "Linux" ]; then
        rdate    $TIMESERVER >> $LOGSYS 2>&1
    fi
    if [ $? -gt 0 ]; then
       STATUS=ERROR
       echo "`date` ***** ERROR sys_timesync en rdate $TIMESERVER" >>$LOGSYS
    fi
fi

if [ -n "$NTPSERVER" ]; then
    if [ -x /usr/sbin/ntpdate ]; then
         echo "Using ntpdate $NTPSERVER"                            >>$LOGSYS
         /usr/sbin/ntpdate -b -u -t 30 $NTPSERVER >>$LOGSYS 2>&1 # `cat /etc/ntp/step-tickers`
         if [ $? -gt 0 ]; then
              STATUS=ERROR
              echo "`date` ***** ERROR sys_timesync $NTPSERVER $TIMESERVER" >>$LOGSYS
         fi
    else
         STATUS=ERROR
         echo "`date` ***** ERROR sys_timesync ntp client not found" >>$LOGSYS
    fi
fi


echo ""                                                       >>$LOGSYS
echo "#% status: $STATUS"                                     >>$LOGSYS
echo "#% motive: $MOTIVE"                                     >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                           >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                              >>$LOGSYS
echo ""                                                       >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "                  >>$LOGSYS
echo "======================================================" >>$LOGSYS

# ************************************************************************
# We send the result of the process to the administrator via e-mail.
# In this way we make sure that the administrator always knows
# if the process is executed correctly or not.
# For this you have to make sure that the equipment can do mail relay.
# ************************************************************************
if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi

# END sys_timesync

Give it execution permissions:

Copy
chmod +x sys_timesync.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
00  2 * * * /CONFIG/SCRIPTS/sys_timesync.sh --ntpserver es.pool.ntp.org

2 OS verification

Create a file named sys_checkos.sh in the /CONFIG/SCRIPTS directory

Copy
cat > sys_checkos.sh

And paste the following code:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Operaint System check
# processname: sys_checkos.sh
#
# ===========================================================================

INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`}
INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`}
DB_LOCALE=${DB_LOCALE:-es_es.8859-1}
CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1}
DBDATE=${DBDATE:-DMY4-}
export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log
[ `uname -s` = "SunOS" ] && MAIL=mailx || MAIL=mail

PCTFULL=80
EXCLUDEDISKS="\"\""

# Usage message.
usage () {
   echo
   echo Usage: $0 [--purgewic days]
   echo           [--mailto \"user1@domain.es user2@domain.es\"]
   echo           [--mailerror \"user1@domain.es user2@domain.es\"]
   echo
   echo --mailto        addresses to send email always
   echo --mailerror     addresses to send email if error occurs
   echo --pctfull       threshold percentage of disk occupation \(default 80%\)
   echo --excludedisks  list of partitions to exclude of check
   echo
   echo Example: $0 --mailerror \"addr1@domain.com addr2@domain.com\"
   echo Example: $0 --pctfull 85 --excludedisks \"\(ifmx\)\"
   echo Example: $0 --excludedisks \"\(ssd\|ifmx\)\"
   echo
   exit
}

#######################################################
# Main

# Analize the parameters to exceed the default values
while :
do
    case $1 in
        --mailto)       shift; MAILTO=$1; shift;;
        --mailerror)    shift; MAILERROR=$1; shift;;
        --pctfull)      shift; PCTFULL=$1; shift;;
        --excludedisks) shift; EXCLUDEDISKS=$1; shift;;
        --)             shift; break;;
        -*)             usage;;
        *)              break;;
    esac
done

# ************************************************************************
#
# SPECIFIC OPERATING SYSTEM AND DATABASE FUNCTIONS
#
#       do_AIX
#       do_HPUX
#       do_LINUX
#       do_SOLARIS
#
# ************************************************************************
do_AIX()
{
    find /home \( -name core -o -name a.out -o -name '*%' \) \
                -print -exec rm -f '{}' \; > /dev/null

        # AIX Volume Manager



        # AIX Disk Arrays
        for DISK in `lsdev -Ctarray -s fdar -F name`; do
                if [ `fraidmgr -C -l $DISK | head -n 1 | grep -v -c "OPTIMAL"` -gt 0 ]; then
                        STATUS=ERROR
                        echo "`date` ***** ERROR en RAID en disco físico $DISK" >>$LOGSYS
                        fraidmgr -C -l $DISK >>$LOGSYS
#               else
#                       echo "$DISK OK" >>$LOGSYS
                fi
        done

    # Filesystems free space
    echo "Verificando espacio libre en filesystems..." >>$LOGSYS
    df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($4 > $PCTFULL ) \
            printf("FILESYSTEM %s with %d%% occupation\n", $7, $4) }' > /tmp/checkos_df.tmp
    if [ -s /tmp/checkos_df.tmp ]; then
        STATUS=ERROR
        cat /tmp/checkos_df.tmp >>$LOGSYS
    fi
    rm -f /tmp/checkos_df.tmp
}

do_HPUX()
{
    find / \( -name core -o -name a.out -o -name '*%' \) \
                -print -exec rm -f '{}' \; > /dev/null

}

do_LINUX()
{
    #echo "Deleting files core.*, a.out in /home and /root" >> $LOGSYS
    # Deleting files core.*, a.out in /home and /root
    #Bug elimina el fichero /home/gsutil/third_party/rsa/rsa/core.py
    #find /home \( -name 'core.*' -o -name a.out -o -name '*%' \) \
    #            -print -exec rm -f '{}' \; > /dev/null

    # Deleting files core.*, a.log in /root not modifies in 15 days
    #Bug elimina el fichero /home/gsutil/third_party/rsa/rsa/core.py
    #find /root \( -name 'core.*' -o -name '*.log' \) -mtime +15 \
    #            -print -exec rm -f '{}' \; > /dev/null

    # Check if Linux RAID is OK
    #if [ -f /proc/mdstat ]; then
    #    echo "Verificando RAID software de Linux" >> $LOGSYS
    #   if [ `cat /proc/mdstat | grep "\[" | grep -c "_"` -gt 0 ]; then
    #           STATUS=ERROR
    #           echo "`date` ***** ERROR en RAID /proc/mdstat" >>$LOGSYS
    #           cat /proc/mdstat >>$LOGSYS
    #   fi
    #fi

    # Filesystems free space
    echo "Checking free space in filesystem. Threshold occupation in ${PCTFULL}%..." >>$LOGSYS
    df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > '$PCTFULL' && $6 !~ /'$EXCLUDEDISKS'/) \
            printf("FILESYSTEM %s with %d%% occupation\n", $6, $5,'$PCTFULL') }' > /tmp/checkos_df.tmp
    if [ -s /tmp/checkos_df.tmp ]; then
        STATUS=ERROR
        cat /tmp/checkos_df.tmp >>$LOGSYS
    fi
    rm -f /tmp/checkos_df.tmp
}

do_SOLARIS()
{
        # Delete core files, a.out y % de /
    find / \( -name core -o -name a.out -o -name '*%' \) \
                -print -exec rm -f '{}' \; > /dev/null

        # Delete recovery files from vi
    find /var/preserve \( -name 'Ex*' \) -atime +3 \
        -print -exec rm '{}' \; > /dev/null

        # Keep reduced the log files
    cat /dev/null > /var/adm/wtmp
    cat /dev/null > /var/adm/wtmpx
    cat /dev/null > /var/adm/sulog
    cat /dev/null > /var/adm/lastlog

    # Solaris DiskSuite
        if [ -f /usr/sbin/metastat ]; then
            if [ `/usr/sbin/metastat | grep -c "esync"` -gt 0 ]; then
                STATUS=ERROR
                echo "`date` ***** ERROR en RAID /usr/sbin/metastat" >>$LOGSYS
                /usr/sbin/metastat >>$LOGSYS
            fi
        fi

        # Veritas volume manager
        if [ -f /usr/sbin/vxprint ]; then
            # Veritas Volume Manager
            if [ `/usr/sbin/vxprint -v  | grep "v" | grep -v -c "ACTIVE"` -gt 0 ]; then
                STATUS=ERROR
                echo "`date` ***** ERROR en RAID /usr/sbin/vxprint -v" >>$LOGSYS
                        /usr/sbin/vxprint -v >> $LOGSYS
            fi
        fi

    # Filesystems free space
    echo "Verificando espacio libre en filesystems..." >>$LOGSYS
    df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > $PCTFULL ) \
            printf("FILESYSTEM %s with %d%% occupation\n", $6, $5) }' > /tmp/checkos_df.tmp
    if [ -s /tmp/checkos_df.tmp ]; then
        STATUS=ERROR
        cat /tmp/checkos_df.tmp >>$LOGSYS
    fi
    rm -f /tmp/checkos_df.tmp
}

do_SAI()
{
   echo "" >> $LOGSYS
   if [ ! -d /bin/PowerChute -a ! -d /usr/local/bin/PowerChute ]; then
        echo "" >>$LOGSYS
        echo "SAI PowerChute no instalado en este equipo." >>$LOGSYS
        return
   else
        if [ -d /bin/PowerChute ]; then
           POWERCHUTEHOME=/bin/PowerChute
        fi
        if [ -d /usr/local/bin/PowerChute ]; then
           POWERCHUTEHOME=/usr/local/bin/PowerChute
        fi
        PCNSID=`cat $POWERCHUTEHOME/pcns.pid`
        if [ `ps -p $PCNSID | grep -c "java"` -eq 0 ]; then
                echo "=========================================" >>$LOGSYS
                echo "ERROR: SAI PowerChute no esta funcionando" >>$LOGSYS
                echo "Modifique el fichero ${POWERCHUTEHOME}/powerchute.sh para que el path" >>$LOGSYS
                echo "de ejecución de java sea /usr/bin/java y cree un link de dicho fichero" >>$LOGSYS
                echo "al path real de su instalación." >>$LOGSYS
                echo "=========================================" >>$LOGSYS
                STATUS=ERROR
        else
                echo "SAI PowerChute ejecutandose correctamente" >>$LOGSYS
        fi
  fi
}

# ************************************************************************
#
# Determines the operating system and executes the dependent code
#
# ************************************************************************

# We didn't use rm -f $LOGSYS to use LOGSYS=/dev/tty
echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Check O.S. status"                             >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

if      [ "`uname -s`" = "AIX" ]; then
        do_AIX
elif    [ "`uname -s`" = "Linux" ]; then
        do_LINUX
elif    [ "`uname -s`" = "HP-UX" ]; then
        do_HPUX
elif    [ "`uname -s`" = "SunOS" ]; then
        do_SOLARIS
else
        status=ERROR
        echo "ERROR: Unknown OS `uname -s`" >>$LOGSYS
fi

#do_SAI

echo ""                                                       >>$LOGSYS
echo "#% status: $STATUS"                                     >>$LOGSYS
echo "#% motive: $MOTIVE"                                     >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                           >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                              >>$LOGSYS
echo ""                                                       >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "                  >>$LOGSYS
echo "======================================================" >>$LOGSYS

# ************************************************************************
# We send the result of the process to the administrator via e-mail.
# In this way we make sure that the administrator always knows
# if the process is executed correctly or not.
# For this you have to make sure that the equipment can do mail relay.
# ************************************************************************
if [ -n "$MAILTO" ]; then
    $MAIL -s "$STATUS sys_checkos at `uname -n` `date`" $MAILTO < $LOGSYS
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
    $MAIL -s "$STATUS sys_checkos at `uname -n` `date`" $MAILERROR < $LOGSYS
fi

# END sys_checkos

Give it execution permissions:

Copy
chmod +x sys_checkos.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
15  4 * * * /CONFIG/SCRIPTS/sys_checkos.sh

3 OS configuration Backup

Create a file named sys_cfgsave.sh in the /CONFIG/SCRIPTS directory

Copy
cat > sys_cfgsave.sh

And paste the following code:

Copy
#!/bin/sh
# =====================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Crea un tar de los ficheros de configuracion del sistema
# processname: sys_cfgsave.sh
# ======================================================================

INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`}
INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`}
export INFORMIXDIR INFORMIXSERVER

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log
HOSTNAME=`uname -n|awk -F'.' '{print $1}'`

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` --dirsave <path-dir> \
                                [--mailto <"user1@domain.es,user2@domain.es,...">] \
                                [--mailerror <"user1@domain.es,user2@domain.es,...">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}

#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1
}

# ************************************************************************
#
# SPECIFIC OPERATING SYSTEM AND DATABASE FUNCTIONS
#
#       do_LINUX
#       do_INFORMIX
# ************************************************************************

do_LINUX()
{
        echo "=== System Filesystem mounts ===" >> $OS_INFO
        df -k >> $OS_INFO
        echo >> $OS_INFO
        echo "=== System Disk structures   ===" >> $OS_INFO
        /sbin/fdisk -l >> $OS_INFO
        echo >> $OS_INFO
        echo "=== Network Configuration ===" >> $OS_INFO
        /sbin/ifconfig -a >> $OS_INFO
        echo >> $OS_INFO
        echo "=== Routing Configuration ===" >> $OS_INFO
        netstat -r >> $OS_INFO
        echo >> $OS_INFO
        echo "=== Cron Root User ===" >> $OS_INFO
        crontab -l >> $OS_INFO
        echo >> $OS_INFO

        # We perform a tar of the critical system files
        tar chf $OS_FILE \
/etc/rc.d/init.d/informix \
/etc/hosts \
/etc/hosts.equiv \
/etc/passwd \
/etc/group \
/etc/shadow \
/etc/gshadow \
/etc/sysctl.conf \
/etc/rsyncd.conf \
/etc/dhcpd.* \
/etc/ldap.* \
/etc/lilo.conf \
/etc/named.conf \
/etc/resolv.conf \
/etc/nsswitch.conf \
/etc/proftpd.conf \
/etc/modules.conf \
/etc/rndc.conf \
/etc/exports \
/etc/fstab \
/etc/cups \
/etc/cvs \
/etc/lvm \
/etc/openldap \
/etc/procmailrc \
/etc/postfix \
/etc/postfix/aliases \
/etc/raidtab \
/etc/htdig/*.conf \
/etc/httpd/conf/*.conf \
/etc/samba* \
/etc/skel \
/etc/squid \
/etc/sysconfig \
/etc/fetchmailrc \
/usr/share/vim/vimrc \
/usr/share/vim/vimrc_example.vim \
/var/named \
/var/spool/cron \
/var/lib/samba \
2>/dev/null

}

do_INFORMIX()
{
        if [ -d /INFORMIXDEV ]; then
                echo "=== Informix /INFORMIXDEV links ===" >> $DB_INFO
                ls -l /INFORMIXDEV >> $DB_INFO
                echo >> $DB_INFO
        fi

        if [ -d $INFORMIXDIR/etc/sqlhosts ]; then
                echo "=== Informix etc/sqlhosts ===" >> $DB_INFO
                cat $INFORMIXDIR/etc/sqlhosts >> $DB_INFO
                echo >> $DB_INFO
        fi

        if [ -x $INFORMIXDIR/bin/onstat ]; then
                echo "=== Informix onstat -d ===" >> $DB_INFO
                $INFORMIXDIR/bin/onstat -d >> $DB_INFO
                echo >> $DB_INFO

                echo "=== Informix onstat -a ===" >> $DB_INFO
                $INFORMIXDIR/bin/onstat -a >> $DB_INFO
                echo >> $DB_INFO
        fi

        # Realizamos un tar de los ficheros criticos de BB.DD.
        tar cf $DB_FILE \
$INFORMIXDIR/.profile \
$INFORMIXDIR/.login \
$INFORMIXDIR/etc/onconfig* \
$INFORMIXDIR/etc/sqlhosts \
$INFORMIXDIR/etc/*.sh \
2>/dev/null

}
# ************************************************************************
#
# Main
#
# ************************************************************************
echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Save critical config files to tar archive"     >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

# -------------------------------------------------------------------
# Parse and verify arguments
# -------------------------------------------------------------------
echo "Arguments:" >> $LOGSYS
echo $* >> $LOGSYS
echo >> $LOGSYS
echo >> $LOGSYS

# Parameters required
if [ $# -eq 0 ]; then
    usage
fi

while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--dirsave)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;;
       --) break;;
       -*) usage "unknown argument: $1";;
        *) break;;
    esac
    shift
    shift
done

#Required params
REQPARAMS=( dirsave )
for PARAM in "${REQPARAMS[@]}" ; do
   arg=`echo $PARAM | tr 'a-z' 'A-Z'`
   if [ -z ${!arg} ]; then
  usage "missing argument --$PARAM"
   fi
done

# ************************************************************************
#
#  DEFINE DATA EXIT VARIABLES
#
# ************************************************************************
# Almacena un tar con los ficheros y datos criticos del agente de base de datos
DB_FILE=/usr/tmp/sys_cfgsave.db_files.tar
# Almacena un tar dependiente de sistema con los ficheros criticos
OS_FILE=/usr/tmp/sys_cfgsave.os_files.tar
# Almacena el texto de informacion de BB.DD.
DB_INFO=/usr/tmp/sys_cfgsave.db_info.txt
# Almacena el texto de informacion del sistema
OS_INFO=/usr/tmp/sys_cfgsave.os_info.txt

rm -f $OS_INFO $DB_INFO
touch $OS_INFO $DB_INFO

# Verifica que existe el directorio de backup
if [ ! -d $DIRSAVE ]; then
    mkdir -p $DIRSAVE
fi


# ************************************************************************
#
# Determines the operating system and executes the dependent code
#
# ************************************************************************

if    [ "`uname -s`" = "Linux" ]; then
        do_LINUX
else
        echo "ERROR: Unknown OS `uname -s`" >>$LOGSYS
fi

do_INFORMIX

# ************************************************************************
#
# Stores the files in a tar file
#
# ************************************************************************

FILES="/CONFIG $OS_INFO $DB_INFO $OS_FILE $DB_FILE"

echo "" >> $LOGSYS
echo "tar cf $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz $FILES" >> $LOGSYS
echo "" >> $LOGSYS
tar cf - $FILES | gzip > $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz 2>/dev/null
if [ $? -ne 0 ]; then
  STATUS=ERROR
  MOTIVE="Error ejecutando tar"
fi

ls -l $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz >> $LOGSYS

rm -f $OS_INFO $DB_INFO $OS_FILE $DB_FILE

echo ""                                                       >>$LOGSYS
echo "#% status: $STATUS"                                     >>$LOGSYS
echo "#% motive: $MOTIVE"                                     >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                           >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                              >>$LOGSYS
echo ""                                                       >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "                  >>$LOGSYS
echo "======================================================" >>$LOGSYS

# ************************************************************************
# We send the result of the process to the administrator via e-mail.
# In this way we make sure that the administrator always knows
# if the process is executed correctly or not.
# For this you have to make sure that the equipment can do mail relay.
# ************************************************************************
if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi

# END sys_cfgsave

Give it execution permissions:

Copy
chmod +x sys_cfgsave.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
00  1 * * * /CONFIG/SCRIPTS/sys_cfgsave.sh --dirsave /home/SYSCONFIG

4 Update statistics

Create a file named dbs_updstat.sh in the /CONFIG/SCRIPTS directory

Copy
cat > dbs_updstat.sh

And paste the following code:

Copy
#!/bin/sh
# ======================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Realiza la actualización de estadísitcas del motor Informix
# processname: dbs_updstat.sh
#
# $Id: dbs_updstat.sh  $
# ======================================================================
INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`}
INFORMIXSERVER=${INFORMIXSERVER:-ol_`uname -n|awk -F'.' '{print $1}'`}
DB_LOCALE=${DB_LOCALE:-es_es.8859-1}
CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1}
DBDATE=${DBDATE:-DMY4-}
export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` [--dbsexclude <"'db1','db2',...">] \
                                [--dbsinclude <"'db1','db2',...">] \
                                [--parallel] \
                                [--mailto <"user1@domain.es,user2@domain.es,...">] \
                                [--mailerror <"user1@domain.es,user2@domain.es,...">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}

#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1
}

# ************************************************************************
#
# Main
#
# ************************************************************************
#Check log file is current day
if [ -f $LOGSYS ]; then
   CHECKLOG=`find $LOGSYS -daystart -mtime -1 -print`
   if [ -z $CHECKLOG ]; then
        cat /dev/null > $LOGSYS
   fi
fi
echo "#% "                                                    >>$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Executes update statistics on databases"       >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

# -------------------------------------------------------------------
# Parse and verify arguments
# -------------------------------------------------------------------
echo "Arguments:" >> $LOGSYS
echo $* >> $LOGSYS
echo >> $LOGSYS
echo >> $LOGSYS

#default value
DBSEXCLUDE="\"\""

while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--dbsexclude|--dbsinclude)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;shift;shift;;
       --parallel)
           PARALLEL=Y;shift;;
       --) break;shift;shift;;
       -*) usage "unknown argument: $1";;
        *) break;shift;shift;;
    esac
done

# Obtiene la lista de las bases de datos a procesar
if [ -z "$DBSINCLUDE" ]; then
    INCLCMD="1=1"
    DBSINCLUDE="\"\""
else
    INCLCMD="1=0"
fi
su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF
  SET ISOLATION TO DIRTY READ;
  UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' '
  SELECT trim(name) || "/" || trim(dbs_collate) name
    FROM sysdatabases, OUTER sysdbslocale
   WHERE sysdatabases.name = sysdbslocale.dbs_dbsname
     AND name NOT MATCHES "sys*"
     AND name NOT IN ($DBSEXCLUDE)
     AND (name IN ($DBSINCLUDE) OR $INCLCMD)
EOF
if [ $? -gt 0 ]; then
  STATUS=ERROR
  echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS
fi
DBSLIST=`cat /tmp/dbslist.$$`
rm -f /tmp/dbslist.$$

# ************************************************************************
#
# For each database
#
# ************************************************************************

echo "SET OPTIMIZATION LOW; UPDATE STATISTICS LOW FORCE;" > /tmp/updstat.sql

for DBSOBJ in `echo $DBSLIST | sed 's/name //g'`; do
  LOC=`basename $DBSOBJ`
  DBS=`dirname $DBSOBJ`

  if [ -z "$PARALLEL" ]; then
    echo "`date` Update statistics for [$DBS] with locale [$LOC]" >>$LOGSYS
    su informix -c "CLIENT_LOCALE=${LOC}; export CLIENT_LOCALE; DB_LOCALE=${LOC}; export DB_LOCALE; $INFORMIXDIR/bin/dbaccess $DBS /tmp/updstat.sql" >>$LOGSYS 2>&1
    if [ $? -gt 0 ]; then
      STATUS=ERROR
      echo "***** ERROR UPDATE STATISTICS ON $DBS" >>$LOGSYS
    fi
  else
      ( \
      echo "UPDATING STATISTICS FOR DATABASE $DBS WIDTH LOCALE $LOC" >/tmp/updstat_$DBS.log ; \
      echo "=====================================" >>/tmp/updstat_$DBS.log ; \
      su informix -c "CLIENT_LOCALE=${LOC}; export CLIENT_LOCALE; DB_LOCALE=${LOC}; export DB_LOCALE; $INFORMIXDIR/bin/dbaccess $DBS /tmp/updstat.sql" >>/tmp/updstat_$DBS.log 2>&1 ; \
      if [ $? -gt 0 ]; then  \
    echo "***** ERROR UPDATE STATISTICS ON $DBS" >>/tmp/updstat_$DBS.log ;  \
      fi ; \
      cat /tmp/updstat_$DBS.log >>$LOGSYS ; rm -f /tmp/updstat_$DBS.log; \
      ) &

      BGPID=$!
      UNLOADPIDS="${UNLOADPIDS} ${BGPID}"
  fi
done

if [ -n "$PARALLEL" ]; then
  # Debemos esperar a que terminen todos los procesos background
  echo "waiting for proces to finish $UNLOADPIDS " >>$LOGSYS
  wait $UNLOADPIDS

  # Como el proceso se ejecuta en background, debemos verificar el error
  # al final...

  if [ `grep -c ERROR $LOGSYS` -gt 0 ]; then
      STATUS=ERROR
  fi
fi
rm -f /tmp/updstat.sql

echo ""                                                       >>$LOGSYS
echo "#% status: $STATUS"                                     >>$LOGSYS
echo "#% motive: $MOTIVE"                                     >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                           >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                              >>$LOGSYS
echo ""                                                       >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "                  >>$LOGSYS
echo "======================================================" >>$LOGSYS

# ************************************************************************
#
# Enviamos el resultado del proceso al administrador via e-mail.
# De este modo nos aseguramos que el administrador siempre sabe
# si el proceso se ejecuta correctamente o no.
# Para ello hay que asegurase que el equipo puede hacer mail relay.
#
# ************************************************************************

if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi

# END dbs_updstat

Darle permisos de ejecución:

Copy
chmod +x dbs_updstat.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
00  4 * * * /CONFIG/SCRIPTS/dbs_updstat.sh

5 Database state verification

Create a file named dbs_oncheck.sh in the /CONFIG/SCRIPTS directory

Copy
cat > dbs_oncheck.sh

And paste the following code:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Ejecuta oncheck sobre las bases de datos
# processname: dbs_oncheck.sh
#
# $Id: dbs_oncheck.sh  $
# ======================================================================

INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`}
INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`}
DB_LOCALE=${DB_LOCALE:-es_es.8859-1}
CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1}
DBDATE=${DBDATE:-DMY4-}
export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` [--dbsexclude <"'db1','db2',...">] \
                                [--dbsinclude <"'db1','db2',...">] \
                                [--mailto <"user1@domain.es,user2@domain.es,...">] \
                                [--mailerror <"user1@domain.es,user2@domain.es,...">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}

#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1
}

echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Executes oncheck command on databases"         >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

# -------------------------------------------------------------------
# Parse and verify arguments
# -------------------------------------------------------------------
echo "Arguments:" >> $LOGSYS
echo $* >> $LOGSYS
echo >> $LOGSYS
echo >> $LOGSYS

#default value
DBSEXCLUDE="\"\""

while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--dbsexclude|--dbsinclude)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;;
       --) break;;
       -*) usage "unknown argument: $1";;
        *) break;;
    esac
    shift
    shift
done

#######################################################
# Main
#######################################################

su informix -c "$INFORMIXDIR/bin/oncheck -cSRe -y -q" >>$LOGSYS 2>&1
if [ $? -gt 0 ]; then
  STATUS=ERROR
  echo "`date` ***** ERROR en oncheck -cSRe" >>$LOGSYS
fi

# Obtiene la lista de las bases de datos a procesar
if [ -z "$DBSINCLUDE" ]; then
    DBSINCLUDE="\"\""
    INCLCMD="1=1"
else
    INCLCMD="1=0"
fi
su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF
  SET ISOLATION TO DIRTY READ;
  UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' '
  SELECT name FROM sysdatabases
  WHERE name NOT MATCHES "sys*"
    AND name NOT IN ($DBSEXCLUDE)
    AND (name IN ($DBSINCLUDE) OR $INCLCMD)
EOF
if [ $? -gt 0 ]; then
  STATUS=ERROR
  echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS
fi
DBSLIST=`cat /tmp/dbslist.$$`
rm -f /tmp/dbslist.$$

for DBS in `echo $DBSLIST | sed 's/name //g'`; do
  echo "Executing oncheck on $DBS" >>$LOGSYS

  su - informix -c "$INFORMIXDIR/bin/oncheck -cxcDI $DBS -y -q" >>$LOGSYS  2>&1
        if [ `grep -c ERROR $LOGSYS` -gt 0 ]; then
      STATUS=ERROR
      echo "`date` ***** ERROR en oncheck -cxcDI $DBS" >>$LOGSYS
  fi
done

echo ""                                                    >>$LOGSYS
echo "#% status: $STATUS"                                  >>$LOGSYS
echo "#% motive: $MOTIVE"                                  >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                        >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                           >>$LOGSYS
echo ""                                                    >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "               >>$LOGSYS
echo "===================================================" >>$LOGSYS

# ************************************************************************
#
# We send the result of the process to the administrator via e-mail.
# In this way we make sure that the administrator always knows
# if the process is executed correctly or not.
# For this you have to make sure that the equipment can do mail relay.
#
# ************************************************************************

if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi

# END dbs_oncheck

Give it execution permisssions:

Copy
chmod +x dbs_oncheck.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
00  2 * * 0 /CONFIG/SCRIPTS/dbs_oncheck.sh --mailto "sysadmin@empresa.es"

6 Verificación del estado del servidor Informix

Create a file named dbs_checkdb.sh in the /CONFIG/SCRIPTS directory

Copy
cat > dbs_checkdb.sh

And paste the following code:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Verificacion del sistema
# processname: dbs_checkdb.sh
#
# ===========================================================================

INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`}
INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`}
DB_LOCALE=${DB_LOCALE:-es_es.8859-1}
CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1}
DBDATE=${DBDATE:-DMY4-}
MSGPATH=`su - informix -c "onstat -c" | grep "^MSGPATH" | awk '{ print $2 }'`
#En caso de que MSGPATH viene especificad con $INFORMIXDIR
MSGPATH=`eval echo "$MSGPATH"`

export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE MSGPATH

STATUS=OK
MOTIVE=""
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log

TMPFILE=/tmp/dbs_checkdb.$$
ERRFILE=/tmp/dbs_checkdb.err

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` [--spexclude <'dbspace1','dbspace2',...>][--maxdbspacefull <value>] \
                                [--maxchkpoint <value>][--maxtableextents <value>] \
                                [--maxtablepages <value>][--minfreelogsize <value>] \
                                [--maxlocks <value>][--maxvirtsegment <value>] \
                                [--maxsesmemory <value>][--maxfgwrites <value>] \
                                [--maxdeadlks <value>][--maxseqscans <value>] \
                                [--maxseqscanssize <value>] \
                                [--mailto <"user1@domain.es,user2@domain.es,...">] \
                                [--mailerror <"user1@domain.es,user2@domain.es,...">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}

#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1
}

# ************************************************************************
# DbmStatusCheck
#   Purpose: Check the availibility of the database server
#   Reason:  If your database server is down, you could not access your data.
#            This might have a negative impact on your business.
# ************************************************************************
do_DbmStatusCheck()
{
   echo "--- $INFORMIXSERVER : Verificando estado" >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/onstat - | grep 'On-Line'" >>$LOGSYS
   if [ ! $? -eq 0 ]; then
      STATUS=ERROR
      echo "ERROR: Motor no disponible en $INFORMIXSERVER" >>$LOGSYS
   fi
}

# ************************************************************************
# DbmHdrStatusCheck
#   Purpose: Check Hdr is working properlly
#   Reason:  If Hdr is not on, ...
#            This might have a negative impact on your business.
# ************************************************************************
do_DbmHdrStatusCheck()
{
   echo "--- $INFORMIXSERVER : Verificando estado HDR" >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/onstat -g dri | egrep '(primary|secondary)' | grep ' on '" >>$LOGSYS
   if [ ! $? -eq 0 ]; then
      STATUS=ERROR
      echo "ERROR: HDR no disponible en $INFORMIXSERVER" >>$LOGSYS
   fi
}

# ************************************************************************
# ConnectCheck
#   Purpose: Make sure that a connect thru 'dbaccess' is possible to any server
#	     names defined in your ONCONFIG file (i.e. DBSERVERNAME,DBSERVERALIASES).
#   Reason:  The previous method 'DbmStatusCheck' checks the availability
#	     of your database server. However the fact that your database server
#            is 'online' does not always ensure that you could connect to your
#            defined servernames. So this additional test is helpful in some
#            special situations.
# ************************************************************************
do_ConnectCheck()
{
   echo "--- $INFORMIXSERVER : Verificando conectividad de DBSERVERS" >>$LOGSYS
   DBSERVERS=`grep -v "^#" $INFORMIXDIR/etc/sqlhosts | grep "on" | awk '{ print $1 }'`
   for SERVER in $DBSERVERS ;  do
      echo "    Connecting to server $SERVER" >>$LOGSYS
      echo "connect to '@$SERVER'" | su - informix -c "$INFORMIXDIR/bin/dbaccess -e -" >$TMPFILE 2>&1
      if [ $? -eq 0 ]; then
         echo "               Connected OK." >>$LOGSYS
      else
	 echo "ERROR Connection exceeded Timout. Returncode: $? " >>$LOGSYS
	 STATUS=ERROR
	 cat $TMPFILE >>$LOGSYS
      fi
   done
}

# ************************************************************************
# LongTxCheck
#     Purpose: 	Check to see if there are any ongoing long transactions.
#     Reason: 	Long transactions should be avoided. They consume major resources
#               of your database server. If a long transaction exclusive high water
#               mark (LTXEHWM) is reached, all other write activities will be blocked.
# ************************************************************************
do_LongTxCheck()
{
   echo "--- $INFORMIXSERVER : Verificando transacciones demasiado grandes " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>$ERRFILE <<!
	   UNLOAD TO "$TMPFILE"
	   SELECT srt.sid, srt.username, scl.pid
	     FROM systxptab stx, sysrstcb srt, sysscblst scl
	    WHERE stx.owner = srt.address
	      and srt.sid = scl.sid
	      and stx.longtx = 1
	      and bitval(srt.flags, "0x80000") = 1
!
            if [ $? != 0 ]; then
                STATUS=ERROR
                echo "ERROR: error en verificación de transacciones largas" >>$LOGSYS
		cat $ERRFILE >>$LOGSYS
            else
                if [ `cat $TMPFILE | wc -l` -gt 1 ]; then
                   STATUS="WARNING LongTxCheck"
                   echo "ATENCION: Transacciones demasiado largas -Long Tx-" >>$LOGSYS
                   cat $TMPFILE >> $LOGSYS
                fi
            fi
            rm -f $ERRFILE $TMPFILE
}


# ************************************************************************
# DbspaceFullCheck
#     Purpose: 	Check the filling degree of your dbspaces
#     Reason: 	Managing disk space is one of the primary tasks of a DBA.
#               If one of your dbspaces runs out of space, some applications could stop working.
# ************************************************************************
do_DbspaceFullCheck()
{
   echo "--- $INFORMIXSERVER : Verificando espacio ocupado de por los dbspaces " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >$TMPFILE 2>&1 <<!
      SELECT name[1,18],
             ROUND(SUM(chksize)*2/1000, 3) size_Mb,
             ROUND(SUM(DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree))*2/1000, 3) free_Mb,
             ROUND((SUM(chksize-DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree))/SUM(chksize)) * 100, 3) usado
             FROM sysdbspaces, syschunks
       WHERE sysdbspaces.dbsnum = syschunks.dbsnum
         AND name NOT IN ($SPEXCLUDE)
       GROUP BY 1
      HAVING (SUM(chksize-DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree)) * 100)/SUM(chksize)
                 > $MAXDBSPACEFULL
       ORDER BY 4 DESC
!
   if [ $? != 0 ]; then
         STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
         echo "ERROR: error en análisis de ocupacion de dbspaces" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
         STATUS="WARNING DbspaceFullCheck"
	 echo "============================================================" >>$LOGSYS
         echo "ATENCION: % ocupado en dbspaces > $MAXDBSPACEFULL %" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
         cat $TMPFILE >> $LOGSYS
	 echo "" >>$LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# CheckpointCheck

#    Purpose: 	Parse the online.log for any violations of the configured maximum checkpoint time allowed.
#    Reason: 	Long checkpoints should be avoided. During a checkpoint all write
#               activities will be blocked. So the goal for every DBA is to keep the
#               checkpoint time as small as possible.
# ************************************************************************
do_CheckpointCheck()
{
   echo "--- $INFORMIXSERVER : Verificando tiempo invertido en check points " >>$LOGSYS
   ONLINELOG=$MSGPATH
   for CHKPOINT in `grep "Checkpoint Completed" $ONLINELOG | tail -100 | sed 's/Fuzzy//g' | awk '{ print $6 }' ` ; do
     if [ $CHKPOINT -gt $MAXCHKPOINT ]; then
         echo "ERROR: Se han encontrado check points de $CHKPOINT segundos" >>$LOGSYS
         STATUS=ERROR
      fi
   done
}

# ************************************************************************
# OntapeCheck

#    Purpose: 	check if ontape is done properlly on daily basis
# ************************************************************************
do_OntapeCheck()
{
   echo "--- $INFORMIXSERVER : Verificando ejecucion correcta de backup " >>$LOGSYS
   DATEBACKUP=`$INFORMIXDIR/bin/onstat -g arc | grep "  0  " | tail -1 | awk '{ print substr($4, 0, 10) }'`
   if [ "$DATEBACKUP" != "`date -d '1 day ago' +'%m/%d/%Y'`" ] && [ "$DATEBACKUP" != "`date +'%m/%d/%Y'`" ]; then
         echo "ERROR: Ultimo backup realizado el dia $DATEBACKUP" >>$LOGSYS
         STATUS=ERROR
   fi
}

# ************************************************************************
# OnlineLogCheck
#    Purpose: 	Parse the online.log and search special events
#    Reason: 	The online.log is an important information resource for the DBA.
#               It contains useful information about any problems that have occurred.
# ************************************************************************
do_OnlineLogCheck()
{
   echo "--- $INFORMIXSERVER : Verificando fichero de mensajes " >>$LOGSYS
   ONLINELOG=$MSGPATH
   grep -4 "Assert" $ONLINELOG >>$LOGSYS
   if [ $? -eq 0 ]; then
        STATUS=ERROR
        echo "===============================================" >>$LOGSYS
        echo "ERROR: Existen Asserts en el fichero de logs..." >>$LOGSYS
   fi
   echo "" >>$LOGSYS
}

# ************************************************************************
# LogFullCheck
#     Purpose: 	Checks to see how full the logical logs are and generates alarms
#               if one of the configured thresholds is exceeded.
#     Reason: 	The logical logs are one of the most important resources of the
#               database server. Your database server will be blocked if they become
#               full because they could not be backed up. You might also lose
#               transactions in the case of a failure if your logical logs have
#               not been backed up. Thus observing the behaviour of the logical
#               logs is also one of the primary activities of a DBA.
#
#     Yes, we have the dynamic log allocation feature since IDS 9.30. But this
#     is not always a good thing. Poorly written applications performing large
#     transactions without any commit could trigger the allocation of several
#     additional logs scattered throughout your dbspaces if you have set
#     DYNAMIC_LOGS to 2 (which is also the default). All these dbspaces will
#     then be considered 'critical' (because they contain a logical log), so if
#     one of them is marked down for some reason, your database server will stop.
# ************************************************************************
do_LogFullCheck()
{
   echo "--- $INFORMIXSERVER : Verificando logical logs disponibles " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
	   SELECT sum(size) free_log_pages
	     FROM syslogs
	    WHERE ((is_backed_up = 1 and is_used = 1) or (is_used = 0))
	   HAVING SUM(size) < $MINFREELOGSIZE
!
# Obtiene los pendientes de backup
# WHERE AND is_backed_up = 0 and is_used = 1

   if [ $? != 0 ]; then
         STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
         echo "ERROR: error en verificación logical logs disponibles" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING LogFullCheck"
	 echo "============================================================" >>$LOGSYS
         echo "ATENCION: No tiene suficiente espacio de logical logs disponible" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
         echo "Espacio disponible..." >> $LOGSYS
         cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE


   #Verifica los backups de logical logs
   LTAPEDEV=`su - informix -c "onstat -c" | grep "^LTAPEDEV" | awk '{ print $2 }'`
   LTAPEDIR=`dirname $LTAPEDEV`

    # Si es un fichero normal. (No es un dispositivo)
    if [ -f $LTAPEDEV ]; then
            echo "Verificando ejecucion de los backups de logical logs" >>$LOGSYS
            if [ `su - informix -c "onstat -l" | egrep "U.-" | wc -l` -gt 3 ]; then
                    STATUS=ERROR
                    echo "ERROR: Mas de tres logical logs pendientes de backup. " >>$LOGSYS
                    echo "       Verifique $INFORMIXDIR/etc/log_full.sh -Evento 23-" >>$LOGSYS
            fi
       if [ -d $LTAPEDIR ]; then
            echo "Verificando limpieza de logical logs en $LTAPEDIR" >>$LOGSYS
            if [ `find $LTAPEDIR -name "logfile.*" -ctime +7 -print | wc -l ` -gt 0 ]; then
                    STATUS=ERROR
                    echo "ERROR: No se realiza la limpieza de backup de logical logs antiguos" >> $LOGSYS
                    echo "       Se han encontrado ficheros logfile de mas de 7 dias" >> $LOGSYS
            fi
       fi
    fi
}

# ************************************************************************
# MaxExtentCheck
#    Purpose: 	Checks the number of extents for a table or a table fragment.
#    Reason: 	The number of extents per table is limited. The upper limit depends
#               on the page size of your system (2K or 4K) and the number of special
#               data types in your table (like datetime or interval). For a 2K system
#               the limit will be approximately 200-220 extents. If this limit is reached,
#               no more inserts into this table will be possible. You have reorganize the
#               relevant table which might be time consuming if the table is large (which is
#               obvious because it ran out of extents).
# ************************************************************************
do_MaxExtentCheck()
{
   echo "--- $INFORMIXSERVER : Verificando número de extents de tablas o fragmentos " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
         SELECT systabnames.dbsname[1,18], systabnames.tabname[1,18],
	        substr(dbinfo( "DBSPACE" , systabinfo.ti_partnum ), 1, 18),
		systabinfo.ti_nextns, systabinfo.ti_nkeys, systabinfo.ti_npdata
           FROM systabnames, systabinfo
          WHERE systabnames.partnum = systabinfo.ti_partnum
            AND systabnames.dbsname in (select name from sysdatabases)
            AND systabnames.tabname not matches "sys*"
            AND systabinfo.ti_nextns >= $MAXTABLEEXTENTS
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de los extents de las tablas o fragmentos" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING MaxExtentCheck"
	 echo "===============================================================" >>$LOGSYS
	 echo "ATENCION: Tablas o fragmentos con mas de $MAXTABLEEXTENTS extents" >>$LOGSYS
	 echo "          Para consolidar los fragmentos puede usar el comando SQL:" >>$LOGSYS
	 echo "          ALTER FRAGMENT ON TABLE table1 INIT IN targetdbs;"     >>$LOGSYS
	 echo "          ALTER FRAGMENT ON INDEX index1 INIT IN targetdbs;"     >>$LOGSYS
	 echo "===============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# MaxPageCheck
#     Purpose: 	Counts the number of pages allocated for a table or a table fragment.
#     Reason: 	There is an upper limit of 16,000,000 pages per table/fragment/index
#               in Informix Dynamic Server. You cannot insert any additional rows when the limit
#               is reached. You must reorganize the table (for example splitting a single table
#               into several fragments) before work can continue. 16,000,000 pages is not that much.
#               On a system using a 2K page size it is around 32 GB.
# ************************************************************************
do_MaxPageCheck()
{
   echo "--- $INFORMIXSERVER : Verificando número de páginas de tablas o fragmentos " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
         SELECT stn.dbsname[1,18], stn.tabname, sti.ti_nkeys, sti.ti_npdata, sti.ti_nptotal,
                dbinfo("dbspace", sti.ti_partnum)
           FROM systabnames stn, systabinfo sti
          WHERE stn.partnum = sti.ti_partnum
            AND stn.tabname not like "TBLSpace"
            AND sti.ti_nptotal >= $MAXTABLEPAGES
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de páginas de las tablas o fragmentos" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING MAxPageCheck"
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: Tablas o fragmentos con mas de $MAXTABLEPAGES páginas" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# SessionLockCheck
#    Purpose: 	Inspects the number of locks held by individual database sessions.
#    Reason: 	Poorly written applications can consume a huge number of locks.
#               This checks the number of locks held by each database session and
#               triggers appropriate alarms if one of the configured thresholds is exceeded.
# ************************************************************************
do_SessionLockCheck()
{
   echo "--- $INFORMIXSERVER : Verificando el número de locks de las sesiones " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
         SELECT sss.sid, sss.username, ssp.lktouts
	   FROM syssessions sss, syssesprof ssp
          WHERE sss.sid = ssp.sid
	    AND ssp.locksheld >= $MAXLOCKS
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de número de locks por sesion" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING SessionLockCheck"
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: Número de locks de alguna sesion excede $MAXLOCKS" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# VirtualSegmentCheck
#     Purpose: 	Counts the number of allocated virtual shared memory segments.
#     Reason: 	Allocating additional shared memory segments is resource intensive
#               and on some platforms (like HP/UX) degrades the overall performance
#               of your database server. There are also some limits on the amount
#               of shared memory that can be allocated, for example on 32-Bit AIX systems.
# ************************************************************************
do_VirtualSegmentCheck()
{
   echo "--- $INFORMIXSERVER : Verificando el número de segmentos de memoria virtual " >>$LOGSYS
   {
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster -" 2>$TMPFILE <<!
	output to pipe "cat" without headings
         SELECT COUNT(*) FROM syssegments WHERE seg_class = 2 HAVING COUNT(*) > $MAXVIRTSEGMENT
!
} | while read line; do 	# pipe the output to while read
      if [ "$line" ]; then # check if line is not NULL
	if [ $line -gt 0 ]; then
	   STATUS="WARNING VirtualSegmentCheck"
	   echo "============================================================" >>$LOGSYS
	   echo "ATENCION: Número de segmentos de memoria virtual $line superior a $MAXLOCKS" >>$LOGSYS
	   echo "============================================================" >>$LOGSYS
	fi
      fi
   done

   rm -f  $TMPFILE
}

# ************************************************************************
# DbspaceDownCheck
#     Purpose: 	Checks if any dbspaces have been marked down.
#     Reason: 	You cannot access the data in 'down' dbspaces. You may need to
#               restore the data from an archive.
# ************************************************************************
do_DbspaceDownCheck()
{
   echo "--- $INFORMIXSERVER : Verificando dbspaces caidos " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
	 SELECT sds.name, sck.fname
	   FROM sysdbspaces sds, syschunks sck
	  WHERE sds.dbsnum = sck.dbsnum and sck.is_offline = 1
	 UNION
	 SELECT sds.name, sck.mfname
	   FROM sysdbspaces sds, syschunks sck
	  WHERE sds.dbsnum = sck.dbsnum and sck.mis_offline = 1
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de dbspcaes caidos" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="ERROR DbspaceDownCheck"
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: Existen dbspaces marcados como caidos -down-" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# ChunkDownCheck
#     Purpose: 	Checks if any chunks are marked down.
#     Reason: 	You cannot access the data in 'down' chunks. You may need to
#               restore the data from an archive.
# ************************************************************************
do_ChunkDownCheck()
{
   echo "--- $INFORMIXSERVER : Verificando chunks caidos " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
	 SELECT sds.name, sck.fname
	   FROM sysdbspaces sds, syschunks sck
	  WHERE sds.dbsnum = sck.dbsnum and sck.is_offline = 1
	 UNION
	 SELECT sds.name, sck.mfname
	   FROM sysdbspaces sds, syschunks sck
	  WHERE sds.dbsnum = sck.dbsnum and sck.mis_offline = 1
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de chunks caidos" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: Existen chunks marcados como caidos -down-" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# SessionMemoryCheck
#
#    Purpose: 	Inspects the allocated memory of each database session currently connected.
#    Reason: 	Depending on the number of prepared statements, recursive stored
#               procedures and some other factors, the allocated memory per session
#               might be high, especially if these sessions fail to free their prepared
#               statements. With a large number of users, you might suddenly hit the
#               known memory limitations on 32-bit systems. This method lets you identify
#               those memory-intensive sessions.
# ************************************************************************
do_SessionMemoryCheck()
{
   echo "--- $INFORMIXSERVER : Verificando memoria reservada por sesion " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
	 SELECT sss.sid, sss.username, sum(sps.po_usedamt + sps.po_freeamt)
	   FROM syssessions sss, syspools sps
	  WHERE sss.sid || "" = sps.po_name
	  GROUP BY 1,2
	  HAVING sum(sps.po_usedamt  + sps.po_freeamt) > $MAXSESMEMORY
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de memoria reservada por sesion" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING SessionMemoryCheck"
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: Existen sesiones con mas de $MAXSESMEMORY de memoria reservada" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# ForegroundWriteCheck
#    Purpose: 	Checks the number of foreground writes that have occurred.
#    Reason: 	Foreground writes should be avoided. They slow down the performance
#               of your database server. Depending on the nature of your application
#               (batch or more interactive) you should prefer chunk writes or lru writes,
#               so that foreground writes almost never happen.
# ************************************************************************
do_ForegroundWriteCheck()
{
   echo "--- $INFORMIXSERVER : Verificando foreground writes " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
         SELECT value fgwrites
           FROM sysprofile
          WHERE name = "fgwrites"
	    AND value > $MAXFGWRITES
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de foreground writes" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS="WARNING ForegroundWriteCheck"
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: se ha excedido el número recomendado de foreground writes" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# DeadLockCheck
#    Purpose: 	Counts the number of deadlocks that have occurred.
#    Reason: 	Deadlocks should also be avoided. They normally result from an
#               inappropriate application design. However We've seen also a lot
#               of deadlocks because people forgot to create their tables in
#               'row' lock mode (the default is 'page').
# ************************************************************************
do_DeadLockCheck()
{
   echo "--- $INFORMIXSERVER : Verificando dead locks " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
	 SELECT value deadlks
	   FROM sysprofile
	  WHERE name = "deadlks"
	    AND value > $MAXDEADLKS
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "============================================================" >>$LOGSYS
	 echo "ERROR: error en verificación de dead locks" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
	 STATUS=WARNING
	 echo "============================================================" >>$LOGSYS
	 echo "ATENCION: se ha excedido el número recomendado de dead locks" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
	 cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# ReadCacheCheck
#    Purpose: 	Checks the current read cache rate of your database server.
#    Reason: 	The read cache rate is an indicator of the overall performance of
#               your database server. The goal for OLTP systems is too keep the read
#               cache rate over 95 percent.
# ************************************************************************
do_ReadCacheCheck()
{
   echo "--- $INFORMIXSERVER : Verificando porcentaje de lecturas en cache " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>/dev/null 2>&1 <<!
        UNLOAD TO "$TMPFILE"
        SELECT name,  value
                  FROM sysprofile spe
                           WHERE spe.name IN ("dskreads", "bufreads")
                                 ORDER BY 1
!
    for line in `cat $TMPFILE`; do      # pipe the output to while read
       if [ "$line" ]; then # check if line is not NULL
               NAME=`echo $line | awk -F'|' '{ print $1 }'`
               VALUE=`echo $line | awk -F'|' '{ print $2 }'`
                if [ "$NAME" = "dskreads" ]; then
                           DSKREADS=$VALUE
                fi
        if [ "$NAME" = "bufreads" ]; then
           BUFREADS=$VALUE
        fi
   fi
     done
   let "percent = $BUFREADS * 100 / ($BUFREADS + $DSKREADS)"
   if [ $percent -lt 95 ]; then
	 STATUS=WARNING
	 echo "============================================================" >>$LOGSYS
         echo "ATENCION: Porcentaje impacto en cache muy bajo $percent" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# WriteCacheCheck
#    Purpose: 	Checks the current write cache rate of your database server.
#    Reason: 	Almost the same as the above described 'ReadCacheRate'. The goal
#               for OLTP systems is to keep the write cache rate over 85 percent.
#               However depending on the nature of the application (for example
#               write-intensive batch applications) this might not always be possible.
# ************************************************************************
do_WriteCacheCheck()
{
   echo "--- $INFORMIXSERVER : Verificando porcentaje de escrituras en cache " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>/dev/null 2>&1 <<!
        UNLOAD TO "$TMPFILE"
        SELECT name,  value
          FROM sysprofile spe
         WHERE spe.name IN ("dskwrites", "bufwrites")
         ORDER BY 1
!
   for line in `cat $TMPFILE`; do      # pipe the output to while read
       if [ "$line" ]; then # check if line is not NULL
          NAME=`echo $line | awk -F'|' '{ print $1 }'`
          VALUE=`echo $line | awk -F'|' '{ print $2 }'`
          if [ "$NAME" = "dskwrites" ]; then
             DSKWRITES=$VALUE
          fi
          if [ "$NAME" = "bufwrites" ]; then
             BUFWRITES=$VALUE
          fi
      fi
   done
   let "percent = $BUFWRITES * 100 / ($BUFWRITES + $DSKWRITES)"
   if [ $percent -lt 95 ]; then
	 STATUS=WARNING
	 echo "============================================================" >>$LOGSYS
         echo "ATENCION: Porcentaje impacto en cache muy bajo $percent" >>$LOGSYS
	 echo "============================================================" >>$LOGSYS
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# SequentialScansCheck
#    Purpose: 	Checks the number of sequential scans that occurred on individual tables.
#    Reason: 	Sequential scans on large tables should normally be avoided in OLTP
#               systems. In data warehouse environments they are quite common.
# ************************************************************************
do_SequentialScansCheck()
{
# ti_nextns  ( number of extents )
# ti_nptotal ( space allocated )
# ti_npused  ( space used )
# ti_npdata  ( space used by data , indexes excluded )

   echo "--- $INFORMIXSERVER : Verificando sequential scans " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<!
         SELECT stn.dbsname[1,18], stn.tabname[1,18], sti.ti_npdata, sti.ti_nrows, spf.seqscans
           FROM systabnames stn, systabinfo sti, sysptprof spf
          WHERE stn.partnum = sti.ti_partnum
            and stn.partnum = spf.partnum
            and sti.ti_npdata >= $MAXSEQSCANSSIZE
            and spf.seqscans >= $MAXSEQSCANS
            and stn.dbsname NOT IN ('sysadmin')
            and bitand(sti.ti_flags,"0x8000004") = 0
!
   if [ $? != 0 ]; then
         STATUS=ERROR
         echo "ERROR: error en verificación de sequential scans" >>$LOGSYS
         cat $TMPFILE >> $LOGSYS
   else
      if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then
         STATUS=WARNING
         echo "ATENCION: sequential scans exceden $MAXSEQSCANS" >>$LOGSYS
         cat $TMPFILE >> $LOGSYS
      fi
   fi
   rm -f $TMPFILE
}

# ************************************************************************
# ReadyQueueCheck
#    Purpose: 	Counts the number of threads currently waiting on the ready queue.
#    Reason: 	Threads will be put on the ready queue because all available CPU virtual processors (VPs) are currently busy. They wait for a free virtual processor, hence the database session is blocked. A constantly large number of threads on the ready queue ('onstat -g rea'), leads to the conclusion that you have to add additional CPU VPs.

#    However if you have already configured the same number of CPU VPs as physical processors available in the machine, you might have to add more physical processors or investigate other performance tuning activities. This domain inspector allows you to specify the number of samples that should be taken before computing the average number of threads on the ready queue. This ensures that the computed value is more representative.
# ************************************************************************
do_ReadyQueueCheck()
{
   echo "--- $INFORMIXSERVER : Verificando hebras esperando una ready queue " >>$LOGSYS
# onstat -g rea

# SHOW: lines, tids, thread_counts, total_thread_counts, avg_thread_counts
}


# ************************************************************************
# dbWho
#    Purpose: 	List users conected to each database.
#    Reason:
# ************************************************************************
do_dbWho()
{
   echo "--- $INFORMIXSERVER : Verificando lista de usuarios conectados " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>&1 <<!
        select sysdatabases.name[1,18] database,
               syssessions.username[1,18],
               syssessions.hostname,
               syslocks.owner sid
          from syslocks, sysdatabases , outer syssessions
         where syslocks.rowidlk = sysdatabases.rowid
           and syslocks.tabname = "sysdatabases"
           and syslocks.owner = syssessions.sid
         order by 1;
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "ERROR: error en obtencion de la lista de usuarios" >>$LOGSYS
   fi
}


# ************************************************************************
# dbList
#    Purpose: 	List all databases, owner and logging status
#    Reason:
# ************************************************************************
do_dbList()
{
   echo "--- $INFORMIXSERVER : Lista de las BB.DD. y sus dbspaces " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>$ERRFILE <<!
     select substr(dbinfo("DBSPACE",partnum), 1, 18) dbspace, name[1,18] database, owner[1,15],
            is_logging logging, is_buff_log buff_log
       from sysdatabases
      order by dbspace, name;
!
   if [ $? != 0 ]; then
	 STATUS=ERROR
	 echo "ERROR: error en obtencion de la lista de bases de datos" >>$LOGSYS
	 cat $ERRFILE >>$LOGSYS
   fi
   rm -f $ERRFILE
}


# ************************************************************************
# do_dbRotateLogs
#    Purpose: 	Rotate IBM-IDS logs and remove old assert fails
#    Reason:
# ************************************************************************
do_dbRotateLogs()
{
   # Eliminamos de /tmp o /usr/tmp assert-faileds de mas de 7 dias
   echo "Eliminando ficheros assert fail de IBM-IDS -af.*-" >> $LOGSYS
   find /tmp \( -name 'af.*' \) -atime +7 -print -exec rm '{}' \;
   find /usr/tmp \( -name 'af.*' \) -atime +7 -print -exec rm '{}' \;
   if [ -f $MSGPATH ]; then
      cp $MSGPATH ${MSGPATH}.`date '+%w'`
      cat /dev/null > $MSGPATH
   fi
}


# ************************************************************************
# do_dbCheckDistributions
#    Purpose: 	Check if DB contains statistics updated with distributions
#    Reason:	update statistics with distributions has been proved that
#               has a bad effect in performance
# ************************************************************************
do_dbCheckDistributions()
{
   DBSLIST=""

   echo "--- $INFORMIXSERVER : Verificando si hay estadisticas con distribuciones " >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF
	SET ISOLATION TO DIRTY READ;
	UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' '
	SELECT name FROM sysdatabases
	WHERE name NOT MATCHES "sys*"
EOF
   if [ $? -gt 0 ]; then
	STATUS=ERROR
	echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS
   fi
   DBSLIST=`cat /tmp/dbslist.$$`
   rm -f /tmp/dbslist.$$

   for DBS in `echo $DBSLIST | sed 's/name //g'`; do

      {
      su informix -c "$INFORMIXDIR/bin/dbaccess $DBS -" 2>/dev/null <<!
           output to pipe "cat" without headings
            SELECT COUNT(*) FROM sysdistrib
!
      } | while read line; do         # pipe the output to while read
         if [ -n "$line" ]; then # check if line is not NULL
           if [ "$line" -gt 0 ]; then
              STATUS=WARNING
              echo "============================================================" >>$LOGSYS
              echo "ATENCION: $DBS con estadisticas de distribucion (sysdistributions)" >>$LOGSYS
              echo "============================================================" >>$LOGSYS
           fi
         fi
         done
   done
}
# ************************************************************************
# do_dbDeisterLogs
#    Purpose: 	Check if Deister logical log backup is working ok
#    Reason:
# ************************************************************************
do_dbDeisterLogs()
{
   LTAPEDEV=`su - informix -c "onstat -c" | grep "^LTAPEDEV" | awk '{ print $2 }'`
   ALARMPROGRAM=`su - informix -c "onstat -c" | grep "^ALARMPROGRAM" | awk '{ print $2 }'`
   #En caso de que ALARMPROGRAM viene especificad con $INFORMIXDIR
   ALARMPROGRAM=`eval echo "$ALARMPROGRAM"`
   if [ "`grep -c DEISTER $ALARMPROGRAM`" == "0" ]; then
      STATUS=ERROR
      echo "El programa de backup de logical logs $ALARMPROGRAM no es el estándar de DEISTER" >>$LOGSYS
   fi
}

# ************************************************************************
# do_DeleteWebStudioLogs
#     Purpose: 	Check to see if there are any ongoing long transactions.
#     Reason: 	Long transactions should be avoided. They consume major resources
#               of your database server. If a long transaction exclusive high water
#               mark (LTXEHWM) is reached, all other write activities will be blocked.
# ************************************************************************
do_DeleteWebStudioLogs()
{
   echo "--- $INFORMIXSERVER : Borrando logs de WebStudio en wic_conf" >>$LOGSYS
   su informix -c "$INFORMIXDIR/bin/dbaccess wic_conf -" >>$LOGSYS 2>$ERRFILE <<!
	DELETE FROM wic_user_logs     WHERE DATE(log_date)   < TODAY-90 UNITS DAY;
	DELETE FROM wic_user_xsllogs  WHERE DATE(xsl_date)   < TODAY-90 UNITS DAY;
	DELETE FROM wic_user_qrylogs  WHERE DATE(query_date) < TODAY-90 UNITS DAY AND user_code NOT IN('ldr','vsc','als');
	DELETE FROM wic_user_trxlogs  WHERE DATE(trx_date)   < TODAY-90 UNITS DAY;
	DELETE FROM wic_jcub_xmldat   WHERE DATE(cub_expires)< TODAY-90 UNITS DAY;
	DELETE FROM wic_messageboards WHERE DATE(msg_date)   < TODAY-90 UNITS DAY;
	DELETE FROM wic_user_xsltjobs WHERE DATE(job_date)   < TODAY-90 UNITS DAY AND job_stat = -1;
	DELETE FROM wic_user_jrepjobs WHERE DATE(job_date)   < TODAY-90 UNITS DAY AND job_stat = -1;
!
  if [ $? != 0 ]; then
       STATUS=ERROR
       echo "ERROR: error borrando los logs de wic_conf" >>$LOGSYS
		   cat $ERRFILE >>$LOGSYS
  fi
  rm -f $ERRFILE $TMPFILE
}


#######################################################
# Main
#######################################################

echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: Check database engine status"                  >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS

echo "Arguments:" >> $LOGSYS
echo $* >> $LOGSYS
echo >> $LOGSYS
echo >> $LOGSYS

#default value
SPEXCLUDE="''"
MAXDBSPACEFULL=80
MAXCHKPOINT=30
MAXTABLEEXTENTS=15
MAXTABLEPAGES=15000000
MINFREELOGSIZE=10000
MAXLOCKS=10
MAXVIRTSEGMENT=2
MAXSESMEMORY=2048000
MAXFGWRITES=100
MAXDEADLKS=1
MAXSEQSCANS=100
MAXSEQSCANSSIZE=20

# Analize parameters to exceed default values
while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--spexclude|--maxdbspacefull|--maxchkpoint|--maxtableextents|--maxtablepages| \
       --minfreelogsize|--maxlocks|--maxvirtsegment|--maxsesmemory|--maxfgwrites|--maxdeadlks|--maxseqscans|--maxseqscanssize)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;;
       --) break;;
       -*) usage "unknown argument: $1";;
        *) break;;
    esac
    shift
    shift
done

do_DbmStatusCheck
do_DbmHdrStatusCheck
do_OntapeCheck
do_LongTxCheck
do_ConnectCheck
do_DbspaceFullCheck
do_CheckpointCheck
do_OnlineLogCheck
do_LogFullCheck
do_MaxExtentCheck
do_MaxPageCheck
do_SessionLockCheck
do_VirtualSegmentCheck
do_DbspaceDownCheck
do_ChunkDownCheck
do_SessionMemoryCheck
do_ForegroundWriteCheck
do_DeadLockCheck
do_ReadCacheCheck
do_WriteCacheCheck
do_SequentialScansCheck
do_ReadyQueueCheck
#do_dbWho
#do_dbList
do_dbCheckDistributions
do_dbRotateLogs
do_dbDeisterLogs
#do_DeleteWebStudioLogs

echo ""                                                    >>$LOGSYS
echo "#% status: $STATUS"                                  >>$LOGSYS
echo "#% motive: $MOTIVE"                                  >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                        >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                           >>$LOGSYS
echo ""                                                    >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "               >>$LOGSYS
echo "===================================================" >>$LOGSYS

# ************************************************************************
# We send the result of the process to the administrator via e-mail.
# In this way we make sure that the administrator always knows
# if the process is executed correctly or not.
# For this you have to make sure that the equipment can do mail relay.
# ************************************************************************
if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi

# END dbs_checkdb

Give it execution permissions:

Copy
chmod +x dbs_checkdb.sh

Finally add the root crontab in the following execution:

Copy
crontab -e
Copy
15  4 * * * /CONFIG/SCRIPTS/dbs_checkdb.sh

7 Copy to USB device

Create a file named usb_mirror.sh in the /CONFIG/SCRIPTS directory:

Copy
cat > usb_mirror.sh

And paste the following code:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creacion, produccion o prestacion del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de perdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a traves de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, accion humana o inaccion
# del sistema informatico, linea telefonica, hardware, software o errores
# en el programa.
#
# description: Copia de directorios a un dispositivo de almacenamiento USB
# processname: usb_mirror.sh
#
# ===========================================================================
 
before="$(date +%s)"
 
USBPATH=/media/WD
DIRECTORIES="home backup"
LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log
LOGSYS_VERBOSE=/usr/tmp/`basename $0 .sh`.`date +%w`.verbose
STATUS=OK
 
[ `uname -s` = "SunOS" ] && MAIL=mailx || MAIL=mail
 
while :
   do
        case $1 in
                --mailto)     shift; MAILTO=$1; shift;;
                --)     shift; break;;
                -*)     usage;;
                *)      break;;
        esac
done
 
echo "#% "                                                     >$LOGSYS
echo "#% START"                                               >>$LOGSYS
echo "#% name: `basename $0 .sh`"                             >>$LOGSYS
echo "#% desc: USB Mirror directories"                        >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo "#% host: `uname -n`"                                    >>$LOGSYS
echo "#% date: `date +%d-%m-%Y`"                              >>$LOGSYS
echo "#% time: `date +%H:%M`"                                 >>$LOGSYS
echo "#% "                                                    >>$LOGSYS
echo " "                                                      >>$LOGSYS
 
if [ -n "$MAILTO" ]; then
   echo "Defined mail to send log: $MAILTO"                      >>$LOGSYS
   echo " "                                                      >>$LOGSYS
fi
 
 
# -----------------------------------------------------------
#
# -----------------------------------------------------------
echo "Mounting filesystem ..." >> $LOGSYS
mount $USBPATH
 
if [ `mount | grep $USBPATH | wc -l` -eq 0 ]; then
   echo "ERROR USB DEVICE: filesystem '$USBPATH' not mounted" >> $LOGSYS
   STATUS=ERROR
fi
 
if [ ! -d $USBPATH ]; then
   echo "ERROR USB DEVICE: filesystem '$USBPATH' not found" >> $LOGSYS
   STATUS=ERROR
fi
 
 
# -----------------------------------------------------------
# MIRRORING si el dispositiu USB esta disponible.
# -----------------------------------------------------------
if [ "$STATUS" = "OK" ]; then
    for DIR in $DIRECTORIES ; do
 
       echo "" >> $LOGSYS
       echo "Processing directory /$DIR" >> $LOGSYS
 
       # Status del directori origen
       SRC_DIR_STATUS=0
 
       if [ ! -d /$DIR ]; then
          echo "   ERROR: Directory /$DIR not exists" >> $LOGSYS
          STATUS=ERROR
          SRC_DIR_STATUS=1
       fi
 
       # Status del directori desti a usb device
       USB_DIR_STATUS=0
 
       if [ "$SRC_DIR_STATUS" = "0" ] && [ ! -d $USBPATH/$DIR ]; then
          echo "   Creating directory $USBPATH/$DIR ..." >> $LOGSYS
          mkdir $USBPATH/$DIR
 
          USB_DIR_STATUS=$?
          if [ "$USB_DIR_STATUS" != "0" ]; then
             echo "   ERROR USB DEVICE: directory '$USBPATH/$DIR' can not be created" >> $LOGSYS
             STATUS=ERROR
          else
             echo "   Directory $USBPATH/$DIR created" >> $LOGSYS
          fi
       fi
 
       if [ "$SRC_DIR_STATUS" = "0" ] && [ "$USB_DIR_STATUS" = "0" ]; then
           # Degut al gran nombre de linies emeses, el verbose el poso en altre fitxer
           # per a que no ho envii el sys_htmllogs (te extensio .verbose, no .log).
           # Pot arribar a generar un fitxer de 70MB i mig milio de linies.
           echo "   Mirroring /$DIR $USBPATH/$DIR" >> $LOGSYS
           mirrordir --verbose --no-netrc /$DIR $USBPATH/$DIR >> $LOGSYS_VERBOSE
       fi
 
    done
fi
 
echo "" >> $LOGSYS
 
# Compressio del fitxer verbose.
echo "GZIP Compress file verbose $LOGSYS_VERBOSE" >> $LOGSYS
gzip -f $LOGSYS_VERBOSE
 
# -----------------------------------------------------------
# After copy ... delete recycle dirs
# -----------------------------------------------------------
for dir in `find /home -name .recycle -type d`; do
    echo rm -rf $dir
done
 
# -----------------------------------------------------------
# Verify size of USB device
# -----------------------------------------------------------
echo "" >> $LOGSYS
echo "Verify free space in filesystem $USBPATH ..." >>$LOGSYS
echo df -k $USBPATH | sed '1d' | sed 's/%/ /g' >>$LOGSYS
df -k $USBPATH | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > 80 ) printf("FILESYSTEM %s con %d%% ocupado\n", $6, $5) }' > /tmp/checkos_df.tmp
if [ -s /tmp/checkos_df.tmp ]; then
    STATUS=ERROR
    echo "ERROR USB DEVICE: filesystem space free < 20% " >>$LOGSYS
fi
rm -f /tmp/checkos_df.tmp
 
 
after="$(date +%s)"
elapsed_seconds="$(expr $after - $before)"
echo "Elapsed time for USB mirror is: '$elapsed_seconds'" >> $LOGSYS
 
# -----------------------------------------------------------
# umount
# -----------------------------------------------------------
echo "Umounting filesystem to safe USB device" >> $LOGSYS
umount $USBPATH
 
echo ""                                                       >>$LOGSYS
echo "#% status: $STATUS"                                     >>$LOGSYS
echo "#% motive: $MOTIVE"                                     >>$LOGSYS
echo "#% enddate: `date +%d-%m-%Y`"                           >>$LOGSYS
echo "#% endtime: `date +%H:%M`"                              >>$LOGSYS
echo ""                                                       >>$LOGSYS
echo "END $STATUS `basename $0 .sh` `date` "                  >>$LOGSYS
echo "======================================================" >>$LOGSYS
 
if [ -n "$MAILTO" ]; then
    echo "sending mail"
    echo $MAIL -s "$STATUS USB MIRROR at `uname -n` `date`" $MAILTO
    $MAIL -s "$STATUS USB MIRROR at `uname -n` `date`" $MAILTO < $LOGSYS
    echo "sending mail done"
fi

Darle permisos de ejecución:

Copy
chmod +x usb_mirror.sh

Finalmente añadir en el crontab de root la siguientes ejecución:

Copy
crontab -e
Copy
30  4 * * 1-5 /CONFIG/SCRIPTS/usb_mirror.sh --mailto "sysadmin@empresa.es"

Donde sysadmin@empresa.es debe ser reemplzado por la dirección de correo electrónico del administrador de sistemas responsable de la instalación.

8 Resumen de actividad

Crear un archivo de nombre sys_htmllogs.sh en el directorio /CONFIG/SCRIPTS

Copy
cat > sys_htmllogs.sh

Y pegar el siguiente código:

Copy
#!/bin/sh
# ===========================================================================
# Este documento contiene datos propiedad intelectual de DEISTER
# S.A. Este documento no puede ser  publicado,  copiado o cedido
# total o parcialmente sin permiso escrito de DEISTER S.A.
#
# Al utilizar este software, usted reconoce y concuerda que su uso
# es bajo su responsabilidad y que ninguna de las partes involucradas
# en la creación, producción o prestación del servicio es responsable
# de cualquier perjuicio directo, incidental, consecuente, indirecto
# o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios
# legales, honorarios de peritos u otro desembolso) que pueda surgir
# directa o indirectamente a través de su uso, incluyendo pero no
# limitado a lo causado por virus, defectos, acción humana o inacción
# del sistema informático, línea telefónica, hardware, software o errores
# en el programa.
#
# description: Envio de correo electronico resumen
# processname: sys_htmllogs.sh
#
# ===========================================================================

STATUS=OK
MOTIVE=""
LOGSYS=/tmp/`basename $0 .sh`.`date +%w`.log

WEEKDAY=`date +%w`
LOGFILES=`ls -rt /usr/tmp/*.${WEEKDAY}.log`
CURRDATE=`date +%d-%m-%Y`
CURRHOST=`uname -n`

# Usage message.
usage () {
   STATUS=ERROR
   MOTIVE="Usage: `basename $0` --mailto <"user1@domain.es,user2@domain.es,..."> \
                               [--mailerror <"user1@domain.es,user2@domain.es,...">]\
                               [--pexclude <"nas_mirror\|sys_rsync">]"
   echo >> $LOGSYS
   echo "Error: $1" >> $LOGSYS
   echo >> $LOGSYS
   echo $MOTIVE >> $LOGSYS
   exit 1
}

#send email
do_mail ()
{
   cat -v $LOGSYS | mail -s "$(echo -e "$STATUS `basename $0 .sh`\nContent-Type: text/html")" -r `hostname` $1
}

if [ "X`echo -n`" = "X-n" ]; then
   echo_n() { echo ${1+"$@"}"\c"; }
else
   echo_n() { echo -n ${1+"$@"}; }
fi

check_log()
{
   FILENAME=`basename $1`
   FILEPROC=`grep '#% name:' $1 | tail -1 | awk '{ print $3 }'`
   FILEDATE=`grep '#% date:' $1 | tail -1 | awk '{ print $3 }'`
   FILETIME=`grep '#% time:' $1 | tail -1 | awk '{ print $3 }'`
   FILEHOST=`grep '#% host:' $1 | tail -1 | awk '{ print $3 }'`
   FILESTAT=`grep '#% status:' $1 | tail -1 | awk '{ print $3 }'`
   FILEMOTI=`grep '#% motive:' $1 | tail -1 | awk '{ print substr($0, 12) }'`

   if [ "$FILEPROC" == "" ] && [ "$STATUS" == "OK" ]; then
      STATUS=WARNING
      MOTIVE="$MOTIVE File: $FILE Header #% Not found <BR>"
   fi
   if [ "$FILESTAT" == "ERROR" ] && [ "$STATUS" != "ERROR" ]; then
      STATUS=ERROR
      MOTIVE="File: $FILE status: ERROR <BR>"
   fi
   if [ "$FILESTAT" == "WARNING" ] && [ "$STATUS" == "OK" ]; then
      STATUS=WARNING
      MOTIVE="File: $FILE status: WARNING <BR>"
   fi
}

# ************************************************************************
#
# Main
#
# ************************************************************************

# -------------------------------------------------------------------
# Parse and verify arguments
# -------------------------------------------------------------------
if [ $# -eq 0 ]; then
  usage "missing arguments"
fi

while echo $1 | grep ^- > /dev/null; do
    case $1 in
       --mailto|--mailerror|--pexclude)
           eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;;
       --) break;;
       -*) usage "unknown argument: $1";;
        *) break;;
    esac
    shift
    shift
done

#Required params
REQPARAMS=( mailto )
for PARAM in "${REQPARAMS[@]}" ; do
   arg=`echo $PARAM | tr 'a-z' 'A-Z'`
   if [ -z ${!arg} ]; then
  usage "missing argument --$PARAM"
   fi
done

if [ -n "$PEXCLUDE" ]; then
   LOGFILESAUX=""
   for FILE in $LOGFILES; do
     echo "$FILE" | grep -q "$PEXCLUDE"
     if [ $? -eq 0 ];then
      continue
     fi
     LOGFILESAUX="$LOGFILESAUX $FILE"
   done
   LOGFILES=$LOGFILESAUX

fi

echo "<HTML>"                                                        >$LOGSYS
echo "<BODY STYLE='font-family: arial,helvetica; fot-size: 8pt;'>"  >>$LOGSYS
echo "<A NAME='TOP'>"                                               >>$LOGSYS
echo "<TABLE CELLSPACING='0' BORDER='1'>"                           >>$LOGSYS
echo "<TR><TD BGCOLOR='#FFFFCC'><H1><FONT SIZE='3'>"                >>$LOGSYS
echo "Name: `basename $0`<BR>"                                      >>$LOGSYS
echo "Host: `uname -n`<BR>Date: `date`" >>$LOGSYS
echo "</FONT></H1></TD></TR>" >>$LOGSYS
echo "<TR><TD>" >>$LOGSYS
echo "<H2><font size='2'>Resumen de las operaciones</FONT></H2>" >>$LOGSYS

# Se usa el parametro -rt para ordenar por fecha de creacion
# de mas antigua a mas nueva. De esto modo los ficheros se
# concatenan ordenados por fecha.
echo "<UL>" >>$LOGSYS
for FILE in $LOGFILES; do
    check_log $FILE
    if [ -n "$FILEPROC" ]; then
      echo_n "<LI><A HREF='#$FILE'>" >>$LOGSYS
      if [ "$FILESTAT" != "OK" ]; then
        echo_n "<FONT FACE='courier' COLOR='RED'>" >>$LOGSYS
      else
        echo_n "<FONT FACE='courier'>" >>$LOGSYS
      fi
      echo_n "<PRE STYLE='display: inline; white-space: pre; font-size: 9pt'>" >>$LOGSYS
      echo "$FILESTAT#$FILENAME#$FILEDATE#$FILETIME" | awk -F#  '{ printf "%-5s %-24s %-10s %-5s",$1,$2,$3,$4 }' >>$LOGSYS
      echo_n "</PRE>" >>$LOGSYS
      echo_n "</FONT>" >>$LOGSYS
      echo "</A></LI>" >>$LOGSYS
    fi
done
echo "</UL><BR>" >>$LOGSYS



# Verificamos que estamos mirando los logs adecuados
# y que son de la fecha correcta
STATUS="OK"
for FILE in $LOGFILES; do
    check_log $FILE
    if [ -n "$FILEPROC" ]; then
      if [ "$FILEDATE" != "$CURRDATE" ]; then
        echo "<FONT COLOR='RED' SIZE='2'>WARNING: File: $FILE Date expected: [ $CURRDATE ] Found: [ $FILEDATE ] </FONT><BR>" >>$LOGSYS
      fi
    fi
done

echo "<BR></TD></TR>" >>$LOGSYS
for FILE in $LOGFILES; do
    check_log $FILE

    BGCOLOR="#CCCCCC"
    if [ "`grep '#% status:' $FILE | tail -1 | awk '{ print $3 }'`" != "OK" ]; then
            BGCOLOR="#FFDDCC"
    fi
    echo "<TR><TD BGCOLOR='$BGCOLOR'><A NAME='$FILE'><PRE>" >>$LOGSYS
    grep "#%" $FILE >> $LOGSYS
    if [ `grep -c "#%" $FILE` -eq 0 ]; then
       echo "$FILE" >> $LOGSYS
    fi
    echo "</PRE>"  >> $LOGSYS
    echo "<A HREF='' onclick='document.getElementById(\"`basename $FILE`\").style.display=\"block\"; return false;'>Show</A>"  >> $LOGSYS
    echo "</TD></TR>" >>$LOGSYS
    echo "<TR><TD><PRE ID='`basename $FILE`' STYLE='font-size: 8pt; display: none'>" >>$LOGSYS

    # Emitimos el body del log
    grep -v "#%" $FILE >> $LOGSYS
    echo "</TD></TR>" >>$LOGSYS
done
echo "</TABLE>" >>$LOGSYS
echo "</BODY></HTML>" >>$LOGSYS

# ************************************************************************
#
# Enviamos el resultado del proceso al administrador via e-mail.
# De este modo nos aseguramos que el administrador siempre sabe
# si el proceso se ejecuta correctamente o no.
# Para ello hay que asegurase que el equipo puede hacer mail relay.
#
# ************************************************************************
if [ -n "$MAILTO" ]; then
     do_mail $MAILTO
fi
if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then
     do_mail $MAILERROR
fi
rm -f $LOGSYS

# END sys_htmllogs

Darle permisos de ejecución:

Copy
chmod +x sys_htmllogs.sh

Finalmente añadir en el crontab de root la siguiente ejecución:

Copy
crontab -e
Copy
00  8 * * * /CONFIG/SCRIPTS/sys_htmllogs.sh --mailto "sysadmin@empresa.es"