#!/bin/bash
#
# Copyright (c) 2012
#
# Authors: Wild Man, Krytarik
# Helpers: chili555
#
# This script gathers the infos necessary for troubleshooting a wireless
# connection and saves them in a text file, wrapping it in an archive if it
# exceeds the size limit of 19.5 kB for ".txt" files on the Ubuntu Forums.
#
############################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
SCRIPTDATE="2014-08-04 20:47 +0200"
FILEBASE="wireless-info"
OUTPUTDIR=$(pwd)
OUTPUTDIRFB="/tmp"
MODMATCHES="(air|ar5|ath|carl|at7|iwl|ipw|rt(2|3|5|6|7)|rtl|r(818|871)|8192(cu|du)|ssb|wl|b43|bcma|brcm|ndis)[^[:punct:] ]*"
LSMODMATCHES="wmi"
DMESGMATCHES="(wlan0|eth1|firmware|[nN]etwork)[^[:punct:] ]*"
BLACKLISTEXCL="(alsa-base|blacklist-(firewire|framebuffer|modem|oss|watchdog)|fglrx|nvidia|fbdev|bumblebee)"
export LANG="en_US.UTF-8"
export LANGUAGE="en_US:en"
export LC_ALL="en_US.UTF-8"
if [ -t 0 ]; then
SUDO="sudo"
elif [ -x /usr/bin/pkexec ]; then
SUDO="pkexec"
elif [ -x /usr/bin/gksudo ]; then
SUDO="gksudo"
elif [ -x /usr/bin/kdesudo ]; then
SUDO="kdesudo"
fi
exec 3>&1 4>&2
exec 1> "$OUTPUTDIR/$FILEBASE.txt"
if [ "$?" != "0" ]; then
printf "\nCannot write output file in \"%s\", trying in \"%s\" instead.\n" "$OUTPUTDIR" "$OUTPUTDIRFB" >&2
OUTPUTDIR="$OUTPUTDIRFB"
exec 1> "$OUTPUTDIR/$FILEBASE.txt"
if [ "$?" != "0" ]; then
printf "\nCannot write output file in \"%s\" either, aborting.\n\n" "$OUTPUTDIR" >&2
exit 1
fi
fi
exec 2>&1
printf "\n########## wireless info START ##########\n\n"
REPORTDATE=$(date +"%d %b %Y %H:%M %Z %z")
SCRIPTDATE=$(date -u -d "$SCRIPTDATE" +"%d %b %Y %H:%M %Z %z")
printf "Report from: %s\n\n" "$REPORTDATE"
printf "Script from: %s\n" "$SCRIPTDATE"
printf "\n##### release #####\n\n"
lsb_release -idrc
printf "\n##### kernel #####\n\n"
uname -srvmpio
echo
cat /proc/cmdline | sed 's/root=[^ ]*//;s/[ ]\+/, /g;s/^BOOT_IMAGE=[^ ]*/Parameters:/'
printf "\n##### desktop #####\n\n"
DESKTOP="$DESKTOP_SESSION"
if [ -z "$DESKTOP" ]; then
DESKTOP=$(sed -n 's/^Session=\(.*\)$/\1/p' "$HOME/.dmrc")
DESKDMRC=" (from ~/.dmrc)"
fi
if [ -n "$DESKTOP" ]; then
if [ -f "/usr/share/xsessions/$DESKTOP.desktop" ]; then
DESKTOP=$(sed -n 's/^Name=\(.*\)$/\1/p' "/usr/share/xsessions/$DESKTOP.desktop")
fi
echo "${DESKTOP/ Session/}${DESKDMRC}"
else
echo "Could not be determined."
fi
printf "\n##### lspci #####\n\n"
lspci -nnk | grep -iA2 '^[^[:space:]].*net' | sed '/^--$/d; /^[^[:space:]]/ i\\'
printf "\n##### lsusb #####\n\n"
lsusb
printf "\n##### PCMCIA Card Info #####\n\n"
pccardctl info
printf "\n##### rfkill #####\n\n"
rfkill list all
printf "\n##### lsmod #####\n\n"
LSMOD=$(lsmod | egrep "(^|[[:punct:] ])($MODMATCHES|$LSMODMATCHES)([[:punct:] ]|$)")
echo "$LSMOD"
printf "\n##### interfaces #####\n\n"
sed '/^#/d;s/wpa-psk [[:graph:]]\+/wpa-psk /' /etc/network/interfaces
printf "\n##### ifconfig #####\n\n"
ifconfig | sed '/^lo[ ]/,/^$/d'
printf "\n##### iwconfig #####\n\n"
iwconfig
printf "\n##### route #####\n\n"
route -n
printf "\n##### resolv.conf #####\n\n"
grep -v '^#' /etc/resolv.conf
printf "\n##### nm-tool #####\n\n"
nm-tool
printf "\n##### NetworkManager.state #####\n\n"
cat -s /var/lib/NetworkManager/NetworkManager.state
printf "\n##### NetworkManager.conf #####\n\n"
grep -v '^#' /etc/NetworkManager/NetworkManager.conf
if [ -f /etc/NetworkManager/nm-system-settings.conf ]; then
printf "\nnm-system-settings.conf (used up to Ubuntu 10.04):\n\n"
grep -v '^#' /etc/NetworkManager/nm-system-settings.conf
fi
printf "\n##### iw reg get #####\n\n"
iw reg get
printf "\n##### iwlist channels #####\n\n"
iwlist chan
printf "\n##### iwlist scan #####\n\n"
if [ -n "$SUDO" ]; then
trap "" 2 3
IWLISTSCAN=$($SUDO iwlist scan || echo "Acquisition of admin privileges failed.")
trap 2 3
if [[ $IWLISTSCAN =~ ^[[:space:]]*Frequency: ]]; then
echo "Channel occupancy:"
grep '^[[:space:]]*Frequency:' <<< "$IWLISTSCAN" | sort | uniq -c | sed 's/^[ ]*\([0-9]\+\)[[:space:]]*/ \1 WLAPs on /'
echo
fi
grep -v '^[[:space:]]*IE:[ ]*Unknown:' <<< "$IWLISTSCAN"
else
echo "No way to acquire admin privileges found."
fi
printf "\n##### module infos #####\n\n"
MODULES=$(egrep "^$MODMATCHES" <<< "$LSMOD" | awk '{print $1}')
for MODULE in $MODULES; do
MODINFO=$(modinfo $MODULE)
printf "[%s]\n%s\n\n" "$MODULE" "$MODINFO"
done
printf "\n##### module parameters #####\n\n"
for MODULE in $MODULES; do
if [ -d /sys/module/$MODULE/parameters ]; then
MODPARAMS=$(grep -H '^[[:graph:]]' /sys/module/$MODULE/parameters/* | sed 's#^.*/##;s/:/: /')
printf "[%s]\n%s\n\n" "$MODULE" "$MODPARAMS"
fi
done
printf "\n##### /etc/modules #####\n\n"
grep -v '^#' /etc/modules
printf "\n##### blacklists #####\n\n"
for CONFFILE in $(ls /etc/modprobe.d/*.conf | egrep -v "$BLACKLISTEXCL"); do
BLACKLIST=$(grep '^blacklist' $CONFFILE)
if [ -n "$BLACKLIST" ]; then
printf "[%s]\n%s\n\n" "$CONFFILE" "$BLACKLIST"
fi
done
printf "\n##### udev rules #####\n\n"
egrep '^(#.*device|[^#]|$)' /etc/udev/rules.d/70-persistent-net.rules
printf "\n##### dmesg #####\n\n"
dmesg | egrep "[[:punct:] ]($MODMATCHES|$DMESGMATCHES)[[:punct:] ]"
printf "\n########## wireless info END ############\n\n"
exec 2>&4 4>&-
exec 1>&3 3>&-
##### MAC address masking #####
RESULTS=$(cat -s "$OUTPUTDIR/$FILEBASE.txt")
LOCDEVSRAW=$(sed -n '/^[- ]*Device:/,/^[ ]*HW Address:/p' <<< "$RESULTS")
NETDEVNAMES=($(sed -n 's/^[- ]*Device:[ ]*\([^ ]*\).*/\1/p' <<< "$LOCDEVSRAW"))
NETDEVMACS=($(sed -n 's/^[ ]*HW Address:[ ]*\([^ ]*\).*/\1/p' <<< "$LOCDEVSRAW"))
WLAPSRAW=$(sed -n '/^[ ]*Wireless Access Points/,/^$/p' <<< "$RESULTS")
NETDEVNAMES+=($(sed -n 's/^[ ]*\*\?\([^ ]*\):.*/\1/p' <<< "$WLAPSRAW"))
NETDEVMACS+=($(grep -o '\([[:alnum:]][[:alnum:]]:\)\{5\}[[:alnum:]][[:alnum:]]' <<< "$WLAPSRAW"))
for NETDEVNR in "${!NETDEVMACS[@]}"; do
MACMASKSED+="s/${NETDEVMACS[$NETDEVNR]}//I;"
done
sed "$MACMASKSED/\([[:alnum:]][[:alnum:]]:\)\{6,\}/! s/\([[:alnum:]][[:alnum:]]:\)\{5\}[[:alnum:]][[:alnum:]]//" <<< "$RESULTS" > "$OUTPUTDIR/$FILEBASE.txt"
##### The End #####
if [[ $(stat -c %s "$OUTPUTDIR/$FILEBASE.txt") -gt 19968 ]]; then
tar -czf "$OUTPUTDIR/$FILEBASE.tar.gz" --remove-files -C "$OUTPUTDIR" "$FILEBASE.txt"
printf "\nResults archived in \"%s.tar.gz\", as they exceed the 19.5 kB size limit for \".txt\" files on the Ubuntu Forums.\n\n" "$OUTPUTDIR/$FILEBASE"
else
printf "\nResults saved in \"%s.txt\".\n\n" "$OUTPUTDIR/$FILEBASE"
fi