]> git.saurik.com Git - apple/configd.git/blobdiff - get-mobility-info
configd-395.6.tar.gz
[apple/configd.git] / get-mobility-info
index 403b317c8515d53f21c853bc00e01197ddb43cbe..adc3d6a3805d6194b9f41ed1207364fba9d43080 100755 (executable)
@@ -1,11 +1,11 @@
 #!/bin/sh
+# Copyright (c) 2004-2011 Apple Inc.
+#
 # get-mobility-info
 #
 # Collect system & network configuration information.
 #
 
-OUT=mobility-config-$$
-
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
 
 PRIV=""
@@ -13,23 +13,56 @@ if [ ${EUID} -ne 0 ]; then
        PRIV="sudo"
 fi
 
-cd /tmp
-mkdir ${OUT}
+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
+       mkdir -p ${OUTDIR}
+fi
+
+umask 077
+
+WORKDIR=`mktemp -d -q "/tmp/${OUT}"`
+if [ $? -ne 0 ]; then
+       echo "Could not create snapshot directory"
+       exit 1
+fi
+
+GZ_EXT=""
+GZ_OPT=""
+if [ -x /usr/bin/gzip ]; then
+       GZ_EXT=".gz"
+       GZ_OPT="-z"
+fi
+
+ARCHIVE=`mktemp -q "${OUTDIR}/${OUT}.tar${GZ_EXT}"`
+if [ $? -ne 0 ]; then
+       echo "Could not create snapshot archive"
+       rm -rf "${WORKDIR}"
+       exit 1
+fi
+
+cd "${WORKDIR}"
 
 #
 # processes
 #
-ps axlww                                               > ${OUT}/ps                     2>&1
+ps axlww                                               > ps                    2>&1
 
 #
 # network interface configuration
 #
-ifconfig -a -b                                         > ${OUT}/ifconfig               2>&1
+ifconfig -a -L -b -m -r -v                             > ifconfig              2>&1
+if [ $? -ne 0 ]; then
+       ifconfig -a                                     > ifconfig              2>&1
+fi
 
 #
 # network route configuration
 #
-netstat -n -r                                          >> ${OUT}/netstat               2>&1
+netstat -n -r -a -l                                    > netstat               2>&1
 
 #
 # DHCP configuration
@@ -38,54 +71,65 @@ for if in `ifconfig -l`
 do
        case ${if} in
        lo* )   ;;
-       en* )   ipconfig getpacket ${if}                > ${OUT}/ipconfig-${if}         2>&1
+       en* )   ipconfig getpacket ${if}                > ipconfig-${if}        2>&1
                ;;
        esac
 done
 
+#
+# AirPort info
+#
+if [ -x /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport ]; then
+       /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport --getinfo      \
+                                                       > airport               2>&1
+fi
+
 #
 # OS info
 #
 if [ -e /System/Library/CoreServices/SystemVersion.plist ]; then
        cat /System/Library/CoreServices/SystemVersion.plist    \
-                                                       > ${OUT}/SystemVersion.plist    2>&1
+                                                       > SystemVersion.plist   2>&1
 fi
 if [ -e /System/Library/CoreServices/ServerVersion.plist ]; then
        cat /System/Library/CoreServices/ServerVersion.plist    \
-                                                       > ${OUT}/ServerVersion.plist    2>&1
+                                                       > ServerVersion.plist   2>&1
 fi
 
 #
 # IOKit info
 #
-ioreg -l                                               > ${OUT}/ioreg                  2>&1
+ioreg -i -l -w 0                                       >  ioreg                2>&1
+ioreg -i -l -p IODeviceTree -w 0                       >> ioreg                2>&1
+
+#
+# Host name
+#
+hostname                                               > hostname              2>&1
 
 #
 # Host configuration
 #
-hostinfo                                               > ${OUT}/hostinfo               2>&1
+hostinfo                                               > hostinfo              2>&1
 if [ -e /etc/hostconfig ]; then
-       cat /etc/hostconfig                             > ${OUT}/etc.hostconfig         2>&1
+       cat /etc/hostconfig                             > etc.hostconfig        2>&1
 fi
 
 #
 # DNS configuration
 #
