1d2e20874d4e1db1f2576fbdefe1dfebb276cd4f
[asterisk/asterisk.git] / contrib / scripts / autosupport
1 #!/bin/sh
2 #
3 # Autosupport Version 2.0.18
4 # Collect support information
5 #
6 # Copyright (C) 2005-2011, Digium, Inc.
7 #
8 # Written by John Bigelow (support@digium.com)
9 #            Charles Moye (cmoye@digium.com)
10 #            Trey Blancher (trey@digium.com)
11 #
12 # Distributed under the terms of the GNU General Public
13 # License
14 #
15 # usage:
16 # autosupport [prefix]
17 # ARGUMENTS:
18 # prefix - Prefix to tarball. (Referenced as $1)
19 #      Example: autosupport <Your Digium Technical Support Ticket number>
20
21 # Ensure the PATH variable includes '/usr/sbin' and '/sbin'
22 PATH=/usr/sbin:/sbin:${PATH}
23
24 DATE_STAMP=$(date +%Y%m%d)
25 OUTPUT_FILE=digiuminfo.txt
26 TARBALL_OUTPUT_FILE="digium-info_${DATE_STAMP}.tar"
27 VAR_LIB_LIST_FILE="list-of-varlibasterisk.txt"
28 FILE_PREFIX=
29 FOLDER_PREFIX="${HOME}/"
30 files="n";
31 NONINTERACTIVE=0
32
33 # If a prefix is specified on command-line, add it.
34 if (set -u; : $1) 2> /dev/null
35 then
36   if [ $1 == "-h" ] || [ $1 == "--help" ]; then
37     echo
38     echo "Digium autosupport script"
39     echo "Copyright (C) 2005-2010, Digium, Inc."
40     echo "Licensed under the terms of the GNU General Public License"
41     echo
42     echo "usage: autosupport [prefix]"
43     echo "Valid Options:"
44     echo "   [prefix]                   Prefix to apply to output files"
45     echo "                              May be your existing Digium Technical Support Ticket ID"
46     echo "   -n, --non-interactive      Run without requiring user input"
47     echo "   -h, --help                 Show help about options"
48     echo
49     echo "Example:"
50     echo "    autosupport XXXXXXXX"
51     echo "Generates:"
52     echo "    XXXXXXXX_${OUTPUT_FILE}"
53     echo "    XXXXXXXX_${TARBALL_OUTPUT_FILE}"
54     echo
55     exit
56   elif [ $1 == "-n" ] || [ $1 == "--non-interactive" ]; then
57     FILE_PREFIX=
58     NONINTERACTIVE=1
59   else
60     FILE_PREFIX="${FILE_PREFIX}${1}_";
61   fi
62 fi
63
64 MYUID=$(id -u);
65
66 if [ $MYUID -ne  0 ]; then
67   echo "You must be root to run this."
68   exit 1
69 fi
70
71 SUPPORTED_MODULES="wcb4xxp wct4xxp wctc4xxp wctdm wctdm24xxp wcte11xp wcte12xp"
72 RELATED_MODULES="$SUPPORTED_MODULES dahdi_dummy dahdi_transcode dahdi_vpmadt032_loader zaptel ztdummy zttranscode";
73
74 OUTPUT_FILE="${FILE_PREFIX}${OUTPUT_FILE}"
75 TARBALL_OUTPUT_FILE="${FILE_PREFIX}${TARBALL_OUTPUT_FILE}"
76 VAR_LIB_LIST_FILE="${FILE_PREFIX}${VAR_LIB_LIST_FILE}"
77
78 OUTPUT="${FOLDER_PREFIX}${OUTPUT_FILE}"
79 TARBALL_OUTPUT="${FOLDER_PREFIX}${TARBALL_OUTPUT_FILE}"
80 VAR_LIB_LIST="${FOLDER_PREFIX}${VAR_LIB_LIST_FILE}"
81
82 # Done with setup, now start gathering information.
83
84 # function not implemented yet
85 determine_paths()
86 {
87   ASTERISK_PROCESS=$(ps -o cmd -C asterisk | grep asterisk 2> /dev/null)
88 echo "detected process: $ASTERISK_PROCESS";
89   # split on whitespace? or use sed/awk to parse
90   # get first arg which will be path to Asterisk binary - add this to PATH
91   # look for a '-C' if that is present, get the arg after it, and make the tarball collect that directory
92   ## in addition to /etc/asterisk/ or instead of it?
93 }
94
95 collect_digiuminfo()
96 {
97 # Delete existing OUTPUT
98 [ -f $OUTPUT ] && rm -rf $OUTPUT
99
100 # Sanity Checks
101 echo "------------------" >> $OUTPUT;
102 echo "Sanity" >> $OUTPUT;
103 echo "------------------" >> $OUTPUT;
104 md5sum $0 >> $OUTPUT;
105 grep "Autosupport Version" $0 | head -n1 >> $OUTPUT
106 echo >> $OUTPUT;
107 echo >> $OUTPUT;
108 echo -n "Working";
109
110 echo "------------------" >> $OUTPUT;
111 echo "UPTIME : uptime" >> $OUTPUT;
112 echo "------------------" >> $OUTPUT;
113 uptime >> $OUTPUT;
114 echo >> $OUTPUT;
115 echo >> $OUTPUT;
116 echo -n "."
117
118 echo "------------------" >> $OUTPUT;
119 echo "MEMORY : free" >> $OUTPUT;
120 echo "------------------" >> $OUTPUT;
121 free >> $OUTPUT;
122 echo >> $OUTPUT;
123 echo >> $OUTPUT;
124 echo -n "."
125
126 echo "------------------" >> $OUTPUT;
127 echo "KERNEL VERSION : uname -a" >> $OUTPUT;
128 echo "------------------" >> $OUTPUT;
129 uname -a >> $OUTPUT;
130 echo >> $OUTPUT;
131 echo >> $OUTPUT;
132 echo -n "."
133
134 echo "------------------" >> $OUTPUT;
135 echo "VERSION INFO : cat /proc/version" >> $OUTPUT;
136 echo "------------------" >> $OUTPUT;
137 cat /proc/version >> $OUTPUT;
138 echo >> $OUTPUT;
139 echo >> $OUTPUT;
140 echo -n "."
141
142 echo "------------------" >> $OUTPUT;
143 echo "CMDLINE INFO : cat /proc/cmdline" >> $OUTPUT;
144 echo "------------------" >> $OUTPUT;
145 cat /proc/cmdline >> $OUTPUT;
146 echo >> $OUTPUT;
147 echo >> $OUTPUT;
148 echo -n "."
149
150 # Check for loaded Zaptel/DAHDI modules
151 for module in dahdi zaptel; do
152   if [ -d /sys/module/$module ]; then
153     echo "------------------" >> $OUTPUT
154     echo "$module version:" >> $OUTPUT
155     echo "------------------" >> $OUTPUT
156     echo "/sys/module/$module/version: " >> $OUTPUT
157     cat /sys/module/$module/version 2> /dev/null >> $OUTPUT
158     echo "" >> $OUTPUT;
159     echo -n "."
160   fi
161 done
162
163 echo "------------------" >> $OUTPUT;
164 echo "DAHDI TOOLS : dahdi_cfg --help" >> $OUTPUT;
165 echo "------------------" >> $OUTPUT;
166 dahdi_cfg --help 2>&1 | grep "Version" >> $OUTPUT;
167 echo >> $OUTPUT;
168 echo >> $OUTPUT;
169 echo -n "."
170
171 echo "------------------" >> $OUTPUT;
172 echo "DAHDI HARDWARE : dahdi_hardware" >> $OUTPUT;
173 echo "------------------" >> $OUTPUT;
174 dahdi_hardware >> $OUTPUT;
175 echo >> $OUTPUT;
176 echo >> $OUTPUT;
177
178 echo "------------------" >> $OUTPUT;
179 echo "ASTERISK INFO : asterisk -V" >> $OUTPUT;
180 echo "------------------" >> $OUTPUT;
181 echo "asterisk -V:" >> $OUTPUT;
182 asterisk -V >> $OUTPUT;
183 echo >> $OUTPUT;
184 # Add check to see if asterisk is running.
185 if [ -e /var/run/asterisk.ctl ] || [ -e /var/run/asterisk/asterisk.ctl ]; then
186   for command in "show version" "core show version" "pri show version" "dahdi show version" "transcoder show" \
187       "core show uptime" "pri show spans" "misdn show stacks" "zap show channels" "dahdi show status" "dahdi show channels" \
188       "dahdi show channel 1" "core show channels" "skype show version" "skype show licenses" "skype show users" \
189       "skype show hostid" "show g729" "g729 show version" "g729 show licenses" "g729 show hostid" "fax show version" \
190       "fax show licenses" "fax show hostid" "fax show stats"; do
191     echo "asterisk -rx \"$command\"" >> $OUTPUT;
192     asterisk -rx "$command" >> $OUTPUT;
193     echo >> $OUTPUT;
194     echo -n "."
195   done
196   echo >> $OUTPUT;
197 fi
198
199 echo "------------------" >> $OUTPUT;
200 echo "OTHER INFO : cat /etc/*{issue,release,version}*" >> $OUTPUT;
201 echo "------------------" >> $OUTPUT;
202 for file in $(ls /etc/*issue* /etc/*release* /etc/*version* \
203   /etc/*motd* /etc/asterisknow-version /dev/zap/ /dev/dahdi/ \
204   2> /dev/null); do
205   if [ -f $file ]; then
206     echo "$file:" >> $OUTPUT;
207     cat $file >> $OUTPUT;
208     echo >> $OUTPUT;
209     echo -n "."
210   fi
211 done
212 echo >> $OUTPUT;
213
214 echo "------------------" >> $OUTPUT;
215 echo "TOP : top -bn1" >> $OUTPUT;
216 echo "------------------" >> $OUTPUT;
217 top -bn1 >> $OUTPUT;
218 echo >> $OUTPUT;
219 echo >> $OUTPUT;
220 echo -n "."
221
222 echo "------------------" >> $OUTPUT;
223 echo "RUNNING PROCESSES : ps aux" >> $OUTPUT;
224 echo "------------------" >> $OUTPUT;
225 ps aux >> $OUTPUT;
226 echo >> $OUTPUT;
227 echo >> $OUTPUT;
228 echo -n "."
229
230 echo "------------------" >> $OUTPUT;
231 echo "INTERRUPTS : cat /proc/interrupts" >> $OUTPUT;
232 echo "------------------" >> $OUTPUT;
233 cat /proc/interrupts >> $OUTPUT;
234 echo -n "."
235 sleep 2;
236 echo "---------- sleep(2) ----------" >> $OUTPUT;
237 cat /proc/interrupts >> $OUTPUT;
238 echo >> $OUTPUT;
239 echo >> $OUTPUT;
240 echo -n "."
241
242 echo "------------------" >> $OUTPUT;
243 echo "DAHDI SCAN : dahdi_scan" >> $OUTPUT;
244 echo "------------------" >> $OUTPUT;
245 dahdi_scan >> $OUTPUT;
246 echo >> $OUTPUT;
247 echo >> $OUTPUT;
248 echo -n "."
249
250 echo "----------------------------" >> $OUTPUT;
251 echo "CAT OF DAHDI/ZAPTEL CHANNELS : cat /proc/dahdi/" >> $OUTPUT;
252 echo "----------------------------" >> $OUTPUT;
253 for tech in dahdi zaptel zap; do
254   if [ -d /proc/$tech/ ]; then
255     for file in $(ls /proc/$tech/ 2> /dev/null); do
256       echo "----------------------------" >> $OUTPUT;
257       echo "/proc/$tech/$file:" >> $OUTPUT;
258       cat /proc/$tech/$file >> $OUTPUT;
259       echo >> $OUTPUT;
260       echo -n "."
261     done
262   fi
263 done
264 echo >> $OUTPUT;
265
266 echo "------------------" >> $OUTPUT;
267 echo "DMESG OUTPUT : dmesg" >> $OUTPUT;
268 echo "------------------" >> $OUTPUT;
269 dmesg >> $OUTPUT;
270 echo >> $OUTPUT;
271 echo >> $OUTPUT;
272 echo -n "."
273
274 echo "------------------" >> $OUTPUT;
275 echo "LOADED MODULES : lsmod" >> $OUTPUT;
276 echo "------------------" >> $OUTPUT;
277 lsmod >> $OUTPUT;
278 echo >> $OUTPUT;
279 echo >> $OUTPUT;
280 echo -n "."
281
282 # Grab the parameters for each module
283 for mod in $SUPPORTED_MODULES; do
284   if [ -d /sys/module/$mod ]; then
285     echo "------------------" >> $OUTPUT
286     echo "$mod parameters" >> $OUTPUT
287     echo "------------------" >> $OUTPUT
288     echo "/sys/module/$mod/parameters:" >> $OUTPUT
289     for param in $(ls /sys/module/$mod/parameters/ /sys/module/$mod/ 2> /dev/null); do
290       if [ -f /sys/module/$mod/parameters/$param ]; then
291         echo -n "$param:  " >> $OUTPUT
292         cat /sys/module/$mod/parameters/$param 2> /dev/null >> $OUTPUT
293       elif [ -f /sys/module/$mod/$param ]; then
294         # Handle Zaptel doing it differently
295         echo -n "$param:  " >> $OUTPUT
296         cat /sys/module/$mod/$param 2> /dev/null >> $OUTPUT
297       fi
298       echo -n "."
299     done
300     echo >> $OUTPUT
301   fi
302 done
303
304 echo "------------------------" >> $OUTPUT;
305 echo "DAHDI/ZAPTEL MODULE INFO : modinfo" >> $OUTPUT;
306 echo "------------------------" >> $OUTPUT;
307 for file in $(ls /lib/modules/$(uname -r)/dahdi/*.ko \
308   /lib/modules/$(uname -r)/dahdi/*/*.ko\
309   /lib/modules/$(uname -r)/extra/*.ko \
310   /lib/modules/$(uname -r)/extra/*/*.ko \
311   /lib/modules/$(uname -r)/misc/*.ko \
312   /lib/modules/$(uname -r)/misc/*/*.ko 2> /dev/null); do
313   if [ -f $file ]; then
314     echo "------------------------" >> $OUTPUT;
315     modinfo $file >> $OUTPUT;
316     echo >> $OUTPUT;
317     echo -n "."
318   fi
319 done
320 echo "------------------------" >> $OUTPUT;
321 echo >> $OUTPUT;
322
323 echo "------------------" >> $OUTPUT;
324 echo "PCI LIST : lspci -vvvb" >> $OUTPUT;
325 echo "------------------" >> $OUTPUT;
326 lspci -vvvb >> $OUTPUT;
327 echo >> $OUTPUT;
328 echo >> $OUTPUT;
329 echo -n "."
330
331 echo "------------------" >> $OUTPUT;
332 echo "PCI LIST(no lookup) : lspci -vvvbn" >> $OUTPUT;
333 echo "------------------" >> $OUTPUT;
334 lspci -vvvbn >> $OUTPUT;
335 echo >> $OUTPUT;
336 echo >> $OUTPUT;
337 echo -n "."
338
339 echo "------------------" >> $OUTPUT;
340 echo "CPU INFO : cat /proc/cpuinfo" >> $OUTPUT;
341 echo "------------------" >> $OUTPUT;
342 cat /proc/cpuinfo >> $OUTPUT;
343 echo >> $OUTPUT;
344 echo >> $OUTPUT;
345 echo -n "."
346
347 echo "----------------------" >> $OUTPUT;
348 echo "VPM FIRMWARE INSTALLED : ls -la /lib/firmware" >> $OUTPUT;
349 echo "----------------------" >> $OUTPUT;
350 $(ls -la /lib/firmware 2> /dev/null >> $OUTPUT);
351 echo >> $OUTPUT;
352 echo >> $OUTPUT;
353 echo -n "."
354
355 echo "------------------" >> $OUTPUT;
356 echo "NETWORK INFO : route -n; iptables -L; ifconfig -a" >> $OUTPUT;
357 echo "------------------" >> $OUTPUT;
358 route -n 2> /dev/null >> $OUTPUT;
359 echo >> $OUTPUT;
360 echo "------------------" >> $OUTPUT;
361 iptables -L 2> /dev/null >> $OUTPUT;
362 echo >> $OUTPUT;
363 echo "------------------" >> $OUTPUT;
364 ifconfig -a 2> /dev/null >> $OUTPUT;
365 echo >> $OUTPUT;
366 echo >> $OUTPUT;
367 echo -n "."
368
369 echo "------------------" >> $OUTPUT;
370 echo "DMIDECODE : dmidecode" >> $OUTPUT;
371 echo "------------------" >> $OUTPUT;
372 dmidecode >> $OUTPUT;
373 echo >> $OUTPUT;
374 echo >> $OUTPUT;
375 echo -n "."
376
377 echo "------------------" >> $OUTPUT;
378 echo "KERNEL CONFIG : cat /path/.config" >> $OUTPUT;
379 echo "------------------" >> $OUTPUT;
380 for file in /lib/modules/$(uname -r)/build/.config /usr/src/linux/.config; do
381   if [ -f $file ]; then
382     echo "------------------" >> $OUTPUT;
383     echo "$file:" >> $OUTPUT;
384     cat $file >> $OUTPUT;
385     echo >> $OUTPUT;
386     echo -n "."
387   fi
388 done
389 echo >> $OUTPUT;
390
391 echo "done!"
392 }
393
394 collect_var_lib_list()
395 {
396   # Delete existing VAR_LIB_LIST
397   [ -f $VAR_LIB_LIST ] && rm -rf $VAR_LIB_LIST
398   DIR_LISTING="/var/lib/asterisk/"
399   if [ -d /var/lib/digium ]; then
400     DIR_LISTING="/var/lib/digium/ ${DIR_LISTING}"
401   fi
402   if [ -d /usr/lib/asterisk/modules/ ]; then
403     DIR_LISTING="/usr/lib/asterisk/modules/ ${DIR_LISTING}"
404   fi
405   echo "ls -1aAR $DIR_LISTING > $VAR_LIB_LIST"
406   $(ls -1aR ${DIR_LISTING} | sed -e '/^\.\.*$/d' > $VAR_LIB_LIST);
407 }
408
409 collect_config_backup()
410 {
411   collect_var_lib_list
412   # Include the /etc/asterisk directory, modprobe.conf, and the modprobe.d directory
413   TAR_FILES="/etc/asterisk/ /etc/modprobe.*"
414
415   # Check if any Asterisk licenses are installed
416   # G.729, Fax, ABE, Cepstral, Skype, etc.
417   if [ -d /var/lib/asterisk/licenses/ ]; then
418     TAR_FILES="$TAR_FILES /var/lib/asterisk/licenses/*"
419   fi
420
421   # Check if any Digium licenses are installed
422   # HPEC
423   if [ -d /var/lib/digium/licenses/ ]; then
424     TAR_FILES="$TAR_FILES /var/lib/digium/licenses/*"
425   fi
426
427   # Check if DAHDI is installed
428   if [ -d /etc/dahdi ]; then
429     TAR_FILES="$TAR_FILES /etc/dahdi*"
430   fi
431
432   # Check for Zaptel Module configuration
433   if [ -f /etc/sysconfig/zaptel ]; then
434     TAR_FILES="$TAR_FILES /etc/sysconfig/zaptel*"
435   fi
436
437   # Check for Zaptel Module configuration (alternate location)
438   if [ -f /etc/default/zaptel ]; then
439     TAR_FILES="$TAR_FILES /etc/default/zaptel*"
440   fi
441
442   # Grab the dahdi/zaptel init scripts, in case they have been modified
443   for driver in dahdi zaptel; do
444     if [ -f /etc/init.d/$driver ]; then
445       TAR_FILES="$TAR_FILES /etc/init.d/$driver"
446     fi
447   done
448
449   # Check for zaptel.conf
450   if [ -f /etc/zaptel.conf ]; then
451     TAR_FILES="$TAR_FILES /etc/zaptel*"
452   fi
453
454   # Check for fxotune.conf
455   if [ -f /etc/fxotune.conf ]; then
456     TAR_FILES="$TAR_FILES /etc/fxotune.conf*"
457   fi
458
459   # Check for misdn-init.conf
460   if [ -f /etc/misdn-init.conf ]; then
461     TAR_FILES="$TAR_FILES /etc/misdn-init.conf*"
462   fi
463
464   # Check for digiuminfo.txt
465   if [ -f $HOME/$OUTPUT_FILE ]; then
466     TAR_FILES="$TAR_FILES $OUTPUT_FILE"
467   fi
468
469   # Check for asterisk listing
470   if [ -f $VAR_LIB_LIST ]; then
471     TAR_FILES="$TAR_FILES $VAR_LIB_LIST_FILE"
472   fi
473
474   # Collect System Log Files
475   if [ -f /var/log/dmesg ]; then
476     TAR_FILES="$TAR_FILES /var/log/dmesg"
477   fi
478   if [ -f /var/log/messages ]; then
479     TAR_FILES="$TAR_FILES /var/log/messages"
480   fi
481
482   [ -f $TARBALL_OUTPUT ] && rm -rf $TARBALL_OUTPUT
483   [ -f $TARBALL_OUTPUT.gz ] && rm -rf $TARBALL_OUTPUT.gz
484
485   echo "tarring: tar -chvf ${TARBALL_OUTPUT} $TAR_FILES"
486   cd $HOME && tar -chvf $TARBALL_OUTPUT $TAR_FILES
487   echo "gzipping $TARBALL_OUTPUT"
488   gzip $TARBALL_OUTPUT
489 }
490
491 collect()
492 {
493   echo "This may take up to half a minute to run. Please be patient."
494   collect_digiuminfo;
495   collect_config_backup;
496
497   # ensure the output was written
498   if [ -f $TARBALL_OUTPUT.gz ]; then
499     clear;
500     echo;
501     echo;
502     echo "Tarball has been stored to:"
503     echo "$TARBALL_OUTPUT.gz"
504     echo "Please send this file to an email case you already"
505     echo "have open with Digium Tech Support."
506   else
507     echo;
508     echo;
509     echo "An error has occurred in capturing information."
510     echo "$TARBALL_OUTPUT.gz was not found."
511     echo;
512     echo "Please investigate your system, and send the output"
513     echo "above to your Digium Technical Support Ticket."
514   fi
515 }
516
517 clear;
518
519 if [ $NONINTERACTIVE -eq 1 ]; then
520   collect;
521 else
522   echo
523   echo "This script will try to collect the following pieces of"
524   echo "information from your system."
525   echo
526   echo "1. Information about your system such as:"
527   echo "pci listing, dmesg, running processes, and kernel version"
528   echo
529   echo "2. A backup of elements of your configuration such as:"
530   echo "asterisk config files, license files, loaded dahdi/zaptel module"
531   echo "parameters, and other asterisk/dahdi/zaptel related files."
532   echo
533   echo "Collect this information [y/n] ? "
534   read files;
535
536   if [ "$files" = "y" ] || [ "$files" = "yes" ]; then
537     collect;
538   else
539     clear;
540     echo;
541     echo "User selected not to continue."
542   fi
543 fi
544 exit