Collect hardware information in a temporary directory, Support -h/--help option,...
[grml-hwinfo.git] / grml-hwinfo
1 #!/bin/sh
2 # Filename:      grml-hwinfo
3 # Purpose:       get hardware information
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8 # Notice: Some ideas have been taken from
9 # http://club.black.co.at/david/hwdb/infodump
10 # by David Schmitt <david@schmitt.edv-bus.at>
11 ################################################################################
12
13 # variables
14 UNAME="$(uname -r)"
15 PN="$(basename $0)"
16 WORKING_DIR=$(pwd)
17 VERSION='0.4'
18
19 if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
20   echo "$PN - collect hardware information
21
22 This tool collects information of the hardware this tool is being executed
23 on.  It can be executed as normal user to collect some basic information or
24 with root permissions to collect as much information as possible. A file
25 named info.tar.bz2 storing all collected information will be created in the
26 current working directory."
27
28   exit 0
29 fi
30
31 TMPDIR=$(mktemp -d) || { echo "Error creating a temporary directory, can not continue. Exiting.">&2 ; exit 1; }
32 INFODIR="info"
33
34 bailout() {
35   [ -d "$TMPDIR" ] && rm -rf "$TMPDIR"
36   [ -n "$1" ] && exit 1 || exit 0
37 }
38
39 [ -n "$INFOFILE" ] || INFOFILE='info.tar.bz2'
40 INFOFILE="${WORKING_DIR}/${INFOFILE}"
41
42 if [ "$(id -u)" != "0" ] ; then
43    NOTROOT=1
44    echo "Notice: you are running $PN without root permissions. Not all information will be collected."
45    echo
46 fi
47
48 # check whether a binary is available and executable
49 exectest() {
50 if [ -z "$1" ] ; then
51    echo 'Usage: exectest <binary>'>&2
52    return 1
53 else
54    test -e "$(which $1)" && return 0 || return 1
55 fi
56 }
57
58 # echo a list of all disks and their size
59 # taken from http://cvs.debian.org/fai/lib/disk-info
60 diskandsize() {
61     local isdisk major minor blocks device suffix
62     while read major minor blocks device suffix; do
63         isdisk=1
64         # skip ide cdrom
65         [ -f /proc/ide/$device/media ] && grep -q cdrom /proc/ide/$device/media && isdisk=0
66         [ "$isdisk" -eq 1 ] && echo "$device $blocks"
67     done
68 }
69
70 list_disks() {
71 # print only every second entry; used by disk_info
72 i=0
73 for ent in $@; do
74     if [ "$i" -eq 0 ]; then
75         echo $ent
76         i=1
77     else
78         i=0
79     fi
80 done
81 }
82
83 disk_info() {
84     # the variable holds a space separated list of devices and their block size
85     device_size=`grep -E ' cciss/c.d.$| ida/c.d.$| rd/c.d.$| hd.$| sd.$|/disc$' /proc/partitions | diskandsize`
86     # a list of all local disks, without size
87     disklist=`list_disks $device_size`
88 }
89
90 echo "Running grml-hwinfo ${VERSION} - collecting hardware information."
91
92 mkdir "${TMPDIR}/${INFODIR}"
93 cd "${TMPDIR}/${INFODIR}" || bailout 1
94 (
95   cd "${TMPDIR}/${INFODIR}"
96
97   echo "Generating hardware information report using file $INFOFILE."
98   echo "This might take a few seconds/minutes. Please be patient..."
99
100 # some sysinfo
101   date > date
102   if [ -r /etc/grml_version ] ; then
103      cat /etc/grml_version > grml_version
104   fi
105   if [ -r /etc/debian_version ] ; then
106      cat /etc/debian_version > debian_version
107   fi
108   uname -a > uname
109
110 # disks / devices
111   [ -f /proc/scsi/scsi ] && cat /proc/scsi/scsi > scsi
112   (lspci; lspci -n) | sort > lspci
113   [ -r /proc/bus/pnp ] && lspnp > lspnp
114   [ -r /proc/bus/usb ] && lsusb > lsusb
115   cat /proc/partitions > partitions
116   find /proc/ide/ -name geometry -exec grep . {} \; > proc_ide 2>/dev/null
117   df -h > df 2>/dev/null
118   for i in free lsmod mount lsdev ; do
119       exectest $i  && $i > $i
120   done
121
122 # proc stuff
123   for i in cpuinfo interrupts cmdline devices dma fb iomem ioports \
124     mdstat meminfo modules mtrr pci version ; do
125     [ -r /proc/$i ] && cat /proc/$i > proc_$i
126   done
127   exectest sysdump  && sysdump > sysdump 2>sysdump.error
128 # for sysnet in `find /proc/sys/net/*/ -type f | grep -v flush`; do cat $sysnet >> sysnet ; done
129
130 # log
131   dmesg > dmesg.cur
132
133 # hwinfo
134   exectest discover && discover -v --type-summary --enable-bus all > discover 2> discover.2
135   exectest hwinfo   && hwinfo log=hwinfo
136   exectest x86info  && x86info > x86info 2>x86info.2
137
138 # net stuff
139   exectest ifconfig  && ifconfig -v -a  > ifconfig
140   exectest ip        && ip route show   > ip_route
141   exectest ip        && ip link show    > ip_link
142   exectest route     && route -n        > route
143
144 # software
145   if exectest dpkg ; then
146      dpkg --get-selections   > dpkg_get_selections
147      COLUMNS=300 dpkg --list > dpkg_list
148      COLUMNS=1000 dpkg -l linux-image-$UNAME | grep linux-image-$UNAME | tr -s ' ' > running_kernel
149   fi
150
151 # powermanagement
152   exectest laptop-detect  && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
153   exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
154   exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
155   [ -r /proc/apm/ ] && apm > apm
156
157 # kernel stuff
158   if [ -r /proc/config.gz ] ; then
159      zcat /proc/config.gz > kernelconfig
160   else
161      [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
162   fi
163
164 # X stuff
165   if [ -n "${DISPLAY}" ] ; then
166      exectest xviddetect  && xviddetect         > xviddetect
167      exectest xvidtune    && xvidtune -show     > xdivtune
168      exectest xrandr      && xrandr             > xrandr
169      exectest xdpyinfo    && xdpyinfo           > xdpyinfo
170      X -version > x_version 2>&1
171   fi
172
173   for i in Xorg.0.log Xorg.7.log Xorg.8.log XFree86.0.log XFree86.7.log XFree86.8.log dmesg ; do
174       cp /var/log/$i log_$i 2>/dev/null
175   done
176
177   cp /etc/X11/xorg.conf    xorg.conf    2>/dev/null
178   cp /etc/modules          modules      2>/dev/null
179   cp /etc/X11/XF86Config-4 XF86Config-4 2>/dev/null
180
181 # not available:
182 # sysinfo -class device -level all
183
184 # as root:
185 if [ -n "$NOTROOT" ] ; then
186    echo "not running as root" > root
187 else
188    echo "running as root" > root
189    disk_info
190    exectest sfdisk     && sfdisk -d > sfdisk 2>sfdisk.error
191    exectest ddcprobe   && ddcprobe  > ddcprobe
192    exectest dmidecode  && dmidecode > dmidecode
193
194    exectest dconf && dconf -o dconf
195
196    if [ -x /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl ] ; then
197       /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
198    fi
199
200    for disk in $disklist; do
201       exectest smartctl  && smartctl -i /dev/$disk >> smartctl
202       exectest hdparm    && hdparm -iv /dev/$disk  >> hdparm
203       exectest fdisk     && fdisk -lu /dev/$disk   >> fdisk 2>>fdisk.error
204       exectest parted    && parted -s /dev/$disk print >> parted
205       LC_ALL=C file -s /dev/$disk?* | grep -v ": empty" >> file_disk
206    done
207 fi
208 )
209
210 # finally create the tarball
211 if [ -f "${INFOFILE}" ] ; then
212    DATE="$(date +%Y%m%d_%H%M%S)"
213    NEW_INFOFILE="${WORKING_DIR}/info_${DATE}.tar.bz2"
214    echo
215    echo "Warning: $INFOFILE exists already, using $NEW_INFOFILE instead.">&2
216    INFOFILE="$NEW_INFOFILE" # adjust variable for final info message
217 fi
218
219 cd "${TMPDIR}"
220 tar jcf "${INFOFILE}" "${INFODIR}"
221 cd "${WORKING_DIR}"
222
223 echo
224 [ -r "$INFOFILE" ] && echo "$INFOFILE ($(ls -ahl $INFOFILE | awk '{print $5}')) has been generated."
225 echo
226
227 bailout
228
229 ## END OF FILE##################################################################