get-mobility-info   [plain text]


#!/bin/sh
# Copyright (c) 2004-2013 Apple Inc.
#
# get-mobility-info
#
# Collect system & network configuration information.
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

PRIV=""
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
	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}"

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
#
if [ -x /bin/ps ]; then
	/bin/ps axlww					> ps			2>&1
fi

#
# network interface configuration
#
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
#
if [ -x /usr/sbin/netstat ]; then
	/usr/sbin/netstat -n -r -a -l			> netstat		2>&1
fi

#
# DHCP configuration
#
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
#
if [ -x /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport ]; then
	/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport --getinfo	\
							> 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
#
if [ -e /System/Library/CoreServices/SystemVersion.plist ]; then
	cat /System/Library/CoreServices/SystemVersion.plist	\
							> SystemVersion.plist	2>&1
fi
if [ -e /System/Library/CoreServices/ServerVersion.plist ]; then
	cat /System/Library/CoreServices/ServerVersion.plist	\
							> ServerVersion.plist	2>&1
fi

#
# IOKit info
#
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
#
if [ -x /bin/hostname ]; then
	/bin/hostname					> hostname		2>&1
fi

#
# Host configuration
#
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

#
# DNS configuration
#
scutil --dns						> dns-configuration	2>&1
if [ -e /etc/resolv.conf ]; then
	cat /etc/resolv.conf				> etc.resolv.conf	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 -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
#
for f in										\
	/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist		\
	/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.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}"				> "${b}"		2>&1
	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>/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>/dev/null
fi

#
# configd's cache
#
${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-pattern.plist ]; then
	cat /var/tmp/configd-pattern.plist		> configd-pattern.plist	2>&1
fi
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-state ]; then
	cat /var/tmp/configd-state			> configd-state		2>&1
fi
if [ -f /var/tmp/configd-reachability ]; then
	cat /var/tmp/configd-reachability		> configd-reachability		2>&1
fi

#
# mounted filesystems
#
mount							> mounted-filesystems	2>&1

${PRIV} cat /etc/hosts 					> etc.hosts		2>/dev/null

#
# kernel extensions statistic
#
if   [ -x /usr/sbin/kextstat ]; then
	/usr/sbin/kextstat				> kextstat		2>&1
elif [ -x /usr/sbin/kmodstat ]; then
	/usr/sbin/kmodstat				> kmodstat		2>&1
fi

#
# network statistics
#
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
	/usr/sbin/ndp -n -a				>> network-statistics	2>&1

	echo "#"					>> network-statistics
	echo "# ndp -n -p"				>> network-statistics
	echo "#"					>> network-statistics
	/usr/sbin/ndp -n -p				>> network-statistics	2>&1

	echo "#"					>> network-statistics
	echo "# ndp -n -r"				>> network-statistics
	echo "#"					>> network-statistics
	/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} /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} /sbin/pfctl -s all			>> pf			2>&1
	echo "=============================="		>> pf
	echo "#"					>> pf
	echo "# pfctl -s References"			>> pf
	echo "#"					>> pf
	${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} /sbin/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} /usr/sbin/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} /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
	/usr/bin/dscacheutil -configuration		>> ds-info		2>&1

	echo "#"					>> ds-info
	echo "# dscacheutil -statistics"		>> ds-info
	echo "#"					>> ds-info
	/usr/bin/dscacheutil -statistics		>> ds-info		2>&1

	echo "#"					>> ds-info
	echo "# dscacheutil -cachedump -entries"	>> ds-info
	echo "#"					>> ds-info
	/usr/bin/dscacheutil -cachedump -entries	>> ds-info		2>&1
fi

#
# IPsec configuration
#
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

	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 --verbose --all-content"		>> kerberos
	echo "#"					>> kerberos
	klist --verbose --all-content			>> kerberos	2>&1

	echo "#"					>> kerberos
	echo "# ktutil list"				>> kerberos
	echo "#"					>> kerberos
	${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

#
# 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

#
# system usage statistics
#
echo -n ""						> system-statistics

if [ -x /usr/bin/uptime ]; then
	echo "#"					>> system-statistics
	echo "# uptime"					>> system-statistics
	echo "#"					>> system-statistics
	/usr/bin/uptime					>> system-statistics	2>&1
fi

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

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()
{
    if [ ! -f ${1} ]; then
	return
    fi

    VERSION=`what ${1}`
    echo "${VERSION}"					>> versions	2>&1

    SUM=`sum ${1}`
    echo "\tsum: ${SUM}"				>> versions	2>&1

    LSINFO=`ls -lu ${1}`
    echo "\tadditional info: ${LSINFO}"			>> versions	2>&1

    echo ""						>> versions	2>&1
}

get_binary_info()
{
    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_plugins_info()
{
    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

	echo "${PLUGIN}"					>> versions		2>&1

	ENABLED="Enabled"
	BOOL=`scutil --get ${PLUGIN_INF} / Enabled					2>/dev/null`
	if [ $? -eq 0 ]; then
	    if [ ${BOOL} = "TRUE" ]; then
		ENABLED="Enabled*"
	    else
		ENABLED="Disabled"
	    fi
	fi
	echo "\t${ENABLED}"					>> versions		2>&1

	VERBOSE=""
	BOOL=`scutil --get ${PLUGIN_INF} / Verbose					2>/dev/null`
	if [ $? -eq 0 ]; then
	    if [ ${BOOL} = "TRUE" ]; then
		VERBOSE="Verbose"
	    fi
	fi
	if [ -n "${VERBOSE}" ]; then
		echo "\t${VERBOSE}"				>> versions		2>&1
	fi

	VERSION=`scutil --get ${PLUGIN_INF} / CFBundleVersion				2>/dev/null`
	if [ $? -eq 1 ]; then
		VERSION=`scutil --get ${PLUGIN_INF} / CFBundleShortVersionString	2>/dev/null`
	fi
	echo "\tVersion: ${VERSION}"				>> versions		2>&1

	if [ -f ${PLUGIN_DIR}/Contents/MacOS/${PLUGIN%.*} ]; then
	    SUM=`sum ${PLUGIN_DIR}/Contents/MacOS/${PLUGIN%.*}`
	    echo "\tsum: ${SUM}"				>> versions		2>&1

	    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
}

if [ -x /usr/bin/what -a -x /usr/bin/sum -a -x /bin/ls ]; then
	get_binary_info
	get_plugins_info
fi

#
# 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/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_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		\
				/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
		fi
	done
fi


#
# collect everything into a single archive
#
cd "${WORKDIR}/.."
tar -c ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
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}\""