-#!/bin/sh
+#!/bin/bash
# Filename: grml-hwinfo
# Purpose: get hardware information
# Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
UNAME="$(uname -r)"
PN="$(basename $0)"
[ -n "$WORKING_DIR" -a -d "$WORKING_DIR" ] || WORKING_DIR=$(pwd)
-VERSION='0.4.1'
+VERSION='***UNRELEASED***'
# data collection should not be affected by user locale
export LANG=C
echo "$PN ${VERSION} - collect hardware information"
+# defaults
GENERATE_FILE='1'
GENERATE_DIRECTORY=''
+_opt_output_directory=false
+_opt_output_file=false
-while getopts "hdf" args; do
- case "$args" in
- h) echo "
+usage() {
+ echo "
This tool collects information of the hardware this tool is being executed
on. It can be executed as normal user to collect some basic information or
with root permissions to collect as much information as possible. By
Options:
- -h Display this help message
- -f Create grml-hwinfo-TIMESTAMP.tar.bz2
- -d Create grml-hwinfo-TIMESTAMP as a directory
- -df Create both, the directory and the file
+ -b, --both Create directory + file grml-hwinfo-TIMESTAMP.tar.bz2
+ -d, --directory Create grml-hwinfo-TIMESTAMP as a directory (no file)
+ -f, --file Create grml-hwinfo-TIMESTAMP.tar.bz2 [default action]
+ -h, --help Display this help message
+ --output-directory <dir> Store output files in specified directory
+ --output-file <file> Store output in specified filename (tar.bz2 format)
"
+}
- exit 0;;
-
- d)
- GENERATE_FILE=''
- GENERATE_DIRECTORY='1'
- ;;
-
- f) # generating file; default behaviour
- GENERATE_FILE='1'
- ;;
-
+CMDLINE_OPTS=output-directory:,output-file:,both,directory,file,help
+_opt_temp=$(getopt --name grml-hwinfo -o +bdfh --long $CMDLINE_OPTS -- "$@")
+if [ $? -ne 0 ]; then
+ echo "Try 'grml-hwinfo --help' for more information." >&2
+ exit 1
+fi
+eval set -- "$_opt_temp"
+
+while :; do
+ case "$1" in
+ --help|-h)
+ usage ; exit 0
+ ;;
+ --output-directory)
+ shift; OUTDIRNAME="$1"
+ GENERATE_DIRECTORY='1'
+ _opt_output_directory=true
+ $_opt_output_file && GENERATE_FILE='1' || GENERATE_FILE=''
+ ;;
+ --output-file)
+ shift; OUTFILE="$1"
+ GENERATE_FILE='1'
+ _opt_output_file=true
+ $_opt_output_directory && GENERATE_DIRECTORY='1' || GENERATE_DIRECTORY=''
+ ;;
+ -d|--directory)
+ GENERATE_DIRECTORY='1'
+ GENERATE_FILE=''
+ ;;
+ -f|--file)
+ GENERATE_DIRECTORY=''
+ GENERATE_FILE='1'
+ ;;
+ -b|--both)
+ GENERATE_DIRECTORY='1'
+ GENERATE_FILE='1'
+ ;;
+ --)
+ shift; break
+ ;;
+ *)
+ echo "Internal getopt error!" >&2
+ exit 1
+ ;;
esac
- done
+ shift
+done
# Generate output/temporary directory name & path, and output file path
-OUTFILE=""
-OUTDIRNAME="grml-hwinfo-${DATE}"
+[ -n "$OUTDIRNAME" ] || OUTDIRNAME="grml-hwinfo-${DATE}"
OUTDIR="${WORKING_DIR}/${OUTDIRNAME}"
mkdir "${OUTDIR}" || { echo 'Directory "'${OUTDIR}'" already exists, aborting.'>&2 ; exit 1; }
if [ -n "$GENERATE_FILE" ] ; then
- OUTFILE_="${OUTDIR}.tar.bz2"
+ [ -n "$OUTFILE" ] && OUTFILE_="$OUTFILE" || OUTFILE_="${OUTDIR}.tar.bz2"
[ -e "${OUTFILE_}" ] && { echo 'File "'${OUTFILE_}'" already exists, aborting.'>&2 ; rm -r "${OUTDIR}"; exit 1; }
OUTFILE=${OUTFILE_}
touch "${OUTFILE}"
echo 'Usage: exectest <binary>'>&2
return 1
else
- test -e "$(which $1)" && return 0 || return 1
+ if test -e "$(which $1)" ; then
+ return 0
+ else
+ grep -q "^$1"'$' missing_tools 2>/dev/null || echo "$1" >> missing_tools
+ return 1
+ fi
fi
}
for i in free lsmod mount lsdev ; do
exectest $i && $i > $i
done
+ swapon -s > swapon 2>swapon.error
# proc stuff
for i in cpuinfo interrupts cmdline devices dma fb iomem ioports \
# hwinfo
exectest discover && discover -v --type-summary --enable-bus all > discover 2> discover.2
exectest hwinfo && hwinfo log=hwinfo
+ exectest numactl && numactl --hardware > numactl
exectest x86info && x86info > x86info 2>x86info.2
# net stuff
if exectest dpkg ; then
dpkg --get-selections > dpkg_get_selections
COLUMNS=300 dpkg --list > dpkg_list
- COLUMNS=1000 dpkg -l linux-image-$UNAME | grep linux-image-$UNAME | tr -s ' ' > running_kernel
fi
# power management
[ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
fi
+ exectest dpkg && COLUMNS=1000 dpkg -l linux-image-$UNAME 2>running_kernel.error \
+ | grep linux-image-$UNAME | tr -s ' ' > running_kernel 2>>running_kernel.error
+ dpkg -S /boot/vmlinuz-$(uname -r) >> running_kernel 2>>running_kernel.error
+
# X stuff
if [ -n "${DISPLAY}" ] ; then
exectest xviddetect && xviddetect > xviddetect
echo "running as root" > root
disk_info
exectest sfdisk && sfdisk -d > sfdisk 2>sfdisk.error
- exectest ddcprobe && ddcprobe > ddcprobe
exectest dmidecode && dmidecode > dmidecode
exectest dconf && dconf -o dconf
/usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
fi
+ # proxmox
+ exectest qm && qm list > qm 2>qm.error
+ # libvirt
+ exectest virsh && virsh list >virsh 2>virsh.error
+ # openvz
+ exectest vzlist && vzlist >vzlist 2>vzlist.error
+ # vserver
+ exectest vserver-stat && vserver-stat >vserver-stat 2>vserver-stat.error
+
+ exectest mdadm && mdadm --detail /dev/md[0-9]* >> mdadm 2>mdadm.error
+
+ # LVM
+ exectest pvs && pvs > pvs 2>pvs.error
+ exectest vgs && vgs > vgs 2>vgs.error
+ exectest lvs && lvs > lvs 2>lvs.error
+ exectest lvdisplay && lvdisplay > lvdisplay 2>lvdisplay.error
+
+ exectest dmsetup && dmsetup ls > dmsetup_ls 2>dmsetup_ls.error
+
for disk in $disklist; do
- exectest smartctl && echo "smartctl -a /dev/$disk :\n" >> smartctl && smartctl -a /dev/$disk >> smartctl && echo "\n\n" >> smartctl
- exectest hdparm && echo "hdparm -iv /dev/$disk :\n" >> hdparm && hdparm -iv /dev/$disk >> hdparm && echo "\n\n" >> hdparm
- exectest fdisk && echo "fdisk -lu /dev/$disk :\n" >> fdisk && fdisk -lu /dev/$disk >> fdisk 2>>fdisk.error && echo "\n\n" >> fdisk
- exectest parted && echo "parted -s /dev/$disk :\n" >> parted && parted -s /dev/$disk print >> parted && echo "\n\n" >> parted
- file -s /dev/$disk?* | grep -v ": empty" >> file_disk
+ if exectest smartctl ; then
+ echo -e "smartctl -a /dev/${disk}:\n" >> smartctl
+ smartctl -a /dev/$disk >> smartctl
+ echo -e "\n\n" >> smartctl
+ fi
+
+ if exectest hdparm ; then
+ echo -e "hdparm -iv /dev/${disk}:\n" >> hdparm
+ hdparm -iv /dev/$disk >> hdparm
+ echo -e "\n\n" >> hdparm
+ fi
+
+ if exectest fdisk ; then
+ echo -e "fdisk -lu /dev/${disk}:\n" >> fdisk
+ fdisk -lu /dev/$disk >>fdisk 2>>fdisk.error
+ echo -e "\n\n" >> fdisk
+ fi
+
+ if exectest parted ; then
+ echo -e "parted -s /dev/${disk}:\n" >> parted
+ parted -s /dev/$disk print >> parted
+ echo -e "\n\n" >> parted
+ fi
+
+ if exectest sdparm ; then
+ echo -e "sdparm --all --long /dev/${disk}:\n" >> sdparm
+ sdparm --all --long /dev/$disk >> sdparm
+ echo -e "\n\n" >> sdparm
+ fi
+
+ file -s /dev/$disk?* | grep -v ": empty" >> file_disk
done
fi
)
+# get rid of empty files
+for file in *; do
+ test -s $file || rm $file
+done
+
echo
cd "${WORKING_DIR}"