xref: /freebsd/cddl/usr.sbin/dwatch/libexec/jail (revision 434283fda99e89af20c3fe95fde427624ae96d04)
1*434283fdSDevin Teske# -*- tab-width: 4 -*- ;; Emacs
2*434283fdSDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3*434283fdSDevin Teske############################################################ IDENT(1)
4*434283fdSDevin Teske#
5*434283fdSDevin Teske# $Title: dwatch(8) module for jail(2) management syscalls $
6*434283fdSDevin Teske# $Copyright: 2026 Devin Teske. All rights reserved. $
7*434283fdSDevin Teske#
8*434283fdSDevin Teske############################################################ DESCRIPTION
9*434283fdSDevin Teske#
10*434283fdSDevin Teske# Print jail management activity -- jail(2), jail_set(2), jail_get(2),
11*434283fdSDevin Teske# jail_attach(2), and jail_remove(2) -- naming the syscall, the jail id
12*434283fdSDevin Teske# operated on, and any errno returned. Answers "who is creating,
13*434283fdSDevin Teske# entering, or destroying jails?" Complements the dwatch `-j jail'
14*434283fdSDevin Teske# filter, which scopes any profile to processes inside one jail; this
15*434283fdSDevin Teske# profile watches the management plane itself, from any jail or none.
16*434283fdSDevin Teske# Use jail-attach, jail-get, jail-remove, or jail-set to watch a
17*434283fdSDevin Teske# single operation by name.
18*434283fdSDevin Teske#
19*434283fdSDevin Teske############################################################ PROBE
20*434283fdSDevin Teske
21*434283fdSDevin Teskecase "$PROFILE" in
22*434283fdSDevin Teskejail)
23*434283fdSDevin Teske	: ${PROBE:=$( echo \
24*434283fdSDevin Teske		syscall::jail:return, \
25*434283fdSDevin Teske		syscall::jail_set:return, \
26*434283fdSDevin Teske		syscall::jail_get:return, \
27*434283fdSDevin Teske		syscall::jail_attach:return, \
28*434283fdSDevin Teske		syscall::jail_remove:return )} ;;
29*434283fdSDevin Teske*)
30*434283fdSDevin Teske	: ${PROBE:=syscall::jail_${PROFILE#jail-}:return}
31*434283fdSDevin Teskeesac
32*434283fdSDevin Teske
33*434283fdSDevin Teske#
34*434283fdSDevin Teske# Derive the matching entry probes from the return probes being watched
35*434283fdSDevin Teske#
36*434283fdSDevin TeskeENTRY_PROBE=$( echo "$PROBE" | awk 'gsub(/:return/, ":entry") || 1' )
37*434283fdSDevin Teske
38*434283fdSDevin Teske############################################################ ACTIONS
39*434283fdSDevin Teske
40*434283fdSDevin Teskeexec 9<<EOF
41*434283fdSDevin Teskeself int	jail_arg;
42*434283fdSDevin Teskethis int	jail_jid;
43*434283fdSDevin Teske
44*434283fdSDevin Teske$ENTRY_PROBE /* probe ID $ID */
45*434283fdSDevin Teske{${TRACE:+
46*434283fdSDevin Teske	printf("<$ID>");}
47*434283fdSDevin Teske	self->jail_arg = -1;
48*434283fdSDevin Teske}
49*434283fdSDevin Teske
50*434283fdSDevin Teskesyscall::jail_attach:entry,
51*434283fdSDevin Teskesyscall::jail_remove:entry /* probe ID $(( $ID + 1 )) */
52*434283fdSDevin Teske{${TRACE:+
53*434283fdSDevin Teske	printf("<$(( $ID + 1 ))>");}
54*434283fdSDevin Teske	/* arg0 is the jail id being attached-to or removed */
55*434283fdSDevin Teske	self->jail_arg = (int)arg0;
56*434283fdSDevin Teske}
57*434283fdSDevin Teske
58*434283fdSDevin Teske$PROBE /* probe ID $(( $ID + 2 )) */
59*434283fdSDevin Teske{${TRACE:+
60*434283fdSDevin Teske	printf("<$(( $ID + 2 ))>");
61*434283fdSDevin Teske}
62*434283fdSDevin Teske	/*
63*434283fdSDevin Teske	 * jail(2), jail_set(2), and jail_get(2) return the jail id;
64*434283fdSDevin Teske	 * jail_attach(2) and jail_remove(2) were given it at entry
65*434283fdSDevin Teske	 */
66*434283fdSDevin Teske	this->jail_jid = self->jail_arg >= 0 ?
67*434283fdSDevin Teske		self->jail_arg : (int)arg0;
68*434283fdSDevin Teske	self->jail_arg = 0;
69*434283fdSDevin Teske}
70*434283fdSDevin TeskeEOF
71*434283fdSDevin TeskeACTIONS=$( cat <&9 )
72*434283fdSDevin TeskeID=$(( $ID + 3 ))
73*434283fdSDevin Teske
74*434283fdSDevin Teske############################################################ EVENT DETAILS
75*434283fdSDevin Teske
76*434283fdSDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then
77*434283fdSDevin Teskeexec 9<<EOF
78*434283fdSDevin Teske	/*
79*434283fdSDevin Teske	 * Print jail management details
80*434283fdSDevin Teske	 */
81*434283fdSDevin Teske	printf("%s(2) jid %d%s%s",
82*434283fdSDevin Teske		probefunc,
83*434283fdSDevin Teske		this->jail_jid,
84*434283fdSDevin Teske		errno > 0 ? " -- " : "",
85*434283fdSDevin Teske		errno > 0 ? strerror[errno] : "");
86*434283fdSDevin TeskeEOF
87*434283fdSDevin TeskeEVENT_DETAILS=$( cat <&9 )
88*434283fdSDevin Teskefi
89*434283fdSDevin Teske
90*434283fdSDevin Teske################################################################################
91*434283fdSDevin Teske# END
92*434283fdSDevin Teske################################################################################
93