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 if test -e "$(which $1)" ; then
90 grep -q "^$1"'$' missing_tools 2>/dev/null || echo "$1" >> missing_tools
96 # echo a list of all disks and their size
97 # taken from http://cvs.debian.org/fai/lib/disk-info
99 local isdisk major minor blocks device suffix
100 while read major minor blocks device suffix; do
103 [ -f /proc/ide/$device/media ] && grep -q cdrom /proc/ide/$device/media && isdisk=0
104 [ "$isdisk" -eq 1 ] && echo "$device $blocks"
109 # print only every second entry; used by disk_info
112 if [ "$i" -eq 0 ]; then
122 # the variable holds a space separated list of devices and their block size
123 device_size=`grep -E ' cciss/c.d.$| ida/c.d.$| rd/c.d.$| hd.$| sd.$|/disc$' /proc/partitions | diskandsize`
124 # a list of all local disks, without size
125 disklist=`list_disks $device_size`
129 cd "${OUTDIR}" || exit 1
131 [ -n "$GENERATE_FILE" ] && echo "Output file: $OUTFILE"
132 [ -n "$GENERATE_DIRECTORY" ] && echo "Output directory: $OUTDIR"
134 echo "This might take a few seconds/minutes. Please be patient..."
138 if [ -r /etc/grml_version ] ; then
139 cat /etc/grml_version > grml_version
141 if [ -r /etc/debian_version ] ; then
142 cat /etc/debian_version > debian_version
147 [ -f /proc/scsi/scsi ] && cat /proc/scsi/scsi > scsi
148 (lspci; lspci -n) | sort > lspci
149 [ -r /proc/bus/pnp ] && lspnp > lspnp
150 [ -r /proc/bus/usb ] && lsusb > lsusb
151 cat /proc/partitions > partitions
152 find /proc/ide/ -name geometry -exec grep . {} \; > proc_ide 2>/dev/null
153 df -h > df 2>/dev/null
154 for i in free lsmod mount lsdev ; do
155 exectest $i && $i > $i
157 swapon -s > swapon 2>swapon.error
160 for i in cpuinfo interrupts cmdline devices dma fb iomem ioports \
161 mdstat meminfo modules mtrr pci version ; do
162 [ -r /proc/$i ] && cat /proc/$i > proc_$i
164 exectest sysdump && sysdump > sysdump 2>sysdump.error
165 # for sysnet in `find /proc/sys/net/*/ -type f | grep -v flush`; do cat $sysnet >> sysnet ; done
171 exectest discover && discover -v --type-summary --enable-bus all > discover 2> discover.2
172 exectest hwinfo && hwinfo log=hwinfo
173 exectest numactl && numactl --hardware > numactl
174 exectest x86info && x86info > x86info 2>x86info.2
177 exectest ifconfig && ifconfig -v -a > ifconfig
178 exectest ip && ip route show > ip_route
179 exectest ip && ip link show > ip_link
180 exectest route && route -n > route
183 if exectest dpkg ; then
184 dpkg --get-selections > dpkg_get_selections
185 COLUMNS=300 dpkg --list > dpkg_list
189 exectest laptop-detect && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
190 exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
191 exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
192 [ -r /proc/apm/ ] && apm > apm
195 if [ -r /proc/config.gz ] ; then
196 zcat /proc/config.gz > kernelconfig
198 [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
201 exectest dpkg && COLUMNS=1000 dpkg -l linux-image-$UNAME \
202 | grep linux-image-$UNAME | tr -s ' ' > running_kernel 2>running_kernel.error
203 dpkg -S /boot/vmlinuz-$(uname -r) >> running_kernel 2>>running_kernel.error
206 if [ -n "${DISPLAY}" ] ; then
207 exectest xviddetect && xviddetect > xviddetect
208 exectest xvidtune && xvidtune -show > xdivtune
209 exectest xrandr && xrandr > xrandr
210 exectest xdpyinfo && xdpyinfo > xdpyinfo
211 X -version > x_version 2>&1
214 for i in Xorg.0.log Xorg.7.log Xorg.8.log XFree86.0.log XFree86.7.log XFree86.8.log dmesg ; do
215 cp /var/log/$i log_$i 2>/dev/null
218 cp /etc/X11/xorg.conf xorg.conf 2>/dev/null
219 cp /etc/modules modules 2>/dev/null
220 cp /etc/X11/XF86Config-4 XF86Config-4 2>/dev/null
223 # sysinfo -class device -level all
226 if [ -n "$NOTROOT" ] ; then
227 echo "not running as root" > root
229 echo "running as root" > root
231 exectest sfdisk && sfdisk -d > sfdisk 2>sfdisk.error
232 exectest dmidecode && dmidecode > dmidecode
234 exectest dconf && dconf -o dconf
236 if [ -x /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl ] ; then
237 /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
240 exectest mdadm && mdadm --detail /dev/md[0-9]* >> mdadm 2>mdadm.error
243 exectest pvs && pvs > pvs 2>pvs.error
244 exectest vgs && vgs > vgs 2>vgs.error
245 exectest lvs && lvs > lvs 2>lvs.error
246 exectest lvdisplay && lvdisplay > lvdisplay 2>lvdisplay.error
248 exectest dmsetup && dmsetup ls > dmsetup_ls 2>dmsetup_ls.error
250 for disk in $disklist; do
251 exectest smartctl && echo "smartctl -a /dev/$disk :\n" >> smartctl && smartctl -a /dev/$disk >> smartctl && echo "\n\n" >> smartctl
252 exectest hdparm && echo "hdparm -iv /dev/$disk :\n" >> hdparm && hdparm -iv /dev/$disk >> hdparm && echo "\n\n" >> hdparm
253 exectest fdisk && echo "fdisk -lu /dev/$disk :\n" >> fdisk && fdisk -lu /dev/$disk >> fdisk 2>>fdisk.error && echo "\n\n" >> fdisk
254 exectest parted && echo "parted -s /dev/$disk :\n" >> parted && parted -s /dev/$disk print >> parted && echo "\n\n" >> parted
255 file -s /dev/$disk?* | grep -v ": empty" >> file_disk
260 # get rid of empty files
262 test -s $file || rm $file
270 if [ -n "$GENERATE_FILE" ] ; then
271 tar jcf "${OUTFILE}" "${OUTDIRNAME}"
272 [ -r "$OUTFILE" ] && echo "$OUTFILE ("$(ls -ahl "$OUTFILE" | awk '{print $5}')") has been generated."
275 # remove (temporary) output directory if needed, else keep it, as it doubles
276 # as the real output directory.
277 if [ -z "$GENERATE_DIRECTORY" ] ; then
280 [ -r "${OUTDIR}" ] && echo "${OUTDIR} has been generated."
285 ## END OF FILE##################################################################