X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=grml-hwinfo;h=a58e829a2190b74b2e55d0c6433c2476062257fd;hb=91379edb0599d3746e3973a09891c33a696a289c;hp=7944a08f241bbfd9b7d70fba929f463982b76957;hpb=ca2c74f03717a14058c14dcac347200c3a03e8c4;p=grml-hwinfo.git diff --git a/grml-hwinfo b/grml-hwinfo index 7944a08..a58e829 100755 --- a/grml-hwinfo +++ b/grml-hwinfo @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Filename: grml-hwinfo # Purpose: get hardware information # Authors: grml-team (grml.org), (c) Michael Prokop @@ -14,17 +14,25 @@ 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 +export LC_ALL=C + TIMESTAMP='+%F--%H-%M-%S-%Z' -TIMESTAMP_NANO='+%F--%H-%M-%S-%N-%Z' +DATE="$(date $TIMESTAMP)" +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 "$PN - collect hardware information - +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 @@ -34,46 +42,78 @@ you can have it create a directory with all information. Options: --h : Display this help --f : Create grml-hwinfo-TIMESTAMP.tar.bz2 --d : Create grml-hwinfo-TIMESTAMP/ - --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 Store output files in specified directory + --output-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 -TMPDIR=$(mktemp -d) || { echo "Error creating a temporary directory, can not continue. Exiting.">&2 ; exit 1; } -INFODIR="info" +# Generate output/temporary directory name & path, and output file path +[ -n "$OUTDIRNAME" ] || OUTDIRNAME="grml-hwinfo-${DATE}" +OUTDIR="${WORKING_DIR}/${OUTDIRNAME}" +mkdir "${OUTDIR}" || { echo 'Directory "'${OUTDIR}'" already exists, aborting.'>&2 ; exit 1; } -bailout() { - [ -d "$TMPDIR" ] && rm -rf "$TMPDIR" - [ -n "$1" ] && exit 1 || exit 0 -} - -DATE="$(date $TIMESTAMP)" -[ -n "$INFOFILE" ] || INFOFILE="grml-hwinfo-$DATE.tar.bz2" -INFOFILE="${WORKING_DIR}/${INFOFILE}" -[ -n "$INFOOUTDIR" ] || INFOOUTDIR="grml-hwinfo-$DATE" -INFOOUTDIR="${WORKING_DIR}/${INFOOUTDIR}" +if [ -n "$GENERATE_FILE" ] ; then + [ -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}" +fi if [ "$(id -u)" != "0" ] ; then NOTROOT=1 - echo "Notice: you are running $PN without root permissions. Not all information will be collected." - echo + echo "W: Running without root permissions. Not all data will be collected." fi # check whether a binary is available and executable @@ -82,7 +122,12 @@ if [ -z "$1" ] ; then echo 'Usage: exectest '>&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 } @@ -118,15 +163,12 @@ disk_info() { disklist=`list_disks $device_size` } -echo "Running grml-hwinfo ${VERSION} - collecting hardware information." -mkdir "${TMPDIR}/${INFODIR}" -cd "${TMPDIR}/${INFODIR}" || bailout 1 +cd "${OUTDIR}" || exit 1 ( - cd "${TMPDIR}/${INFODIR}" - - [ -n "$GENERATE_FILE" ] && echo "Output file: $INFOFILE" - [ -n "$GENERATE_DIRECTORY" ] && echo "Output directory: $INFOOUTDIR" + [ -n "$GENERATE_FILE" ] && echo "Output file: $OUTFILE" + [ -n "$GENERATE_DIRECTORY" ] && echo "Output directory: $OUTDIR" + echo echo "This might take a few seconds/minutes. Please be patient..." # some sysinfo @@ -150,6 +192,7 @@ cd "${TMPDIR}/${INFODIR}" || bailout 1 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 \ @@ -165,6 +208,7 @@ cd "${TMPDIR}/${INFODIR}" || bailout 1 # 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 @@ -177,7 +221,6 @@ cd "${TMPDIR}/${INFODIR}" || bailout 1 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 @@ -193,6 +236,10 @@ cd "${TMPDIR}/${INFODIR}" || bailout 1 [ -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 @@ -220,7 +267,6 @@ else 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 @@ -229,54 +275,84 @@ else /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 - LC_ALL=C 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 ) -if [ -n "$GENERATE_DIRECTORY" ] ; then - if [ -e "${INFOOUTDIR}" ] ; then - # falling back onto nanoseconds as tie-breaker - DATE="$(date $TIMESTAMP_NANO)" - NEW_INFOOUTDIR="${WORKING_DIR}/grml-hwinfo-$DATE" - echo - echo "Warning: $INFOOUTDIR exists already, using $NEW_INFOOUTDIR instead.">&2 - INFOOUTDIR="$NEW_INFOOUTDIR" # adjust variable for final info message - fi +# get rid of empty files +for file in *; do + test -s $file || rm $file +done - cd "${TMPDIR}" - cp -ax "${TMPDIR}/info" "${INFOOUTDIR}" +echo - echo - [ -r "$INFOOUTDIR" ] && echo "$INFOOUTDIR has been generated." - echo -fi +cd "${WORKING_DIR}" +# create tarball if [ -n "$GENERATE_FILE" ] ; then - # finally create the tarball - if [ -e "${INFOFILE}" ] ; then - # falling back onto nanoseconds as tie-breaker - DATE="$(date $TIMESTAMP_NANO)" - NEW_INFOFILE="${WORKING_DIR}/grml-hwinfo-$DATE.tar.bz2" - echo - echo "Warning: $INFOFILE exists already, using $NEW_INFOFILE instead.">&2 - INFOFILE="$NEW_INFOFILE" # adjust variable for final info message - fi - - cd "${TMPDIR}" - tar jcf "${INFOFILE}" "${INFODIR}" - cd "${WORKING_DIR}" + tar jcf "${OUTFILE}" "${OUTDIRNAME}" + [ -r "$OUTFILE" ] && echo "$OUTFILE ("$(ls -ahl "$OUTFILE" | awk '{print $5}')") has been generated." +fi - echo - [ -r "$INFOFILE" ] && echo "$INFOFILE ("$(ls -ahl "$INFOFILE" | awk '{print $5}')") has been generated." - echo +# remove (temporary) output directory if needed, else keep it, as it doubles +# as the real output directory. +if [ -z "$GENERATE_DIRECTORY" ] ; then + rm -r "${OUTDIR}" +else + [ -r "${OUTDIR}" ] && echo "${OUTDIR} has been generated." fi -bailout +exit 0 ## END OF FILE##################################################################