Changeset View
Changeset View
Standalone View
Standalone View
cddl/usr.sbin/dwatch/libexec/tcp
- This file was added.
Property | Old Value | New Value |
---|---|---|
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
# -*- tab-width: 4 -*- ;; Emacs | |||||
# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM | |||||
############################################################ IDENT(1) | |||||
# | |||||
# $Title: dwatch(8) module for dtrace_tcp(4) connections $ | |||||
# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ | |||||
# $FreeBSD$ | |||||
# | |||||
############################################################ DESCRIPTION | |||||
# | |||||
# Print addresses when TCP connections are established | |||||
# | |||||
############################################################ PROBE | |||||
case "$PROFILE" in | |||||
tcp) | |||||
: ${PROBE:=$( echo \ | |||||
tcp:::accept-established, \ | |||||
tcp:::accept-refused, \ | |||||
tcp:::connect-established, \ | |||||
tcp:::connect-refused, \ | |||||
tcp:::connect-request )} ;; | |||||
tcp-accept) | |||||
: ${PROBE:=tcp:::accept-established, tcp:::accept-refused} ;; | |||||
tcp-connect) | |||||
: ${PROBE:=$( echo \ | |||||
tcp:::connect-established, \ | |||||
tcp:::connect-refused, \ | |||||
tcp:::connect-request )} ;; | |||||
tcp-established) | |||||
: ${PROBE:=tcp:::accept-established, tcp:::connect-established} ;; | |||||
tcp-refused) | |||||
: ${PROBE:=tcp:::accept-refused, tcp:::connect-refused} ;; | |||||
*) | |||||
: ${PROBE:=tcp:::${PROFILE#tcp-}} | |||||
esac | |||||
############################################################ GLOBALS | |||||
# | |||||
# This profile does not support these dwatch features | |||||
# NB: They are disabled here so they have no effect when profile is loaded | |||||
# | |||||
unset EXECNAME # -k name | |||||
unset EXECREGEX # -z regex | |||||
unset GROUP # -g group | |||||
unset PID # -p pid | |||||
unset PSARGS # affects -d | |||||
unset PSTREE # -R | |||||
unset USER # -u user | |||||
############################################################ ACTIONS | |||||
exec 9<<EOF | |||||
$PROBE /* probe ID $ID */ | |||||
{${TRACE:+ | |||||
printf("<$ID>"); | |||||
} | |||||
/* | |||||
* Which function triggered? | |||||
*/ | |||||
this->send = probename == "send" ? 1 : 0; | |||||
this->receive = probename == "receive" ? 1 : 0; | |||||
this->io = this->send || this->receive ? 1 : 0; | |||||
this->connect = this->io ? 0 : | |||||
strstr(probename, "connect") != NULL ? 1 : 0; | |||||
this->request = this->connect ? ( | |||||
strstr(probename, "request") != NULL ? 1 : 0 | |||||
) : 0; | |||||
this->refused = this->request ? 0 : ( | |||||
strstr(probename, "refused") != NULL ? 1 : 0 | |||||
); | |||||
/* | |||||
* TCP addresses | |||||
*/ | |||||
this->reverse = this->send || this->request || | |||||
(this->refused && ! this->connect) ? 1 : 0; | |||||
this->local = this->reverse ? args[2]->ip_saddr : args[2]->ip_daddr; | |||||
this->remote = this->reverse ? args[2]->ip_daddr : args[2]->ip_saddr; | |||||
/* | |||||
* TCP ports | |||||
*/ | |||||
this->lport = this->reverse ? args[4]->tcp_sport : args[4]->tcp_dport; | |||||
this->rport = this->reverse ? args[4]->tcp_dport : args[4]->tcp_sport; | |||||
/* | |||||
* IPv6 support | |||||
*/ | |||||
this->local6 = strstr(this->local, ":") != NULL ? 1 : 0; | |||||
this->remote6 = strstr(this->remote, ":") != NULL ? 1 : 0; | |||||
this->local = strjoin(strjoin(this->local6 ? "[" : "", | |||||
this->local), this->local6 ? "]" : ""); | |||||
this->remote = strjoin(strjoin(this->remote6 ? "[" : "", | |||||
this->remote), this->remote6 ? "]" : ""); | |||||
/* | |||||
* I/O | |||||
*/ | |||||
this->flow = this->connect ? ( | |||||
this->request ? "-?" : /* connect-request */ | |||||
this->refused ? "-X" : /* connect-refused */ | |||||
"->" /* connect-established */ | |||||
) : this->refused ? "X-" : /* accept-refused */ | |||||
this->send ? "->" : /* send */ | |||||
"<-"; /* accept-established, receive */ | |||||
} | |||||
EOF | |||||
ACTIONS=$( cat <&9 ) | |||||
ID=$(( $ID + 1 )) | |||||
############################################################ EVENT TAG | |||||
exec 9<<EOF | |||||
printf("%s: ", "$PROFILE"); | |||||
EOF | |||||
EVENT_TAG=$( cat <&9 ) | |||||
############################################################ EVENT DETAILS | |||||
exec 9<<EOF | |||||
/* | |||||
* Print connection details (incl. TCP port) | |||||
*/ | |||||
printf("%s:%u %s %s:%u", | |||||
this->local, this->lport, | |||||
this->flow, | |||||
this->remote, this->rport); | |||||
EOF | |||||
EVENT_DETAILS=$( cat <&9 ) | |||||
################################################################################ | |||||
# END | |||||
################################################################################ |