Fix formating of disk tools output
[grml-hwinfo.git] / grml-hwinfo
index a379c86..a58e829 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # Filename:      grml-hwinfo
 # Purpose:       get hardware information
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Filename:      grml-hwinfo
 # Purpose:       get hardware information
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
@@ -14,7 +14,7 @@
 UNAME="$(uname -r)"
 PN="$(basename $0)"
 [ -n "$WORKING_DIR" -a -d "$WORKING_DIR" ] || WORKING_DIR=$(pwd)
 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
 
 # data collection should not be affected by user locale
 export LANG=C
@@ -25,12 +25,14 @@ DATE="$(date $TIMESTAMP)"
 
 echo "$PN ${VERSION} - collect hardware information"
 
 
 echo "$PN ${VERSION} - collect hardware information"
 
+# defaults
 GENERATE_FILE='1'
 GENERATE_DIRECTORY=''
 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
 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
@@ -40,34 +42,70 @@ you can have it create a directory with all information.
 
 Options:
 
 
 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
   esac
-  done
+  shift
+done
 
 # Generate output/temporary directory name & path, and output file path
 
 # 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
 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}"
    [ -e "${OUTFILE_}" ] && { echo 'File "'${OUTFILE_}'" already exists, aborting.'>&2 ; rm -r "${OUTDIR}"; exit 1; }
    OUTFILE=${OUTFILE_}
    touch "${OUTFILE}"
@@ -84,7 +122,12 @@ if [ -z "$1" ] ; then
    echo 'Usage: exectest <binary>'>&2
    return 1
 else
    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
 }
 
 fi
 }
 
@@ -149,6 +192,7 @@ cd "${OUTDIR}" || exit 1
   for i in free lsmod mount lsdev ; do
       exectest $i  && $i > $i
   done
   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 \
 
 # proc stuff
   for i in cpuinfo interrupts cmdline devices dma fb iomem ioports \
@@ -164,6 +208,7 @@ cd "${OUTDIR}" || exit 1
 # hwinfo
   exectest discover && discover -v --type-summary --enable-bus all > discover 2> discover.2
   exectest hwinfo   && hwinfo log=hwinfo
 # 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
   exectest x86info  && x86info > x86info 2>x86info.2
 
 # net stuff
@@ -176,7 +221,6 @@ cd "${OUTDIR}" || exit 1
   if exectest dpkg ; then
      dpkg --get-selections   > dpkg_get_selections
      COLUMNS=300 dpkg --list > dpkg_list
   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
   fi
 
 # power management
@@ -192,6 +236,10 @@ cd "${OUTDIR}" || exit 1
      [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
   fi
 
      [ -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
 # X stuff
   if [ -n "${DISPLAY}" ] ; then
      exectest xviddetect  && xviddetect         > xviddetect
@@ -219,7 +267,6 @@ else
    echo "running as root" > root
    disk_info
    exectest sfdisk     && sfdisk -d > sfdisk 2>sfdisk.error
    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
    exectest dmidecode  && dmidecode > dmidecode
 
    exectest dconf && dconf -o dconf
@@ -228,16 +275,66 @@ else
       /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
    fi
 
       /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
    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
 )
 
    done
 fi
 )
 
+# get rid of empty files
+for file in *; do
+  test -s $file || rm $file
+done
+
 echo
 
 cd "${WORKING_DIR}"
 echo
 
 cd "${WORKING_DIR}"