annotate sbin/ftjail @ 334:fdbb78c54ffb

Begin the "ftjail freebsd-update" command
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 02 Dec 2022 09:36:57 +0100
parents 8dbd11726ee5
children a423bc0e2a3f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 #!/bin/sh
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 # -*- indent-tabs-mode: nil; -*-
274
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
3 #:
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
4 #: A very minimal BSD Thin Jail management tool.
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
5 #:
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
6 #: :Author: Franz Glasner
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
7 #: :Copyright: (c) 2022 Franz Glasner.
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
8 #: All rights reserved.
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
9 #: :License: BSD 3-Clause "New" or "Revised" License.
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
10 #: See LICENSE for details.
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
11 #: If you cannot find LICENSE see
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
12 #: <https://opensource.org/licenses/BSD-3-Clause>
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
13 #: :ID: @(#)@@PKGORIGIN@@ $HGid$
570363928b13 Convert the "module" doc-string to a `#:'-style comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 270
diff changeset
14 #:
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
15
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
16 set -eu
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
17
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
18 VERSION="@@VERSION@@"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
19
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
20 USAGE='
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
21 USAGE: ftjail [ OPTIONS ] COMMAND [ COMMAND OPTIONS ] [ ARG ... ]
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
22
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
23 OPTIONS:
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
24
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
25 -V Print the program name and version number to stdout and exit
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
26
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
27 -h Print this help message to stdout and exit
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
28
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
29 COMMANDS:
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
30
300
901b0e3c0dab All manual pages for ftjail done
Franz Glasner <fzglas.hg@dom66.de>
parents: 297
diff changeset
31 datasets-tmpl -L|-P PARENT-BASE PARENT-SKELETON NAME
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
32
300
901b0e3c0dab All manual pages for ftjail done
Franz Glasner <fzglas.hg@dom66.de>
parents: 297
diff changeset
33 mount-tmpl -L|-P [-n] [-u] BASE-RO SKELETON-RW MOUNTPOINT
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
34
243
d3fa59e2c5fe Typo in docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 242
diff changeset
35 umount-tmpl BASE-RO SKELETON-RW
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
36
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
37 interlink-tmpl MOUNTPOINT
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
38
307
23bcbbbd99ea FIX: Rename "ftjail-populate.rst" to "ftjail-populate-tmpl"
Franz Glasner <fzglas.hg@dom66.de>
parents: 300
diff changeset
39 populate-tmpl -L|-P DIRECTORY BASETXZ
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
40
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
41 snapshot-tmpl BASE-RO SKELETON-RW SNAPSHOT-NAME
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
42
293
73ac6bec36fe Man page for "ftjail copy-jail"
Franz Glasner <fzglas.hg@dom66.de>
parents: 292
diff changeset
43 copy-skel [-A] [-L] [-M MOUNTPOINT] [-P] [-u] SOURCE-DS SNAPSHOT-NAME TARGET-DS
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
44
308
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
45 build-etcupdate-current-tmpl DIRECTORY TARBALL
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
46
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
47 ENVIRONMENT:
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
48
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
49 All environment variables that affect "zfs" are effective also.
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
50
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
51 DESCRIPTION:
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
52
307
23bcbbbd99ea FIX: Rename "ftjail-populate.rst" to "ftjail-populate-tmpl"
Franz Glasner <fzglas.hg@dom66.de>
parents: 300
diff changeset
53 All commands with the exception of "populate-tmpl" require ZFS as
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
54 filesystem.
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
55 '
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
56
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
57 # Reset to standard umask
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
58 umask 0022
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
59
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
60
278
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
61 #:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
62 #: Ensure that no command line options are given
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
63 #:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
64 #: Args:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
65 #: $@:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
66 #:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
67 #: Exit:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
68 #: 2: If formally `getopts` finds options in "$@"
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
69 #:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
70 #: Return:
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
71 #: - 0
a6c9eb25ae81 Convert a function to have comment-form docs
Franz Glasner <fzglas.hg@dom66.de>
parents: 277
diff changeset
72 #:
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
73 _ensure_no_options() {
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
74 local _opt
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
75
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
76 while getopts ":" _opt ; do
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
77 [ "${_opt}" = '?' ] && { echo "ERROR: no option allowed" 1>&2; exit 2; }
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
78 done
277
0da26750b6fb FIX: Explicitely return 0 in the non-error case becsue getopts sometime determines the result value instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 274
diff changeset
79 return 0
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
80 }
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
81
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
82
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
83 _get_dataset_for_mountpoint() {
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
84 : 'Use `mount -t zfs -p` to determine the ZFS dataset for a given mountpoint.
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
85
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
86 '
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
87 local _mountpoint
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
88
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
89 local _ds _mount _rest
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
90
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
91 _mountpoint="$1"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
92
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
93 mount -t zfs -p \
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
94 | {
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
95 while IFS=' '$'\t' read -r _ds _mount _rest ; do
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
96 if [ "$_mount" = "$_mountpoint" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
97 echo "${_ds}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
98 return 0
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
99 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
100 done
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
101 return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
102 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
103 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
104
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
105
334
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
106 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
107 #: Search for a running jail where it's "path" points to a given location
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
108 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
109 #: Args:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
110 #: $1: the location to search for
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
111 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
112 #: Output (stdout):
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
113 #: The name if the jail with a "path" that is equal to the input param.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
114 #: Nothing if a jail is not found.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
115 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
116 #: Return:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
117 #: - 0: if a running jail is found
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
118 #: - 1: error
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
119 #: - 2: no running jail found
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
120 #: - 3: jail found but currently dying
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
121 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
122 _get_jail_from_path() {
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
123 local _location
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
124
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
125 local _name _path _dying
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
126
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
127 _location="${1-}"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
128 [ -z "${_location}" ] && { echo "ERROR: no mountpoint given" 1>&2; return 1; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
129
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
130
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
131 jls -d name path dying \
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
132 | {
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
133 while IFS=' '$'\t' read -r _name _path _dying ; do
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
134 if [ "${_path}" = "${_location}" ]; then
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
135 if [ "${_dying}" != "false" ]; then
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
136 echo "Jail \`${_name}' is currently dying" 1>&2
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
137 return 3
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
138 fi
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
139 echo "${_name}"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
140 return 0
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
141 fi
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
142 done
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
143 return 2
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
144 }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
145 }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
146
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
147
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
148 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
149 #: Search for mounts and sub-mounts at a given directory.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
150 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
151 #: The output is sorted by the mountpoint.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
152 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
153 #: Args:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
154 #: $1: the directory where to start for mounts and sub-mounts
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
155 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
156 #: Output (stdout):
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
157 #: The sorted list (lines) of mounts in :manpage:`fstab(5)` format.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
158 #: This list may be empty.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
159 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
160 #: Exit:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
161 #: 1: on fatal errors (usage et al.)
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
162 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
163 #: Important:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
164 #: The input directory **must** be an absolute path.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
165 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
166 _get_mounts_at_directory() {
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
167 local _directory
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
168
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
169 local _fstab
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
170
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
171 _directory=${1-}
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
172 case "${_directory}" in
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
173 /*)
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
174 :
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
175 ;;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
176 '')
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
177 echo "ERROR: no directory given" 1>&2;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
178 exit 1;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
179 ;;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
180 *)
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
181 echo "ERROR: directory must be an absolute path" 1>&2;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
182 exit 1;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
183 ;;
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
184 esac
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
185 _fstab="$(mount -p | grep -E '\s'"${_directory}" | sort -k3)"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
186 echo "${_fstab}"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
187 }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
188
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
189
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
190 #
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
191 # PARENT-BASE NAME DRY-RUN
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
192 #
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
193 command_datasets_tmpl_base() {
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
194 local _p_base _name
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
195
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
196 local _opt_dry_run
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
197
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
198 local _ds_base _opt
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
199
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
200 _opt_dry_run=""
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
201 while getopts "nu" _opt ; do
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
202 case ${_opt} in
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
203 n|u)
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
204 _opt_dry_run="yes"
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
205 ;;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
206 \?|:)
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
207 return 2;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
208 ;;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
209 esac
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
210 done
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
211 shift $((OPTIND-1))
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
212 OPTIND=1
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
213
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
214 _p_base="${1-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
215 _name="${2-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
216
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
217 if [ -z "${_p_base}" ]; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
218 echo "ERROR: no parent dataset for base given" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
219 return 2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
220 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
221 if [ -z "${_name}" ]; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
222 echo "ERROR: no name given" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
223 return 2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
224 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
225
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
226 if ! zfs list -H -o mountpoint -t filesystem "${_p_base}" >/dev/null 2>/dev/null; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
227 echo "ERROR: parent dataset \`${_p_base}' does not exist" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
228 return 1
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
229 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
230 _ds_base="${_p_base}/${_name}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
231 if zfs list -H -o mountpoint -t filesystem "${_ds_base}" >/dev/null 2>/dev/null; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
232 echo "ERROR: dataset \`${_ds_base}' does already exist" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
233 return 1
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
234 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
235
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
236
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
237 [ "${_opt_dry_run}" = "yes" ] && return 0
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
238
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
239 echo "Creating RO base datasets in:"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
240 printf "\\t%s\\n" "${_ds_base}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
241
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
242 zfs create -u -o canmount=noauto "${_ds_base}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
243
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
244 }
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
245
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
246
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
247 #
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
248 # SKELETON NAME DRY-RUN
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
249 #
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
250 command_datasets_tmpl_skel() {
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
251 local _p_base _name
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
252
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
253 local _opt_dry_run _opt_symlink
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
254
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
255 local _ds_skel _child _child_zfsopts _opt
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
256
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
257 _opt_dry_run=""
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
258 _opt_symlink=""
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
259
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
260 while getopts "LPnu" _opt ; do
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
261 case ${_opt} in
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
262 L)
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
263 _opt_symlink="yes"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
264 ;;
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
265 P)
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
266 _opt_symlink="no"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
267 ;;
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
268 n|u)
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
269 _opt_dry_run="yes"
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
270 ;;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
271 \?|:)
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
272 return 2;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
273 ;;
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
274 esac
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
275 done
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
276 shift $((OPTIND-1))
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
277 OPTIND=1
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
278
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
279 [ -z "${_opt_symlink}" ] && { echo "ERROR: -L or -P must be given" 1>&2; return 2; }
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
280
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
281 _p_skel="${1-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
282 _name="${2-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
283
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
284 if [ -z "${_p_skel}" ]; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
285 echo "ERROR: no parent dataset for skeleton given" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
286 return 2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
287 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
288 if [ -z "${_name}" ]; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
289 echo "ERROR: no name given" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
290 return 2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
291 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
292
238
9b0d83703a28 FIX: Bogus keyword shortcut error: wrong copy-paste text in script
Franz Glasner <fzglas.hg@dom66.de>
parents: 237
diff changeset
293 if ! zfs list -H -o mountpoint -t filesystem "${_p_skel}" >/dev/null 2>/dev/null; then
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
294 echo "ERROR: parent dataset \`${_p_skel}' does not exist" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
295 return 1
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
296 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
297 _ds_skel="${_p_skel}/${_name}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
298 if zfs list -H -o mountpoint -t filesystem "${_ds_skel}" >/dev/null 2>/dev/null; then
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
299 echo "ERROR: dataset \`${_ds_skel}' does already exist" >&2
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
300 return 1
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
301 fi
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
302
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
303 [ "${_opt_dry_run}" = "yes" ] && return 0
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
304
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
305 echo "Creating RW skeleton datasets in:"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
306 printf "\\t%s\\n" "${_ds_skel}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
307
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
308 if [ "${_opt_symlink}" = "yes" ]; then
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
309 # In this case the skeleton root needs to be mounted into a "skeleton" subdir
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
310 zfs create -u -o canmount=noauto "${_ds_skel}"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
311 else
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
312 # Only children are to be mounted
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
313 zfs create -u -o canmount=off "${_ds_skel}"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
314 fi
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
315 # "usr" is only a container holding "usr/local"
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
316 zfs create -u -o canmount=off "${_ds_skel}/usr"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
317 #
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
318 # XXX FIXME: What about usr/ports/distfiles
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
319 # We typically want to use binary packages.
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
320 # And if we use ports they are not in usr/ports typically.
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
321 #
239
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
322 #zfs create -u -o canmount=off "${_ds_skel}/usr/ports"
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
323 #
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
324 # XXX FIXME: What about home
237
a38906739422 Drop a note about /home in skel-rw
Franz Glasner <hg@dom66.de>
parents: 236
diff changeset
325 #
239
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
326 for _child in etc home root tmp usr/local var ; do
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
327 case "${_child}" in
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
328 "tmp"|"var/tmp")
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
329 _child_zfsopts="-o sync=disabled -o setuid=off"
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
330 ;;
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
331 "home")
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
332 _child_zfsopts="-o setuid=off"
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
333 ;;
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
334 "usr/ports/distfiles")
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
335 _child_zfsopts="-o exec=off -o setuid=off -o compression=off -o primarycache=metadata"
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
336 ;;
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
337 "var/mail")
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
338 _child_zfsopts="-o atime=on -o exec=off -o setuid=off"
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
339 ;;
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
340 *)
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
341 _child_zfsopts=""
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
342 ;;
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
343 esac
23f37702a502 Creating datasets for base and skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 238
diff changeset
344 zfs create -u -o canmount=noauto ${_child_zfsopts} "${_ds_skel}/${_child}"
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
345 done
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
346 }
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
347
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
348
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
349 #
235
85aea8ca1ab8 Some work on datasets-tmpl
Franz Glasner <fzglas.hg@dom66.de>
parents: 234
diff changeset
350 # "datasets-tmpl" -- create the ZFS dataset tree
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
351 #
234
8682cfa74f6a Minimum work on creating datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 233
diff changeset
352 # PARENT-BASE PARENT-SKELETON NAME
8682cfa74f6a Minimum work on creating datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 233
diff changeset
353 #
235
85aea8ca1ab8 Some work on datasets-tmpl
Franz Glasner <fzglas.hg@dom66.de>
parents: 234
diff changeset
354 command_datasets_tmpl() {
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
355 # parent ZFS dataset -- child ZFS dataset name
234
8682cfa74f6a Minimum work on creating datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 233
diff changeset
356 local _p_base _p_skel _name
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
357 local _opt_symlink
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
358
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
359 local _ds_base _ds_skel _opt
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
360
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
361 _opt_symlink=""
234
8682cfa74f6a Minimum work on creating datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 233
diff changeset
362
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
363 while getopts "LP" _opt ; do
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
364 case ${_opt} in
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
365 L)
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
366 _opt_symlink="-L"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
367 ;;
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
368 P)
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
369 _opt_symlink="-P"
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
370 ;;
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
371 \?)
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
372 return 2;
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
373 ;;
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
374 esac
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
375 done
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
376 shift $((OPTIND-1))
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
377 OPTIND=1
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
378
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
379 [ -z "${_opt_symlink}" ] && { echo "ERROR: -L or -P must be given" 1>&2; return 2; }
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
380
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
381 _p_base="${1-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
382 _p_skel="${2-}"
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
383 _name="${3-}"
234
8682cfa74f6a Minimum work on creating datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 233
diff changeset
384
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
385 # Check preconditions
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
386 command_datasets_tmpl_base -n "${_p_base}" "${_name}" || return
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
387 command_datasets_tmpl_skel -n ${_opt_symlink} "${_p_skel}" "${_name}" || return
236
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
388
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
389 # Really do it
661e35a9d6e5 Some work on ftjail: creating the very basic ZFS datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 235
diff changeset
390 command_datasets_tmpl_base "${_p_base}" "${_name}" || return
253
590007b0e902 Implement "-L" and "-P" for "datasets-tmpl" to allow for different ZFS props
Franz Glasner <fzglas.hg@dom66.de>
parents: 252
diff changeset
391 command_datasets_tmpl_skel ${_opt_symlink} "${_p_skel}" "${_name}" || return
235
85aea8ca1ab8 Some work on datasets-tmpl
Franz Glasner <fzglas.hg@dom66.de>
parents: 234
diff changeset
392 return 0
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
393 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
394
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
395
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
396 #
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
397 # "populate-tmpl" -- populate the datasets with content from a FreeBSD base.txz
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
398 #
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
399 # command_populate_tmpl mountpoint basetxz
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
400 #
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
401 command_populate_tmpl() {
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
402 # MOUNTPOINT -- base.txz
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
403 local _mp _basetxz
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
404 local _opt_symlink
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
405
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
406 local _opt _dir
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
407
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
408 _opt_symlink=""
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
409
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
410 while getopts "LP" _opt ; do
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
411 case ${_opt} in
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
412 L)
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
413 _opt_symlink="yes"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
414 ;;
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
415 P)
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
416 _opt_symlink="no"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
417 ;;
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
418 \?)
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
419 return 2;
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
420 ;;
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
421 esac
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
422 done
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
423 shift $((OPTIND-1))
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
424 OPTIND=1
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
425
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
426 [ -z "${_opt_symlink}" ] && { echo "ERROR: -L or -P must be given" 1>&2; return 2; }
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
427
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
428 _mp="${1-}"
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
429 _basetxz="${2-}"
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
430
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
431 if [ -z "${_mp}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
432 echo "ERROR: no mountpoint given" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
433 return 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
434 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
435 if [ -z "${_basetxz}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
436 echo "ERROR: no base.txz given" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
437 return 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
438 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
439 if [ ! -d "${_mp}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
440 echo "ERROR: mountpoint \`${_mp}' does not exist" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
441 return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
442 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
443 if [ ! -r "${_basetxz}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
444 echo "ERROR: file \`${_basetxz}' is not readable" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
445 return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
446 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
447
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
448 if [ "${_opt_symlink}" = "yes" ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
449 echo "Extracting RO base ..."
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
450 tar -C "${_mp}" --exclude=./etc --exclude=./root --exclude=./tmp --exclude=./usr/local --exclude=./var --no-safe-writes -xJp -f "${_basetxz}" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
451 # "home" is not part of base
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
452 for _dir in etc root tmp usr/local var ; do
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
453 echo "Extracting RW skeleton: ${_dir} ..."
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
454 tar -C "${_mp}/skeleton" --include="./${_dir}" --exclude=./root/.cshrc --exclude=./root/.profile -xJp -f "${_basetxz}" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
455 done
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
456 # In the original archive they are archived as hardlinks: make proper symlinks here
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
457 (cd "${_mp}/skeleton/root" && ln -s ../../.profile .profile) || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
458 (cd "${_mp}/skeleton/root" && ln -s ../../.cshrc .cshrc) || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
459 else
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
460 echo "Extracting base ..."
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
461 tar -C "${_mp}" --exclude=./root/.cshrc --exclude=./root/.profile --no-safe-writes -xJp -f "${_basetxz}" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
462 # In the original archive they are archived as hardlinks: make proper symlinks here
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
463 (cd "${_mp}/root" && ln -s ../.profile .profile) || return
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
464 (cd "${_mp}/root" && ln -s ../.cshrc .cshrc) || return
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
465 fi
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
466
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
467 find "${_mp}/boot" -type f -delete || true
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
468 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
469
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
470
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
471 #
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
472 # _do_mount dataset mountpoint dry-run mount-natural childs-only
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
473 #
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
474 _do_mount() {
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
475 local _dsname _mountpoint _dry_run _mount_natural _childs_only
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
476
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
477 local _name _mp _canmount _mounted
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
478 local _rootds_mountpoint _relative_mp _real_mp
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
479
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
480 _dsname="${1}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
481 _mountpoint="${2}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
482 _dry_run="${3}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
483 _mount_natural="${4}"
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
484 _childs_only="${5}"
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
485
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
486 if [ -z "${_dsname}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
487 echo "ERROR: no dataset given" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
488 return 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
489 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
490
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
491 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}")" || \
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
492 { echo "ERROR: root dataset \`${_dsname}' does not exist" >&2; return 1; }
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
493
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
494 if [ -z "${_mountpoint}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
495 if [ "${_mount_natural}" = "yes" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
496 _mountpoint="${_rootds_mountpoint}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
497 else
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
498 echo "ERROR: no mountpoint given" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
499 return 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
500 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
501 else
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
502 if [ "${_mount_natural}" = "yes" ]; then
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
503 echo "ERROR: Cannot have a custom mountpoint when mount-natural is activated" >&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
504 return 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
505 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
506 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
507
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
508 # Eventually remove a trailing slash
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
509 _mountpoint="${_mountpoint%/}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
510 if [ -z "${_mountpoint}" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
511 echo "ERROR: would mount over the root filesystem" >&2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
512 return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
513 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
514
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
515 zfs list -H -o name,mountpoint,canmount,mounted -s mountpoint -t filesystem -r "${_dsname}" \
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
516 | {
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
517 while IFS=$'\t' read -r _name _mp _canmount _mounted ; do
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
518 # Skip filesystems that are already mounted
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
519 [ "${_mounted}" = "yes" ] && continue
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
520 # Skip filesystems that must not be mounted
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
521 [ "${_canmount}" = "off" ] && continue
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
522 case "${_mp}" in
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
523 "none"|"legacy")
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
524 # Do nothing for filesystem with unset or legacy mountpoints
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
525 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
526 "${_rootds_mountpoint}"|"${_rootds_mountpoint}/"*)
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
527 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
528 # Handle only mountpoints that have a mountpoint below
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
529 # the parent datasets mountpoint
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
530 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
531
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
532 # Determine the mountpoint relative to the parent mountpoint
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
533 _relative_mp="${_mp#${_rootds_mountpoint}}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
534 # Eventually remove a trailing slash
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
535 _relative_mp="${_relative_mp%/}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
536 # The real effective full mountpoint
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
537 _real_mp="${_mountpoint}${_relative_mp}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
538
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
539 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
540 # Consistency and sanity check: computed real mountpoint must
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
541 # be equal to the configured mountpoint when no custom mountpoint
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
542 # is given.
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
543 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
544 if [ "${_mount_natural}" = "yes" ]; then
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
545 if [ "${_real_mp}" != "${_mp}" ]; then
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
546 echo "ERROR: mountpoint mismatch" 1>&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
547 return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
548 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
549 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
550
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
551 if [ \( "${_childs_only}" = "yes" \) -a \( "${_name}" = "${_dsname}" \) ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
552 echo "Skipping ${_name} because mounting childs only" 1>&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
553 else
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
554 if [ "${_dry_run}" = "yes" ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
555 echo "Would mount ${_name} on ${_real_mp}"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
556 else
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
557 mkdir -p "${_real_mp}" 1> /dev/null 2> /dev/null || \
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
558 { echo "ERROR: cannot create mountpoint ${_real_mp}" 1>&2; return 1; }
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
559 echo "Mounting ${_name} on ${_real_mp}"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
560 mount -t zfs "${_name}" "${_real_mp}" || return 1
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
561 fi
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
562 fi
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
563 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
564 *)
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
565 echo "Skipping ${_name} because its configured ZFS mountpoint is not relative to given root dataset" 1>&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
566 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
567 esac
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
568 done
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
569
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
570 return 0
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
571 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
572 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
573
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
574
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
575 #
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
576 # "mount-tmpl" -- recursively mount a base and skeleton datasets including subordinate datasets
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
577 #
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
578 # command_mount_tmpl base-ro skeleton-rw mountpoint
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
579 #
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
580 command_mount_tmpl() {
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
581 local _ds_base _ds_skel _mountpoint
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
582 local _opt_dry_run _opt_symlink
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
583
246
bdee72ff7dbd Some subcommands now support options properly
Franz Glasner <fzglas.hg@dom66.de>
parents: 245
diff changeset
584 local _opt
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
585
244
6e632f459818 Rename "_dry_run" to the more proper "_opt_dry_run"
Franz Glasner <fzglas.hg@dom66.de>
parents: 243
diff changeset
586 _opt_dry_run=""
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
587 _opt_symlink=""
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
588
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
589 while getopts "LPnu" _opt ; do
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
590 case ${_opt} in
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
591 L)
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
592 _opt_symlink="yes"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
593 ;;
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
594 P)
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
595 _opt_symlink="no"
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
596 ;;
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
597 n|u)
244
6e632f459818 Rename "_dry_run" to the more proper "_opt_dry_run"
Franz Glasner <fzglas.hg@dom66.de>
parents: 243
diff changeset
598 _opt_dry_run="yes"
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
599 ;;
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
600 \?|:)
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
601 return 2;
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
602 ;;
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
603 esac
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
604 done
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
605 shift $((OPTIND-1))
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
606 OPTIND=1
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
607
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
608 [ -z "${_opt_symlink}" ] && { echo "ERROR: -L or -P must be given" 1>&2; return 2; }
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
609
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
610 _ds_base="${1-}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
611 _ds_skel="${2-}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
612 _mountpoint="${3-}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
613
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
614 _do_mount "${_ds_base}" "${_mountpoint}" "${_opt_dry_run}" "" "" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
615 if [ "${_opt_symlink}" = "yes" ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
616 if [ "${_opt_dry_run}" != "yes" ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
617 if [ ! -d "${_mountpoint}/skeleton" ]; then
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
618 mkdir "${_mountpoint}/skeleton" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
619 fi
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
620 fi
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
621 _do_mount "${_ds_skel}" "${_mountpoint}/skeleton" "${_opt_dry_run}" "" "" || return
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
622 else
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
623 _do_mount "${_ds_skel}" "${_mountpoint}" "${_opt_dry_run}" "" "yes" || return
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
624 fi
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
625
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
626 return 0
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
627 }
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
628
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
629
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
630 #
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
631 # _do_umount dataset
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
632 #
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
633 _do_umount() {
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
634 local _dsname
249
a91e1c5173cc Also support direct mounting of the RW skeleton subdirs at a mountpoint
Franz Glasner <fzglas.hg@dom66.de>
parents: 248
diff changeset
635
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
636 local _name _mp _rest
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
637 local _rootds_mountpoint
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
638
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
639 _dsname="${1}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
640 [ -z "${_dsname}" ] && { echo "ERROR: no dataset given" >&2; return 2; }
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
641
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
642 # Just determine whether the given dataset name exists
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
643 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}")" || \
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
644 { echo "ERROR: dataset not found" >&2; return 1; }
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
645
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
646 mount -t zfs -p \
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
647 | grep -E "^${_dsname}(/|\s)" \
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
648 | sort -n -r \
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
649 | {
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
650 while IFS=' '$'\t' read -r _name _mp _rest ; do
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
651 echo "Umounting ${_name} on ${_mp}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
652 umount "${_mp}" || return 1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
653 done
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
654 return 0
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
655 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
656 }
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
657
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
658
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
659 #
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
660 # "umount-tmpl" -- umount skeleton and base datasets
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
661 #
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
662 # command_umount_tmpl ds-base ds-skeleton
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
663 #
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
664 command_umount_tmpl() {
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
665 local _ds_base _ds_skel
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
666
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
667 _ensure_no_options "$@"
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
668
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
669 _ds_base="${1-}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
670 _ds_skel="${2-}"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
671
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
672 [ -z "${_ds_base}" ] && { echo "ERROR: no RO base dataset given" >&2; return 2; }
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
673 [ -z "${_ds_skel}" ] && { echo "ERROR: no RW skeleton dataset given" >&2; return 2; }
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
674
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
675 _do_umount "${_ds_skel}" || return
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
676 _do_umount "${_ds_base}" || return
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
677
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
678 return 0
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
679 }
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
680
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
681
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
682 #
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
683 # "interlink-tmpl" -- create links from base to skeleton
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
684 #
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
685 # command_interlink_tmpl mountpint
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
686 #
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
687 command_interlink_tmpl() {
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
688 local _mountpoint
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
689
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
690 local _dir _dirpart _basepart
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
691
245
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
692 _ensure_no_options "$@"
61861d36758c Ensure that no options are really given when no options are allowed
Franz Glasner <fzglas.hg@dom66.de>
parents: 244
diff changeset
693
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
694 _mountpoint="${1-}"
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
695
248
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
696 [ -z "${_mountpoint}" ] && { echo "ERROR: no mountpoint given" 1>&2; return 2; }
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
697 [ -d "${_mountpoint}" ] || { echo "ERROR: mountpoint \`${_mountpoint}' does not exist" 1>&2; return 1; }
0b5dbf394aa2 FIX: echo 2>&1 is not intended: use 1>&2 instead
Franz Glasner <fzglas.hg@dom66.de>
parents: 247
diff changeset
698 [ -d "${_mountpoint}/skeleton" ] || { echo "WARNING: skeleton is not mounted at \`${_mountpoint}/skeleton'" 1>&2; }
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
699
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
700 for _dir in etc home root tmp usr/local var ; do
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
701 case "${_dir}" in
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
702 "usr/local")
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
703 _dirpart="$(dirname "${_dir}")"
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
704 _basepart="$(basename "${_dir}")"
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
705 [ -d "${_mountpoint}/${_dirpart}" ] || mkdir "${_mountpoint}/${_dirpart}" || return
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
706 ( cd "${_mountpoint}/${_dirpart}" && ln -s "../skeleton/${_dir}" "${_basepart}" ) || return
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
707 ;;
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
708 *)
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
709 ( cd "${_mountpoint}" && ln -s "skeleton/${_dir}" "${_dir}" ) || return
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
710 ;;
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
711 esac
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
712 done
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
713 return 0
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
714 }
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
715
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
716 #:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
717 #: Create a snapshot for a dataset and all of its children.
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
718 #:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
719 #: Args:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
720 #: $1: the datasets
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
721 #: $2: the name of the snapshot
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
722 #:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
723 _do_snapshot() {
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
724 local _ds _snap_name
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
725
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
726 _ds="${1}"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
727 _snap_name="${2}"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
728
254
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
729 [ -z "${_ds}" ] && { echo "ERROR: no dataset given" 1>&2; return 2; }
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
730 [ -z "${_snap_name}" ] && { echo "ERROR: no snapshot name given" 1>&2; return 2; }
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
731
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
732 if ! zfs list -H -o name -t filesystem "${_ds}" 1> /dev/null 2> /dev/null ; then
254
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
733 echo "ERROR: parent dataset \`${_ds}' does not exist or is not available" 1>&2
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
734 return 1
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
735 fi
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
736
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
737 zfs snapshot -r "${_ds}@${_snap_name}" || return
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
738 }
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
739
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
740
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
741 #:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
742 #: Implement the "snapshot-tmpl" command
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
743 #:
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
744 command_snapshot_tmpl() {
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
745 local _ds_base _ds_skel _snap_name
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
746
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
747 _ensure_no_options "$@"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
748
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
749 _ds_base="${1-}"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
750 _ds_skel="${2-}"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
751 _snap_name="${3-}"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
752
254
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
753 # Here extra checks because of better error messages possible
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
754 [ -z "${_ds_base}" ] && { echo "ERROR: no RO base dataset name given" 1>&2; return 2; }
39268cba8c46 FIX: Error handling
Franz Glasner <fzglas.hg@dom66.de>
parents: 253
diff changeset
755 [ -z "${_ds_skel}" ] && { echo "ERROR: no RW skeleton dataset name given" 1>&2; return 2; }
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
756
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
757 _do_snapshot "${_ds_base}" "${_snap_name}" || return
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
758 _do_snapshot "${_ds_skel}" "${_snap_name}" || return
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
759 return 0
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
760 }
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
761
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
762
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
763 #:
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
764 #: Implementation of "copy-skel"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
765 #:
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
766 command_copy_skel() {
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
767 local _ds_source _snapshot_name _ds_target
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
768 local _opt_symlink _opt_nomount _opt_canmount _opt_mountpoint
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
769
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
770 local _opt _name _relative_name _root_canmount
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
771
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
772 _opt_symlink=""
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
773 _opt_nomount=""
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
774 _opt_canmount="-o canmount=on"
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
775 _opt_mountpoint=""
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
776
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
777 while getopts "ALM:Pu" _opt ; do
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
778 case ${_opt} in
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
779 A)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
780 _opt_canmount="-o canmount=noauto"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
781 ;;
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
782 L)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
783 _opt_symlink="yes"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
784 ;;
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
785 M)
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
786 _opt_mountpoint="${OPTARG}"
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
787 ;;
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
788 P)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
789 _opt_symlink="no"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
790 ;;
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
791 u)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
792 _opt_nomount="-u"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
793 ;;
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
794 \?)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
795 return 2;
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
796 ;;
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
797 esac
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
798 done
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
799 shift $((OPTIND-1))
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
800 OPTIND=1
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
801
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
802 [ -z "${_opt_symlink}" ] && { echo "ERROR: -L or -P must be given" 1>&2; return 2; }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
803
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
804 _ds_source="${1-}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
805 _snapshot_name="${2-}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
806 _ds_target="${3-}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
807
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
808 [ -z "${_ds_source}" ] && { echo "ERROR: no source given" 1>&2; return 2; }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
809 [ -z "${_snapshot_name}" ] && { echo "ERROR: no snapshot name given" 1>&2; return 2; }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
810 [ -z "${_ds_target}" ] && { echo "ERROR: no target given" 1>&2; return 2; }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
811
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
812 zfs list -r -t all -o name "${_ds_source}" \
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
813 | {
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
814 while IFS=$'\t' read -r _name ; do
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
815 if [ "${_name}" = "${_name%@*}@${_snapshot_name}" ]; then
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
816 echo "FOUND: $_name"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
817 # Determine the relative name of the dataset
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
818 _relative_name="${_name#${_ds_source}}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
819 _relative_name="${_relative_name%@*}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
820 echo " -> $_relative_name"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
821 if [ -z "${_relative_name}" ]; then
292
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
822 #
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
823 # Root
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
824 #
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
825 if [ "${_opt_symlink}" = "yes" ]; then
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
826 _root_canmount="${_opt_canmount}"
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
827 else
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
828 _root_canmount="-o canmount=off"
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
829 fi
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
830 if [ -n "${_opt_mountpoint}" ]; then
330
8dbd11726ee5 Explicitely set "readonly=off" for the target datasets of a RW skeleton.
Franz Glasner <fzglas.hg@dom66.de>
parents: 308
diff changeset
831 zfs send -Lec -p -v "${_name}" | zfs receive ${_opt_nomount} -v ${_root_canmount} -o "mountpoint=${_opt_mountpoint}" -o readonly=off "${_ds_target}${_relative_name}"
270
dde5967d1e43 Implement the "-M" (custom mountpoint) option for "copy-skel"
Franz Glasner <fzglas.hg@dom66.de>
parents: 256
diff changeset
832 else
330
8dbd11726ee5 Explicitely set "readonly=off" for the target datasets of a RW skeleton.
Franz Glasner <fzglas.hg@dom66.de>
parents: 308
diff changeset
833 zfs send -Lec -p -v "${_name}" | zfs receive ${_opt_nomount} -o readonly=off -v ${_root_canmount} -x mountpoint "${_ds_target}${_relative_name}"
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
834 fi
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
835 else
292
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
836 #
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
837 # Children
d40e6e40c315 Comments
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
838 #
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
839 if [ "${_relative_name}" = "/usr" ]; then
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
840 zfs send -Lec -p -v "${_name}" | zfs receive ${_opt_nomount} -v -o canmount=off -x mountpoint "${_ds_target}${_relative_name}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
841 else
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
842 zfs send -Lec -p -v "${_name}" | zfs receive ${_opt_nomount} -v ${_opt_canmount} -x mountpoint "${_ds_target}${_relative_name}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
843 fi
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
844 fi
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
845 fi
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
846 done
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
847 }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
848 # Need only the filesystem data (no associated snapshots)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
849 echo "Destroying unneeded snapshots ..."
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
850 zfs destroy -rv "${_ds_target}@${_snapshot_name}"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
851 }
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
852
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
853
308
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
854 #:
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
855 #: Implement the "build-etcupdate-current-tmpl" command
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
856 #:
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
857 command_build_etcupdate_current_tmpl() {
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
858 local _directory _tarball
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
859
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
860 _directory="${1-}"
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
861 _tarball="${2-}"
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
862
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
863 [ -z "${_directory}" ] && { echo "ERROR: no directory given" 1>&2; return 2; }
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
864 [ -z "${_tarball}" ] && { echo "ERROR: no directory given" 1>&2; return 2; }
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
865 [ -e "${_tarball}" ] && { echo "ERROR: \`${_tarball}' exists already" 1>&2; return 1; }
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
866
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
867 if ! tar -cjf "${_tarball}" -C "${_directory}/var/db/etcupdate/current" . ; then
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
868 rm -f "${_tarball}" || true
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
869 return 1
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
870 fi
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
871 }
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
872
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
873
334
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
874 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
875 #: Implement the "freebsd-update" command for a thin jail
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
876 #:
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
877 command_freebsd_update() {
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
878 local _directory
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
879
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
880 local _res _jailname _dir_mounts _dir_fn_fstab _dir_basename
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
881 local _root_dataset _root_mountpoint _root_type _root_options
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
882 local _dummy
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
883 local _root_readonly
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
884
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
885 _directory="${1-}"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
886
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
887 [ -z "${_directory}" ] && { echo "ERROR: no directory given" 1>&2; return 2; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
888 [ -d "${_directory}" ] || { echo "ERROR: directory \`${_directory}' does not exist" 1>&2; exit 1; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
889
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
890 _dir_basename="$(basename ${_directory})"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
891
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
892 set +e
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
893 _jailname=$(_get_jail_from_path "${_directory}")´
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
894 _res=$?
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
895 set -e
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
896 if [ ${_res} -ne 2 ] ; then
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
897 if [ ${_res} -ne 0 ] ; then
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
898 exit ${_res}
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
899 else
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
900 echo "ERROR: Please stop the \`${_jailname}' jail" >&2
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
901 exit 1
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
902 fi
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
903 fi
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
904 _dir_mounts="$(_get_mounts_at_directory "${_directory}")"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
905
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
906 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
907 # Check preconditions thoroughly!
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
908 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
909 # Check that the first item/line is a read-only ZFS mount directly
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
910 # at the given directory.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
911 # Also check that it is a clone proper.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
912 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
913 IFS=' '$'\t' read -r _root_dataset _root_mountpoint _root_type _root_options _dummy <<EOF4tHGCSS
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
914 ${_dir_mounts}
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
915 EOF4tHGCSS
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
916 [ "${_root_mountpoint}" != "${_directory}" ] && { echo "ERROR: found root mountpoint does not match given directory" 1>&2; exit 1; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
917 [ "${_root_type}" != "zfs" ] && { echo "ERROR: root mountpoint is not from a ZFS dataset" 1>&2; exit 1; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
918 _root_readonly="$(zfs list -H -o readonly "${_root_dataset}")"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
919 [ "${_root_readonly}" != "on" ] && { echo "ERROR: the root dataset is not mounted read-only" 1>&2; exit 1; }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
920 # XXX TBD: Check that it is a proper clone
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
921
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
922 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
923 # XXX FIXME: should we check that _root_options equals "ro" or
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
924 # start with "ro,"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
925 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
926 _dir_fn_fstab="$(env TMPDIR=/var/tmp mktemp -t ftjail-fstab.${_dir_basename})"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
927 echo -n "${_dir_mounts}" >>"${_dir_fn_fstab}"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
928
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
929 # Unmount in reverse order: unmount can do it for us
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
930 umount -a -F "${_dir_fn_fstab}" -v || exit 1
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
931
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
932 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
933 # XXX TBD: Hooks to create some new top-level dirs (/srv /proc et
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
934 # al.) if needed: clone RW, mount, make the dirs,
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
935 # umount, make the clone RO and continue "normally" by
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
936 # completely mounting the stored fstab.
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
937 #
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
938 }
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
939
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
940
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
941 #
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
942 # Global option handling
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
943 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
944 while getopts "Vh" _opt ; do
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
945 case ${_opt} in
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
946 V)
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
947 printf 'ftjail v%s (rv:%s)\n' "${VERSION}" '@@HGREVISION@@'
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
948 exit 0
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
949 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
950 h)
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
951 echo "${USAGE}"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
952 exit 0
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
953 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
954 \?)
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
955 exit 2;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
956 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
957 *)
250
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
958 echo "ERROR: option handling failed" 1>&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
959 exit 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
960 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
961 esac
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
962 done
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
963
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
964 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
965 # Reset the Shell's option handling system to prepare for handling
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
966 # command-local options.
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
967 #
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
968 shift $((OPTIND-1))
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
969 OPTIND=1
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
970
250
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
971 test $# -gt 0 || { echo "ERROR: no command given" 1>&2; exit 2; }
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
972
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
973 command="$1"
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
974 shift
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
975
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
976 case "${command}" in
235
85aea8ca1ab8 Some work on datasets-tmpl
Franz Glasner <fzglas.hg@dom66.de>
parents: 234
diff changeset
977 datasets-tmpl)
85aea8ca1ab8 Some work on datasets-tmpl
Franz Glasner <fzglas.hg@dom66.de>
parents: 234
diff changeset
978 command_datasets_tmpl "$@"
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
979 ;;
241
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
980 mount-tmpl)
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
981 command_mount_tmpl "$@"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
982 ;;
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
983 umount-tmpl|unmount-tmpl)
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
984 command_umount_tmpl "$@"
acf16a85900f Mount and unmount template datasets
Franz Glasner <fzglas.hg@dom66.de>
parents: 240
diff changeset
985 ;;
242
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
986 interlink-tmpl)
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
987 command_interlink_tmpl "$@"
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
988 ;;
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
989 populate-tmpl)
59e933b81dcf First attemt to populate base and skeleton using the "skeleton" subdir and symliks from base to RW skeleton subdirs
Franz Glasner <fzglas.hg@dom66.de>
parents: 241
diff changeset
990 command_populate_tmpl "$@"
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
991 ;;
251
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
992 snapshot-tmpl)
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
993 command_snapshot_tmpl "$@"
7a6c03445ba1 Implement a "snapshot-tmpl" command: create ZFS snapshots for the RO base and the RW skeleton
Franz Glasner <fzglas.hg@dom66.de>
parents: 250
diff changeset
994 ;;
256
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
995 copy-skel)
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
996 command_copy_skel "$@"
68f091c9524a Command "copy-skel" implemented
Franz Glasner <fzglas.hg@dom66.de>
parents: 254
diff changeset
997 ;;
308
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
998 build-etcupdate-current-tmpl)
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
999 command_build_etcupdate_current_tmpl "$@"
2102b46566f0 Implement "ftjail build-etcupdate-curent-tmpl".
Franz Glasner <fzglas.hg@dom66.de>
parents: 307
diff changeset
1000 ;;
250
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
1001 configure)
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
1002 echo "ERROR: use \`fjail configure' instead" 1>&2;
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
1003 exit 2
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
1004 ;;
334
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
1005 freebsd-update)
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
1006 command_freebsd_update "$@"
fdbb78c54ffb Begin the "ftjail freebsd-update" command
Franz Glasner <fzglas.hg@dom66.de>
parents: 330
diff changeset
1007 ;;
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1008 *)
250
c4d835ccb4ae Implement configure for symlinked skeletons.
Franz Glasner <fzglas.hg@dom66.de>
parents: 249
diff changeset
1009 echo "ERROR: unknown command \`${command}'" 1>&2
233
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1010 exit 2
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1011 ;;
f745d3a216a6 Erste Basis für "ftjail": Management von Thin Jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1012 esac