-scutil --dns                                           > ${OUT}/dns-configuration      2>&1
+scutil --dns                                           > dns-configuration     2>&1
 if [ -e /etc/resolv.conf ]; then
-       cat /etc/resolv.conf                            > ${OUT}/etc.resolv.conf        2>&1
+       cat /etc/resolv.conf                            > etc.resolv.conf       2>&1
 fi
 if [ -e /var/run/resolv.conf ]; then
-       cat /var/run/resolv.conf                        > ${OUT}/var.run.resolv.conf    2>&1
+       cat /var/run/resolv.conf                        > var.run.resolv.conf   2>&1
 fi
 
 #
-# NetInfo configuration
+# Proxy configuration
 #
-niutil -statistics .                                   > ${OUT}/netinfo-statistics     2>&1
-if [ -f /var/run/niconfig_local.xml ]; then
-       cat /var/run/niconfig_local.xml                 > ${OUT}/niconfig_local.xml     2>&1
-fi
+scutil --proxy                                         > proxy-configuration   2>&1
 
 #
 # System / network preferences
@@ -95,16 +139,32 @@ 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                      \
+       /Library/Preferences/com.apple.alf.plist                                        \
        /Library/Preferences/com.apple.sharing.firewall.plist                           \
+       /Library/Preferences/com.apple.wwand.plist                                      \
 
 do
-       if [ -e ${f} ]; then
-               b=`basename $f`
-               cat ${f}                                > ${OUT}/${b}                   2>&1
+       if [ -e "${f}" ]; then
+               b="`basename ${f}`"
+               cat "${f}"                              > "${b}"                2>&1
        fi
 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
+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
+fi
+
 #
 # configd's cache
 #
@@ -113,124 +173,644 @@ open
 snapshot
 quit
 _END_OF_INPUT
-if [ -f /var/tmp/configd-store.xml ]; then
-       cp /var/tmp/configd-store.xml                   ${OUT}/configd-store.xml
+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-pattern.plist ]; then
+       cat /var/tmp/configd-pattern.plist              > configd-pattern.plist 2>&1
 fi
-if [ -f /var/tmp/configd-pattern.xml ]; then
-       cp /var/tmp/configd-pattern.xml                 ${OUT}/configd-pattern.xml
+if [ -f /var/tmp/configd-session.plist ]; then
+       cat /var/tmp/configd-session.plist              > configd-session.plist 2>&1
 fi
-if [ -f /var/tmp/configd-session.xml ]; then
-       cp /var/tmp/configd-session.xml                 ${OUT}/configd-session.xml
+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                          > ${OUT}/reachability-info      2>&1
-if [ -f /usr/bin/dig ]; then
-       dig -t any -c any www.apple.com                 > ${OUT}/dig-results            2>&1
+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
 fi
 
 #
 # mounted filesystems
 #
-mount                                                  > ${OUT}/mounted-filesystems    2>&1
+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
 
 #
-# system log
+# IPConfiguration log
 #
-tail -1000 /var/log/system.log                         > ${OUT}/system.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
 
 #
-# ppp log
+# application firewall log
 #
-if [ -f /var/log/ppp.log ]; then
-       cp /var/log/ppp.log                             ${OUT}/ppp.log
+if [ -f /var/log/appfirewall.log ]; then
+       ${PRIV} tail -n 2000 /var/log/appfirewall.log   > appfirewall.log
 fi
 
 #
 # kernel extensions statistic
 #
