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)
17 VERSION='***UNRELEASED***'
19 # data collection should not be affected by user locale
23 TIMESTAMP='+%F--%H-%M-%S-%Z'
24 DATE="$(date $TIMESTAMP)"
26 echo "$PN ${VERSION} - collect hardware information"
31 while getopts "hdf" args; do
34 This tool collects information of the hardware this tool is being executed
35 on. It can be executed as normal user to collect some basic information or
36 with root permissions to collect as much information as possible. By
37 default, a file named grml-hwinfo-TIMESTAMP.tar.bz2 storing all collected
38 information will be created in the current working directory. Alternatively,
39 you can have it create a directory with all information.
43 -h Display this help message
44 -f Create grml-hwinfo-TIMESTAMP.tar.bz2
45 -d Create grml-hwinfo-TIMESTAMP as a directory
46 -df Create both, the directory and the file
53 GENERATE_DIRECTORY='1'
56 f) # generating file; default behaviour
63 # Generate output/temporary directory name & path, and output file path
65 OUTDIRNAME="grml-hwinfo-${DATE}"
66 OUTDIR="${WORKING_DIR}/${OUTDIRNAME}"
67 mkdir "${OUTDIR}" || { echo 'Directory "'${OUTDIR}'" already exists, aborting.'>&2 ; exit 1; }
69 if [ -n "$GENERATE_FILE" ] ; then
70 OUTFILE_="${OUTDIR}.tar.bz2"
71 [ -e "${OUTFILE_}" ] && { echo 'File "'${OUTFILE_}'" already exists, aborting.'>&2 ; rm -r "${OUTDIR}"; exit 1; }
76 if [ "$(id -u)" != "0" ] ; then
78 echo "W: Running without root permissions. Not all data will be collected."
81 # check whether a binary is available and executable
84 echo 'Usage: exectest <binary>'>&2
87 test -e "$(which $1)" && return 0 || return 1
91 # echo a list of all disks and their size
92 # taken from http://cvs.debian.org/fai/lib/disk-info
94 local isdisk major minor blocks device suffix
95 while read major minor blocks device suffix; do
98 [ -f /proc/ide/$device/media ] && grep -q cdrom /proc/ide/$device/media && isdisk=0
99 [ "$isdisk" -eq 1 ] && echo "$device $blocks"
104 # print only every second entry; used by disk_info
107 if [ "$i" -eq 0 ]; then
117 # the variable holds a space separated list of devices and their block size
118 device_size=`grep -E ' cciss/c.d.$| ida/c.d.$| rd/c.d.$| hd.$| sd.$|/disc$' /proc/partitions | diskandsize`
119 # a list of all local disks, without size
120 disklist=`list_disks $device_size`
124 cd "${OUTDIR}" || exit 1
126 [ -n "$GENERATE_FILE" ] && echo "Output file: $OUTFILE"
127 [ -n "$GENERATE_DIRECTORY" ] && echo "Output directory: $OUTDIR"
129 echo "This might take a few seconds/minutes. Please be patient..."
133 if [ -r /etc/grml_version ] ; then
134 cat /etc/grml_version > grml_version
136 if [ -r /etc/debian_version ] ; then
137 cat /etc/debian_version > debian_version
142 [ -f /proc/scsi/scsi ] && cat /proc/scsi/scsi > scsi
143 (lspci; lspci -n) | sort > lspci
144 [ -r /proc/bus/pnp ] && lspnp > lspnp
145 [ -r /proc/bus/usb ] && lsusb > lsusb
146 cat /proc/partitions > partitions
147 find /proc/ide/ -name geometry -exec grep . {} \; > proc_ide 2>/dev/null
148 df -h > df 2>/dev/null
149 for i in free lsmod mount lsdev ; do
150 exectest $i && $i > $i
152 swapon -s > swapon 2>swapon.error
155 for i in cpuinfo interrupts cmdline devices dma fb iomem ioports \
156 mdstat meminfo modules mtrr pci version ; do
157 [ -r /proc/$i ] && cat /proc/$i > proc_$i
159 exectest sysdump && sysdump > sysdump 2>sysdump.error
160 # for sysnet in `find /proc/sys/net/*/ -type f | grep -v flush`; do cat $sysnet >> sysnet ; done
166 exectest discover && discover -v --type-summary --enable-bus all > discover 2> discover.2
167 exectest hwinfo && hwinfo log=hwinfo
168 exectest numactl && numactl --hardware > numactl
169 exectest x86info && x86info > x86info 2>x86info.2
172 exectest ifconfig && ifconfig -v -a > ifconfig
173 exectest ip && ip route show > ip_route
174 exectest ip && ip link show > ip_link
175 exectest route && route -n > route
178 if exectest dpkg ; then
179 dpkg --get-selections > dpkg_get_selections
180 COLUMNS=300 dpkg --list > dpkg_list
181 COLUMNS=1000 dpkg -l linux-image-$UNAME | grep linux-image-$UNAME | tr -s ' ' > running_kernel
185 exectest laptop-detect && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
186 exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
187 exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
188 [ -r /proc/apm/ ] && apm > apm
191 if [ -r /proc/config.gz ] ; then
192 zcat /proc/config.gz > kernelconfig
194 [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
198 if [ -n "${DISPLAY}" ] ; then
199 exectest xviddetect && xviddetect > xviddetect
200 exectest xvidtune && xvidtune -show > xdivtune
201 exectest xrandr && xrandr > xrandr
202 exectest xdpyinfo && xdpyinfo > xdpyinfo
203 X -version > x_version 2>&1
206 for i in Xorg.0.log Xorg.7.log Xorg.8.log XFree86.0.log XFree86.7.log XFree86.8.log dmesg ; do
207 cp /var/log/$i log_$i 2>/dev/null
210 cp /etc/X11/xorg.conf xorg.conf 2>/dev/null
211 cp /etc/modules modules 2>/dev/null
212 cp /etc/X11/XF86Config-4 XF86Config-4 2>/dev/null
215 # sysinfo -class device -level all
218 if [ -n "$NOTROOT" ] ; then
219 echo "not running as root" > root
221 echo "running as root" > root
223 exectest sfdisk && sfdisk -d > sfdisk 2>sfdisk.error
224 exectest ddcprobe && ddcprobe > ddcprobe
225 exectest dmidecode && dmidecode > dmidecode
227 exectest dconf && dconf -o dconf
229 if [ -x /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl ] ; then
230 /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
233 exectest mdadm && mdadm --detail /dev/md[0-9]* >> mdadm 2>mdadm.error
236 exectest pvs && pvs > pvs 2>pvs.error
237 exectest vgs && vgs > vgs 2>vgs.error
238 exectest lvs && lvs > lvs 2>lvs.error
239 exectest lvdisplay && lvdisplay > lvdisplay 2>lvdisplay.error
241 exectest dmsetup && dmsetup ls > dmsetup_ls 2>dmsetup_ls.error
243 for disk in $disklist; do
244 exectest smartctl && echo "smartctl -a /dev/$disk :\n" >> smartctl && smartctl -a /dev/$disk >> smartctl && echo "\n\n" >> smartctl
245 exectest hdparm && echo "hdparm -iv /dev/$disk :\n" >> hdparm && hdparm -iv /dev/$disk >> hdparm && echo "\n\n" >> hdparm
246 exectest fdisk && echo "fdisk -lu /dev/$disk :\n" >> fdisk && fdisk -lu /dev/$disk >> fdisk 2>>fdisk.error && echo "\n\n" >> fdisk
247 exectest parted && echo "parted -s /dev/$disk :\n" >> parted && parted -s /dev/$disk print >> parted && echo "\n\n" >> parted
248 file -s /dev/$disk?* | grep -v ": empty" >> file_disk
258 if [ -n "$GENERATE_FILE" ] ; then
259 tar jcf "${OUTFILE}" "${OUTDIRNAME}"
260 [ -r "$OUTFILE" ] && echo "$OUTFILE ("$(ls -ahl "$OUTFILE" | awk '{print $5}')") has been generated."
263 # remove (temporary) output directory if needed, else keep it, as it doubles
264 # as the real output directory.
265 if [ -z "$GENERATE_DIRECTORY" ] ; then
268 [ -r "${OUTDIR}" ] && echo "${OUTDIR} has been generated."
273 ## END OF FILE##################################################################