summaryrefslogtreecommitdiff
path: root/ports-mgmt/rc-subr-jail/files/rc.subr.jail
blob: 7d16c34bf9eea146a54d7f4154c5e9bd0ddf620a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# This file can be included in the RC script by adding following line:
# . %%LOCALBASE%%/share/rc-subr-jail/rc.subr.jail

# The behavior of routines defined in this file are affected by the following
# global variables, which can be used in the same manner as Makefile knobs:

# jail_copy_resolv_conf
# set this to "yes" to copy /etc/resolv.conf file into the jail being created

# jail_copy_services
# set this to "yes" to copy /etc/services file into the jail being created

# jail_copy_programs
# set this to a list of binaries, which should be copied into /bin directory
# of the jail. Dynamic libraries required by each program will be placed into
# the /lib directory of the jail

# jail_mount_devfs
# set this to "yes" to mount a devfs filesystem under the /dev directory of the
# jail

# jail_ip_inherit
# set this to "yes" to make "ip4=inherit" and "ip6=inherit" arguments to be
# passed to the jail

# jail_prepare_inside_cmds
# set this to the shell command that will be run before starting the jail
# commands are run after changing directory into the jail's root

# jail_nullfs_mounts
# set this to a list of triplets of "src_dir dst_dir opts" that will be passed
# to mount_nullfs
# make sure to pass either "ro" or "rw" as "opts" value


# prepare_jail jroot
# sets $jail_prepared_args that can be used in jail(4) invocation
# intended to be run during "start" command
prepare_jail()
{
    local jroot jargs
    jroot="$1"
    jargs="-c path=${jroot} "

    destroy_jail "$jroot" 2> /dev/null

    mkdir -p "$jroot"

    if [ "$jail_copy_resolv_conf" = "yes" ]; then
        mkdir -p "$jroot/etc"
        cp /etc/resolv.conf "$jroot/etc"
    fi
    if [ "$jail_copy_services" = "yes" ]; then
        mkdir -p "$jroot/etc"
        cp /etc/services "$jroot/etc"
    fi

    local  _prog _interp
    for _prog in $jail_copy_programs; do
        mkdir -p "$jroot/bin"
        mkdir -p "$jroot/lib"

        cp "$_prog" "$jroot/bin"
        ldd "$_prog" 2> /dev/null | cut -s -d " " -f 3 | grep -E '^(/lib|/usr)' | sort -u | xargs -I % cp % "${jroot}/lib/"

        _interp=$(file "$_prog" | grep -o '/libexec/ld-elf.so[0-9\.]*')
        if [ "$_interp" ]; then
            mkdir -p "$jroot/libexec"
            cp "$_interp" "$jroot/libexec/"
        fi
    done

    if [ "$jail_mount_devfs" = "yes" ]; then
        mkdir -p "$jroot/dev"
        jargs="$jargs mount.devfs "
    fi
    if [ "$jail_ip_inherit" = "yes" ]; then

        if check_kern_features inet; then
            jargs="$jargs ip4=inherit "
        fi
        if check_kern_features inet6; then
            jargs="$jargs ip6=inherit "
        fi
    fi

    if [ "$jail_nullfs_mounts" ]; then
        local _mnt_line
        echo "$jail_nullfs_mounts" | xargs -n 3 | while read -r _mnt_line; do
            local _src _dst _opts
            _src=$(echo "$_mnt_line" | awk '{print $1}')
            _dst=$(echo "$_mnt_line" | awk '{print $2}')
            _opts=$(echo "$_mnt_line" | awk '{print $3}')
            mkdir -p "$_dst"
            mount_nullfs -o "$_opts" "$_src" "$_dst"
        done
    fi

    if [ "$jail_prepare_inside_cmds" ]; then
        /bin/sh -c "cd \"$jroot\" && $jail_prepare_inside_cmds"
    fi

    jail_prepared_args=$jargs
}

# destroy_jail jail_root
# cleans up the jail, unmounts all filesystems and finally removes jail_root
# intended to be run during both "stop" and "start" commands
destroy_jail()
{
    local jroot
    jroot="$1"

    if [ "$jail_mount_devfs" = "yes" ]; then
        rmdir "$jroot/dev"
    fi

    if [ "$jail_nullfs_mounts" ]; then
        local _mnt_line
        echo "$jail_nullfs_mounts" | xargs -n 3 | while read -r _mnt_line; do
            local _dst
            _dst=$(echo "$_mnt_line" | awk '{print $2}')
            umount "$_dst"
            rmdir "$_dst"
        done
    fi

    rm -rf "$jroot"
}