Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
annotate sbin/fzfs @ 529:703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
For this to work textproc/jq must be installed as /usr/local/bin/jq.
"mount -p" is requested as JSON (via libxo) processed accordingly.
This is because normally "mount -p" has a TAB as field separator -- with the exception of
fields becoming to large; the a SPACE is used...
"fzfs mount" works already in this cases.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Wed, 04 Sep 2024 20:52:57 +0200 |
| parents | 93b98803219b |
| children | 07071afd9ae5 |
| rev | line source |
|---|---|
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1 #!/bin/sh |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
2 # -*- indent-tabs-mode: nil; -*- |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
3 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
4 #: A ZFS management helper tool. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
5 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
6 #: :Author: Franz Glasner |
|
438
9c3b1966ba91
Extend copyright to 2024
Franz Glasner <fzglas.hg@dom66.de>
parents:
429
diff
changeset
|
7 #: :Copyright: (c) 2022-2024 Franz Glasner. |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
8 #: All rights reserved. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
9 #: :License: BSD 3-Clause "New" or "Revised" License. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
10 #: See LICENSE for details. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
11 #: If you cannot find LICENSE see |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
12 #: <https://opensource.org/licenses/BSD-3-Clause> |
|
386
84d2735fe7f6
Simplified version tagging a lot: it is also faster now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
13 #: :ID: @(#)@@SIMPLEVERSIONTAG@@ |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
14 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
15 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
16 set -eu |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
17 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
18 VERSION="@@VERSION@@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
19 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
20 USAGE=' |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
21 USAGE: fzfs [ OPTIONS ] COMMAND [ COMMAND OPTIONS ] [ ARG ... ] |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
22 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
23 OPTIONS: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
24 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
25 -V Print the program name and version number to stdout and exit |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
26 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
27 -h Print this help message to stdout and exit |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
28 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
29 COMMANDS: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
30 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
31 clone-tree [-k] [-n] SOUECE-DATASET DEST-DATASET |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
32 |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
33 copy-tree [-A] [-M MOUNTPOINT] [-n] [-u] SOURCE-DATASET DEST-DATASET |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
34 |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
35 create-tree [-A] [-M MOUNTPOINT] [-n] [-p] [-u] SOURCE-DATASET DEST-DATASET |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
36 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
37 mount [-O] [-N] [-P] [-k] [-u] [-n] DATASET [MOUNTPOINT] |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
38 |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
39 umount [-k] DATASET |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
40 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
41 unmount |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
42 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
43 ' |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
44 |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
45 |
|
442
a2011285f054
Move "_get_local_zfs_properties_for_create()" into common.subr
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
46 _p_datadir="$(dirname "$0")"/../share/local-bsdtools |
|
a2011285f054
Move "_get_local_zfs_properties_for_create()" into common.subr
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
47 . "${_p_datadir}/common.subr" |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
48 . "${_p_datadir}/array.sh" |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
49 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
50 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
51 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
52 #: Implementation of the "mount" command. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
53 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
54 #: Mount a dataset and recursively all its children datasets. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
55 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
56 command_mount() { |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
57 local _dsname _mountpoint |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
58 local _opt_dry_run _opt_mount_outside _opt_mount_natural |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
59 local _opt_mount_children_only _opt_keep |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
60 |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
61 local _name _mp _canmount _mounted _rootds_mountpoint _rootds_mountpoint_prefix _relative_mp _real_mp |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
62 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
63 _opt_dry_run="" |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
64 _opt_keep="" |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
65 _opt_mount_outside="" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
66 _opt_mount_natural="" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
67 _opt_mount_children_only="" |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
68 while getopts "ONPknu" _opt ; do |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
69 case ${_opt} in |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
70 O) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
71 _opt_mount_outside="yes" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
72 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
73 N) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
74 _opt_mount_natural="yes" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
75 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
76 P) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
77 _opt_mount_children_only="yes" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
78 ;; |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
79 k) |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
80 _opt_keep="yes" |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
81 ;; |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
82 n|u) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
83 _opt_dry_run="yes" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
84 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
85 \?|:) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
86 return 2; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
87 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
88 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
89 done |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
90 shift $((OPTIND-1)) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
91 OPTIND=1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
92 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
93 _dsname="${1-}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
94 _mountpoint="${2-}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
95 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
96 if [ -z "${_dsname}" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
97 echo "ERROR: no dataset given" >&2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
98 return 2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
99 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
100 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
101 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}")" || \ |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
102 { echo "ERROR: root dataset does not exist" >&2; return 1; } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
103 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
104 if [ -z "${_mountpoint}" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
105 if [ "${_opt_mount_natural}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
106 _mountpoint="${_rootds_mountpoint}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
107 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
108 echo "ERROR: no mountpoint given" >&2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
109 return 2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
110 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
111 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
112 if [ "${_opt_mount_natural}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
113 echo "ERROR: Cannot have a custom mountpoint when \"-O\" is given" >&2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
114 return 2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
115 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
116 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
117 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
118 # Eventually remove a trailing slash |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
119 _mountpoint="${_mountpoint%/}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
120 if [ -z "${_mountpoint}" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
121 echo "ERROR: would mount over the root filesystem" >&2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
122 return 1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
123 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
124 |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
125 if [ "${_rootds_mountpoint}" = "/" ]; then |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
126 _rootds_mountpoint_prefix="/" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
127 else |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
128 _rootds_mountpoint_prefix="${_rootds_mountpoint}/" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
129 fi |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
130 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
131 zfs list -H -o name,mountpoint,canmount,mounted -s mountpoint -t filesystem -r "${_dsname}" \ |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
132 | { |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
133 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
134 # |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
135 # _mounted_datasets is an array of ZFS datasets that have been |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
136 # mounted by this routine and should be unmounted on errors |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
137 # -- if possible. |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
138 # |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
139 array_create _mounted_datasets |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
140 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
141 while IFS=$'\t' read -r _name _mp _canmount _mounted ; do |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
142 # Skip filesystems that are already mounted |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
143 [ "${_mounted}" = "yes" ] && continue |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
144 # Skip filesystems that must not be mounted |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
145 [ "${_canmount}" = "off" ] && continue |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
146 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
147 # Mount only the children and skip the given parent dataset |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
148 # if required |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
149 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
150 [ \( "${_opt_mount_children_only}" = "yes" \) -a \( "${_name}" = "${_dsname}" \) ] && continue |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
151 case "${_mp}" in |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
152 "none"|"legacy") |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
153 # Do nothing for filesystem with unset or legacy mountpoints |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
154 ;; |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
155 "${_rootds_mountpoint}"|"${_rootds_mountpoint_prefix}"*) |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
156 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
157 # Handle only mountpoints that have a mountpoint below |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
158 # or exactly at the parent datasets mountpoint |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
159 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
160 |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
161 # |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
162 # Determine the mountpoint relative to the parent |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
163 # mountpoint. Extra effort is needed because the root |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
164 # filesystem mount is just a single slash. |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
165 # |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
166 if [ "${_mp}" = "${_rootds_mountpoint}" ]; then |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
167 if [ "${_name}" != "${_dsname}" ]; then |
| 498 | 168 echo "ERROR: child dataset mounts over root dataset" >&2 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
169 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
170 _umount_datasets _mounted_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
171 fi |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
172 return 1 |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
173 fi |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
174 _relative_mp="" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
175 _real_mp="${_mountpoint}" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
176 else |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
177 _relative_mp="${_mp#${_rootds_mountpoint_prefix}}" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
178 # Eventually remove a trailing slash |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
179 _relative_mp="${_relative_mp%/}" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
180 if [ -z "${_relative_mp}" ]; then |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
181 echo "ERROR: got an empty relative mountpoint in child" >&2 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
182 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
183 _umount_datasets _mounted_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
184 fi |
|
492
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
185 return 1 |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
186 fi |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
187 # The real effective full mountpoint |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
188 _real_mp="${_mountpoint}/${_relative_mp}" |
|
312aebce590c
FIX: Handle severe error in "fzfs mount" when the root dataset naturally mounts at root filesystem
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
189 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
190 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
191 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
192 # Consistency and sanity check: computed real mountpoint must |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
193 # be equal to the configured mountpoint when no custom mountpoint |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
194 # is given. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
195 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
196 if [ "${_opt_mount_natural}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
197 if [ "${_real_mp}" != "${_mp}" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
198 echo "ERROR: mountpoint mismatch" >&2 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
199 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
200 _umount_datasets _mounted_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
201 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
202 return 1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
203 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
204 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
205 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
206 if [ "${_opt_dry_run}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
207 echo "Would mount ${_name} on ${_real_mp}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
208 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
209 mkdir -p "${_real_mp}" 1> /dev/null 2> /dev/null || \ |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
210 { echo "ERROR: cannot create mountpoint ${_real_mp}" >&2; _umount_datasets _mounted_datasets || true; return 1; } |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
211 echo "Mounting ${_name} on ${_real_mp}" |
|
527
b7d60802b25f
Use absolute paths for "mount" (all occurrences) and grep (some)
Franz Glasner <fzglas.hg@dom66.de>
parents:
521
diff
changeset
|
212 if /sbin/mount -t zfs "${_name}" "${_real_mp}"; then |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
213 array_append _mounted_datasets "${_name}" |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
214 else |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
215 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
216 _umount_datasets _mounted_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
217 fi |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
218 return 1 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
219 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
220 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
221 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
222 *) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
223 if [ "${_opt_mount_outside}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
224 if [ "${_opt_dry_run}" = "yes" ]; then |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
225 echo "Would mount ${_name} on configured ZFS dataset mountpoint ${_mp}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
226 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
227 echo "Mounting ${_name} on configured ZFS dataset mountpoint ${_mp}" |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
228 if zfs mount "${_name}"; then |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
229 array_append _mounted_datasets "${_name}" |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
230 else |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
231 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
232 _umount_datasets _mounted_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
233 fi |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
234 return 1 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
235 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
236 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
237 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
238 echo "Skipping ${_name} because its configured ZFS mountpoint is not relative to given root dataset" 2>&1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
239 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
240 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
241 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
242 done |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
243 array_destroy _mounted_datasets |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
244 return 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
245 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
246 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
247 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
248 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
249 #: |
|
500
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
250 #: Helper to unmount mounted ZFS filesystems |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
251 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
252 #: Args: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
253 #: $1 (str): The name of the array that contains the datasets to unmount to |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
254 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
255 #: Returns: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
256 #: 0 if successfully unmounted all given datasets, |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
257 #: 1 otherwise |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
258 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
259 #: Unmounting is done in the reverse order. |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
260 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
261 _umount_datasets() { |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
262 array_reversed_for_each "$1" _umount_datasets_umount |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
263 } |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
264 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
265 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
266 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
267 #: Array callback to unmount a single ZFS filesystem |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
268 #: |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
269 _umount_datasets_umount() { |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
270 if ! zfs umount "$3" ; then |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
271 warn "Dataset \`${3}' cannot unmounted" |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
272 return 1 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
273 fi |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
274 return 0 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
275 } |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
276 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
277 |
|
7d498093d4c2
fzfs: Try to unmount filesystems that have been mounted by this tool when an error occurs
Franz Glasner <fzglas.hg@dom66.de>
parents:
498
diff
changeset
|
278 #: |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
279 #: Implement the "umount" command. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
280 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
281 #: Umount a datasets and recursively all its children datasets. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
282 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
283 command_umount() { |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
284 local _dsname |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
285 local _opt_dry_run |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
286 |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
287 local _opt _name _mp _rest _rootds_mountpoint |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
288 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
289 _opt_dry_run="" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
290 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
291 while getopts "k" _opt ; do |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
292 case ${_opt} in |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
293 k) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
294 _opt_dry_run="yes" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
295 ;; |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
296 \?) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
297 return 2; |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
298 ;; |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
299 esac |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
300 done |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
301 shift $((OPTIND-1)) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
302 OPTIND=1 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
303 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
304 _dsname="${1-}" |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
305 [ -z "${_dsname}" ] && { err "no dataset given"; return 2; } |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
306 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
307 # Just determine whether the given dataset name exists |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
308 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}" 1>/dev/null 2>/dev/null)" || { err "dataset not found"; return 1; } |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
309 |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
310 if [ -x "${JQ}" ]; then |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
311 /sbin/mount -t zfs -p --libxo=json,no-locale \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
312 | LC_ALL=C "${JQ}" -r $'.mount.fstab.[] | [.device, .mntpoint, .fstype, .opts, .dump, .pass] | @tsv ' \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
313 | LC_ALL=C /usr/bin/awk -F $'\\t+' -v OFS=$'\t' -v ds1="${_dsname}" -v ds2="${_dsname}/" $'{ if (($1 == ds1) || (index($1, ds2) == 1)) { print $1, $2; } }' \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
314 | LC_ALL=C /usr/bin/sort -t $'\t' -k 1 -r \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
315 | while IFS=$'\t' read -r _name _mp ; do |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
316 if checkyes _opt_dry_run ; then |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
317 echo "Would umount ${_name} from ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
318 else |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
319 echo "Umounting ${_name} on ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
320 /sbin/umount "${_mp}" || return 1 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
321 fi |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
322 done |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
323 else |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
324 /sbin/mount -t zfs -p \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
325 | LC_ALL=C GREP_OPTIONS="" /usr/bin/egrep "^${_dsname}(/|\s)" \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
326 | LC_ALL=C /usr/bin/sort -n -r \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
327 | while IFS=' '$'\t' read -r _name _mp _rest ; do |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
328 if checkyes _opt_dry_run ; then |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
329 echo "Would umount ${_name} from ${_mp}" |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
330 else |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
331 echo "Umounting ${_name} on ${_mp}" |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
332 /sbin/umount "${_mp}" || return 1 |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
333 fi |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
334 done |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
335 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
336 return 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
337 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
338 |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
339 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
340 #: |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
341 #: Implementation of "copy-tree" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
342 #: |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
343 command_copy_tree() { |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
344 local _ds_source _ds_target |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
345 local _opt_mountpoint _opt_mount_noauto _opt_nomount _opt_keep _opt_dry_run |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
346 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
347 local _ds_source_base _ds_source_snapshot _snapshot_suffix |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
348 local _ds_tree _ds _ds_relname _ds_canmount |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
349 local _arg_canmount _arg_mp1 _arg_mp2 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
350 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
351 _opt_mountpoint="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
352 _opt_mount_noauto="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
353 _opt_nomount="" |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
354 _opt_keep="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
355 _opt_dry_run="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
356 |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
357 while getopts "AM:knu" _opt ; do |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
358 case ${_opt} in |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
359 A) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
360 _opt_mount_noauto="-o canmount=noauto" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
361 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
362 M) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
363 _opt_mountpoint="${OPTARG}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
364 ;; |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
365 k) |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
366 _opt_keep="yes" |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
367 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
368 n) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
369 _opt_dry_run="-n" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
370 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
371 u) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
372 _opt_nomount="-u" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
373 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
374 \?) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
375 return 2; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
376 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
377 esac |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
378 done |
|
422
4363929b0a3e
FIX: Typo in variable name "OPTID" -> "OPTIND"
Franz Glasner <fzglas.hg@dom66.de>
parents:
421
diff
changeset
|
379 shift $((OPTIND-1)) |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
380 OPTIND=1 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
381 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
382 _ds_source="${1-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
383 _ds_target="${2-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
384 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
385 [ -z "${_ds_source}" ] && { echo "ERROR: no source given" 1>&2; return 2; } |
|
423
1d6ee78f06ef
FIX: Another typo in variable name (COPY-PASTE)
Franz Glasner <fzglas.hg@dom66.de>
parents:
422
diff
changeset
|
386 [ -z "${_ds_target}" ] && { echo "ERROR: no target name given" 1>&2; return 2; } |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
387 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
388 if ! zfs get -H name "${_ds_source}" >/dev/null 2>&1; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
389 echo "ERROR: source dataset does not exist: ${_ds_source}" 1>&2; |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
390 return 1; |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
391 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
392 if zfs get -H name "${_ds_target}" >/dev/null 2>&1; then |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
393 echo "ERROR: target dataset already exists: ${_ds_target}" 1>&2; |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
394 return 1; |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
395 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
396 |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
397 _ds_source_base="${_ds_source%@*}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
398 _ds_source_snapshot="${_ds_source##*@}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
399 _snapshot_suffix="@${_ds_source_snapshot}" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
400 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
401 if [ "${_ds_source_snapshot}" = "${_ds_source_base}" ]; then |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
402 # No snapshot given |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
403 [ "${_ds_source_base}" = "${_ds_source}" ] || { echo "ERROR:" 1>&2; return 1; } |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
404 _ds_source_snapshot="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
405 _snapshot_suffix="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
406 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
407 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
408 _ds_tree="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
409 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
410 while IFS=$'\n' read -r _ds; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
411 if [ -z "${_ds_tree}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
412 _ds_tree="${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
413 else |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
414 _ds_tree="${_ds_tree}"$'\n'"${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
415 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
416 done <<EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
417 $(zfs list -H -r -t filesystem -o name -s name "${_ds_source_base}") |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
418 EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
419 # Check the existence of all intermediate datasets and their shapshots |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
420 IFS=$'\n' |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
421 for _ds in ${_ds_tree}; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
422 if ! zfs get -H name "${_ds}${_snapshot_suffix}" >/dev/null 2>&1; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
423 echo "ERROR: child dataset does not exist: ${_ds}${_snapshot_suffix}" 1>&2 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
424 return 1 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
425 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
426 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
427 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
428 for _ds in ${_ds_tree}; do |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
429 # Reset IFS |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
430 IFS=$' \t\n' |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
431 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
432 # Determine the relative name of the dataset |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
433 _ds_relname="${_ds#${_ds_source_base}}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
434 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
435 _ds_canmount=$(zfs get -H -o value canmount "${_ds}") |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
436 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
437 if [ "${_ds_canmount}" = "off" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
438 _arg_canmount="-o canmount=off" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
439 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
440 _arg_canmount="${_opt_mount_noauto}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
441 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
442 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
443 if [ -z "${_ds_relname}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
444 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
445 # Source root to target root |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
446 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
447 if [ -z "${_opt_mountpoint}" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
448 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
449 _arg_mp2=mountpoint |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
450 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
451 _arg_mp1=-o |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
452 _arg_mp2="mountpoint=${_opt_mountpoint}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
453 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
454 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
455 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
456 _arg_mp2=mountpoint |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
457 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
458 if [ -z "${_opt_dry_run}" ]; then |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
459 zfs send -Lec -p -v "${_ds}${_snapshot_suffix}" | zfs receive -v ${_opt_nomount} ${_arg_canmount} ${_arg_mp1} "${_arg_mp2}" "${_ds_target}${_ds_relname}" |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
460 else |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
461 echo "Would execute: zfs send -Lec -p -v '${_ds}${_snapshot_suffix}' | zfs receive -v ${_opt_nomount} ${_arg_canmount} ${_arg_mp1} '${_arg_mp2}' '${_ds_target}${_ds_relname}'" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
462 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
463 # for the loop |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
464 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
465 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
466 # Reset to default |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
467 IFS=$' \t\n' |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
468 # Remove received snapshots by default |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
469 if [ -n "${_ds_source_snapshot}" ]; then |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
470 if [ -z "${_opt_keep}" ]; then |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
471 if [ -z "${_opt_dry_run}" ]; then |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
472 zfs destroy -rv "${_ds_target}${_snapshot_suffix}" |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
473 else |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
474 echo "Would execute: zfs destroy -rv '${_ds_target}${_snapshot_suffix}'" |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
475 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
476 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
477 fi |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
478 } |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
479 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
480 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
481 #: |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
482 #: Implementation of "clone-tree" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
483 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
484 command_clone_tree() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
485 local _ds_source _ds_dest |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
486 local _opt_keep _opt_dry_run |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
487 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
488 local _ds snapshot_name _ds_source_base _ds_relname |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
489 local _ds_canmount _ds_mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
490 local _clone_props _arg_canmount _arg_other_clone_props |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
491 local _opt _idx _idx_lp _prop _propval |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
492 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
493 _opt_dry_run="" |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
494 _opt_keep="" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
495 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
496 while getopts "kn" _opt ; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
497 case ${_opt} in |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
498 k) |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
499 _opt_keep="yes" |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
500 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
501 n) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
502 _opt_dry_run="yes" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
503 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
504 \?|:) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
505 return 2; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
506 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
507 esac |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
508 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
509 shift $((OPTIND-1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
510 OPTIND=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
511 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
512 _ds_source="${1-}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
513 _ds_dest="${2-}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
514 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
515 [ -z "${_ds_source}" ] && { err "no source dataset/snapshot given"; return 2; } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
516 [ -z "${_ds_dest}" ] && { err "no destination name given"; return 2; } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
517 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
518 if ! zfs get -H name "${_ds_source}" >/dev/null 2>&1; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
519 err "source dataset does not exist: ${_ds_source}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
520 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
521 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
522 if zfs get -H name "${_ds_dest}" >/dev/null 2>&1; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
523 err "destination dataset already exists: ${_ds_dest}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
524 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
525 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
526 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
527 _ds_source_base="${_ds_source%@*}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
528 _snapshot_name="${_ds_source##*@}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
529 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
530 if [ "${_ds_source_base}" = "${_snapshot_name}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
531 err "no snapshot given" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
532 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
533 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
534 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
535 array_create _ds_tree |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
536 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
537 while IFS=$'\n' read -r _ds; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
538 array_append _ds_tree "${_ds}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
539 done <<EOF_9ef07253679011efa78174d435fd3892 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
540 $(zfs list -H -r -t filesystem -o name -s name "${_ds_source_base}") |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
541 EOF_9ef07253679011efa78174d435fd3892 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
542 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
543 # Check the existence of all intermediate datasets and their shapshots |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
544 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
545 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
546 if ! zfs get -H name "${_ds}@${_snapshot_name}" >/dev/null 2>&1; then |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
547 err "child dataset (snapshot) does not exist: ${_ds}@${_snapshot_name}" 1>&2 |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
548 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
549 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
550 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
551 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
552 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
553 array_create _cloned_datasets |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
554 alist_create _local_props |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
555 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
556 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
557 # 1. Clone with "safe" canmount settings |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
558 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
559 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
560 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
561 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
562 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
563 _ds_relname="${_ds#${_ds_source_base}}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
564 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
565 # Need to determine in *every* case (local, default, received, ...) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
566 _ds_canmount="$(zfs get -H -o value canmount "${_ds}")" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
567 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
568 alist_clear _local_props |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
569 while IFS=$'\t' read -r _prop _propval ; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
570 alist_set _local_props "${_prop}" "${_propval}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
571 done <<EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
572 $(zfs get -H -o property,value -s local,received all "${_ds}") |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
573 EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
574 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
575 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
576 # - "zfs clone" does NOT copy/clone properties. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
577 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
578 # Clones inherit their properties from the target filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
579 # context or are set back to their ZFS default. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
580 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
581 if [ "${_ds_canmount}" = "off" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
582 _arg_canmount="-o canmount=off" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
583 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
584 _arg_canmount="-o canmount=noauto" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
585 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
586 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
587 # Copy all local props with the exception of canmount and mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
588 _arg_other_clone_props="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
589 _idx_lp=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
590 while alist_tryget_key_at_index _prop _local_props ${_idx_lp}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
591 if [ "${_prop}" = "mountpoint" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
592 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
593 continue |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
594 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
595 if [ "${_prop}" = "canmount" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
596 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
597 continue |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
598 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
599 alist_tryget_value_at_index _propvalue _local_props ${_idx_lp} |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
600 _arg_other_clone_props="${_arg_other_clone_props} -o ${_prop}=${_propvalue}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
601 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
602 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
603 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
604 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
605 echo "Cloning ${_ds}@${_snapshot_name} into ${_ds_dest}${_ds_relname} with ${_arg_canmount} ${_arg_other_clone_props}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
606 if zfs clone ${_arg_canmount} ${_arg_other_clone_props} "${_ds}@${_snapshot_name}" "${_ds_dest}${_ds_relname}"; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
607 array_append _cloned_datasets "${_ds_dest}${_ds_relname}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
608 else |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
609 if ! checkyes _opt_keep; then |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
610 _destroy_datasets _cloned_datasets || true |
|
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
611 fi |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
612 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
613 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
614 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
615 echo "Would execute: zfs clone ${_arg_canmount} ${_arg_other_clone_props} '${_ds}@${_snapshot_name}' '${_ds_dest}${_ds_relname}'" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
616 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
617 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
618 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
619 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
620 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
621 # 2. Copy property mountpoint for root and inherit for all children; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
622 # also handle canmount. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
623 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
624 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
625 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
626 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
627 _ds_relname="${_ds#${_ds_source_base}}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
628 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
629 # Need to determine in *every* case (default, local, received, ...) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
630 _ds_canmount="$(zfs get -H -o value canmount "${_ds}")" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
631 # Local mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
632 _ds_mountpoint="$(zfs get -H -o value -s local,received mountpoint "${_ds}")" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
633 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
634 if [ \( "${_ds_canmount}" = "off" \) -o \( "${_ds_canmount}" = "noauto" \) ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
635 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
636 # Already handled above because "nomount" is the default if not |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
637 # already set to "off". |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
638 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
639 _arg_canmount="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
640 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
641 _arg_canmount="-o canmount=${_ds_canmount}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
642 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
643 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
644 if [ \( -n "${_arg_canmount}" \) -o \( -n "${_ds_mountpoint}" \) ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
645 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
646 # If a local or received mountpoint is given set it here |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
647 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
648 echo "Correcting properties for ${_ds_dest}${_ds_relname}: ${_arg_canmount} mountpoint=\"${_ds_mountpoint}\"" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
649 zfs set -u ${_arg_canmount} mountpoint="${_ds_mountpoint}" "${_ds_dest}${_ds_relname}" || true |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
650 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
651 echo "Correcting properties for ${_ds_dest}${_ds_relname}: ${_arg_canmount}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
652 zfs set -u ${_arg_canmount} "${_ds_dest}${_ds_relname}" || true |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
653 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
654 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
655 # If a local or received mountpoint is given set it here |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
656 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
657 echo "Would execute: zfs set -u ${_arg_canmount} mountpoint='${_ds_mountpoint}' '${_ds_dest}${_ds_relname}'" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
658 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
659 echo "Would execute: zfs set -u ${_arg_canmount} '${_ds_dest}${_ds_relname}'" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
660 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
661 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
662 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
663 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
664 done |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
665 array_destroy _cloned_datasets |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
666 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
667 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
668 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
669 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
670 #: |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
671 #: Implement the "create-tree" command |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
672 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
673 #: Create a ZFS dataset tree from a source tree tree including important properties |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
674 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
675 command_create_tree() { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
676 local _source_ds _target_ds |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
677 local _opt_dry_run _opt_mountpoint _opt_noauto _opt_nomount _opt_canmount_parent_only |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
678 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
679 local _opt _source_name _snapshot_name _current_name _current_type _relative_name _zfs_opts _zfs_canmount _zfs_mountpoint |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
680 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
681 _opt_noauto="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
682 _opt_dry_run="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
683 _opt_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
684 _opt_nomount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
685 _opt_canmount_parent_only="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
686 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
687 while getopts "AM:npu" _opt ; do |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
688 case ${_opt} in |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
689 A) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
690 _opt_noauto="-o canmount=noauto" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
691 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
692 M) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
693 _opt_mountpoint="${OPTARG}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
694 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
695 n) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
696 _opt_dry_run="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
697 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
698 p) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
699 _opt_canmount_parent_only="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
700 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
701 u) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
702 _opt_nomount="-u" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
703 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
704 \?|:) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
705 return 2; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
706 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
707 esac |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
708 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
709 shift $((OPTIND-1)) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
710 OPTIND=1 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
711 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
712 _source_ds="${1-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
713 _target_ds="${2-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
714 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
715 [ -z "${_source_ds}" ] && { echo "ERROR: no source dataset given" 1>&2; return 2; } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
716 [ -z "${_target_ds}" ] && { echo "ERROR: no destination dataset given" 1>&2; return 2; } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
717 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
718 _source_name="${_source_ds%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
719 if [ "${_source_name}" != "${_source_ds}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
720 _snapshot_name="${_source_ds##*@}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
721 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
722 _snapshot_name="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
723 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
724 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
725 [ -n "${_snapshot_name}" ] && { echo "ERROR: No snapshot sources are supported yet" 1>&2; return 2; } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
726 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
727 zfs list -H -r -t filesystem -o name,type "${_source_ds}" \ |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
728 | { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
729 while IFS=$'\t' read -r _current_name _current_type ; do |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
730 # Determine the relative name of the dataset |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
731 _relative_name="${_current_name#${_source_name}}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
732 _relative_name="${_relative_name%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
733 if [ "${_current_type}" != "filesystem" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
734 echo "ERROR: Got a snapshot but expected a filesystem" 1>&2 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
735 return 1 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
736 fi |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
737 _zfs_opts="$(_get_local_zfs_properties_for_create "${_current_name}" atime exec setuid compression primarycache sync readonly)" |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
738 if [ -z "${_relative_name}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
739 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
740 # Root |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
741 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
742 if [ -z "${_opt_noauto}" ]; then |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
743 _zfs_canmount="$(_get_local_zfs_properties_for_create "${_current_name}" canmount)" |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
744 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
745 _zfs_canmount="${_opt_noauto}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
746 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
747 if [ -n "${_opt_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
748 _zfs_mountpoint="${_opt_mountpoint}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
749 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
750 _zfs_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
751 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
752 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
753 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
754 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
755 echo "Would call: zfs create ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} ${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
756 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
757 echo "Would call: zfs create ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} -o mountpoint=${_zfs_mountpoint} ${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
758 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
759 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
760 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
761 zfs create -v ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} "${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
762 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
763 zfs create -v ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} -o "mountpoint=${_zfs_mountpoint}" "${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
764 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
765 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
766 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
767 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
768 # Children |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
769 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
770 if [ -z "${_opt_noauto}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
771 if [ "${_opt_canmount_parent_only}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
772 _zfs_canmount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
773 else |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
774 _zfs_canmount="$(_get_local_zfs_properties_for_create "${_current_name}" canmount)" |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
775 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
776 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
777 _zfs_canmount="${_opt_noauto}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
778 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
779 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
780 echo "Would call: zfs create ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} ${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
781 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
782 zfs create -v ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} "${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
783 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
784 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
785 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
786 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
787 return 0 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
788 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
789 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
790 |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
791 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
792 #: Helper to destroy some created ZFS filesystems |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
793 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
794 #: Args: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
795 #: $1 (str): The name of the array that contains the datasets to destroy to |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
796 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
797 #: Returns: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
798 #: 0 if successfully destroyed all given datasets, |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
799 #: 1 otherwise |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
800 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
801 #: Destruction is done in the reverse order. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
802 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
803 _destroy_datasets() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
804 array_reversed_for_each "$1" _destroy_datasets_destroy |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
805 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
806 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
807 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
808 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
809 #: Array callback to destroy a single ZFS filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
810 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
811 _destroy_datasets_destroy() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
812 if ! zfs destroy -v "$3" ; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
813 warn "Dataset \`${3}' cannot unmounted" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
814 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
815 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
816 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
817 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
818 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
819 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
820 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
821 # Global option handling |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
822 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
823 while getopts "Vh" _opt ; do |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
824 case ${_opt} in |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
825 V) |
|
408
bb0a0384b5da
FIX: Program name in fzfs's version string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
386
diff
changeset
|
826 printf 'fzfs %s\n' '@@SIMPLEVERSIONSTR@@' |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
827 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
828 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
829 h) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
830 echo "${USAGE}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
831 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
832 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
833 \?) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
834 exit 2; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
835 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
836 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
837 fatal 2 "option handling failed" 1>&2 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
838 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
839 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
840 done |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
841 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
842 # Reset the Shell's option handling system to prepare for handling |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
843 # command-local options. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
844 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
845 shift $((OPTIND-1)) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
846 OPTIND=1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
847 |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
848 test $# -gt 0 || fatal 2 "no command given" |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
849 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
850 command="$1" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
851 shift |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
852 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
853 case "${command}" in |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
854 mount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
855 command_mount "$@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
856 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
857 umount|unmount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
858 command_umount "$@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
859 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
860 clone-tree) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
861 command_clone_tree "$@" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
862 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
863 copy-tree) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
864 command_copy_tree "$@" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
865 ;; |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
866 create-tree) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
867 command_create_tree "$@" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
868 ;; |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
869 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
870 fatal 2 "unknown command \`${command}'" 1>&2 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
871 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
872 esac |
