#! /bin/sh

run(){
  echo "== $1 =="
  sh -c "$@" || true
}

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
export PATH

exec 2>&1

if [ "`id -u`" -ne 0 ]; then
        echo
	echo WARNING: rerun $0 as root for fuller results.
        echo
fi

nss_db_status () {
    db_path="$1"
    if [ ! -e "$db_path" ]; then
	echo "NSS database path '$db_path' does not exist"
	return
    fi
    run "ls '$db_path'"
    dbm_files_found=0
    sql_files_found=0
    secmod_found=0
    key3_found=0
    cert8_found=0
    pkcs11_found=0
    key4_found=0
    cert9_found=0
    if [ -e "$db_path/secmod.db" ]; then
	dbm_files_found=$((dbm_files_found + 1))
	secmod_found=1
    fi
    if [ -e "$db_path/key3.db" ]; then
	dbm_files_found=$((dbm_files_found + 1))
	key3_found=1
    fi
    if [ -e "$db_path/cert8.db" ]; then
	dbm_files_found=$((dbm_files_found + 1))
	cert8_found=1
    fi
    if [ -e "$db_path/pkcs11.txt" ]; then
	sql_files_found=$((sql_files_found + 1))
	pkcs11_found=1
    fi
    if [ -e "$db_path/key4.db" ]; then
	sql_files_found=$((sql_files_found + 1))
	key4_found=1
    fi
    if [ -e "$db_path/cert9.db" ]; then
	sql_files_found=$((sql_files_found + 1))
	cert9_found=1
    fi

    if [ $dbm_files_found = 0 -a $sql_files_found = 0 ]; then
	echo "No NSS database found at '$db_path'"
    else
	if [ $dbm_files_found = 3 ]; then
	    echo "dbm format NSS database found at '$db_path'"
	elif [ $dbm_files_found != 0 ]; then
	    [ $secmod_found = 0 ] && echo "secmod.db is missing from dbm format NSS database at '$db_path'"
	    [ $key3_found = 0 ] && echo "key3.db is missing from dbm format NSS database at '$db_path'"
	    [ $cert8_found = 0 ] && echo "cert8.db is missing from dbm format NSS database at '$db_path'"
	fi
	if [ $sql_files_found = 3 ]; then
	    echo "sql format NSS database found at '$db_path'"
	elif [ $sql_files_found != 0 ]; then
	    [ $pkcs11_found = 0 ] && echo "pkcs11.txt is missing from sql format NSS database at '$db_path'"
	    [ $key4_found = 0 ] && echo "key4.db is missing from sql format NSS database at '$db_path'"
	    [ $cert9_found = 0 ] && echo "cert9.db is missing from sql format NSS database at '$db_path'"
	fi
    fi
}

run "id"
run "free"
run "stap -V"
run "which stap"
run "cat $HOME/.systemtap/rc"
run "which stap-server"
run "locate --regex '/stap(run|io|dyn)?$' | xargs ls -ald"
run "printenv | grep -E '^PATH=|^LD_LIBRARY_PATH=|^SYSTEMTAP_.*=|^XDG_DATA.*=|^NSS.*='"
run "stap -vv --vp 0002 --poison-cache -p4 -e 'probe begin {exit()}'"
run "gcc -v"
run "java -version"
run "uname -a"
run "dmesg | fgrep 'Linux version'"
run "dmesg | grep -E 'stap|systemtap' | tail -n 10"
run "hostname"
run "nslookup `hostname`"
run "cat /etc/hosts"
run "cat /var/log/stap-server/log"
run "cat /proc/cpuinfo | grep -E 'processor|vendor_id|model name|flags|bugs'"
run "cat /sys/kernel/security/lockdown"
if [ -x /usr/bin/dpkg ]; then
  # debian/ubuntu
  run "dpkg --list | grep -E 'systemtap|elfutils|kernel|linux|gcc|dyninst|java|byteman|avahi|nss|nspr|dejagnu|libdw' | awk '{print \$2,\$3}' | sort"
elif [ -x /usr/bin/rpm -o -x /bin/rpm ]; then
  # fedora/rhel/suse/...
  run "rpm -qa --qf '%{name}-%{version} %{release}.%{arch}\\t%{buildtime:date}@%{buildhost}\\n' | grep -E 'systemtap|elfutils|kernel|gcc|dyninst|java|byteman|avahi|nss|nspr|dejagnu|libdw' | sort"
elif [ -f /var/log/packages ]; then
  # slackware
  run "cat /var/log/packages | grep -E 'systemtap|elfutils|kernel|gcc|dyninst|java|byteman|avahi|nss|nspr|dejagnu' | sort -k9"
fi
run "egrep 'PROBE|RANDOMIZE|RELOC|TRACE|MARKER|KALLSYM|_DEBUG_|LOCKDEP|LOCKING|MODULE|FENTRY|_SIG|BPF' /lib/modules/`uname -r`/build/.config | grep -v not.set | sort | fmt -w 80"
run "find /debugfs /proc/sys /sys/kernel /dev -type f -path '*kprobe*' -o -path '*yama*' 2>/dev/null | xargs grep -H ."
run "lsmod"
run "avahi-browse -r -t _stap._tcp"
run "ifconfig -a"
run "ps awux | grep stap"
for dir in /boot /usr/lib/debug/lib/modules/`uname -r` /lib/modules/`uname -r`/build
do
    for file in $dir/vmlinuz-`uname -r` $dir/vmlinuz $dir/vmlinux-`uname -r` $dir/vmlinux `locate -r '/vmlinu[xz]' 2>/dev/null`
    do
        if [ -f $file ]; then
            if grep -q ELF $file; then
                echo $file
                run "(eu-readelf -n $file 2>/dev/null || readelf -n $file 2>/dev/null) | grep Build"
            fi
        fi
    done
done
locate vmlinux.id 2>/dev/null | while read file
do
    run "cat $file"
done
run "hexdump -C /sys/kernel/notes"
for file in /sys/module/*/notes/.*build*
do
    run "hexdump -C $file"
done
if [ -x /usr/bin/seinfo ]; then
   run "seinfo"
fi
if [ -x /usr/sbin/getenforce ]; then
   run "getenforce"
fi
if [ -x /usr/sbin/aa-status ]; then
   run "aa-status"
fi
echo "== NSS =="
if [ -n "$SYSTEMTAP_DIR" ]; then
    nss_db_status "$SYSTEMTAP_DIR/ssl/client"
    nss_db_status "$SYSTEMTAP_DIR/ssl/server"
fi
nss_db_status ~/.systemtap/ssl/client
nss_db_status ~/.systemtap/ssl/server
nss_db_status /etc/systemtap/ssl/server
nss_db_status /etc/systemtap/staprun