-if   [ -f /usr/sbin/kextstat ]; then
-       kextstat                                        > ${OUT}/kextstat               2>&1
-elif [ -f /usr/sbin/kmodstat ]; then
-       kmodstat                                        > ${OUT}/kmodstat               2>&1
+if   [ -x /usr/sbin/kextstat ]; then
+       kextstat                                        > kextstat              2>&1
+elif [ -x /usr/sbin/kmodstat ]; then
+       kmodstat                                        > kmodstat              2>&1
 fi
 
 #
 # network statistics
 #
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# netstat -n -a -A -f inet"                      >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-netstat -n -a -A -f inet                               >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# lsof -n -i -P"                                 >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-lsof -n -i -P                                          >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# netstat -s"                                    >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-netstat -s                                             >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# netstat -m"                                    >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-netstat -m                                             >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# netstat -i -n -d"                              >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-netstat -i -n -d                                       >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# ipfw -at show"                                 >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-ipfw -at show                                          >> ${OUT}/network-statistics    2>&1
-echo "#"                                               >> ${OUT}/network-statistics
-echo "# appletalk -s"                                  >> ${OUT}/network-statistics
-echo "#"                                               >> ${OUT}/network-statistics
-appletalk -s                                           >> ${OUT}/network-statistics    2>&1
+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
+
+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
+
+       echo "#"                                        >> network-statistics
+       echo "# ndp -n -p"                              >> network-statistics
+       echo "#"                                        >> network-statistics
+       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
+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
+fi
+
+if [ -x /sbin/pfctl ]; then
+       echo "#"                                        >  pf
+       echo "# pfctl -s all"                           >> pf
+       echo "#"                                        >> pf
+       ${PRIV} 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`
+       do
+               echo "=============================="   >> pf
+               echo "#"                                >> pf
+               echo "# pfctl -a ${ANCHOR} -s all"      >> pf
+               echo "#"                                >> pf
+               ${PRIV} pfctl -a ${ANCHOR} -s all       >> pf                   2>&1
+       done
+fi
+
+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
+fi
+
+#
+# DirectoryService info
+#
+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
+elif [ -x /usr/bin/dscacheutil ]; then
+       echo "#"                                        >  ds-info
+       echo "# dscacheutil -configuration"             >> ds-info
+       echo "#"                                        >> ds-info
+       dscacheutil -configuration                      >> ds-info              2>&1
+
+       echo "#"                                        >> ds-info
+       echo "# dscacheutil -statistics"                >> ds-info
+       echo "#"                                        >> ds-info
+       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
+fi
 
 #
-# system usage statistics
+# 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;
+               } else {
+                       printf "%s\n", $_;
+               }
+       '                                               >> ipsec
+done
+
+#
+# Kerberos configuration
+#
+if [ -x /usr/bin/klist ]; then
+       echo "#"                                        >  kerberos
+       echo "# klist -e -c -A -f -a -n"                >> kerberos
+       echo "#"                                        >> kerberos
+       ${PRIV} klist -e -c -A -f -a -n                 >> kerberos     2>&1
+
+       echo "#"                                        >> kerberos
+       echo "# klist -e -k -t -K"                      >> kerberos
+       echo "#"                                        >> kerberos
+       ${PRIV} klist -e -k -t -K                       >> kerberos     2>&1
+fi
+
 #
-echo "#"                                               >  ${OUT}/system-statistics
-echo "# uptime"                                                >> ${OUT}/system-statistics
-echo "#"                                               >> ${OUT}/system-statistics
-uptime                                                 >> ${OUT}/system-statistics     2>&1
-echo "#"                                               >> ${OUT}/system-statistics
-echo "# pstat -t"                                      >> ${OUT}/system-statistics
-echo "#"                                               >> ${OUT}/system-statistics
-pstat -t                                               >> ${OUT}/system-statistics     2>&1
-echo "#"                                               >> ${OUT}/system-statistics
-echo "# sysctl -a"                                     >> ${OUT}/system-statistics
-echo "#"                                               >> ${OUT}/system-statistics
-sysctl -a                                              >> ${OUT}/system-statistics     2>&1
-echo "#"                                               >> ${OUT}/system-statistics
-echo "# zprint"                                                >> ${OUT}/system-statistics
-echo "#"                                               >> ${OUT}/system-statistics
-zprint                                                 >> ${OUT}/system-statistics     2>&1
-echo "#"                                               >> ${OUT}/system-statistics
-echo "# top -l5 -s2"                                   >> ${OUT}/system-statistics
-echo "#"                                               >> ${OUT}/system-statistics
-  echo ""
-  echo "Please wait, collecting statistics"
-  echo ""
-top -s 2 -l 5                                          >> ${OUT}/system-statistics     2>&1
+# BTMM configuration
+#
+
+BTMM_CLEANUP()
+{
+       rm -f .btmmfifo .btmminfo .digsync
+}
+
+BTMM_SETUP()
+{
+       BTMM_CLEANUP
+       mkfifo .btmmfifo
+
+       BTMMPORT=40000
+       while nc -6z ::1 "${PORT}"                      > /dev/null     2>&1
+       do
+               BTMMPORT=$((PORT + 1))
+       done
+}
+
+BTMM_CHECKMACDOTCOM()
+{
+       TAIL=`echo "${1}" | cut -d. -f2-`
+       if [ "${TAIL}" = "members.mac.com" ]; then
+               return 0
+       fi
+
+       return 1
+}
+
+# get DNS info
+# params: QUERYNAME QUERYTYPE
+BTMM_DIG()
+{
+       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
+}
+
+# get the unique identifier used to lookup the keychain item for a zone
+# params: ZONE
+BTMM_UNIQUEIDFROMZONE()
+{
+       BTMM_CHECKMACDOTCOM "${1}"
+       if [ $? -eq 0 ]; then
+               echo "dns:${1}"
+       else
+               echo "btmmdns:${1}"
+       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'
+}
+
+# params: ZONE
+BTMM_URLISH()
+{
+       BTMM_CHECKMACDOTCOM "${1}"
+       if [ $? -eq 0 ]; then
+               echo "pm-members.mac.com.:443"
+       else
+               cat .btmminfo | sed -n 's/.*0x00000007 <blob>=\"\(.*\)\"/\1/p'
+       fi
+}
+
+BTMM_RELAYINFO()
+{
+       BTMM_CHECKMACDOTCOM "${1}"
+       if [ $? -eq 0 ]; then
+               return
+       fi
+       
+       SECRET=`BTMM_GETINFO "btmmrelay:${1}"`
+       
+       if [ -z "${SECRET}" ]; then
+               echo "  No Relay keychain item."                >> btmm
+               return
+       fi
+       
+       if [ `echo "${SECRET}" | wc -l` -ne 1 ]; then
+               echo "  More than one Relay keychain item."     >> btmm
+               return
+       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
+       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
+
+                       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
+
+                       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
+}
+
+BTMM_SETUP
+
+scutil <<_END_OF_INPUT \
+| sed -n 's@.* : *\(.*\)$@\1@p' \
+| sort \
+| while read DOMAIN
+open
+show Setup:/Network/BackToMyMac
+quit
+_END_OF_INPUT
+do
+       BTMM_REPORTZONE "$DOMAIN"
+done
+
+BTMM_CLEANUP
 
 #
 # collect crash reports
 #
-for daemon in bootpd configd pppd
+for daemon in                          \
+               bootpd                  \
+               configd                 \
+               eapolclient             \
+               mDNSResponder           \
+               mDNSResponderHelper     \
+               awacsd                  \
+               pppd                    \
+               racoon                  \
+               socketfilterfw          \
+               SCHelper                \
+               SCMonitor               \
+
 do
-       LOG=${daemon}.crash.log
-       if [ -e /Library/Logs/CrashReporter/${LOG} ]; then
-               cat /Library/Logs/CrashReporter/${LOG}  > ${OUT}/${LOG}                 2>&1
-       fi
+       /bin/ls -1      /Library/Logs/DiagnosticReports/${daemon}_*.crash       \
+                       /Library/Logs/CrashReporter/${daemon}_*.crash           \
+                       2>/dev/null                                             \
+       | while read log
+       do
+               if [ -f "${log}" ]; then
+                       b="`basename ${log}`"
+                       ${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
+
+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
 #
-tar cfz ${OUT}.tar.gz ${OUT}
-rm -rf ${OUT}
+cd "${WORKDIR}/.."
+if [ -x /usr/bin/tar ]; then
+       tar -c ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
+else
+       pax -w ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
+fi
+rm -rf "${WORKDIR}"
+
+if [ ${UID} -eq 0 ]; then
+       if [ -n "${SUDO_UID}" -a -n "${SUDO_GID}" ]; then
+               if [ ${UID} -ne ${SUDO_UID} ]; then
+                       chown ${SUDO_UID}:${SUDO_GID} "${ARCHIVE}"
+               fi
+       fi
+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
 
-echo "Network data collected to /tmp/${OUT}.tar.gz"