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 ################################################################################
16 [ -n "$WORKING_DIR" -a -d "$WORKING_DIR" ] || WORKING_DIR=$(pwd)
19 if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
20 echo "$PN - collect hardware information
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."
31 TMPDIR=$(mktemp -d) || { echo "Error creating a temporary directory, can not continue. Exiting.">&2 ; exit 1; }
35 [ -d "$TMPDIR" ] && rm -rf "$TMPDIR"
36 [ -n "$1" ] && exit 1 || exit 0
39 [ -n "$INFOFILE" ] || INFOFILE='info.tar.bz2'
40 INFOFILE="${WORKING_DIR}/${INFOFILE}"
42 if [ "$(id -u)" != "0" ] ; then
44 echo "Notice: you are running $PN without root permissions. Not all information will be collected."
48 # check whether a binary is available and executable
51 echo 'Usage: exectest <binary>'>&2
54 test -e "$(which $1)" && return 0 || return 1
58 # echo a list of all disks and their size
59 # taken from http://cvs.debian.org/fai/lib/disk-info
61 local isdisk major minor blocks device suffix
62 while read major minor blocks device suffix; do
65 [ -f /proc/ide/$device/media ] && grep -q cdrom /proc/ide/$device/media && isdisk=0
66 [ "$isdisk" -eq 1 ] && echo "$device $blocks"
71 # print only every second entry; used by disk_info
74 if [ "$i" -eq 0 ]; then
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`
90 echo "Running grml-hwinfo ${VERSION} - collecting hardware information."
92 mkdir "${TMPDIR}/${INFODIR}"
93 cd "${TMPDIR}/${INFODIR}" || bailout 1
95 cd "${TMPDIR}/${INFODIR}"
97 echo "Generating hardware information report using file $INFOFILE."
98 echo "This might take a few seconds/minutes. Please be patient..."
102 if [ -r /etc/grml_version ] ; then
103 cat /etc/grml_version > grml_version
105 if [ -r /etc/debian_version ] ; then
106 cat /etc/debian_version > debian_version
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
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
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
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
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
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
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
158 if [ -r /proc/config.gz ] ; then
159 zcat /proc/config.gz > kernelconfig
161 [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
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
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
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
182 # sysinfo -class device -level all
185 if [ -n "$NOTROOT" ] ; then
186 echo "not running as root" > root
188 echo "running as root" > root
190 exectest sfdisk && sfdisk -d > sfdisk 2>sfdisk.error
191 exectest ddcprobe && ddcprobe > ddcprobe
192 exectest dmidecode && dmidecode > dmidecode
194 exectest dconf && dconf -o dconf
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
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
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"
215 echo "Warning: $INFOFILE exists already, using $NEW_INFOFILE instead.">&2
216 INFOFILE="$NEW_INFOFILE" # adjust variable for final info message
220 tar jcf "${INFOFILE}" "${INFODIR}"
224 [ -r "$INFOFILE" ] && echo "$INFOFILE ("$(ls -ahl "$INFOFILE" | awk '{print $5}')") has been generated."
229 ## END OF FILE##################################################################