X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/6bb659645459a5a8b169b9554c8dfc459f435bc2..5e9ce69ef59d7d98ff13748ce18266968031faaf:/get-mobility-info?ds=sidebyside diff --git a/get-mobility-info b/get-mobility-info index adc3d6a..a0b66a9 100755 --- a/get-mobility-info +++ b/get-mobility-info @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2004-2011 Apple Inc. +# Copyright (c) 2004-2013 Apple Inc. # # get-mobility-info # @@ -13,12 +13,20 @@ if [ ${EUID} -ne 0 ]; then 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 @@ -46,35 +54,67 @@ 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 @@ -84,6 +124,22 @@ if [ -x /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport > 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 # @@ -99,18 +155,34 @@ fi # # 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 @@ -125,11 +197,32 @@ 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 @@ -139,7 +232,6 @@ for f in \ /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 \ @@ -154,25 +246,42 @@ do 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 @@ -185,28 +294,8 @@ 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 # @@ -214,177 +303,149 @@ 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 @@ -392,7 +453,7 @@ if [ -x /usr/sbin/lsof ]; then 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 # @@ -402,399 +463,390 @@ if [ -x /usr/bin/odutil ]; then 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 =\"\(.*\)\"/\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\"=\"\(.*\)\"/\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\"=\"\(.*\)\"/\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 @@ -807,10 +859,3 @@ fi 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 -