| Path : /opt/ds_agent/ |
|
|
| Current File : //opt/ds_agent/dsa-state-capture.sh |
#!/bin/bash
# The first argument is the name of a directory where we can create files or symlinks.
# The agent will include any files we drop in the this directory in the diagnostic zip.
FileSizeLimit=0
if [ "$#" -ge 1 ]; then
cd "${1}"
shift
FileSizeLimit=${1}
shift
fi
# ------------------------------------------------------------------------
# make sure we are running as root and output is going to a file or pipe
if test -t 1 ; then
DATE=$(date +%Y%m%d-%H%M%S)
FILE="/tmp/dsa-state-$DATE"
echo output logged to $FILE 2>&1
exec >$FILE "$0" ${1+"$@"}
exit 1
fi
if test `id -u` -ne 0 ; then
echo rerunning script with sudo 2>&1
exec sudo "$0" $@
exit 1
fi
# ------------------------------------------------------------------------
# helper functions
die() {
echo >&2 $@
exit 1
}
header() {
echo
echo "#######################################################################################"
echo "### $@"
echo "#######################################################################################"
}
bag() {
for f in $*; do
test -r $f && header $f && cat $f
done
}
DSVA_PATH=/var/opt/ds_agent
DSVA_ENV=$DSVA_PATH/slowpath/dsva-ovf.env
DSVA_XML=$DSVA_PATH/slowpath/dsva-ovf.xml
IS_DSVA=0
if test -f "$DSVA_ENV" ; then
IS_DSVA=1
fi
# ------------------------------------------------------------------------
# fix the PATH
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
# ------------------------------------------------------------------------
# kernel info
PROC_FILES=$(ls /proc/*info /proc/cmdline /proc/version)
for f in $PROC_FILES ; do
ln -s "$f" proc-$(basename "${f}")
done
# ------------------------------------------------------------------------
# DSA/VMPD fd info
header "DS_AGENT/DS_AM FILE DISCRIPTOR LIST"
for i in $(pgrep ds_agent); do
echo "/proc/$i/fd:"
ls -l "/proc/$i/fd" 2>&1
done
for i in $(pgrep ds_am); do
echo "/proc/$i/fd:"
ls -l "/proc/$i/fd" 2>&1
done
# ------------------------------------------------------------------------
# dump all of proc
PROC_DSA=/proc/driver/dsa
if test -d "$PROC_DSA" ; then
PROC_DSA_FILES=$(find $PROC_DSA -type f | grep -v 'trace$' | sort)
for f in $PROC_DSA_FILES ; do
ln -s "$f" proc-dsa-$(basename "${f}")
done
#This is currently hanging on SuSE 10
#PROC_DSA_TRACE=/proc/driver/dsa/trace
#header "PROC: $PROC_DSA_TRACE"
#( sleep 2 ; ps aux \
# | awk '/[c]at.\/proc\/driver\/dsa\/trace/ {print $2}' \
# | xargs kill -INT ) &
#cat $PROC_DSA_TRACE 2>/dev/null
#echo ""
else
header "ERROR: no $PROC_DSA directory found"
fi
# dump all of gsch proc
PROC_GSCH=/proc/driver/gsch
if test -d "$PROC_GSCH" ; then
PROC_GSCH_FILES=$(find "${PROC_GSCH}" -maxdepth 1 -type f | sort)
PROC_GSCH_CACHE_FILES=$(find "${PROC_GSCH}/cache" -type f | sort)
PROC_GSCH_SCAN_FILES=$(find "${PROC_GSCH}/scan" -type f | sort)
PROC_GSCH_FLT_FILES=$(find "${PROC_GSCH}/flt" -type f | sort)
PROC_GSCH_REDIRFS_FILES=$(find "${PROC_GSCH}/redirfs" -type f | sort)
PROC_GSCH_SYSHOOK_FILES=$(find "${PROC_GSCH}/syshook" -type f | sort)
for f in $PROC_GSCH_FILES ; do
ln -s "$f" proc-gsch-$(basename "${f}")
done
for f in $PROC_GSCH_CACHE_FILES ; do
ln -s "$f" proc-gsch-cache-$(basename "${f}")
done
for f in $PROC_GSCH_SCAN_FILES ; do
ln -s "$f" proc-gsch-scan-$(basename "${f}")
done
for f in $PROC_GSCH_FLT_FILES ; do
ln -s "$f" proc-gsch-flt-$(basename "${f}")
done
for f in $PROC_GSCH_REDIRFS_FILES ; do
ln -s "$f" proc-gsch-redirfs-$(basename "${f}")
done
for f in $PROC_GSCH_SYSHOOK_FILES ; do
ln -s "$f" proc-gsch-syshook-$(basename "${f}")
done
else
header "INFO: no $PROC_GSCH directory found"
fi
# dump all of redirfs proc
PROC_REDIRFS=/sys/fs/redirfs
if test -d "$PROC_REDIRFS" ; then
PROC_REDIRFS_FILES="/sys/fs/redirfs/count /sys/fs/redirfs/filters/gsch_flt/paths";
for f in $PROC_REDIRFS_FILES ; do
ln -s "$f" proc-redirfs-$(basename "${f}")
done
else
header "INFO: no $PROC_REDIRFS directory found"
fi
# dump all of ds_am cgroup config
CGROUP_V1="/sys/fs/cgroup/cpu/ds_am"
CGROUP_V2="/sys/fs/cgroup/ds_am/"
header "DSAM CGROUP CPU CONFIG"
if test -d "$CGROUP_V1" ; then
echo "Dump $CGROUP_V1:"
find $CGROUP_V1 -maxdepth 1 -type f | sort | xargs tail -n 1
fi
if test -d "$CGROUP_V2" ; then
echo "Dump $CGROUP_V2:"
find $CGROUP_V2 -maxdepth 1 -type f | sort | xargs tail -n 1
fi
if ! test -d "$CGROUP_V1" && ! test -d "$CGROUP_V2" ; then
echo "INFO: no $CGROUP_V1 directory found"
echo "INFO: no $CGROUP_V2 directory found"
fi
# ------------------------------------------------------------------------
# dump all of bmhook proc and collect files
PROC_BMHOOK=/proc/driver/bmhook
if test -d "$PROC_BMHOOK" ; then
header "BMHOOK"
echo "Pattern files:"
ls -al /var/opt/ds_agent/**/tmbmf.ptn.*
echo "Dump /proc/driver/bmhook:"
find /proc/driver/bmhook/ -maxdepth 3 -type f | sort | xargs tail -n +1
fi
# ------------------------------------------------------------------------
# dump tmhook live patch config and collect files
TMHOOK_LIVEPATCH_CONFIG=/sys/kernel/livepatch/tmhook
header "THMOOK LIVE PATCH CONFIG"
if test -d "$TMHOOK_LIVEPATCH_CONFIG" ; then
echo "Dump $TMHOOK_LIVEPATCH_CONFIG:"
find $TMHOOK_LIVEPATCH_CONFIG -maxdepth 1 -type f | sort | xargs tail -n +1
else
echo "INFO: no $TMHOOK_LIVEPATCH_CONFIG directory found"
fi
# ------------------------------------------------------------------------
# get info about modules
LSMOD=$(which lsmod)
header "LSMOD"
${LSMOD} 2>&1
# ------------------------------------------------------------------------
# get info about PCI
LSPCI=$(which lspci)
header "LSPCI: tree"
${LSPCI} -tv 2>&1
header "LSPCI: verbose"
${LSPCI} -vv 2>&1
# ------------------------------------------------------------------------
# get info about USB
LSUSB=$(which lsusb)
header "LSUSB"
${LSUSB} 2>&1
# ------------------------------------------------------------------------
# get info about XEN
XEN_CAPS="/proc/xen/capabilities"
header "XEN: capabilities"
cat ${XEN_CAPS}
XENSTORE_LS=$(which xenstore-ls)
header "XEN: xenstore-ls"
${XENSTORE_LS} 2>&1
# ------------------------------------------------------------------------
# get info from ifconfig
IFCONFIG=$(which ifconfig)
header "IFCONFIG"
${IFCONFIG} -a 2>&1
# ------------------------------------------------------------------------
# get info from netstat
NETSTAT=$(which netstat)
if [ $IS_DSVA -eq "0" ]; then
header "NETSTAT: interfaces"
${NETSTAT} -ian 2>&1
fi
if [ $IS_DSVA -eq "1" ]; then
header "NETSTAT: interfaces"
${NETSTAT} -ean 2>&1
fi
header "NETSTAT: routes"
${NETSTAT} -ran 2>&1
if [ $IS_DSVA -eq "0" ]; then
header "NETSTAT: IP"
${NETSTAT} --ip -anp 2>&1
fi
# ------------------------------------------------------------------------
# get info from ethtool
ETHTOOL=$(which ethtool)
for eth in $(ifconfig -a | awk '/:Ethernet/ { print $1 }') ; do
header "ETHTOOL: info ${eth}"
"${ETHTOOL}" -i "${eth}" 2>&1
header "ETHTOOL: pause ${eth}"
"${ETHTOOL}" -a "${eth}" 2>&1
header "ETHTOOL: coalesce ${eth}"
"${ETHTOOL}" -c "${eth}" 2>&1
header "ETHTOOL: ring ${eth}"
"${ETHTOOL}" -g "${eth}" 2>&1
header "ETHTOOL: offload ${eth}"
"${ETHTOOL}" -k "${eth}" 2>&1
done
# ------------------------------------------------------------------------
# get stuff from sysctl
SYSCTL=$(which sysctl)
header "SYSCTL"
${SYSCTL} -A 2>&1
# ------------------------------------------------------------------------
# get stuff from dmesg
BOOT_DMESG=/var/log/dmesg
DMESG=$(which dmesg)
DMESG_LINES=100
header "DMESG: boot"
cat ${BOOT_DMESG}
header "DMESG: last ${DMESG_LINES}"
${DMESG} | tail -n ${DMESG_LINES}
MSGS=/var/log/messages
SYSL=/var/log/syslog
KERN=/var/log/kern.log
function save_sys_log()
{
local LOG_FILE=$1
local FILE_NAME=$(basename ${LOG_FILE})
tail -c ${FileSizeLimit} ${LOG_FILE} > ./${FILE_NAME}
}
if test -f "$MSGS" ; then
save_sys_log $MSGS
fi
if test -f "$SYSL" ; then
save_sys_log $SYSL
fi
if test -f "$KERN" ; then
header "$KERN"
cat "$KERN"
fi
# ------------------------------------------------------------------------
# get kernel config
CONFIG_GZ=/proc/config.gz
CONFIG_VER="/boot/config-$(uname -r)"
CONFIG_DEFAULT="/boot/config"
if test -f "${CONFIG_GZ}" ; then
header "CONFIG: config.gz"
zcat "${CONFIG_GZ}" | grep "^CONFIG_"
elif test -f "${CONFIG_VER}" ; then
header "CONFIG: $(uname -r)"
cat "${CONFIG_VER}" | grep "^CONFIG_"
else
header "CONFIG: default"
cat "${CONFIG_DEFAULT}" | grep "^CONFIG_"
fi
# ------------------------------------------------------------------------
# get kernel package versions
if ( which dpkg >/dev/null 2>&1 ) ; then
header "DPKG kernel packages"
dpkg -S /boot/vmlinu* | cut -d : -f 1 | xargs -n1 dpkg-query -W
fi
if ( which rpm >/dev/null 2>&1 ) ; then
header "RPM kernel packages"
rpm -qf /boot/vmlinu*
fi
# ------------------------------------------------------------------------
# get disk information
header "DISK Status"
df -h 2>&1
echo
grab() {
if test -x $1; then
header $1;
$* 2>&1
fi
}
LD_LIBRARY_PATH=/opt/ds_agent/lib grab /opt/ds_agent/ds_am -s 1
header "df -kH"
df -kH
mount
# ------------------------------------------------------------------------
# get stuff from ratt
RATT="/opt/ds_agent/ratt"
if test -x "$RATT" ; then
header "RATT version"
$RATT version 2>&1
echo
header "RATT inteface"
$RATT if 2>&1
echo
header "RATT blacklist"
$RATT blacklist -4 2>&1
$RATT blacklist -6 2>&1
echo
header "RATT conntrack UDP"
$RATT conntrack UDP 2>&1
echo
header "RATT conntrack TCP"
$RATT conntrack TCP 2>&1
echo
header "RATT stats"
$RATT stats -a 2>&1
echo
header "RATT trace"
$RATT trace -i 2>&1
echo
header "RATT tz"
$RATT tz 2>&1
echo
header "RATT var"
$RATT var 2>&1
echo
else
header "ERROR: no ratt tool found in $RATT"
fi
bag /var/opt/ds_agent/am/amgblcfg.xml
ln -s /opt/ds_agent/notifier_version.txt /var/opt/ds_agent/ds_monitor.log .
echo
# ------------------------------------------------------------------------
# get dsva stuff
if [ $IS_DSVA -eq "1" ]; then
header "DSVA INFORMATION STARTS HERE"
header "DSVA INFORMATION - dsva-ovf.env"
cat "$DSVA_ENV"
header "DSVA INFORMATION - dsva-ovf.xml"
cat "$DSVA_XML"
# ------------------------------------------------------------------------
# are we on the DSVA
conf="/var/opt/ds_agent/guests"
# get status of all upstart
header "DSVA Process List"
initctl list 2>&1
echo
initdir="/etc/event.d"
find $conf/ -mindepth 1 -maxdepth 1 -type d | while read i
do
uuid=`basename "$i"`
uuid_path=$conf/$uuid
#ignore 0000-0000-0000
uuid_len=$(echo ${#uuid})
if [ $uuid_len -gt 14 ] ; then
header "DS INFORMATION FOR GUEST:$uuid" 2>&1
header "uuid.map for GUEST:$uuid"
cat $conf/"${uuid}"/uuid.map >&1
echo
header "amvmcfg.xml for GUEST:$uuid"
cat $uuid_path/amvmcfg.xml
echo
header "# of quarantined file(s) GUEST:$uuid"
find $uuid_path/quarantined/ -maxdepth 1 -type f | wc -l 2>&1
header "RATT show interface for GUEST:$uuid"
$RATT -u "${uuid}" if >&1
echo
header "RATT variables for GUEST:$uuid"
$RATT -u "${uuid}" var >&1
echo
header "RATT stats for GUEST:$uuid"
$RATT -u "${uuid}" stats >&1
echo
header "RATT conntrack UDP for GUEST:$uuid"
$RATT -u "${uuid}" conntrack UDP >&1
echo
header "RATT conntrack TCP for GUEST:$uuid"
$RATT -u "${uuid}" conntrack TCP >&1
echo
header "ds_guest_agent.log for GUEST:$uuid"
cat $uuid_path/diag/ds_guest_agent.log
fi
done
fi
if [ -x /opt/ds_agent/dvfilter/vmguestinfo.sh ]; then
header "DSVA SLOWPATH UNACTIVATED VM INFO" 2>&1
/opt/ds_agent/dvfilter/vmguestinfo.sh -u >&1
fi
if [ -x /opt/ds_agent/dvfilter/vmguestinfo.sh ]; then
header "DSVA SLOWPATH ACTIVATED VM INFO" 2>&1
/opt/ds_agent/dvfilter/vmguestinfo.sh -a >&1
fi
if [ $IS_DSVA -eq "1" ]; then
header "DSVA YUM PACKAGE LIST" 2>&1
yum list >&1
else
if command -v rpm &> /dev/null; then
header "RPM PACKAGE LIST" 2>&1
timeout 10s rpm -qa >&1
fi
if command -v dpkg-query &> /dev/null; then
header "DPKG PACKAGE LIST" 2>&1
timeout 10s dpkg-query -l >&1
fi
fi
exit 0;