Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
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 # |
