diff options
Diffstat (limited to 'extras')
-rwxr-xr-x | extras/rh-upload | 283 | ||||
-rwxr-xr-x | extras/sos-open | 151 | ||||
-rwxr-xr-x | extras/sysreport/functions | 132 | ||||
-rwxr-xr-x | extras/sysreport/sysreport-fdisk | 8 | ||||
-rwxr-xr-x | extras/sysreport/sysreport.legacy | 766 | ||||
-rw-r--r-- | extras/sysreport/text.xsl | 33 |
6 files changed, 1373 insertions, 0 deletions
diff --git a/extras/rh-upload b/extras/rh-upload new file mode 100755 index 00000000..75a86f43 --- /dev/null +++ b/extras/rh-upload @@ -0,0 +1,283 @@ +#!/bin/bash + +################################################################################# +# # +# rh-upload # +# Version - 0.3 # +# Copyright (c) 2007 Red Hat, Inc. All rights reserved. # +# # +# # +# Written by David Mair # +# Cleanup and generalized for any kind of file by Olivier Arsac # +# Idea stolen from Chris Snook :-) # +# # +# Purpose - To help in the automatic upload of files. # +# Specifically, this script will compress, encrypt, md5sum, # +# and upload the file automatically when invoked. # +# Items are optional and specified by command line switch. # +# ############################################################################### + + +## Global directives +umask 0077 + +## Declare some variables +Date=`/bin/date -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '` +Destination="dropbox.redhat.com" + +function usage { +cat <<EOF +rh-upload [-cehnNq] [-s size of hunks in MB] -f filename + rh-upload automates the upload of files to the Red Hat ftp. + The script helps the user to compress, checksum, encrypt and upload a file. + -c|--checksum : perform an md5 checksum on the file + -e|--encrypt : encrypt the file + -f|--file : file to act on (required) + -h|--help : show this usage help + -z|--compress : compress the file + -n|--noupload : Do NOT upload + -q|--quiet : Do everything I ask and do it quietly + -s|--split : split file into small hunks + +EOF +} + + +# echo to stderr +function echoe(){ + echo -e "$@" 1>&2 +} + +# echo unless in verbosity is too low +function echov(){ + local level="$1" + shift + if [[ $Verbose -ge "$level" ]]; then echo -e "$@"; fi +} + +# Parse command line options (and perform some checks) +function parse(){ + if [ $# == 0 ]; then + usage + exit 0 + fi + + TEMP=`getopt -o heuczqs:f:n --long help,encrypt,quiet,noupload,checksum,compress,split:,file: -n 'rh-upload' -- "$@"` + + if [ $? != 0 ]; then + echo "Options error -- Terminating..." >&2 + usage + exit 1 + fi + + eval set -- "$TEMP" + Upload=1 + Split=0 + Verbose=1 + Compress=0 + Encrypt=0 + Force=0 + while true; do + case "$1" in + -h|--help) usage; exit 0;; + -e|--encrypt) Encrypt=1; shift;; + -N|--noupload) Upload=0; shift;; + -c|--checksum) Checksum=1; shift;; + -q|--quiet) Verbose=0; shift;; + -z|--compress) Compress=1; shift;; + -s|--split) + case $2 in + "") echoe "You must specify a hunk size."; exit 1 ;; + *) Split=$2; shift 2;; + esac ;; + -F|--force) Force=1; shift;; + -f|--file) + case "$2" in + "") echoe "You must specify a file name."; exit 1 ;; + *) File=$2; shift 2;; + esac ;; + --) shift; break ;; + *) echoe "Wrong options or flag specified"; usage; exit 1;; + esac + done + + # Ensure the -f||--file flag was passed or die + if [ -z "$File" ]; then + echoe "The -f or --file flag is required! Terminating." + usage + exit 1 + fi + + # Validate the file exists or die + if [ ! -f "$File" ]; then + echoe "Invalid filename or file not found. Terminating." + exit 1 + fi + File_dirname=${File%/*} + File_basename=${File##*/} + File_ext=${File_basename##*.} + Src_file="$File" + Dst_file="$File_basename" +} + +function ticket(){ + echov 1 + echov 1 "We'll need to use your issue-tracker ticket number for a couple of things." + echo -n "Please enter ticket number: " + read Ticket_number + Dst_file="${Ticket_number}-${Date}-${File_basename}" +} + +# Compress the file +function compress(){ + if [ "$Compress" != 0 ]; then + echov 1 "Starting file compression. This may take some time." + # Begin compression of file + if [ ! -x /usr/bin/gzip ]; then + echoe "Cannot find gzip in /usr/bin/. Terminating." + exit 1 + else + /usr/bin/gzip --fast "$Src_file" + fi + Src_file="${Src_file}.gz" + Dst_file="${Dst_file}.gz" + fi +} + +# Encrypt the file +function encrypt(){ + if [ "$Encrypt" != 0 ]; then + echov 1 "Encrypting file. This should only take a few minutes." + if [ ! -x /usr/bin/openssl ]; then + echoe "Cannot find openssl in /usr/bin. Terminating." + exit 1 + fi + # Use the ticket number as the ssl keyfile name + Key_file="${Ticket_number}-${Date}.key" + /usr/bin/openssl rand -out "$Key_file" -base64 48 + echov 1 "You have chosen to encrypt your file. Your passkey file is: $Key_file" + echov 1 "Please attach this key to your ticket." + /usr/bin/openssl aes-128-cbc -in $Src_file -out $Src_file.aes -pass file:"$Key_file" + Src_file="$Src_file.aes" + Dst_file="$Dst_file.aes" + fi +} + +function checksum(){ + if [ "$Checksum" != 0 ]; then + echov 1 "Cheksuming $Src_file... (This should only take a few minutes)" + if [ ! -x /usr/bin/md5sum ]; then + echoe "Cannot find md5sum in /usr/bin. Terminating." + exit 1 + fi + MD5_file="${Ticket_number}-${Date}-checksum.out" + MD5_result=`/usr/bin/md5sum "$Src_file" | awk '{print $1}'` + echo "$MD5_result" > "$MD5_file" + echov 1 "The MD5 checksum is $MD5_result (in $MD5_file)." + fi +} + +function split(){ + if [ "$Split" -eq 0 ]; then + return + fi + local hunk_size="$Split" + if [[ "$hunk_size" -gt 0 ]] && [[ "$hunk_size" -lt 1001 ]]; then + if [ ! -x /usr/bin/split ]; then + echoe "Cannot find split in /usr/bin. Terminating." + exit 1 + fi + Split_dir="${Ticket_number}-${Date}" + # We need to make a directory to keep things sane + echov 1 "Creating directory $Split_dir to house file hunks..." + /bin/mkdir "$Split_dir" + echov 1 "Splitting $Src_file..." + /usr/bin/split -b "$hunk_size"m -d "$Src_file" "${Split_dir}/${Dst_file}" + else + echoe "Invalid hunk size argument. Please enter a number greater than 0 and less than 1001. Terminating." + exit 1 + fi +} + +function upload(){ + if [ "$Upload" -eq 0 ]; then + echov 1 "All file operations are complete. The file(s) is ready to upload at your convenience." + return + fi + echov 1 "The file(s) will now be uploaded." + echo -n "Please enter the destination host (default is $Destination): " + local destination_input + read destination_input + if [ "$destination_input" != "" ]; then + Destination=$destination_input + fi + echov 1 + echov 1 "Uploading to $Destination... (This could take quite a while)." + if [ ! -x /usr/bin/lftp ]; then + # No lftp installed + echov 1 "lftp could not be found in /usr/bin. The file(s) will need to be uploaded manually." + Ftp_res=255 + else + # Make the lftp script first + local script="/tmp/rh-upload-lftp.$$" + echo "lftp $Destination <<EOF" > $script + echo "cd incoming" >> $script + if [ "$Split" != 0 ]; then + echo "lcd $Split_dir" >> $script + echo "mirror -R" >> $script + else + echo "put $Src_file -o $Dst_file" >> $script + fi + echo "exit" >> $script + echo "EOF" >> $script + /usr/bin/lftp -f $script + Ftp_res=$? + fi +} + +function closure(){ + if [ "$Encrypt" != 0 ]; then + echov 1 "## File was encrypted with key $Key_file." + echov 1 "Please upload this key file to Issue Tracker or send it to your support representative for decryption after upload." + fi + + if [ "$Checksum" != 0 ]; then + echov 1 "## A checksum was performed on your file." + echov 1 "The MD5 checksum is $MD5_result (in $MD5_file)." + echov 1 "Please include this when updating your ticket so your support representative can verify the copy uploaded." + fi + + if [ "$Split" != 0 ]; then + echov 1 "## Your file was split and the hunks are in: $Split_dir/ " + fi + + if [ -n "$Ftp_res" ] && [ "$Ftp_res" -eq 0 ]; then + echov 1 "This script has completed successfully the upload." + if [ "$Compress" != 0 ] || [ "$Split" != 0 ]; then + echov 1 "You performed file encryption and/or file splitting." + echov 1 "You may consider removing those temporary files." + fi + else + echoe "Sorry unable to upload the files to $Destination. You may want to retry or do it manually." + fi + + if [ "$Compress" != 0 ]; then + echov 1 "It is NOT recommended to remove the gzipped copy of the file." + echov 1 "This is the only remaining copy of the file on your system." + echov 1 "It is recommended to retain the file until your support representative indicates that the problem has been identified and/or resolved." + fi +} + +function main(){ + # Run through the functions + parse $@ + ticket + compress + encrypt + checksum + split + upload + closure +} + +main $@ diff --git a/extras/sos-open b/extras/sos-open new file mode 100755 index 00000000..ffc9f051 --- /dev/null +++ b/extras/sos-open @@ -0,0 +1,151 @@ +#!/usr/bin/python + +import os, commands, getopt, sys, tarfile + +# FILES NEEDED BY CHECKSYSREPORT: /etc/redhat-release /etc/sysconfig/rhn/up2date rpm-Va installed-rpms uname lsmod + +CONFIG = {} +report_dirs = [] + +CONFIG["outdir"] = "/tmp/sysreports" +CONFIG["extract_reports"] = [] +CONFIG["spawn_terminal"] = False +if not sys.stdin.isatty(): CONFIG["spawn_terminal"] = True +else: CONFIG["spawn_terminal"] = False + +def cat(fname): + try: + fp = open(fname,"r") + print fp.read() + fp.close() + except: pass + +try: + opts, args = getopt.getopt(sys.argv[1:], "hi:w:vxf", ["help", "input="]) +except getopt.GetoptError: + # print help information and exit: + usage() + sys.exit(2) + +for o, a in opts: + if o == "-v": + verbose = True + if o == "-f": + CONFIG["spawn_terminal"] = False + if o == "-x": + CONFIG["spawn_terminal"] = True + sys.argv[sys.argv.index("-x")] = "-f" + if o in ("-h", "--help"): + usage() + sys.exit() + if o in ("-d"): + CONFIG["outdir"] = a + if o in ("-w"): + a = os.path.abspath(a) + try: os.stat(a) + except: print "ERROR: could not open", a + else: report_dirs.append(a) + + if o in ("-i"): + a = os.path.abspath(a) + try: os.stat(a) + except: print "ERROR: could not open", a + +if CONFIG["spawn_terminal"]: + print "spawning new terminal" + sys.argv[0] = os.path.abspath(sys.argv[0]) + os.system("gnome-terminal -e '%s'" % (' '.join(sys.argv))) + sys.exit() + +CONFIG["extract_reports"] = [os.path.abspath(a) for a in args] + +if not os.path.isdir(CONFIG["outdir"]): + if not os.path.exists(CONFIG["outdir"]): + exit("ERROR: working directory path exists but it's not a directory") + else: + try: os.mkdir(CONFIG["outdir"]) + except: exit("ERROR: could not create working directory") + +try: os.chdir(CONFIG["outdir"]) +except: exit("ERROR: could not chdir into working directory, please check permissions") + +for report in CONFIG["extract_reports"]: + report_ext = report.rsplit(".",1)[-1] + + if report_ext == "gpg": + clear_fname = os.path.join(CONFIG["outdir"],os.path.basename(report.rsplit(".",1)[0])) + status, output = commands.getstatusoutput("gpg --output %s %s" % (clear_fname,report)) + if status: + sys.exit("ERROR: could not decrypt using gpg" + output ) + report = clear_fname + report_ext = clear_fname.rsplit(".",1)[-1] + del clear_fname + + outdir = None + tar = tarfile.open(report, "r") + for tarinfo in tar: + if tarinfo.isdir(): outdir = tarinfo.name ; break + tar.close() + + if not outdir: + print("INFO: archive doesn't appear to be either a sysreport or sosreport") + cddir = os.path.basename(report) + for sout in [ ".tar.gz", ".tgz", ".tar.bz2" ]: + if cddir.endswith(sout): cddir = cddir[:-len(sout)] + cddir = os.path.abspath(os.path.join(CONFIG["outdir"],"extract_" + cddir)) + outdir = cddir + else: + cddir = CONFIG["outdir"] + outdir = os.path.abspath(os.path.join(CONFIG["outdir"], outdir)) + + extract = True + if os.path.isdir(outdir): + extract = False + yorno = False + print "This report already seems to have been extracted in:" + print " " + outdir + print + while yorno not in ['y','n']: yorno = raw_input("Do you want to replace it with a fresh copy ? (y/n) ").lower() + if yorno == 'y': + print "Deleting previous copy..." + os.system("chmod -R u+rw %s" % outdir) + os.system("rm -rf %s" % outdir) + extract = True + + if extract: + print "Extracting..." + if not os.path.isdir(cddir): + os.mkdir(cddir) + if report_ext == "bz2": + status, output = commands.getstatusoutput("tar xCfj %s %s" % (cddir,report)) + elif report_ext == "gz" or report_ext == "tgz" : + status, output = commands.getstatusoutput("tar xCfz %s %s" % (cddir,report)) + + if status: + print("ERROR: there was some problem extracting the report (%s)" % report) + + report_dirs.append(os.path.abspath(outdir)) + +if len(report_dirs) == 1 and os.path.isdir(report_dirs[0]): + os.chdir(report_dirs[0]) + + if os.path.isfile("sos_reports/diagnose.txt"): + print + print "Diagnostics messages available:" + print + fp = open("sos_reports/diagnose.txt","r") + for line in fp.readlines(): + print " " + line.strip("\n") + fp.close() + print + + report_dirs[0] + + print + print "The extracted report is located in: " + print " " + report_dirs[0] + print "Once finished, press exit to return." + print + cat("uname") + os.system("PS1='[SoS \W]\$ ' HOME='%s' /bin/bash -l" % (report_dirs[0]) ) + sys.exit(-1) diff --git a/extras/sysreport/functions b/extras/sysreport/functions new file mode 100755 index 00000000..fff52ccd --- /dev/null +++ b/extras/sysreport/functions @@ -0,0 +1,132 @@ +#! /bin/sh +export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin" +export LANG=C +export LC_ALL=C +export LC_CTYPE=C + +log="sysreport.log" + +fixupfile() { + if [ -f $2 ] ; then + /bin/sed -e$1 $2 > $2.newfile + /bin/mv $2.newfile $2 + fi + return 0 +} + +getpartinfo() { + # Get fdisk -l output from all disks/partitionable raid devices from /proc/partitions + raiddevs=`/bin/cat /proc/partitions | /bin/egrep -v "^major|^$" | /bin/awk '{print $4}' | /bin/grep \/ | /bin/egrep -v "p[0123456789]$"` + disks=`/bin/cat /proc/partitions | /bin/egrep -v "^major|^$" | /bin/awk '{print $4}' | /bin/grep -v / | /bin/egrep -v "[0123456789]$"` + echo "fdisk -l output" + for d in $raiddevs $disks ; do + echo "<---- Disk: /dev/${d} ---->" + echo "" + /sbin/fdisk -l /dev/${d} 2>&1 + echo "" + echo "<---- END ---->" + done +} + +getpciinfo() { +( echo "lspci" + echo + /sbin/lspci + echo + echo "lspci -n" + echo + /sbin/lspci -n + echo + echo "lspci -nv" + echo + /sbin/lspci -nv + echo + echo "lspci -nvv" + echo + /sbin/lspci -nvv ) 2>&1 +} + +catiffile() { + if [ -d $1 ]; then + /bin/cp -p -x --parents -R $1 $ROOT 2>>$ROOT/$log + find $ROOT/$1 -type b -o -type c | xargs rm -f 2>/dev/null || : + echo -n $STATUS + echo_success + return 1 + fi + if [ -f $1 ]; then + /bin/cp -p --parents $1 $ROOT 2>>$ROOT/$log + echo -n $STATUS + echo_success + return 1 + fi + + return 0 +} + +catifexec() { + if [ -x $1 ]; then + echo -n $STATUS + echo "$*" >> $ROOT/`/bin/basename $1` + $* >> $ROOT/`/bin/basename $1` 2>&1 + echo_success + return 1 + fi + return 0 +} + +# The following was borrowed from the Red Hat 6.x init scripts function +# to aid in letting the user know the application was still working. +# +# Get a sane screen width +[ -z "$COLUMNS" ] && COLUMNS=80 + +# Read in our configuration +if [ -z "$BOOTUP" ]; then + if [ -f /etc/sysconfig/init ]; then + . /etc/sysconfig/init + else + # This all seem confusing? Look in /etc/sysconfig/init, + # or in /usr/doc/initscripts-*/sysconfig.txt + BOOTUP=color + RES_COL=60 + MOVE_TO_COL="echo -en \\033[300C\\033[$[${COLUMNS}-${RES_COL}]D" + SETCOLOR_SUCCESS="echo -en \\033[1;32m" + SETCOLOR_FAILURE="echo -en \\033[1;31m" + SETCOLOR_WARNING="echo -en \\033[1;33m" + SETCOLOR_NORMAL="echo -en \\033[0;39m" + LOGLEVEL=1 + fi +fi + +echo_success() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[ " + [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS + echo -n "OK" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo " ]" + return 0 +} + +echo_failure() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[" + [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE + echo -n "FAILED" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo "]" + return 1 +} + +echo_passed() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[" + [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING + echo -n "PASSED" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo "]" + return 1 +} + + diff --git a/extras/sysreport/sysreport-fdisk b/extras/sysreport/sysreport-fdisk new file mode 100755 index 00000000..451cb535 --- /dev/null +++ b/extras/sysreport/sysreport-fdisk @@ -0,0 +1,8 @@ +#! /bin/sh + +/sbin/fdisk -l /dev/hd[a-g] +/sbin/fdisk -l /dev/sd[a-p] +/sbin/fdisk -l /dev/md[0-9] /dev/md[1][0-5] +for i in `/bin/ls /dev/rd/ | /bin/grep -v p[0-9]`; do + /sbin/fdisk -l /dev/rd/"$i" 2>&1 +done diff --git a/extras/sysreport/sysreport.legacy b/extras/sysreport/sysreport.legacy new file mode 100755 index 00000000..043ba026 --- /dev/null +++ b/extras/sysreport/sysreport.legacy @@ -0,0 +1,766 @@ +#! /bin/bash +# +# System Report +# Copyright (c) 1999-2006 Red Hat, Inc. All rights reserved. +# +# Written by: +# Wil Harris <wil@redhat.com> +# Peter Jones <pjones@redhat.com> +# Preston Brown <pbrown@redhat.com> +# Than Ngo <than@redhat.com> + +umask 0077 +UTILDIR=/usr/share/sysreport +VER=`/bin/uname -r` +PATH="" +PROGNAME="sysreport" +DATE=`/bin/date -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '` + +function usage { + echo "Sysreport is a utility that gathers information about a system's" + echo "hardware and configuration. The information can then be used for" + echo "diagnostic purposes and debugging. Sysreport is commonly used to help" + echo "support technicians and developers by providing a "snapshot" of a" + echo "system's current layout." + echo + echo "Usage: sysreport [OPTION]" + echo " -help : show help" + echo " -norpm : omit collecting information about currently installed packages" + echo " -dmidecode: enable dmidecode, getting information about the hardware" + echo " -firewall : collecting the system firewall rules" + echo " -home : place sysreport outputs within home directory" + echo " -usesysrq : collecting information about sysrq-trigger" + echo + exit 0 +} + +[ $# -lt 6 ] || usage +for i +do + case "$i" in + -help) usage;; + -norpm) NORPM=yes;; + -dmidecode) DMIDECODE=yes;; + -firewall) FIREWALL=yes;; + -home) HOMEDIR=yes;; + -sysrq) SYSRQ_TRIGGER=yes;; + -usesysrq) SYSRQ_TRIGGER=yes;; + *) usage;; + esac +done + +if [ -f $UTILDIR/functions ]; then + . $UTILDIR/functions +else + echo "Sysreport is not properly installed" + exit 1 +fi +if [ $UID != 0 ]; then + echo "You must be root to use this utility" + exit 1 +fi + +if [ "$HOMEDIR" = yes ] ; then + TEMPDIR=$HOME + ROOT=$HOME/sysreport-$DATE + /bin/mkdir $ROOT >& /dev/null +else + TEMPDIR=/tmp + ROOT=`/bin/mktemp -dq /tmp/sysreport.XXXXXXXX` +fi +if [ $? != 0 ] ; then + echo "Cannot make temp dir" + exit 1 +fi + +trap "{ rm -rf $ROOT ; exit ; }" EXIT + +if [ -f /etc/fedora-release ] ; then + release_name="Fedora Core" +else + release_name="Red Hat Linux" +fi + +echo +echo "This utility will go through and collect some detailed information " +echo "about the hardware and setup of your $release_name system." +echo "This information will be used to diagnose problems with your system" +echo "and will be considered confidential information. Red Hat will use" +echo "this information for diagnostic purposes ONLY. " +echo +echo "Please wait while we collect information about your system." +echo +echo "This process may take a while to complete...." +echo "No changes will be made to your system during this process." +echo +echo "NOTE: You can safely ignore a failed message. This only means a file" +echo "we were checking for did not exist." +echo +echo "If your system hangs while gathering rpm information, please abort" +echo "the script with CTRL-C and run it again after adding -norpm to the" +echo "sysreport command line" +echo +echo "Press ENTER to continue, or CTRL-C to quit." +read IGNORE + +echo +echo "Getting system configuration information." +echo +STATUS="Determining $release_name version:" +catiffile "/etc/redhat-release" + +STATUS="Determinding your current hostname: " +catifexec "/bin/hostname" + +STATUS="Getting the date:" +catifexec "/bin/date" + +STATUS="Checking your systems current uptime and load average:" +catifexec "/usr/bin/uptime" + +STATUS="Checking available memory:" +catifexec "/usr/bin/free" + +STATUS="Checking free disk space:" +catifexec "/bin/df" "-al" + +STATUS="Checking currently running processes:" +catifexec "/bin/ps" "-e -o euser,pid,ppid,tty,%cpu,%mem,rss,vsz,start_time,time,state,wchan,cmd" + +STATUS="Checking current process tree:" +catifexec "/usr/bin/pstree" + +STATUS="Collecting information about ld.so.conf:" +catiffile "/etc/ld.so.conf" + +STATUS="Collecting information about ld.so.conf.d:" +catiffile "/etc/ld.so.conf.d" + +STATUS="Collecting IPC-related information:" +catifexec "/usr/bin/ipcs" "-a" + +STATUS="Collecting information about chkconfig --list:" +catifexec "/sbin/chkconfig" "--list" + +STATUS="Collecting information about /etc/rc.d:" +catiffile "/etc/rc.d" +/bin/ls /etc/rc.d/rc*.d/ > $ROOT/etc/rc.d/ls-output + +if [ -x /usr/sbin/lsof ] ; then + STATUS="Lists information about files opened (lsof)" + catifexec "/usr/sbin/lsof" "-b +M -n -l" +fi + +STATUS="Collecting interprocess communication facilities status" +catifexec "/usr/bin/ipcs" "-u" +catifexec "/usr/bin/ipcs" "-l" + +# check to see if we want to run rpm, under some circumstances +# rpm can hang and never complete +# yes, command line parsing needs some work +if [ "$NORPM" != "yes" ]; then + echo "Collecting information about currently installed packages:" + echo -n "This may take several minutes...." + /bin/rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}-%{ARCH}\n" > $ROOT/installed-rpms + /bin/rpm -Va > $ROOT/rpm-Va 2>&1 + echo_success +fi + +STATUS="Getting bootloader information:" +/bin/ls -alR /boot > $ROOT/ls-boot 2>&1 + +# This covers sparc, alpha, and intel (respectively) +# updated for grub -mpg +if [ -f /etc/silo.conf ]; then + STATUS="Collecting information about the boot process (silo):" + catiffile "/etc/silo.conf" +fi +if [ -f /etc/milo.conf ]; then + STATUS="Collecting information about the boot process (milo):" + catiffile "/etc/milo.conf" +fi +if [ -f /etc/lilo.conf ]; then + STATUS="Collecting information about the boot process (lilo):" + catiffile "/etc/lilo.conf" + catifexec "/sbin/lilo" "-q" +fi +if [ -d /boot/grub -a -f /boot/grub/grub.conf -a -f /boot/grub/device.map ]; then + STATUS="Collecting information about the boot process (grub.conf):" + catiffile "/boot/grub/grub.conf" + STATUS="Collecting information about the boot process (grub.map):" + catiffile "/boot/grub/device.map" +fi +if [ -f /etc/cluster.conf -o -f /etc/cluster.xml -o -f /etc/cluster/cluster.conf ] ; then + STATUS="Gathering information on cluster setup" + # 2.1 AS + if [ -f /etc/cluster.conf ] ; then + catiffile "/etc/cluster.conf" + fi + # Taroon + if [ -f /etc/cluster.xml ] ; then + catiffile "/etc/cluster.xml" + fi + # RHEL4 + if [ -d /etc/cluster ]; then + catiffile "/etc/cluster" + fi +fi +STATUS="Collecting init configuration:" +catiffile "/etc/inittab" + +STATUS="Collecting information about X:" +catiffile "/etc/X11" + +STATUS="Gathering sysctl information (/proc/sys):" +catifexec "/sbin/sysctl" "-a" +STATUS="Gathering sysctl information (/etc/sysctl.conf):" +catiffile "/etc/sysctl.conf" + +for x in `/bin/ls -d /etc/cron*` ; do + STATUS="Collecting information about cron ($(/bin/basename $x)):" + catiffile "$x" +done + +STATUS="Gathering Syslog config information:" +catiffile "/etc/syslog.conf" + +STATUS="Gathering ntp configuration (/etc/ntp.conf):" +catiffile "/etc/ntp.conf" +STATUS="Gathering ntp configuration (/etc/ntp/step-tickers):" +catiffile "/etc/ntp/step-tickers" +STATUS="Gathering ntp configuration (/etc/ntp/ntpservers):" +catiffile "/etc/ntp/ntpservers" + +STATUS="Gathering IP information (/sbin/ifconfig):" +catifexec "/sbin/ifconfig" "-a" + +STATUS="Checking network routes:" +catifexec "/sbin/route" "-n" + +STATUS="Collecting Name Service Switch config information:" +catiffile "/etc/nsswitch.conf" +STATUS="Collecting NIS client information:" +catiffile "/etc/yp.conf" + +STATUS="Collecting system configuration information:" +catiffile "/etc/sysconfig" +fixupfile 's/\(.*Password=\)\(.*\)/\1********/' $ROOT/etc/sysconfig/rhn/up2date + +STATUS="Collecting information about system authentication (pam):" +catiffile "/etc/pam.d" + +echo +echo "Getting information about the kernel." +echo +STATUS="Getting kernel version:" +catifexec "/bin/uname" "-a" +STATUS="Checking module information:" +catifexec "/sbin/lsmod" +for x in $(/sbin/lsmod | /bin/cut -f1 -d" " 2>/dev/null | /bin/grep -v Module 2>/dev/null ) ; do + STATUS="Checking module information $x:" + catifexec "/sbin/modinfo" "$x" +done + +STATUS="Currently getting ksysms information:" +catifexec "/sbin/ksyms" + +STATUS="Gathering information about your filesystems:" +catiffile "/proc/filesystems" + +STATUS="Gathering information about your system stat:" +catiffile "/proc/stat" + +STATUS="Gathering information about your partitions:" +catiffile "/proc/partitions" + +STATUS="Gathering information about your ksysms:" +catiffile "/proc/ksyms" + +STATUS="Gathering information about slabinfo:" +catiffile "/proc/slabinfo" + +# Added support to cover for the new modules.conf layout in Red Hat 7 +STATUS="Collecting information regarding kernel modules" +catiffile "/lib/modules/$VER/modules.dep" +if [ -f /etc/conf.modules ]; then + STATUS="Collecting information regarding kernel modules (conf.modules)" + catiffile "/etc/conf.modules" +fi +if [ -f /etc/modules.conf ]; then + STATUS="Collecting information regarding kernel modules (modules.conf)" + catiffile "/etc/modules.conf" +fi +if [ -f /etc/modprobe.conf ]; then + STATUS="Collecting information regarding kernel modules (modeprobe.conf)" + catiffile "/etc/modprobe.conf" +fi + +if [ "$DMIDECODE" == "yes" ] ; then + echo "Getting information about the hardware." + echo + if [ -x /usr/sbin/dmidecode ] ; then + STATUS="Gathering DMI information:" + catifexec "/usr/sbin/dmidecode" + fi +fi + +# dkms status +STATUS="Gathering current status of modules, versions and kernels (dkms):" +if [ -x /usr/sbin/dkms ] ; then + catifexec "/usr/sbin/dkms" "status" +fi + +if [ -f /etc/sysconfig/isdncard ] ; then + STATUS="Gathering information about ISDN:" + catiffile "/etc/sysconfig/isdncard" +fi + +STATUS="Collecting information from the proc directory:" +catiffile "/proc/pci" + +STATUS="Getting kernel command line" +catiffile "/proc/cmdline" + +STATUS="Gathering information about your CPU:" +catiffile "/proc/cpuinfo" + +STATUS="Gathering information about your Ram:" +catiffile "/proc/meminfo" + +STATUS="Gathering information about your ioports:" +catiffile "/proc/ioports" + +STATUS="Gathering information about your interrupts:" +catiffile "/proc/interrupts" + +STATUS="Gathering information about your scsi devices:" +catiffile "/proc/scsi" + +STATUS="Gathering information about your dma:" +catiffile "/proc/dma" + +STATUS="Gathering information about your devices (/proc/devices):" +catiffile "/proc/devices" + +STATUS="Gathering information about your rtc:" +catiffile "/proc/rtc" + +STATUS="Gathering information about your ide drivers:" +catiffile "/proc/ide" + +STATUS="Gathering information about your bus:" +getpciinfo > $ROOT/lspci +catiffile "/proc/bus" + +STATUS="Gathering info on udev configuration:" +catiffile "/etc/udev" + +echo +echo "Getting disk and filesystem information." +echo + +STATUS="Collecting information from /etc/fstab:" +catiffile "/etc/fstab" + +STATUS="Collecting disk partition information:" +PATH=/bin getpartinfo > $ROOT/fdisk-l + +STATUS="Checking mounted file systems (mount) " +catifexec "/bin/mount" + +STATUS="Checking mounted file systems (/proc/mounts)" +catiffile "/proc/mounts" + +STATUS="Collecting Software RAID information (/proc/mdstat)" +catiffile "/proc/mdstat" + +STATUS="Collecting Software RAID information (/etc/raidtab)" +catiffile "/etc/raidtab" + +STATUS="Collecting Software RAID information (/etc/mdadm.conf)" +catiffile "/etc/mdadm.conf" + +STATUS="Collecting Software RAID information (mdadm -D /dev/md*)" +catifexec "/sbin/mdadm" "-D /dev/md*" + +STATUS="Collecting Automount information (auto.master)" +catiffile "/etc/auto.master" + +STATUS="Collecting Automount information (auto.misc)" +catiffile "/etc/auto.misc" + +STATUS="Collecting Automount information (auto.net)" +catiffile "/etc/auto.net" + +STATUS="Collecting LVM information:" +catifexec "/usr/sbin/vgdisplay" "-vv" + +STATUS="Gathering LVM setup" +catiffile "/etc/lvm" + +STATUS="Collecting SCSI Tape information (/etc/stinit.def)" +catiffile "/etc/stinit.def" + +if [ -x /sbin/lsusb ] ; then + STATUS="Collecting USB devices list (lsusb):" + catifexec "/sbin/lsusb" +fi + +if [ -x /usr/bin/lshal ] ; then + STATUS="Collecting global devices list (lshal):" + catifexec "/usr/bin/lshal" +fi + +echo +echo "collecting information about commonly used network services" +echo +# This covers backwards compatiablity for systems with inetd while keeping +# support for the new 7.x xinetd +if [ -f /etc/inetd.conf ]; then + STATUS="Collecting information about system services (inetd.conf)" + catiffile "/etc/inetd.conf" +elif [ -f /etc/xinetd.conf ]; then + STATUS="Collecting information about system services (xinetd.conf)" + catiffile "/etc/xinetd.conf" + for x in `/bin/ls -d /etc/xinetd.d/*`; do + STATUS="Collecting information about system services ($(/bin/basename $x))" + catiffile "$x" + done +fi +for x in `/bin/ls -d /etc/host*` ; do + STATUS="Collecting information from $x:" + catiffile "$x" +done + +STATUS="Collecting information about the ftp servers:" +ftpconfigfiles=`/bin/ls -d /etc/ftp* /etc/vsftpd/* 2>/dev/null` +for x in $ftpconfigfiles; do + STATUS="Collecting information about the ftp servers ($(/bin/basename $x)):" + catiffile "$x" +done + +STATUS="Collecting information about ypbind configuration:" +catiffile "/etc/yp.conf" + +if [ "$FIREWALL" == "yes" ]; then + KERNELMIN=`/bin/uname -r | /bin/sed -e 's,[^\.]*\.,,' -e 's,\..*,,'` + ipchainsmod=`/sbin/lsmod 2>/dev/null| /bin/grep ipchains` + + if [ "$KERNELMIN" -lt 3 ] || [ -n "${ipchainsmod}" ] ; then + STATUS="Getting ipchains information:" + catifexec "/sbin/ipchains" "-nvL" + elif [ "$KERNELMIN" -gt 3 ]; then + STATUS="Getting iptables information:" + if [ -f /etc/sysconfig/iptables-config ] ; then + catiffile "/etc/sysconfig/iptables-config" + fi + STATUS="Getting iptables information (filter):" + catifexec "/sbin/iptables" "-t filter -nvL" + STATUS="Getting iptables information (mangle):" + catifexec "/sbin/iptables" "-t mangle -nvL" + STATUS="Getting iptables information (nat):" + catifexec "/sbin/iptables" "-t nat -nvL" + fi +fi + +# ldap client and server config +if [ -f /etc/ldap.conf ] ; then + STATUS="Getting LDAP configuration (ldap.conf)" + catiffile "/etc/ldap.conf" +fi +if [ -d /etc/openldap ] ; then + for x in `/bin/ls -d /etc/openldap/*` ; do + if [ -f $x ] ; then + STATUS="Getting LDAP configuration ($(/bin/basename $x))" + catiffile "$x" + fi + done +fi + +# ssh +STATUS="Getting ssh configuration (ssh_config)" +catiffile "/etc/ssh/ssh_config" +STATUS="Getting sshd configuration (sshd_config)" +catiffile "/etc/ssh/sshd_config" + +# sendmail +SENDMAIL_CF_FILE=/etc/mail/sendmail.cf +SENDMAIL_CW_FILE=/etc/mail/sendmail.cw + +if [ -f /etc/sendmail.cf ] ; then + SENDMAIL_CF_FILE=/etc/sendmail.cf +fi + +if [ -f /etc/sendmail.cw ] ; then + SENDMAIL_CW_FILE=/etc/sendmail.cw +fi + +STATUS="Sendmail Configuration ($SENDMAIL_CF_FILE):" +catiffile "$SENDMAIL_CF_FILE" +if [ -f $SENDMAIL_CW_FILE ]; then + STATUS="Sendmail Machine aliases ($SENDMAIL_CW_FILE):" + catiffile "$SENDMAIL_CW_FILE" +fi + +STATUS="Sendmail User aliases (/etc/aliases):" +catiffile "/etc/aliases" + +for f in `/bin/ls -d /etc/mail/* | /bin/grep -v \.db`; do + STATUS="Getting files from ($(/bin/basename $f))" + catiffile $f +done + +STATUS="Collecting Postfix Configuration (main.cf)" +catiffile "/etc/postfix/main.cf" + +STATUS="Collecting Postfix Configuration (master.cf)" +catiffile "/etc/postfix/master.cf" + +STATUS="Collecting exim configuration directory" +catiffile "/etc/exim" + +STATUS="Collecting host resolution information" +catiffile "/etc/resolv.conf" + +# Make sure we have support for both versions of bind +if [ -f /etc/named.boot ]; then + STATUS="Collecting information about the nameserver (named.boot)" + catiffile "/etc/named.boot" +elif [ -f /etc/named.conf ]; then + STATUS="Collecting information about the nameserver (named.conf)" + catiffile "/etc/named.conf" +fi + +DNSDIR="" +if [ -f /etc/named.conf ]; then + DNSDIR=$(/bin/grep -i directory /etc/named.conf |/bin/gawk '{ print $2 ;}'|\ + /bin/sed s/\"//g|/bin/sed s/\;//g) +elif [ -f /etc/named.boot ]; then + DNSDIR=$(/bin/grep -i directory /etc/named.boot|/bin/gawk '{ print $2 ;}') +fi + +if [ -n "$DNSDIR" -a -d "$DNSDIR" ]; then + STATUS="Collecting information about the nameserver ($DNSDIR)" + catiffile "$DNSDIR" +fi + +if [ -f /etc/exports ] ; then + STATUS="Collecting information about the NFS:" + catiffile "/etc/exports" +fi + +SAMBADIR="/etc/samba" +if [ -d $SAMBADIR ]; then + STATUS="Getting samba informations ($SAMBADIR)" + for x in `/bin/ls -d $SAMBADIR/* | grep -vE 'smbpasswd|secrets\.tdb|\.bak|\.rpmnew'` ; do + STATUS="Getting samba informations ($(/bin/basename $x))" + catiffile "$x" + done + /bin/ls -alR $SAMBADIR > $ROOT/ls-samba 2>&1 + if [ -x /usr/bin/wbinfo ] ; then + STATUS="Getting samba informations (wbinfo -g):" + catifexec "/usr/bin/wbinfo" "-g" + STATUS="Getting samba informations (wbinfo -u):" + catifexec "/usr/bin/wbinfo" "-u" + fi +fi + +STATUS="Getting /etc/securetty" +catiffile "/etc/securetty" + +STATUS="Getting /etc/shells" +catiffile "/etc/shells" + +STATUS="Getting ulimit info" +catiffile "/etc/security/limits.conf" + +STATUS="Getting nscd configuration" +catiffile "/etc/nscd.conf" + +STATUS="Getting Kerberos informations (/etc/krb5.conf)" +catiffile "/etc/krb5.conf" + +STATUS="Getting Kerberos informations (/etc/krb.conf)" +catiffile "/etc/krb.conf" + +STATUS="Getting Kerberos informations (/etc/krb.realms)" +catiffile "/etc/krb.realms" + +STATUS="Getting information about apache" +catiffile "/etc/httpd/conf/httpd.conf" + +for x in `/bin/ls -d /etc/httpd/conf.d/*.conf 2>/dev/null` ; do + STATUS="Getting information about apache ($(/bin/basename $x))" + catiffile "$x" +done + +STATUS="Getting information about squid" +catiffile "/etc/squid/squid.conf" + +STATUS="Getting information about CUPS" +for x in `/bin/ls -d /etc/cups/*.conf 2>/dev/null` ; do + STATUS="Getting information about CUPS ($x)" + catiffile "$x" +done + +echo +echo "Gathering information from system logs" +echo +STATUS="Collecting information from dmesg:" +catiffile "/var/log/dmesg" + +if [ "$SYSRQ_TRIGGER" == "yes" ]; then + STATUS="Collecting information from /proc/sysrq-trigger" + if [ -f /proc/sysrq-trigger -a -f /proc/sys/kernel/sysrq ] ; then + sysr_state="$(/bin/cat /proc/sys/kernel/sysrq)" + echo 1 > /proc/sys/kernel/sysrq + for key in m p t ; do + echo $key > /proc/sysrq-trigger + done + echo $sysr_state > /proc/sys/kernel/sysrq + fi +fi + +for x in `/bin/ls /var/log/messages*` ; do + STATUS="Collecting messages files ($x)" + catiffile "$x" +done +for x in `/bin/ls /var/log/maillog*` ; do + STATUS="Collecting maillog files ($x)" + catiffile "$x" +done + + +STATUS="Collecting information (/var/log/sa)" +catiffile "/var/log/sa" + +for x in `/bin/ls -d /var/log/Xorg.*.log /var/log/XFree86.*.log 2>/dev/null` ; do + STATUS="Collecting X logs ($x)" + catiffile "$x" +done + +STATUS="Collecting information (/var/log/rpmpkgs)" +catiffile "/var/log/rpmpkgs" + +STATUS="Collecting information (/var/log/boot.log)" +catiffile "/var/log/boot.log" + +STATUS="Collecting information (/var/log/up2date)" +catiffile "/var/log/up2date" + +STATUS="Collecting information (/var/log/secure)" +catiffile "/var/log/secure" + +STATUS="Collecting log files from Apache" +catiffile "/var/log/httpd" + +STATUS="Collecting log files from RHN" +if `/bin/ls /var/log/rhn* >& /dev/null` ; then + catiffile "/var/log/rhn*" +fi + +# General monitoring moc logs +if [ -d /opt/notification ] ; then + for x in `/bin/ls -d /opt/notification/var/*.log* 2>/dev/null` ; do + STATUS="Collecting monitoring moc logs ($(/bin/basename $x))" + catiffile "$x" + done + for x in `/bin/ls -d /var/tmp/ack_handler.log* 2>/dev/null` ; do + STATUS="Collecting monitoring moc logs ($(/bin/basename $x))" + catiffile "$x" + done + for x in `/bin/ls -d /var/tmp/enqueue.log* 2>/dev/null` ; do + STATUS="Collecting monitoring moc logs ($(/bin/basename $x))" + catiffile "$x" + done +fi + +# monitoring scout logs +if [ -d /home/nocpulse/var ] ; then + for x in `/bin/ls -d /home/nocpulse/var/*.log* 2>/dev/null` ; do + STATUS="Collecting monitoring scout logs ($(/bin/basename $x))" + catiffile "$x" + done + for x in `/bin/ls -d /home/nocpulse/var/commands/*.log* 2>/dev/null` ; do + STATUS="Collecting monitoring scout logs ($(/bin/basename $x))" + catiffile "$x" + done +fi + +/bin/echo +/bin/echo "Getting information about RHN" +/bin/echo +RHNDIR=/etc/sysconfig/rhn +/bin/mkdir -p $ROOT/$RHNDIR 2>/dev/null +catiffile "/etc/rhn" +if [ -f $RHNDIR/systemid ] ; then + echo -n "Gathering systemid information:" + if [ -x /usr/bin/xsltproc ] ; then + /usr/bin/xsltproc $UTILDIR/text.xsl $RHNDIR/systemid > $ROOT/$RHNDIR/systemid 2>/dev/null + echo_success + else + catiffile "$RHNDIR/systemid" + fi +fi + +# Get hardware profile information (for verification with system state and RHN) +if [ -x /usr/share/rhn/up2date_client/hardware.py ] ; then + STATUS="Gathering RHN hardware profile information" + catifexec /usr/share/rhn/up2date_client/hardware.py +fi +if [ -x /usr/bin/rhn-schema-version ] ; then + STATUS="Gathering schema version" + catifexec "/usr/bin/rhn-schema-version" +fi +if [ -x /usr/bin/rhn-charsets ] ; then + STATUS="Gathering database charactersets" + catifexec "/usr/bin/rhn-charsets" +fi + +# Get SELinux information +echo +echo "Gathering information on SELinux setup" +echo +catifexec "/usr/bin/selinuxconfig" +catifexec "/usr/sbin/sestatus" +catifexec "rpm" "-q -V selinux-policy-targeted" +catifexec "rpm" "-q -V selinux-policy-strict" + +cd $TEMPDIR +/bin/echo +/bin/echo -n "Please enter your case number (if you have one): " + +while read CASENUM +do + case $CASENUM in + *[^0-9]*) + /bin/echo -e "\nError: Your input contains non-numeric characters!" + /bin/echo -e "Please enter your case number (if you have one): " + ;; + *) + break ;; + esac +done +if [ ! $CASENUM ]; then + NAME=$PROGNAME-$HOSTNAME.$DATE +else + NAME="$PROGNAME-$HOSTNAME-$CASENUM.$DATE" +fi +/bin/rm -Rf $NAME +/bin/mv $ROOT $NAME +/bin/tar Scf $NAME.tar $NAME +if [ -x /usr/bin/bzip2 ]; then + /usr/bin/bzip2 $NAME.tar + SUFFIX="tar.bz2" +else + /bin/gzip -9 $NAME.tar + SUFFIX="tar.gz" +fi + +/bin/rm -Rf $NAME +/bin/echo +/bin/echo "Please send $TEMPDIR/${NAME}.${SUFFIX} to your support" +/bin/echo "representative." +/bin/echo + +exit 0 diff --git a/extras/sysreport/text.xsl b/extras/sysreport/text.xsl new file mode 100644 index 00000000..c381b3a8 --- /dev/null +++ b/extras/sysreport/text.xsl @@ -0,0 +1,33 @@ +<?xml version='1.0'?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version='1.0'> + +<xsl:output method="text" indent="no"/> + +<xsl:template match="array"> + <xsl:text>[</xsl:text> + <xsl:for-each select="data/value"> + <xsl:apply-templates/> + <xsl:if test="following-sibling::value"> + <xsl:text>, </xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:text>] </xsl:text> +</xsl:template> + +<xsl:template match="string"> + <xsl:value-of select="."/> +</xsl:template> + +<xsl:template match="member"> + <xsl:value-of select="name"/> + <xsl:text>: </xsl:text> + <xsl:apply-templates select="value"/> + <xsl:text> </xsl:text> +</xsl:template> + +<xsl:template match="/"> + <xsl:apply-templates select=".//member"/> +</xsl:template> + +</xsl:stylesheet> |