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
186 COLUMNS=1000 dpkg -l linux-image-$UNAME | grep linux-image-$UNAME | tr -s ' ' > running_kernel
190 exectest laptop-detect && laptop-detect >/dev/null 2>/dev/null && echo "0" > laptop_detected
191 exectest acpi_available && acpi_available && cat /proc/acpi/info > acpi_info
192 exectest acpi && acpi > acpi 2> acpi.error && acpi -v > acpi.version
193 [ -r /proc/apm/ ] && apm > apm
196 if [ -r /proc/config.gz ] ; then
197 zcat /proc/config.gz > kernelconfig
199 [ -r /boot/config-$UNAME ] && cat /boot/config-$UNAME > kernelconfig
203 if [ -n "${DISPLAY}" ] ; then
204 exectest xviddetect && xviddetect > xviddetect
205 exectest xvidtune && xvidtune -show > xdivtune
206 exectest xrandr && xrandr > xrandr
207 exectest xdpyinfo && xdpyinfo > xdpyinfo
208 X -version > x_version 2>&1
211 for i in Xorg.0.log Xorg.7.log Xorg.8.log XFree86.0.log XFree86.7.log XFree86.8.log dmesg ; do
212 cp /var/log/$i log_$i 2>/dev/null
215 cp /etc/X11/xorg.conf xorg.conf 2>/dev/null
216 cp /etc/modules modules 2>/dev/null
217 cp /etc/X11/XF86Config-4 XF86Config-4 2>/dev/null
220 # sysinfo -class device -level all
223 if [ -n "$NOTROOT" ] ; then
224 echo "not running as root" > root
226 echo "running as root" > root
228 exectest sfdisk && sfdisk -d > sfdisk 2>sfdisk.error
229 exectest dmidecode && dmidecode > dmidecode
231 exectest dconf && dconf -o dconf
233 if [ -x /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl ] ; then
234 /usr/share/doc/lm-sensors/examples/eeprom/decode-dimms.pl > decode-dimms 2>decode-dimms.error
237 exectest mdadm && mdadm --detail /dev/md[0-9]* >> mdadm 2>mdadm.error
240 exectest pvs && pvs > pvs 2>pvs.error
241 exectest vgs && vgs > vgs 2>vgs.error
242 exectest lvs && lvs > lvs 2>lvs.error
243 exectest lvdisplay && lvdisplay > lvdisplay 2>lvdisplay.error
245 exectest dmsetup && dmsetup ls > dmsetup_ls 2>dmsetup_ls.error
247 for disk in $disklist; do
248 exectest smartctl && echo "smartctl -a /dev/$disk :\n" >> smartctl && smartctl -a /dev/$disk >> smartctl && echo "\n\n" >> smartctl
249 exectest hdparm && echo "hdparm -iv /dev/$disk :\n" >> hdparm && hdparm -iv /dev/$disk >> hdparm && echo "\n\n" >> hdparm
250 exectest fdisk && echo "fdisk -lu /dev/$disk :\n" >> fdisk && fdisk -lu /dev/$disk >> fdisk 2>>fdisk.error && echo "\n\n" >> fdisk
251 exectest parted && echo "parted -s /dev/$disk :\n" >> parted && parted -s /dev/$disk print >> parted && echo "\n\n" >> parted
252 file -s /dev/$disk?* | grep -v ": empty" >> file_disk
262 if [ -n "$GENERATE_FILE" ] ; then
263 tar jcf "${OUTFILE}" "${OUTDIRNAME}"
264 [ -r "$OUTFILE" ] && echo "$OUTFILE ("$(ls -ahl "$OUTFILE" | awk '{print $5}')") has been generated."
267 # remove (temporary) output directory if needed, else keep it, as it doubles
268 # as the real output directory.
269 if [ -z "$GENERATE_DIRECTORY" ] ; then
272 [ -r "${OUTDIR}" ] && echo "${OUTDIR} has been generated."
277 ## END OF FILE##################################################################