comparison sbin/ftjail @ 236:661e35a9d6e5

Some work on ftjail: creating the very basic ZFS datasets
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 09 Sep 2022 09:42:52 +0200
parents 85aea8ca1ab8
children a38906739422
comparison
equal deleted inserted replaced
235:85aea8ca1ab8 236:661e35a9d6e5
73 } 73 }
74 } 74 }
75 75
76 76
77 # 77 #
78 # PARENT-BASE NAME DRY-RUN
79 #
80 command_datasets_tmpl_base() {
81 local _p_base _name _dry_run
82
83 local _ds_base
84
85 _p_base="${1-}"
86 _name="${2-}"
87 _dry_run="${3-}"
88
89 if [ -z "${_p_base}" ]; then
90 echo "ERROR: no parent dataset for base given" >&2
91 return 2
92 fi
93 if [ -z "${_name}" ]; then
94 echo "ERROR: no name given" >&2
95 return 2
96 fi
97
98 if ! zfs list -H -o mountpoint -t filesystem "${_p_base}" >/dev/null 2>/dev/null; then
99 echo "ERROR: parent dataset \`${_p_base}' does not exist" >&2
100 return 1
101 fi
102 _ds_base="${_p_base}/${_name}"
103 if zfs list -H -o mountpoint -t filesystem "${_ds_base}" >/dev/null 2>/dev/null; then
104 echo "ERROR: dataset \`${_ds_base}' does already exist" >&2
105 return 1
106 fi
107
108
109 [ "${_dry_run}" = "yes" ] && return 0
110
111 echo "Creating RO base datasets in:"
112 printf "\\t%s\\n" "${_ds_base}"
113
114 zfs create -u -o canmount=noauto "${_ds_base}"
115
116 }
117
118
119 #
120 # SKELETON NAME DRY-RUN
121 #
122 command_datasets_tmpl_skel() {
123 local _p_base _name _dry_run
124
125 local _ds_skel _child
126
127 _p_skel="${1-}"
128 _name="${2-}"
129 _dry_run="${3-}"
130
131 if [ -z "${_p_skel}" ]; then
132 echo "ERROR: no parent dataset for skeleton given" >&2
133 return 2
134 fi
135 if [ -z "${_name}" ]; then
136 echo "ERROR: no name given" >&2
137 return 2
138 fi
139
140 if ! zfs list -H -o mountpoint -t filesyhttps://docs.freebsd.org/en/books/handbook/jails/stem "${_p_skel}" >/dev/null 2>/dev/null; then
141 echo "ERROR: parent dataset \`${_p_skel}' does not exist" >&2
142 return 1
143 fi
144 _ds_skel="${_p_skel}/${_name}"
145 if zfs list -H -o mountpoint -t filesystem "${_ds_skel}" >/dev/null 2>/dev/null; then
146 echo "ERROR: dataset \`${_ds_skel}' does already exist" >&2
147 return 1
148 fi
149
150
151 [ "${_dry_run}" = "yes" ] && return 0
152
153 echo "Creating RW skeleton datasets in:"
154 printf "\\t%s\\n" "${_ds_skel}"
155
156 zfs create -u -o canmount=noauto "${_ds_skel}"
157 zfs create -u -o canmount=off "${_ds_skel}/usr"
158 #
159 # XXX FIXME: What about usr/ports/distfiles
160 # We typically want to use binary packages.
161 # And if we use ports they are not in usr/ports typically.
162 #
163 for _child in etc usr/local tmp var root ; do
164 zfs create -u -o canmount=noauto "${_ds_skel}/${_child}"
165 done
166 }
167
168
169 #
78 # "datasets-tmpl" -- create the ZFS dataset tree 170 # "datasets-tmpl" -- create the ZFS dataset tree
79 # 171 #
80 # PARENT-BASE PARENT-SKELETON NAME 172 # PARENT-BASE PARENT-SKELETON NAME
81 # 173 #
82 command_datasets_tmpl() { 174 command_datasets_tmpl() {
85 local _zfsopts 177 local _zfsopts
86 local _ds_base _ds_skel 178 local _ds_base _ds_skel
87 179
88 _zfsopts="-u -o canmount=noauto" 180 _zfsopts="-u -o canmount=noauto"
89 181
90 _p_base="$1" 182 _p_base="${1-}"
91 _p_skel="$2" 183 _p_skel="${2-}"
92 _name="$3" 184 _name="${3-}"
93 185
94 if [ -z "${_p_base}" ]; then 186 # Check preconditions
95 echo "ERROR: no parent dataset for base given" >&2 187 command_datasets_tmpl_base "${_p_base}" "${_name}" "yes" || return
96 return 2 188 command_datasets_tmpl_skel "${_p_skel}" "${_name}" "yes" || return
97 fi 189
98 if [ -z "${_p_skel}" ]; then 190 # Really do it
99 echo "ERROR: no parent dataset for skeleton given" >&2 191 command_datasets_tmpl_base "${_p_base}" "${_name}" || return
100 return 2 192 command_datasets_tmpl_skel "${_p_skel}" "${_name}" || return
101 fi
102 if [ -z "${_name}" ]; then
103 echo "ERROR: no name given" >&2
104 return 2
105 fi
106
107 _ds_base="${_p_base}/${_name}"
108 _ds_skel="${_p_skel}/${_name}"
109 echo "Resulting new root datasets:"
110 printf "\\t%s\\n" "${_ds_base}"
111 printf "\\t%s\\n" "${_ds_skel}"
112 if ! zfs list -H -o mountpoint -t filesystem "${_p_base}" >/dev/null 2>/dev/null; then
113 echo "ERROR: parent dataset \`${_p_base}' does not exist" >&2
114 return 1
115 fi
116 if zfs list -H -o mountpoint -t filesystem "${_ds_base}" >/dev/null 2>/dev/null; then
117 echo "ERROR: dataset \`${_ds_base}' does already exist" >&2
118 return 1
119 fi
120 if ! zfs list -H -o mountpoint -t filesystem "${_p_skel}" >/dev/null 2>/dev/null; then
121 echo "ERROR: parent dataset \`${_p_skel}' does not exist" >&2
122 return 1
123 fi
124 if zfs list -H -o mountpoint -t filesystem "${_ds_skel}" >/dev/null 2>/dev/null; then
125 echo "ERROR: dataset \`${_ds_skel}' does already exist" >&2
126 return 1
127 fi
128 return 0 193 return 0
129 194
130 # 195 #
131 # NOTE: For BEs these directory will be *excluded* from the BE 196 # NOTE: For BEs these directory will be *excluded* from the BE
132 # 197 #