changeset 340:d3b5fe2712ca

Implement "ftjail freebsd-update -o" for a more exhaustige check the clone's origin
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 03 Dec 2022 09:46:18 +0100
parents e1d6807b0c4d
children a204a7415d4a
files docs/man/man8/ftjail-freebsd-update.rst sbin/ftjail
diffstat 2 files changed, 25 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/docs/man/man8/ftjail-freebsd-update.rst	Fri Dec 02 22:01:43 2022 +0100
+++ b/docs/man/man8/ftjail-freebsd-update.rst	Sat Dec 03 09:46:18 2022 +0100
@@ -6,7 +6,7 @@
 Synopsis
 --------
 
-**ftjail freebsd-update** `directory`
+**ftjail freebsd-update** [**-k**] [**-o** `old-origin`] `directory`
 
 
 Description
@@ -26,6 +26,14 @@
 
    .. note:: On unexpected errors temp files are automatically kept.
 
+.. option:: -o old-origin
+
+   In addition to check that `directory` is a ZFS clone also check that
+   its origin is equal to `old-origin`.
+
+   Note that a check that `directory` is a ZFS clone with some origin
+   is done by default.
+
 
 Environment
 -----------
--- a/sbin/ftjail	Fri Dec 02 22:01:43 2022 +0100
+++ b/sbin/ftjail	Sat Dec 03 09:46:18 2022 +0100
@@ -44,7 +44,7 @@
 
   build-etcupdate-current-tmpl DIRECTORY TARBALL
 
-  freebsd-update -[-k] DIRECTORY
+  freebsd-update [-k] [-o OLD-ORIGIN] DIRECTORY
 
 ENVIRONMENT:
 
@@ -878,19 +878,23 @@
 #:
 command_freebsd_update() {
     local _directory
-    local _opt_keep
+    local _opt_keep _opt_old_origin
 
     local _res _jailname _dir_mounts _dir_fn_fstab _dir_basename
     local _root_dataset _root_mountpoint _root_type _root_options
     local _dummy _opt
-    local _root_readonly
+    local _root_readonly _root_origin
 
     _opt_keep="no"
-    while getopts "k" _opt ; do
+    _opt_old_origin=""
+    while getopts "ko:" _opt ; do
         case ${_opt} in
             k)
                 _opt_keep="yes"
                 ;;
+            o)
+                _opt_old_origin="$OPTARG"
+                ;;
             \?|:)
                 return 2;
                 ;;
@@ -934,12 +938,17 @@
     [ "${_root_type}" != "zfs" ] && { echo "ERROR: root mountpoint is not from a ZFS dataset" 1>&2; exit 1; }
     _root_readonly="$(zfs list -H -o readonly "${_root_dataset}")"
     [ "${_root_readonly}" != "on" ] &&  { echo "ERROR: the root dataset is not mounted read-only" 1>&2; exit 1; }
-    # XXX TBD: Check that it is a proper clone
-    
+    _root_origin="$(zfs list -H -o origin "${_root_dataset}")"
+    if [ -n "${_opt_old_origin}" ]; then
+        [ "${_opt_old_origin}" != "${_root_origin}" ] && { echo "ERROR: origin mismatch" 1>&2; exit 1; }
+    else
+        [ "${_root_origin}" = '-' ] &&  { echo "ERROR: the root dataset is not a ZFS clone" 1>&2; exit 1; }
+    fi
     #
     # XXX FIXME: should we check that _root_options equals "ro" or
     #            start with "ro,"
-    #
+    #    _root_origin="$(zfs list -H -o origin "${_root_dataset}")"
+
     _dir_fn_fstab="$(env TMPDIR=/var/tmp mktemp -t ftjail-fstab.${_dir_basename})"
     echo -n "${_dir_mounts}" >>"${_dir_fn_fstab}"