#!/bin/sh
-# Copyright (c) 2004-2011 Apple Inc.
+# Copyright (c) 2004-2013 Apple Inc.
#
# get-mobility-info
#
PRIV="sudo"
fi
+if [ -x /usr/bin/tail ]; then
+ TAIL_2000="/usr/bin/tail -n 2000"
+ TAIL_25000="/usr/bin/tail -n 25000"
+else
+ TAIL_2000="/bin/cat"
+ TAIL_25000="/bin/cat"
+fi
+
OUT="mobility-info-`date +'%m.%d.%Y.%H%M%S'`"
OUTDIR="/var/tmp"
if [ -d ~/Desktop ]; then
OUTDIR=~/Desktop
elif [ "`readlink /tmp`" = "private/var/tmp" ]; then
- OUTDIR=/Library/Logs/CrashReporter/SystemConfiguration
+ OUTDIR=/Library/Logs/CrashReporter
mkdir -p ${OUTDIR}
fi
cd "${WORKDIR}"
+echo ""
+echo "Please wait, collecting information and statistics"
+echo ""
+
+#
+# Execute network reachability/DNS commands early as "mDNSResponder" will block while
+# logging its "state" info.
+#
+scutil -d -v -r www.apple.com "" no-server > reachability-info 2>&1
+if [ -x /usr/bin/dig -a -f /etc/resolv.conf ]; then
+ /usr/bin/dig -t any -c any www.apple.com > dig-results 2>/dev/null
+fi
+
+#
+# Signal "networkd" and "mDNSResponder" to log their "state" info. This logging will
+# continue while we execute a few other commands and should be complete by the time
+# we collect the log content.
+#
+if [ -x /usr/bin/killall ]; then
+ ${PRIV} /usr/bin/killall -INFO networkd
+ ${PRIV} /usr/bin/killall -INFO mDNSResponder
+ sleep 1
+fi
+
#
# processes
#
-ps axlww > ps 2>&1
+if [ -x /bin/ps ]; then
+ /bin/ps axlww > ps 2>&1
+fi
#
# network interface configuration
#
-ifconfig -a -L -b -m -r -v > ifconfig 2>&1
-if [ $? -ne 0 ]; then
- ifconfig -a > ifconfig 2>&1
+if [ -x /sbin/ifconfig ]; then
+ /sbin/ifconfig -a -L -b -m -r -v -v > ifconfig 2>&1
+ if [ $? -ne 0 ]; then
+ /sbin/ifconfig -a > ifconfig 2>&1
+ fi
fi
#
# network route configuration
#
-netstat -n -r -a -l > netstat 2>&1
+if [ -x /usr/sbin/netstat ]; then
+ /usr/sbin/netstat -n -r -a -l > netstat 2>&1
+fi
#
# DHCP configuration
#
-for if in `ifconfig -l`
-do
- case ${if} in
- lo* ) ;;
- en* ) ipconfig getpacket ${if} > ipconfig-${if} 2>&1
- ;;
- esac
-done
+if [ -x /sbin/ifconfig ]; then
+ for if in `/sbin/ifconfig -l`
+ do
+ case ${if} in
+ lo* ) ;;
+ en* ) ipconfig getpacket ${if} > ipconfig-${if} 2>&1
+ ;;
+ esac
+ done
+fi
#
# AirPort info
> airport 2>&1
fi
+#
+# collect wifi dump
+#
+if [ -x /usr/bin/wdutil ]; then
+ ${PRIV} /usr/bin/wdutil dump
+ mkdir -p "wifi_dump"
+ /bin/ls -1 /private/tmp/wifi-* 2>/dev/null \
+ | while read log
+ do
+ if [ -f "${log}" ]; then
+ b="`basename ${log}`"
+ ${PRIV} cat "${log}" > "wifi_dump/${b}" 2>&1
+ fi
+ done
+fi
+
#
# OS info
#
#
# IOKit info
#
-ioreg -i -l -w 0 > ioreg 2>&1
-ioreg -i -l -p IODeviceTree -w 0 >> ioreg 2>&1
+if [ -x /usr/sbin/ioreg ]; then
+ /usr/sbin/ioreg -i -l -w 0 > ioreg 2>&1
+ /usr/sbin/ioreg -i -l -p IODeviceTree -w 0 >> ioreg 2>&1
+fi
+
+#
+# Power Management info
+#
+if [ -x /usr/bin/pmset ]; then
+ echo "#" > pmset
+ echo "# pmset -g everything" >> pmset
+ echo "#" >> pmset
+ /usr/bin/pmset -g everything 2>/dev/null | ${TAIL_25000} >> pmset
+fi
#
# Host name
#
-hostname > hostname 2>&1
+if [ -x /bin/hostname ]; then
+ /bin/hostname > hostname 2>&1
+fi
#
# Host configuration
#
-hostinfo > hostinfo 2>&1
+if [ -x /usr/bin/hostinfo ]; then
+ /usr/bin/hostinfo > hostinfo 2>&1
+fi
if [ -e /etc/hostconfig ]; then
cat /etc/hostconfig > etc.hostconfig 2>&1
fi
if [ -e /var/run/resolv.conf ]; then
cat /var/run/resolv.conf > var.run.resolv.conf 2>&1
fi
+if [ -e /etc/resolver ]; then
+ tar -c -H /etc/resolver > etc.resolver.tar 2>/dev/null
+fi
#
# Proxy configuration
#
-scutil --proxy > proxy-configuration 2>&1
+scutil -d -v --proxy > proxy-configuration 2>&1
+
+#
+# Network information
+#
+if [ -x /sbin/ifconfig ]; then
+ echo "#" > network-information
+ echo "# scutil --nwi" >> network-information
+ echo "#" >> network-information
+ scutil --nwi >> network-information 2>&1
+ for if in `/sbin/ifconfig -l`
+ do
+ echo "" >> network-information
+ echo "#" >> network-information
+ echo "# scutil --nwi ${if}" >> network-information
+ echo "#" >> network-information
+ scutil --nwi ${if} >> network-information 2>&1
+ done
+fi
#
# System / network preferences
/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist \
/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist \
/Library/Preferences/SystemConfiguration/com.apple.nat.plist \
- /Library/Preferences/SystemConfiguration/com.apple.network.identification.plist \
/Library/Preferences/SystemConfiguration/com.apple.smb.server.plist \
/Library/Preferences/SystemConfiguration/com.apple.wifi.plist \
/Library/Preferences/SystemConfiguration/preferences.plist \
fi
done
+#
+# System / network preferences (from other volumes)
+#
+mount \
+| awk 'BEGIN { FS= "[/ \t]+" } /^\/dev\/disk.* on \/Volumes\// { print $6 }' \
+| while read volume
+do
+ V_PATH="/Volumes/${volume}"
+ for f in \
+ /Library/Preferences/SystemConfiguration/Networkinterfaces.plist \
+ /Library/Preferences/SystemConfiguration/preferences.plist \
+
+ do
+ if [ -f "${V_PATH}/${f}" ]; then
+ mkdir -p "OtherPreferences/${volume}"
+ b="`basename ${f}`"
+ cat "${V_PATH}/${f}" > "OtherPreferences/${volume}/${b}" 2>&1
+ fi
+ done
+done
+
#
# InternetSharing
#
if [ -e /etc/bootpd.plist ]; then
cat /etc/bootpd.plist > bootpd.plist 2>&1
- cat /etc/com.apple.named.proxy.conf > com.apple.named.proxy.conf 2>&1
+ cat /etc/com.apple.named.proxy.conf > com.apple.named.proxy.conf 2>/dev/null
elif [ -e /Library/Preferences/SystemConfiguration/bootpd.plist ]; then
cat /Library/Preferences/SystemConfiguration/bootpd.plist > bootpd.plist 2>&1
- cat /Library/Preferences/SystemConfiguration/com.apple.named.proxy.conf > com.apple.named.proxy.conf 2>&1
+ cat /Library/Preferences/SystemConfiguration/com.apple.named.proxy.conf > com.apple.named.proxy.conf 2>/dev/null
fi
#
# configd's cache
#
-${PRIV} scutil -p <<_END_OF_INPUT
-open
-snapshot
-quit
-_END_OF_INPUT
+${PRIV} scutil -p --snapshot
if [ -f /var/tmp/configd-store.plist ]; then
cat /var/tmp/configd-store.plist > configd-store.plist 2>&1
fi
if [ -f /var/tmp/configd-state ]; then
cat /var/tmp/configd-state > configd-state 2>&1
fi
-
-#
-# check configd's executable
-#
-if [ -x /usr/bin/codesign ]; then
- echo "#" >> configd-state
- echo "# codesign --verbose --display --entitlements - /usr/libexec/configd" >> configd-state
- echo "#" >> configd-state
- /usr/bin/codesign --verbose --display --entitlements - /usr/libexec/configd >> configd-state 2>&1
-
- echo "#" >> configd-state
- echo "# codesign --verbose --verify /usr/libexec/configd" >> configd-state
- echo "#" >> configd-state
- /usr/bin/codesign --verbose --verify /usr/libexec/configd >> configd-state 2>&1
-fi
-
-#
-# network reachability
-#
-scutil -d -v -r www.apple.com > reachability-info 2>&1
-if [ -x /usr/bin/dig -a -f /etc/resolv.conf ]; then
- /usr/bin/dig -t any -c any www.apple.com > dig-results 2>/dev/null
+if [ -f /var/tmp/configd-reachability ]; then
+ cat /var/tmp/configd-reachability > configd-reachability 2>&1
fi
#
#
mount > mounted-filesystems 2>&1
-#
-# mDNSResponder info
-#
-if [ -x /usr/bin/killall ]; then
- ${PRIV} killall -INFO mDNSResponder
-
- # and wait a short amount of time for mDNSResponder
- # to actually log the requested information
- sleep 15
-fi
-
-#
-# awacsd info
-#
-if [ -x /usr/sbin/awacsd -a -x /usr/bin/killall ]; then
- ${PRIV} killall -INFO awacsd 2>/dev/null
-
- # and wait a short amount of time for awacsd
- # to actually log the requested information
- sleep 1
-fi
-
-#
-# system log, kernel.log, early boot log messages
-#
-if [ -x /usr/bin/syslog ]; then
- # save the recent activity
- ${PRIV} syslog | tail -n 25000 > syslog
-
- # save just the "kernel" activity (in case some of the
- # interesting/relevant message are before the messages
- # captured above.
- ${PRIV} syslog -k Facility kern | tail -n 25000 > kernel
-
- if [ -d /var/log/DiagnosticMessages ]; then
- # save any MessageTracer activity
- ${PRIV} syslog -d /var/log/DiagnosticMessages \
- -F raw \
- -T local \
- | tail -n 25000 > DiagnosticMessages
- fi
-else
- if [ -f /var/log/system.log ]; then
- ${PRIV} tail -n 25000 /var/log/system.log > system.log
- fi
- if [ -f /var/log/kernel.log ]; then
- ${PRIV} tail -n 25000 /var/log/kernel.log > kernel.log
- fi
-fi
-${PRIV} dmesg > dmesg
-
-#
-# IPConfiguration log
-#
-if [ -f /var/log/com.apple.IPConfiguration.bootp ]; then
- ${PRIV} tail -n 2000 /var/log/com.apple.IPConfiguration.bootp \
- > com.apple.IPConfiguration.bootp
-fi
-
-#
-# ppp log file(s)
-#
-scutil <<_END_OF_INPUT \
-| awk -F' *: *' \
- ' \
- /Logfile : / { \
- if (index($2, "/") == 1) { print $2 } \
- else { print "/var/log/ppp/" $2 } \
- } \
- END { \
- print "/tmp/pppotcp.log" \
- } \
- ' \
-| sort -u \
-| while read logFile
-open
-show Setup:/Network/Service/[^/]+/PPP pattern
-quit
-_END_OF_INPUT
-do
- if [ -f "${logFile}" ]; then
- b="`basename ${logFile}`"
- cat "${logFile}" > "${b}" 2>&1
- fi
-done
-
-#
-# application firewall log
-#
-if [ -f /var/log/appfirewall.log ]; then
- ${PRIV} tail -n 2000 /var/log/appfirewall.log > appfirewall.log
-fi
+${PRIV} cat /etc/hosts > etc.hosts 2>/dev/null
#
# kernel extensions statistic
#
if [ -x /usr/sbin/kextstat ]; then
- kextstat > kextstat 2>&1
+ /usr/sbin/kextstat > kextstat 2>&1
elif [ -x /usr/sbin/kmodstat ]; then
- kmodstat > kmodstat 2>&1
+ /usr/sbin/kmodstat > kmodstat 2>&1
fi
#
# network statistics
#
-echo "#" > network-statistics
-echo "# arp -n -a" >> network-statistics
-echo "#" >> network-statistics
-arp -n -a >> network-statistics 2>&1
-
-echo "#" >> network-statistics
-echo "# netstat -n -a -A" >> network-statistics
-echo "#" >> network-statistics
-netstat -n -a -A >> network-statistics 2>&1
-
-echo "#" >> network-statistics
-echo "# netstat -s" >> network-statistics
-echo "#" >> network-statistics
-netstat -s >> network-statistics 2>&1
-
-echo "#" >> network-statistics
-echo "# netstat -mmm" >> network-statistics
-echo "#" >> network-statistics
-netstat -mmm >> network-statistics 2>&1
-
-echo "#" >> network-statistics
-echo "# netstat -i -n -d" >> network-statistics
-echo "#" >> network-statistics
-netstat -i -n -d >> network-statistics 2>&1
+echo -n "" > network-statistics
+
+if [ -x /usr/sbin/arp ]; then
+ echo "#" >> network-statistics
+ echo "# arp -n -a" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/arp -n -a >> network-statistics 2>&1
+fi
+
+if [ -x /usr/sbin/netstat ]; then
+ echo "#" >> network-statistics
+ echo "# netstat -n -a -A" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -n -a -A >> network-statistics 2>&1
+
+ echo "#" >> network-statistics
+ echo "# netstat -s" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -s >> network-statistics 2>&1
+
+ echo "#" >> network-statistics
+ echo "# netstat -mmm" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -mmm >> network-statistics 2>&1
+
+ echo "#" >> network-statistics
+ echo "# netstat -i -n -d" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -i -n -d >> network-statistics 2>&1
+
+ echo "#" >> network-statistics
+ echo "# netstat -g -n -s" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -g -n -s >> network-statistics 2>&1
+
+ echo "#" >> network-statistics
+ echo "# netstat -i -x R" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -i -x R >> network-statistics 2>&1
+ echo "#" >> network-statistics
+
+ echo "# netstat -a -n -p mptcp" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -a -n -p mptcp >> network-statistics 2>/dev/null
+
+ echo "#" >> network-statistics
+ echo "# netstat -s -p mptcp" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -s -p mptcp >> network-statistics 2>/dev/null
+
+ if [ -x /sbin/ifconfig ]; then
+ for if in `/sbin/ifconfig -l`
+ do
+ `/sbin/ifconfig -v ${if} | grep -q TXSTART`
+ if [ $? -eq 0 ]; then
+ echo "#" >> network-statistics
+ echo "# netstat -qq -I ${if}" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -qq -I ${if} >> network-statistics 2>&1
+ fi
+ `/sbin/ifconfig -v ${if} | grep -q RXPOLL`
+ if [ $? -eq 0 ]; then
+ echo "#" >> network-statistics
+ echo "# netstat -Q -I ${if}" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/netstat -Q -I ${if} >> network-statistics 2>&1
+ fi
+ done
+ fi
+fi
if [ -x /usr/sbin/ndp ]; then
echo "#" >> network-statistics
echo "# ndp -n -a" >> network-statistics
echo "#" >> network-statistics
- ndp -n -a >> network-statistics 2>&1
+ /usr/sbin/ndp -n -a >> network-statistics 2>&1
echo "#" >> network-statistics
echo "# ndp -n -p" >> network-statistics
echo "#" >> network-statistics
- ndp -n -p >> network-statistics 2>&1
+ /usr/sbin/ndp -n -p >> network-statistics 2>&1
echo "#" >> network-statistics
echo "# ndp -n -r" >> network-statistics
echo "#" >> network-statistics
- ndp -n -r >> network-statistics 2>&1
+ /usr/sbin/ndp -n -r >> network-statistics 2>&1
+
+ if [ -x /sbin/ifconfig ]; then
+ for if in `/sbin/ifconfig -l`
+ do
+ echo "#" >> network-statistics
+ echo "# ndp -i ${if}" >> network-statistics
+ echo "#" >> network-statistics
+ /usr/sbin/ndp -i ${if} >> network-statistics 2>&1
+ done
+ fi
fi
if [ -x /sbin/ipfw ]; then
echo "#" >> network-statistics
echo "# ipfw -at show" >> network-statistics
echo "#" >> network-statistics
- ${PRIV} ipfw -at show >> network-statistics 2>&1
+ ${PRIV} /sbin/ipfw -at show >> network-statistics 2>&1
+fi
+
+if [ -x /sbin/ip6fw ]; then
+ echo "#" >> network-statistics
+ echo "# ip6fw -at show" >> network-statistics
+ echo "#" >> network-statistics
+ ${PRIV} /sbin/ip6fw -at show >> network-statistics 2>&1
fi
if [ -x /sbin/pfctl ]; then
echo "#" > pf
echo "# pfctl -s all" >> pf
echo "#" >> pf
- ${PRIV} pfctl -s all >> pf 2>&1
+ ${PRIV} /sbin/pfctl -s all >> pf 2>&1
echo "==============================" >> pf
echo "#" >> pf
echo "# pfctl -s References" >> pf
echo "#" >> pf
- ${PRIV} pfctl -s References >> pf 2>&1
- for ANCHOR in `pfctl -s Anchors 2>/dev/null`
+ ${PRIV} /sbin/pfctl -s References >> pf 2>&1
+ for ANCHOR in `${PRIV} pfctl -s Anchors -v 2>/dev/null`
do
echo "==============================" >> pf
echo "#" >> pf
echo "# pfctl -a ${ANCHOR} -s all" >> pf
echo "#" >> pf
- ${PRIV} pfctl -a ${ANCHOR} -s all >> pf 2>&1
+ ${PRIV} /sbin/pfctl -a ${ANCHOR} -s all >> pf 2>&1
done
fi
echo "#" >> network-statistics
echo "# lsof -i -U -n -P" >> network-statistics
echo "#" >> network-statistics
- ${PRIV} lsof -i -U -n -P >> network-statistics 2>&1
+ ${PRIV} /usr/sbin/lsof -i -U -n -P >> network-statistics 2>&1
fi
#
echo "#" > od-info
echo "# odutil show all" >> od-info
echo "#" >> od-info
- ${PRIV} odutil show all >> od-info 2>&1
+ ${PRIV} /usr/bin/odutil show all >> od-info 2>&1
elif [ -x /usr/bin/dscacheutil ]; then
echo "#" > ds-info
echo "# dscacheutil -configuration" >> ds-info
echo "#" >> ds-info
- dscacheutil -configuration >> ds-info 2>&1
+ /usr/bin/dscacheutil -configuration >> ds-info 2>&1
echo "#" >> ds-info
echo "# dscacheutil -statistics" >> ds-info
echo "#" >> ds-info
- dscacheutil -statistics >> ds-info 2>&1
+ /usr/bin/dscacheutil -statistics >> ds-info 2>&1
echo "#" >> ds-info
echo "# dscacheutil -cachedump -entries" >> ds-info
echo "#" >> ds-info
- dscacheutil -cachedump -entries >> ds-info 2>&1
+ /usr/bin/dscacheutil -cachedump -entries >> ds-info 2>&1
fi
#
# IPsec configuration
#
-echo "#" > ipsec
-echo "# setkey -D" >> ipsec
-echo "#" >> ipsec
-${PRIV} setkey -D \
-| perl -nle '
- if (/^(\s+[AE]:\s+\S+\s+)"?(.*)"?\s*$/) {
- chop($sha1=`echo "$2" | openssl sha1`);
- printf "%s[SHA-1:%s]\n", $1, $sha1;
- } else {
- printf "%s\n", $_;
- }
-' >> ipsec
-
-echo "" >> ipsec
-echo "#" >> ipsec
-echo "# setkey -Pp -D" >> ipsec
-echo "#" >> ipsec
-${PRIV} setkey -Pp -D >> ipsec
-
-for CF in /var/run/racoon/*.conf
-do
- if [ ! -r "${CF}" ]; then
- continue
- fi
-
- echo "" >> ipsec
- echo "#" >> ipsec
- echo "# ${CF}" >> ipsec
- echo "#" >> ipsec
- ${PRIV} cat ${CF} \
- | perl -nle '
- if (/^(\s+shared_secret\s+use\s+)"?([^\s;"]+)"?(.*)/) {
- chop($sha1=`echo "$2" | openssl sha1`);
- printf "%s[SHA-1:%s]%s\n", $1, $sha1, $3;
+if [ -x /usr/sbin/setkey -a -x /usr/bin/perl ]; then
+ echo "#" > ipsec
+ echo "# setkey -D" >> ipsec
+ echo "#" >> ipsec
+ ${PRIV} /usr/sbin/setkey -D \
+ | /usr/bin/perl -M'Digest::MD5 qw(md5_hex)' -l -n -e '
+ if (/^(\s+[AE]:\s+\S+\s+)"?(.*)"?\s*$/) {
+ printf "%s[MD5:%s]%s\n", $1, md5_hex($2 . "\n"), $3;
} else {
printf "%s\n", $_;
}
- ' >> ipsec
-done
+ ' >> ipsec
+
+ echo "" >> ipsec
+ echo "#" >> ipsec
+ echo "# setkey -Pp -D" >> ipsec
+ echo "#" >> ipsec
+ ${PRIV} /usr/sbin/setkey -Pp -D >> ipsec
+
+ for CF in /var/run/racoon/*.conf
+ do
+ if [ ! -r "${CF}" ]; then
+ continue
+ fi
+
+ echo "" >> ipsec
+ echo "#" >> ipsec
+ echo "# ${CF}" >> ipsec
+ echo "#" >> ipsec
+ ${PRIV} cat ${CF} \
+ | /usr/bin/perl -M'Digest::MD5 qw(md5_hex)' -l -n -e '
+ if (/^(\s+shared_secret\s+use\s+)"?([^\s;"]+)"?(.*)/) {
+ printf "%s[MD5:%s]%s\n", $1, md5_hex($2 . "\n"), $3;
+ } else {
+ printf "%s\n", $_;
+ }
+ ' >> ipsec
+ done
+fi
#
# Kerberos configuration
#
if [ -x /usr/bin/klist ]; then
echo "#" > kerberos
- echo "# klist -e -c -A -f -a -n" >> kerberos
+ echo "# klist --verbose --all-content" >> kerberos
echo "#" >> kerberos
- ${PRIV} klist -e -c -A -f -a -n >> kerberos 2>&1
+ klist --verbose --all-content >> kerberos 2>&1
echo "#" >> kerberos
- echo "# klist -e -k -t -K" >> kerberos
+ echo "# ktutil list" >> kerberos
echo "#" >> kerberos
- ${PRIV} klist -e -k -t -K >> kerberos 2>&1
+ ${PRIV} /usr/sbin/ktutil --verbose list >> kerberos 2>&1
+
+ echo "#" >> kerberos
+ echo "# gsstool list --verbose" >> kerberos
+ echo "#" >> kerberos
+ /System/Library/PrivateFrameworks/Heimdal.framework/Helpers/gsstool list --verbose >> kerberos 2>&1
fi
#
-# BTMM configuration
+# system profiler
#
+if [ -x /usr/sbin/system_profiler ]; then
+ system_profiler -xml SPEthernetDataType \
+ SPFibreChannelDataType \
+ SPFireWireDataType \
+ SPFirewallDataType \
+ SPModemDataType \
+ SPNetworkDataType \
+ SPThunderboltDataType \
+ SPWWANDataType \
+ SPAirPortDataType > system_profiler.spx 2>/dev/null
+fi
-BTMM_CLEANUP()
-{
- rm -f .btmmfifo .btmminfo .digsync
-}
+#
+# system usage statistics
+#
+echo -n "" > system-statistics
-BTMM_SETUP()
-{
- BTMM_CLEANUP
- mkfifo .btmmfifo
+if [ -x /usr/bin/uptime ]; then
+ echo "#" >> system-statistics
+ echo "# uptime" >> system-statistics
+ echo "#" >> system-statistics
+ /usr/bin/uptime >> system-statistics 2>&1
+fi
- BTMMPORT=40000
- while nc -6z ::1 "${PORT}" > /dev/null 2>&1
- do
- BTMMPORT=$((PORT + 1))
- done
-}
+if [ -x /usr/sbin/sysctl ]; then
+ echo "#" >> system-statistics
+ echo "# sysctl -a" >> system-statistics
+ echo "#" >> system-statistics
+ /usr/sbin/sysctl -a >> system-statistics 2>&1
+fi
-BTMM_CHECKMACDOTCOM()
+if [ -x /usr/bin/zprint ]; then
+ echo "#" >> system-statistics
+ echo "# zprint" >> system-statistics
+ echo "#" >> system-statistics
+ ${PRIV} /usr/bin/zprint >> system-statistics 2>&1
+fi
+
+#
+# collect executable and plugin info
+#
+report_binary_info()
{
- TAIL=`echo "${1}" | cut -d. -f2-`
- if [ "${TAIL}" = "members.mac.com" ]; then
- return 0
- fi
+ if [ ! -f ${1} ]; then
+ return
+ fi
+
+ VERSION=`what ${1}`
+ echo "${VERSION}" >> versions 2>&1
+
+ SUM=`sum ${1}`
+ echo "\tsum: ${SUM}" >> versions 2>&1
- return 1
+ LSINFO=`ls -lu ${1}`
+ echo "\tadditional info: ${LSINFO}" >> versions 2>&1
+
+ echo "" >> versions 2>&1
}
-# get DNS info
-# params: QUERYNAME QUERYTYPE
-BTMM_DIG()
+get_binary_info()
{
- rm -f .digsync
-
- nc -6 -l "${BTMMPORT}" < .btmmfifo \
- | openssl s_client -connect "${HOSTPORT}" -quiet > .btmmfifo 2>.digsync &
-
- N_RETRY=0
- while [ $N_RETRY -lt 50 -a ! -s .digsync ]
- do
- N_RETRY=$((N_RETRY + 1))
- sleep 0.1
- done
-
- dig @::1 -p "${BTMMPORT}" \
- -y "${TSIG}" \
- +short \
- +tcp \
- "${1}" "${2}" 2>/dev/null
-
- wait %1
+ for BIN in \
+ /usr/libexec/bootpd \
+ /usr/libexec/configd \
+ /usr/sbin/mDNSResponder \
+ /usr/sbin/awacsd \
+ /usr/sbin/pppd \
+ /usr/sbin/racoon \
+ /usr/libexec/misd \
+ /usr/libexec/InternetSharing \
+ /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration \
+
+ do
+ report_binary_info "${BIN}"
+ done
+
+ if [ -x /usr/bin/xcodebuild ]; then
+ /usr/bin/xcodebuild -showsdks \
+ | grep iphone \
+ | awk '{print $NF}' \
+ | while read IOS
+ do
+ SDKPATH="`xcrun --sdk $IOS --show-sdk-path`"
+ for BIN in \
+ /usr/libexec/configd_sim \
+ /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration \
+
+ do
+ report_binary_info "${SDKPATH}${BIN}"
+ done
+ done
+ fi
}
-# get the unique identifier used to lookup the keychain item for a zone
-# params: ZONE
-BTMM_UNIQUEIDFROMZONE()
+get_plugins_info()
{
- BTMM_CHECKMACDOTCOM "${1}"
- if [ $? -eq 0 ]; then
- echo "dns:${1}"
- else
- echo "btmmdns:${1}"
+ num=0
+ cd ${ROOT}/System/Library/SystemConfiguration
+ for PLUGIN in *.bundle
+ do
+ plugins[$num]=$PLUGIN
+ num=$(( $num + 1 ))
+ done
+
+ cd "${WORKDIR}"
+
+ for PLUGIN in "${plugins[@]}"
+ do
+ PLUGIN_DIR="${ROOT}/System/Library/SystemConfiguration/${PLUGIN}"
+ PLUGIN_INF=${PLUGIN_DIR}/Contents/Info.plist
+ if [ ! -f ${PLUGIN_INF} ]; then
+ PLUGIN_INF=${PLUGIN_DIR}/Info.plist
+ if [ ! -f ${PLUGIN_INF} ]; then
+ echo "${PLUGIN_INF}: No Info.plist" >> versions 2>&1
+ fi
fi
-}
-# get hostname, port, TSIG name and TSIG data from keychain
-# params: UNIQUEID
-BTMM_GETINFO()
-{
- ${PRIV} security find-generic-password \
- -s "${1}" \
- -g /Library/Keychains/System.keychain > .btmminfo 2>/dev/null
- ${PRIV} security find-generic-password \
- -s "${1}" \
- -g /Library/Keychains/System.keychain \
- 2>&1 \
- | sed -n 's/^password: \"\(.*\)\"$/\1/p'
-}
+ echo "${PLUGIN}" >> versions 2>&1
-# params: ZONE
-BTMM_URLISH()
-{
- BTMM_CHECKMACDOTCOM "${1}"
+ ENABLED="Enabled"
+ BOOL=`scutil --get ${PLUGIN_INF} / Enabled 2>/dev/null`
if [ $? -eq 0 ]; then
- echo "pm-members.mac.com.:443"
- else
- cat .btmminfo | sed -n 's/.*0x00000007 <blob>=\"\(.*\)\"/\1/p'
+ if [ ${BOOL} = "TRUE" ]; then
+ ENABLED="Enabled*"
+ else
+ ENABLED="Disabled"
+ fi
fi
-}
+ echo "\t${ENABLED}" >> versions 2>&1
-BTMM_RELAYINFO()
-{
- BTMM_CHECKMACDOTCOM "${1}"
+ VERBOSE=""
+ BOOL=`scutil --get ${PLUGIN_INF} / Verbose 2>/dev/null`
if [ $? -eq 0 ]; then
- return
- fi
-
- SECRET=`BTMM_GETINFO "btmmrelay:${1}"`
-
- if [ -z "${SECRET}" ]; then
- echo " No Relay keychain item." >> btmm
- return
+ if [ ${BOOL} = "TRUE" ]; then
+ VERBOSE="Verbose"
+ fi
fi
-
- if [ `echo "${SECRET}" | wc -l` -ne 1 ]; then
- echo " More than one Relay keychain item." >> btmm
- return
+ if [ -n "${VERBOSE}" ]; then
+ echo "\t${VERBOSE}" >> versions 2>&1
fi
-
- URLISH=`BTMM_URLISH "${DOMAIN}"`
- ACCOUNT=`cat .btmminfo | sed -n 's/.*\"acct\"<blob>=\"\(.*\)\"/\1/p'`
- KEYHASH="[SHA-1:`echo ${SECRET} | openssl sha1`]"
- echo " RHP: ${URLISH}" >> btmm
- echo " RAC: ${ACCOUNT}" >> btmm
- echo " RKY: ${KEYHASH}" >> btmm
-}
-BTMM_REPORTZONE()
-{
- DOMAIN="${1}"
-
- echo >> btmm
- echo "${DOMAIN}" >> btmm
-
- DNSID=`BTMM_UNIQUEIDFROMZONE "${DOMAIN}"`
- SECRET=`BTMM_GETINFO "${DNSID}"`
-
- if [ -z "${SECRET}" ]; then
- echo " No DNS keychain item." >> btmm
- return
+ VERSION=`scutil --get ${PLUGIN_INF} / CFBundleVersion 2>/dev/null`
+ if [ $? -eq 1 ]; then
+ VERSION=`scutil --get ${PLUGIN_INF} / CFBundleShortVersionString 2>/dev/null`
fi
-
- if [ `echo "${SECRET}" | wc -l` -ne 1 ]; then
- echo " More than one DNS keychain item." >> btmm
- return
- fi
-
- URLISH=`BTMM_URLISH "${DOMAIN}"`
- HOSTPORT=`echo "${URLISH}" | cut -d@ -f2`
- ACCOUNT=`cat .btmminfo | sed -n 's/.*\"acct\"<blob>=\"\(.*\)\"/\1/p'`
- TSIG="${ACCOUNT}:${SECRET}"
-
- KEYHASH="[SHA-1:`echo ${SECRET} | openssl sha1`]"
- echo "" >> btmm
- echo " DHP: ${URLISH}" >> btmm
- echo " DAC: ${ACCOUNT}" >> btmm
- echo " DKY: ${KEYHASH}" >> btmm
-
- BTMM_RELAYINFO "${DOMAIN}"
-
- for TYPE in \
- _afpovertcp._tcp \
- _airport._tcp \
- _adisk._tcp \
- _http._tcp \
- _rfb._tcp \
- _smb._tcp \
- _ssh._tcp
- do
- BTMM_DIG "${TYPE}.${DOMAIN}" ptr \
- | while read -r REG
- do
- echo "" >> btmm
- /bin/echo " ${REG}" >> btmm
- echo "" >> btmm
-
- INF_Q=`/bin/echo "${REG}" | sed -e "s/${TYPE}/_device-info._tcp/"`
- INF=`BTMM_DIG "${INF_Q}" txt`
- echo " INF: ${INF}" >> btmm
-
- SRV=`BTMM_DIG ${REG} srv`
- SRV1=`/bin/echo "${SRV}" | head -1`
- echo " SRV: ${SRV1}" >> btmm
- SRV2=`/bin/echo "${SRV}" | tail +2`
- if [ -n "${SRV2}" ]; then
- SRV="${SRV1}"
- /bin/echo "${SRV2}" \
- | sed -e 's/^/ *****: /' >> btmm
- fi
+ echo "\tVersion: ${VERSION}" >> versions 2>&1
- TXT=`BTMM_DIG ${REG} txt`
- TXT1=`/bin/echo "${TXT}" | head -1`
- echo " TXT: ${TXT1}" >> btmm
- TXT2=`/bin/echo "${TXT}" | tail +2`
- if [ -n "${TXT2}" ]; then
- /bin/echo "${TXT2}" \
- | sed -e 's/^/ *****: /' >> btmm
- fi
+ if [ -f ${PLUGIN_DIR}/Contents/MacOS/${PLUGIN%.*} ]; then
+ SUM=`sum ${PLUGIN_DIR}/Contents/MacOS/${PLUGIN%.*}`
+ echo "\tsum: ${SUM}" >> versions 2>&1
- HOST=`/bin/echo "${SRV}" | cut -d ' ' -f 4-`
- if [ -n "${HOST}" ]; then
- V4=`BTMM_DIG ${HOST} a`
- V6=`BTMM_DIG ${HOST} aaaa`
- KRB=`BTMM_DIG _kerberos.${HOST} txt`
- TUN=`BTMM_DIG _autotunnel._udp.${HOST} srv`
- AT6=`BTMM_DIG _autotunnel6.${HOST} aaaa`
- else
- V4=""
- V6=""
- KRB=""
- TUN=""
- AT6=""
- fi
- if [ -n "${V4}" ]; then
- echo " v4: ${V4}" >> btmm
- fi
- if [ -n "${V6}" ]; then
- echo " v6: ${V6}" >> btmm
- fi
- if [ -n "${KRB}" ]; then
- echo " KRB: ${KRB}" >> btmm
- fi
- if [ -n "${TUN}" ]; then
- echo " TUN: ${TUN}" >> btmm
-
- HOST=`/bin/echo "${TUN}" | cut -d ' ' -f 4-`
- if [ -n "${HOST}" ]; then
- V4=`BTMM_DIG ${HOST} a`
- V6=`BTMM_DIG ${HOST} aaaa`
- fi
- if [ -n "${V4}" ]; then
- echo " v4: ${V4}" >> btmm
- fi
- if [ -n "${V6}" ]; then
- echo " v6: ${V6}" >> btmm
- fi
- fi
- if [ -n "${AT6}" ]; then
- echo " AT6: ${AT6}" >> btmm
- fi
- done
- done
+ LSINFO=`ls -lu ${PLUGIN_DIR}/Contents/MacOS/${PLUGIN%.*}`
+ echo "\tadditional info: ${LSINFO}" >> versions 2>&1
+ elif [ -f ${PLUGIN_DIR}/${PLUGIN%.*} ]; then
+ SUM=`sum ${PLUGIN_DIR}/${PLUGIN%.*}`
+ echo "\tsum: ${SUM}" >> versions 2>&1
+
+ LSINFO=`ls -lu ${PLUGIN_DIR}/${PLUGIN%.*}`
+ echo "\tadditional info: ${LSINFO}" >> versions 2>&1
+ fi
+
+ echo "" >> versions 2>&1
+ done
}
-BTMM_SETUP
+if [ -x /usr/bin/what -a -x /usr/bin/sum -a -x /bin/ls ]; then
+ get_binary_info
+ get_plugins_info
+fi
-scutil <<_END_OF_INPUT \
-| sed -n 's@.* : *\(.*\)$@\1@p' \
-| sort \
-| while read DOMAIN
+#
+# Last thing is to collect the logs to give a chance for networkd and mDNSResponder
+# to finish dumping their state
+#
+
+#
+# system log, kernel.log, early boot log messages
+#
+if [ -x /usr/bin/syslog ]; then
+ # save the recent activity
+ ${PRIV} /usr/bin/syslog | ${TAIL_25000} > syslog
+
+ # save just the "kernel" activity (in case some of the
+ # interesting/relevant message are before the messages
+ # captured above.
+ ${PRIV} /usr/bin/syslog -k Facility kern | ${TAIL_25000} > kernel
+
+ if [ -d /var/log/DiagnosticMessages ]; then
+ # save any MessageTracer activity
+ ${PRIV} /usr/bin/syslog -d /var/log/DiagnosticMessages \
+ -F raw \
+ -T local \
+ | ${TAIL_25000} > DiagnosticMessages
+ fi
+else
+ if [ -f /var/log/system.log ]; then
+ ${PRIV} ${TAIL_25000} /var/log/system.log > system.log
+ fi
+ if [ -f /var/log/kernel.log ]; then
+ ${PRIV} ${TAIL_25000} /var/log/kernel.log > kernel.log
+ fi
+fi
+if [ -x /sbin/dmesg ]; then
+ ${PRIV} /sbin/dmesg > dmesg
+fi
+
+#
+# IPConfiguration log
+#
+if [ -f /var/log/com.apple.IPConfiguration.bootp ]; then
+ ${PRIV} ${TAIL_2000} /var/log/com.apple.IPConfiguration.bootp \
+ > com.apple.IPConfiguration.bootp
+fi
+
+#
+# ppp log file(s)
+#
+scutil <<_END_OF_INPUT \
+| awk -F' *: *' \
+ ' \
+ /Logfile : / { \
+ if (index($2, "/") == 1) { print $2 } \
+ else { print "/var/log/ppp/" $2 } \
+ } \
+ END { \
+ print "/tmp/pppotcp.log" \
+ } \
+ ' \
+| sort -u \
+| while read logFile
open
-show Setup:/Network/BackToMyMac
+show Setup:/Network/Service/[^/]+/PPP pattern
quit
_END_OF_INPUT
do
- BTMM_REPORTZONE "$DOMAIN"
+ if [ -f "${logFile}" ]; then
+ b="`basename ${logFile}`"
+ cat "${logFile}" > "${b}" 2>&1
+ fi
done
-BTMM_CLEANUP
-
#
-# collect crash reports
+# application firewall log
#
-for daemon in \
- bootpd \
- configd \
- eapolclient \
- mDNSResponder \
- mDNSResponderHelper \
- awacsd \
- pppd \
- racoon \
- socketfilterfw \
- SCHelper \
- SCMonitor \
+if [ -f /var/log/appfirewall.log ]; then
+ ${PRIV} ${TAIL_2000} /var/log/appfirewall.log > appfirewall.log
+fi
+
+if [ -x /bin/ls ]; then
+ #
+ # collect crash reports
+ #
+ for daemon in \
+ bootpd \
+ configd \
+ eapolclient \
+ mDNSResponder \
+ mDNSResponderHelper \
+ awacsd \
+ pppd \
+ racoon \
+ socketfilterfw \
+ InternetSharing \
+ SCHelper \
+ SCMonitor \
-do
- /bin/ls -1 /Library/Logs/DiagnosticReports/${daemon}_*.crash \
- /Library/Logs/CrashReporter/${daemon}_*.crash \
- 2>/dev/null \
+ do
+ /bin/ls -1 /Library/Logs/DiagnosticReports/${daemon}_*.crash \
+ /Library/Logs/CrashReporter/${daemon}_*.crash \
+ /Library/Logs/CrashReporter/${daemon}_*.plist \
+ 2>/dev/null \
+ | while read log
+ do
+ if [ -f "${log}" ]; then
+ b="`basename ${log}`"
+ ${PRIV} cat "${log}" > "${b}" 2>&1
+ fi
+ done
+ done
+
+ #
+ # collect any verbose logging output
+ #
+ /bin/ls -1 /Library/Logs/CrashReporter/com.apple.networking.*.log* \
+ 2>/dev/null \
| while read log
do
if [ -f "${log}" ]; then
b="`basename ${log}`"
- ${PRIV} cat "${log}" > "${b}" 2>&1
+ ${PRIV} cat "${log}" > "${b}" 2>&1
fi
done
-done
-
-#
-# system usage statistics
-#
-echo "#" > system-statistics
-echo "# uptime" >> system-statistics
-echo "#" >> system-statistics
-uptime >> system-statistics 2>&1
-
-echo "#" >> system-statistics
-echo "# sysctl -a" >> system-statistics
-echo "#" >> system-statistics
-sysctl -a >> system-statistics 2>&1
-
-echo "#" >> system-statistics
-echo "# zprint" >> system-statistics
-echo "#" >> system-statistics
-zprint >> system-statistics 2>&1
+fi
-echo "#" >> system-statistics
-echo "# top -l5 -s2" >> system-statistics
-echo "#" >> system-statistics
-echo ""
-echo "Please wait, collecting statistics"
-echo ""
-top -s 2 -l 5 >> system-statistics 2>&1
#
# collect everything into a single archive
#
cd "${WORKDIR}/.."
-if [ -x /usr/bin/tar ]; then
- tar -c ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
-else
- pax -w ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
-fi
+tar -c ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
rm -rf "${WORKDIR}"
if [ ${UID} -eq 0 ]; then
echo "Network data collected to \"${ARCHIVE}\""
-#
-# if requested, generate a crash report
-#
-if [ "${OUTDIR}" = "/Library/Logs/CrashReporter/SystemConfiguration" -a "${1}" = "CRASH" ]; then
- kill -ABRT $$
-fi
-