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