Add support for DPMA to autosupport
[asterisk/asterisk.git] / contrib / scripts / autosupport
1 #!/bin/sh
2 #
3 # Autosupport Version 2.0.19
4 # Collect support information
5 #
6 # Copyright (C) 2005-2013, 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-2013, 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" "digium_phones show version"; 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 FIRMWARE_DIR=`grep firmware_package_directory /etc/asterisk/res_digium_phone.conf|sed 's/;.*$//;'|grep firmware|sed 's/firmware_package_directory=//;'`;
392 if [ `echo $FIRMWARE_DIR|egrep -v '^$'|wc -l` -eq "0" ]
393 then
394   FIRMWARE_DIR="/var/www/firmware_package_directory"
395 fi
396 echo "------------------" >> $OUTPUT;
397 echo "FIRMWARE LISTING: ls -al $FIRMWARE_DIR" >> $OUTPUT;
398 echo "------------------" >> $OUTPUT;
399 ls -al $FIRMWARE_DIR >> $OUTPUT;
400 echo >> $OUTPUT;
401
402 FIRMWARE_URLS=`grep file_url_prefix /etc/asterisk/res_digium_phone.conf|sed 's/;.*$//;'|grep file|sed 's/file_url_prefix=//;'`;
403 for FIRMWARE_URL in $FIRMWARE_URLS; do
404   echo "------------------" >> $OUTPUT;
405   echo "REMOTE FIRMWARE LISTING: wget $FIRMWARE_URL" >> $OUTPUT;
406   echo "------------------" >> $OUTPUT;
407   wget "$FIRMWARE_URL" -O- 2>/dev/null >> $OUTPUT;
408   echo >> $OUTPUT;
409 done
410
411 echo "done!"
412 }
413
414 collect_var_lib_list()
415 {
416   # Delete existing VAR_LIB_LIST
417   [ -f $VAR_LIB_LIST ] && rm -rf $VAR_LIB_LIST
418   DIR_LISTING="/var/lib/asterisk/"
419   if [ -d /var/lib/digium ]; then
420     DIR_LISTING="/var/lib/digium/ ${DIR_LISTING}"
421   fi
422   if [ -d /usr/lib/asterisk/modules/ ]; then
423     DIR_LISTING="/usr/lib/asterisk/modules/ ${DIR_LISTING}"
424   fi
425   echo "ls -1aAR $DIR_LISTING > $VAR_LIB_LIST"
426   $(ls -1aR ${DIR_LISTING} | sed -e '/^\.\.*$/d' > $VAR_LIB_LIST);
427 }
428
429 collect_config_backup()
430 {
431   collect_var_lib_list
432   # Include the /etc/asterisk directory, modprobe.conf, and the modprobe.d directory
433   TAR_FILES="/etc/asterisk/ /etc/modprobe.*"
434
435   # Check if any Asterisk licenses are installed
436   # G.729, Fax, ABE, Cepstral, Skype, etc.
437   if [ -d /var/lib/asterisk/licenses/ ]; then
438     TAR_FILES="$TAR_FILES /var/lib/asterisk/licenses/*"
439   fi
440
441   # Check if any Digium licenses are installed
442   # HPEC
443   if [ -d /var/lib/digium/licenses/ ]; then
444     TAR_FILES="$TAR_FILES /var/lib/digium/licenses/*"
445   fi
446
447   # Check if DAHDI is installed
448   if [ -d /etc/dahdi ]; then
449     TAR_FILES="$TAR_FILES /etc/dahdi*"
450   fi
451
452   # Check for Zaptel Module configuration
453   if [ -f /etc/sysconfig/zaptel ]; then
454     TAR_FILES="$TAR_FILES /etc/sysconfig/zaptel*"
455   fi
456
457   # Check for Zaptel Module configuration (alternate location)
458   if [ -f /etc/default/zaptel ]; then
459     TAR_FILES="$TAR_FILES /etc/default/zaptel*"
460   fi
461
462   # Grab the dahdi/zaptel init scripts, in case they have been modified
463   for driver in dahdi zaptel; do
464     if [ -f /etc/init.d/$driver ]; then
465       TAR_FILES="$TAR_FILES /etc/init.d/$driver"
466     fi
467   done
468
469   # Check for zaptel.conf
470   if [ -f /etc/zaptel.conf ]; then
471     TAR_FILES="$TAR_FILES /etc/zaptel*"
472   fi
473
474   # Check for fxotune.conf
475   if [ -f /etc/fxotune.conf ]; then
476     TAR_FILES="$TAR_FILES /etc/fxotune.conf*"
477   fi
478
479   # Check for misdn-init.conf
480   if [ -f /etc/misdn-init.conf ]; then
481     TAR_FILES="$TAR_FILES /etc/misdn-init.conf*"
482   fi
483
484   # Check for digiuminfo.txt
485   if [ -f $HOME/$OUTPUT_FILE ]; then
486     TAR_FILES="$TAR_FILES $OUTPUT_FILE"
487   fi
488
489   # Check for asterisk listing
490   if [ -f $VAR_LIB_LIST ]; then
491     TAR_FILES="$TAR_FILES $VAR_LIB_LIST_FILE"
492   fi
493
494   # Collect System Log Files
495   if [ -f /var/log/dmesg ]; then
496     TAR_FILES="$TAR_FILES /var/log/dmesg"
497   fi
498   if [ -f /var/log/messages ]; then
499     TAR_FILES="$TAR_FILES /var/log/messages"
500   fi
501
502   [ -f $TARBALL_OUTPUT ] && rm -rf $TARBALL_OUTPUT
503   [ -f $TARBALL_OUTPUT.gz ] && rm -rf $TARBALL_OUTPUT.gz
504
505   echo "tarring: tar -chvf ${TARBALL_OUTPUT} $TAR_FILES"
506   cd $HOME && tar -chvf $TARBALL_OUTPUT $TAR_FILES
507   echo "gzipping $TARBALL_OUTPUT"
508   gzip $TARBALL_OUTPUT
509 }
510
511 collect()
512 {
513   echo "This may take up to half a minute to run. Please be patient."
514   collect_digiuminfo;
515   collect_config_backup;
516
517   # ensure the output was written
518   if [ -f $TARBALL_OUTPUT.gz ]; then
519     clear;
520     echo;
521     echo;
522     echo "Tarball has been stored to:"
523     echo "$TARBALL_OUTPUT.gz"
524     echo "Please send this file to an email case you already"
525     echo "have open with Digium Tech Support."
526   else
527     echo;
528     echo;
529     echo "An error has occurred in capturing information."
530     echo "$TARBALL_OUTPUT.gz was not found."
531     echo;
532     echo "Please investigate your system, and send the output"
533     echo "above to your Digium Technical Support Ticket."
534   fi
535 }
536
537 clear;
538
539 if [ $NONINTERACTIVE -eq 1 ]; then
540   collect;
541 else
542   echo
543   echo "This script will try to collect the following pieces of"
544   echo "information from your system."
545   echo
546   echo "1. Information about your system such as:"
547   echo "pci listing, dmesg, running processes, and kernel version"
548   echo
549   echo "2. A backup of elements of your configuration such as:"
550   echo "asterisk config files, license files, loaded dahdi/zaptel module"
551   echo "parameters, and other asterisk/dahdi/zaptel related files."
552   echo
553   echo "Collect this information [y/n] ? "
554   read files;
555
556   if [ "$files" = "y" ] || [ "$files" = "yes" ]; then
557     collect;
558   else
559     clear;
560     echo;
561     echo "User selected not to continue."
562   fi
563 fi
564 exit