annotate bin/fjail @ 77:5aab3a28895f

Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
author Franz Glasner <hg@dom66.de>
date Thu, 15 Aug 2019 17:52:06 +0200
parents fea2ef3ff89a
children f5cf08e8d246
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 #!/bin/sh
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 # -*- indent-tabs-mode: nil; -*-
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
3 # @(#)$HGid$
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
4
77
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
5 set -eu
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
6
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
7 VERSION="@@VERSION@@"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
8
75
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
9 USAGE="
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
10 USAGE: fjail [ OPTIONS ] COMMAND [ COMMAND OPTIONS ] [ ARG ... ]
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
11
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
12 OPTIONS:
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
13
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
14 -h Print this help message to stdout and exit
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
15
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
16 COMMANDS:
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
17
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
18 datasets [-u] PARENT CHILD
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
19
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
20 Create ZFS datasets to be used within a jail
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
21
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
22 PARENT must exist already and CHILD must not exist.
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
23
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
24 -u Do not automatically mount newly created datasets
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
25
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
26 privs MOUNTPOINT
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
27
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
28 Adjust some Unix privileges to mounted jail datasets
76
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
29
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
30 populate MOUNTPOINT BASETXZ
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
31
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
32 Populate the jail directory in MOUNTPOINT with the base system in BASETXZ
77
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
33
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
34 copy SOURCE-DATASET DEST-DATASET
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
35
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
36 Copy a tree of ZFS datasets with \"zfs send -R\" and \"zfs receive\".
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
37 Note that the destination dataset must not exist already.
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
38
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
39 -u Do not automatically mount received datasets
75
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
40 "
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
41
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
42
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
43 # Reset to standard umask
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
44 umask 0022
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
45
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
46
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
47 #
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
48 # "datasets" -- create the ZFS dataset tree
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
49 #
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
50 # command_datasets [ -u ] parent-dataset child-dataset
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
51 #
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
52 # -u do not automatically mount newly created datasets
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
53 #
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
54 command_datasets() {
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
55 # parent ZFS dataset -- child ZFS dataset name
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
56 local _pds _cds
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
57 # and its mount point
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
58 local _pmp _get _dummy
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
59 # full name of the dataset
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
60 local _ds
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
61 # dynamic ZFS options
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
62 local _zfsopts
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
63
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
64 _zfsopts=""
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
65 while getopts "u" _opt ; do
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
66 case ${_opt} in
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
67 u)
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
68 # do not mount newly created datasets
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
69 _zfsopts="${_zfsopts} -u"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
70 ;;
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
71 \?|:)
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
72 return 2;
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
73 ;;
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
74 esac
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
75 done
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
76 shift $((OPTIND-1))
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
77 OPTIND=1
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
78
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
79 _pds="$1"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
80 if [ -z "${_pds}" ]; then
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
81 echo "ERROR: no parent dataset given" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
82 return 2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
83 fi
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
84 _get=$(zfs get -H mountpoint "${_pds}" 2>/dev/null) || { echo "ERROR: dataset \`${_pds}' does not exist" >&2; return 1; }
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
85 IFS=$'\t' read _dummy _dummy _pmp _dummy <<EOF
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
86 ${_get}
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
87 EOF
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
88 case "${_pmp}" in
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
89 none)
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
90 echo "ERROR: dataset \`${_pds}' has no mountpoint" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
91 return 1
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
92 ;;
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
93 legacy)
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
94 echo "ERROR: dataset \`${_pds}' has a \`${_mp}' mountpoint" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
95 return 1
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
96 ;;
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
97 *)
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
98 # VOID
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
99 ;;
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
100 esac
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
101 _cds="$2"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
102 if [ -z "${_cds}" ]; then
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
103 echo "ERROR: no child dataset given" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
104 return 2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
105 fi
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
106 _ds="${_pds}/${_cds}"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
107 echo "Resulting new root dataset is \`${_ds}' at mountpoint \`${_pmp}/${_cds}'"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
108 if zfs get -H mountpoint "${_ds}" >/dev/null 2>/dev/null; then
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
109 echo "ERROR: dataset \`${_ds}' does already exist" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
110 return 1
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
111 fi
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
112 zfs create ${_zfsopts} -o atime=off "${_ds}"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
113 zfs create ${_zfsopts} -o sync=disabled -o setuid=off "${_ds}/tmp"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
114 zfs create ${_zfsopts} "${_ds}/usr"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
115 zfs create ${_zfsopts} "${_ds}/var"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
116 zfs create ${_zfsopts} -o exec=off -o setuid=off "${_ds}/var/audit"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
117 zfs create ${_zfsopts} -o exec=off -o setuid=off "${_ds}/var/cache"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
118 zfs create ${_zfsopts} -o exec=off -o setuid=off -o compression=off "${_ds}/var/cache/pkg"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
119 zfs create ${_zfsopts} -o exec=off -o setuid=off -o compression=off "${_ds}/var/crash"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
120 zfs create ${_zfsopts} -o exec=off -o setuid=off "${_ds}/var/db"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
121 zfs create ${_zfsopts} -o exec=on -o setuid=off "${_ds}/var/db/pkg"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
122 zfs create ${_zfsopts} -o readonly=on -o exec=off -o setuid=off "${_ds}/var/empty"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
123 zfs create ${_zfsopts} -o exec=off -o setuid=off -o primarycache=metadata "${_ds}/var/log"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
124 zfs create ${_zfsopts} -o exec=off -o setuid=off -o atime=on "${_ds}/var/mail"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
125 zfs create ${_zfsopts} -o sync=disabled -o exec=off -o setuid=off -o compression=off -o primarycache=all "${_ds}/var/run"
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
126 zfs create ${_zfsopts} -o sync=disabled -o setuid=off "${_ds}/var/tmp"
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
127 }
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
128
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
129
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
130 #
76
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
131 # "populate" -- populate the datasets with content from a FreeBSD base.txz
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
132 #
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
133 # command_populate mountpoint basetxz
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
134 #
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
135 command_populate() {
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
136 # MOUNTPOINT -- base.txz
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
137 local _mp _basetxz
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
138
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
139 _mp="$1"
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
140 _basetxz="$2"
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
141
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
142 if [ -z "${_mp}" ]; then
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
143 echo "ERROR: no mountpoint given" >&2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
144 return 2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
145 fi
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
146 if [ -z "${_basetxz}" ]; then
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
147 echo "ERROR: no base.txz given" >&2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
148 return 2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
149 fi
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
150 if [ ! -d "${_mp}" ]; then
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
151 echo "ERROR: mountpoint \`${_mp}' does not exist" >&2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
152 return 1
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
153 fi
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
154 if [ ! -r "${_basetxz}" ]; then
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
155 echo "ERROR: file \`${_basetxz}' is not readable" >&2
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
156 return 1
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
157 fi
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
158
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
159 tar -C "${_mp}" --exclude=./var/empty -xJp -f "${_basetxz}" || { echo "ERROR: tar encountered errors" >&2; return 1; }
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
160 }
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
161
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
162
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
163 #
77
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
164 # "copy" -- ZFS copy of datasets
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
165 #
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
166 # command_copy source-dataset destination-dataset
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
167 #
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
168 command_copy() {
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
169 # source dataset -- destination dataset
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
170 local _source _dest
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
171 # dynamic ZFS options
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
172 local _zfsopts
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
173
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
174 _zfsopts=""
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
175 while getopts "u" _opt ; do
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
176 case ${_opt} in
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
177 u)
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
178 # do not mount newly created datasets
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
179 _zfsopts="${_zfsopts} -u"
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
180 ;;
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
181 \?|:)
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
182 return 2;
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
183 ;;
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
184 esac
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
185 done
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
186 shift $((OPTIND-1))
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
187 OPTIND=1
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
188
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
189 _source="$1"
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
190 if [ -z "${_source}" ]; then
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
191 echo "ERROR: no source dataset given" >&2
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
192 return 2
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
193 fi
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
194 _dest="$2"
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
195 if [ -z "${_dest}" ]; then
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
196 echo "ERROR: no source dataset given" >&2
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
197 return 2
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
198 fi
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
199 zfs send -R -n -v ${_source} || { echo "ERROR: ZFS operation failed in no-op mode" >&2; return 1; }
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
200 zfs send -R "${_source}" | zfs receive ${_zfsopts} "${_dest}" || { echo "ERROR: ZFS operation failed" >&2; return 1; }
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
201 }
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
202
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
203
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
204 #
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
205 # "privs" -- adjust privileges
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
206 #
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
207 # To be used when all ZFS datasets are mounted.
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
208 #
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
209 command_privs() {
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
210 # mountpoint
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
211 local _mp _d
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
212
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
213 _mp="$1"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
214 if [ -z "${_mp}" ]; then
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
215 echo "ERROR: no mountpoint given" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
216 return 2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
217 fi
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
218 if [ ! -d "${_mp}" ]; then
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
219 echo "ERROR: directory \`${_mp}' does not exist" >&2
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
220 return 1
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
221 fi
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
222 for _d in tmp var/tmp ; do
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
223 chmod 01777 "${_mp}/${_d}"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
224 done
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
225 chown root:mail "${_mp}/var/mail"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
226 chmod 0775 "${_mp}/var/mail"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
227 }
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
228
74
247d35f910ca fjail datasets now recognized a "-u" command option to not automatically mount created datasets
Franz Glasner <hg@dom66.de>
parents: 73
diff changeset
229
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
230 #
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
231 # Global option handling
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
232 #
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
233 while getopts "h" _opt ; do
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
234 case ${_opt} in
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
235 h)
75
2e3ac70bdfc8 A fairly usable usage message
Franz Glasner <hg@dom66.de>
parents: 74
diff changeset
236 echo "${USAGE}"
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
237 exit 0
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
238 ;;
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
239 \?|:)
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
240 exit 2;
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
241 ;;
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
242 esac
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
243 done
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
244
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
245 #
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
246 # Reset the Shell's option handling system to prepare for handling
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
247 # command-local options.
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
248 #
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
249 shift $((OPTIND-1))
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
250 OPTIND=1
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
251
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
252 command="$1"
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
253 shift
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
254
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
255 case "${command}" in
73
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
256 datasets)
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
257 command_datasets "$@"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
258 ;;
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
259 privs)
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
260 command_privs "$@"
2e991a00035b Creation of Jail datasets done
Franz Glasner <hg@dom66.de>
parents: 72
diff changeset
261 ;;
76
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
262 populate)
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
263 command_populate "$@"
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
264 ;;
77
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
265 copy)
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
266 command_copy "$@"
5aab3a28895f Implemented a "copy" command to employ zfs send/receive for recursively copying jail datasets
Franz Glasner <hg@dom66.de>
parents: 76
diff changeset
267 ;;
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
268 *)
76
fea2ef3ff89a Populate an existing directory tree with the contents of base.txz
Franz Glasner <hg@dom66.de>
parents: 75
diff changeset
269 echo "ERROR: unknown command \`${command}'" >&2
72
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
270 exit 2
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
271 ;;
929051be7845 Begin a simple (ZFS-related) jail setup tool
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
272 esac