Get rid of generated files which are empty
[grml-hwinfo.git] / grml-hwinfo
index 5bdafa5..9b261c1 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>
 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***'
 
 
-if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
-  echo "$PN - collect hardware information
+# data collection should not be affected by user locale
+export LANG=C
+export LC_ALL=C
 
 
+TIMESTAMP='+%F--%H-%M-%S-%Z'
+DATE="$(date $TIMESTAMP)"
+
+echo "$PN ${VERSION} - collect hardware information"
+
+GENERATE_FILE='1'
+GENERATE_DIRECTORY=''
+
+while getopts "hdf" args; do
+  case "$args" in
+  h) 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
 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. A file
-named info.tar.bz2 storing all collected information will be created in the
-current working directory."
+with root permissions to collect as much information as possible.  By
+default, a file named grml-hwinfo-TIMESTAMP.tar.bz2 storing all collected
+information will be created in the current working directory. Alternatively,
+you can have it create a directory with all information.
 
 
-  exit 0
-fi
+Options:
 
 
-TMPDIR=$(mktemp -d) || { echo "Error creating a temporary directory, can not continue. Exiting.">&2 ; exit 1; }
-INFODIR="info"
+  -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
+"
 
 
-bailout() {
-  [ -d "$TMPDIR" ] && rm -rf "$TMPDIR"
-  [ -n "$1" ] && exit 1 || exit 0
-}
+  exit 0;;
+
+  d)
+  GENERATE_FILE=''
+  GENERATE_DIRECTORY='1'
+  ;;
 
 
-[ -n "$INFOFILE" ] || INFOFILE='info.tar.bz2'
-INFOFILE="${WORKING_DIR}/${INFOFILE}"
+  f) # generating file; default behaviour
+  GENERATE_FILE='1'
+  ;;
+
+  esac
+  done
+
+# Generate output/temporary directory name & path, and output file path
+OUTFILE=""
+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"
+   [ -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
 
 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
 fi
 
 # check whether a binary is available and executable
@@ -51,7 +84,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
 }
 
@@ -87,14 +125,12 @@ disk_info() {
     disklist=`list_disks $device_size`
 }
 
     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}"
-
-  echo "Generating hardware information report using file $INFOFILE."
+  [ -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
   echo "This might take a few seconds/minutes. Please be patient..."
 
 # some sysinfo
@@ -118,6 +154,7 @@ cd "${TMPDIR}/${INFODIR}" || bailout 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 \
@@ -133,6 +170,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
 # 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
@@ -145,10 +183,9 @@ cd "${TMPDIR}/${INFODIR}" || bailout 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
 
   fi
 
-# powermanagement
+# power management
   exectest laptop-detect  && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
   exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
   exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
   exectest laptop-detect  && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
   exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
   exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
@@ -161,6 +198,10 @@ cd "${TMPDIR}/${INFODIR}" || bailout 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 \
+           | 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
@@ -188,7 +229,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
@@ -197,33 +237,49 @@ 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
 
+   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  && smartctl -i /dev/$disk >> smartctl
-      exectest hdparm    && hdparm -iv /dev/$disk  >> hdparm
-      exectest fdisk     && fdisk -lu /dev/$disk   >> fdisk 2>>fdisk.error
-      exectest parted    && parted -s /dev/$disk print >> parted
-      LC_ALL=C file -s /dev/$disk?* | grep -v ": empty" >> file_disk
+      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
    done
 fi
 )
 
    done
 fi
 )
 
-# finally create the tarball
-if [ -f "${INFOFILE}" ] ; then
-   DATE="$(date +%Y%m%d_%H%M%S)"
-   NEW_INFOFILE="${WORKING_DIR}/info_${DATE}.tar.bz2"
-   echo
-   echo "Warning: $INFOFILE exists already, using $NEW_INFOFILE instead.">&2
-   INFOFILE="$NEW_INFOFILE" # adjust variable for final info message
-fi
+# get rid of empty files
+for file in *; do
+  test -s $file || rm $file
+done
+
+echo
 
 
-cd "${TMPDIR}"
-tar jcf "${INFOFILE}" "${INFODIR}"
 cd "${WORKING_DIR}"
 
 cd "${WORKING_DIR}"
 
-echo
-[ -r "$INFOFILE" ] && echo "$INFOFILE ("$(ls -ahl "$INFOFILE" | awk '{print $5}')") has been generated."
-echo
+# create tarball
+if [ -n "$GENERATE_FILE" ] ; then
+  tar jcf "${OUTFILE}" "${OUTDIRNAME}"
+  [ -r "$OUTFILE" ] && echo "$OUTFILE ("$(ls -ahl "$OUTFILE" | awk '{print $5}')") has been generated."
+fi
+
+# 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##################################################################
 
 ## END OF FILE##################################################################