Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
annotate sbin/fzfs @ 528:93b98803219b
fzfs umount: implemented option "-k" (dry-run)
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Wed, 04 Sep 2024 18:48:10 +0200 |
| parents | b7d60802b25f |
| children | 703e9f357339 |
| 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-}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
305 [ -z "${_dsname}" ] && { echo "ERROR: no dataset given" 1>&2; return 2; } |
|
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 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
308 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}")" || { echo "ERROR: dataset not found" 1>&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
|
309 |
|
527
b7d60802b25f
Use absolute paths for "mount" (all occurrences) and grep (some)
Franz Glasner <fzglas.hg@dom66.de>
parents:
521
diff
changeset
|
310 /sbin/mount -t zfs -p \ |
|
b7d60802b25f
Use absolute paths for "mount" (all occurrences) and grep (some)
Franz Glasner <fzglas.hg@dom66.de>
parents:
521
diff
changeset
|
311 | LC_ALL=C GREP_OPTIONS="" /usr/bin/egrep "^${_dsname}(/|\s)" \ |
|
b7d60802b25f
Use absolute paths for "mount" (all occurrences) and grep (some)
Franz Glasner <fzglas.hg@dom66.de>
parents:
521
diff
changeset
|
312 | /usr/bin/sort -n -r \ |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
313 | { |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
314 while IFS=' '$'\t' read -r _name _mp _rest ; do |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
315 if checkyes _opt_dry_run ; then |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
316 echo "Would umount ${_name} from ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
317 else |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
318 echo "Umounting ${_name} on ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
319 /sbin/umount "${_mp}" || return 1 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
320 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
321 done |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
322 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
323 return 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
324 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
325 |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
326 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
327 #: |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
328 #: Implementation of "copy-tree" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
329 #: |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
330 command_copy_tree() { |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
331 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
|
332 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
|
333 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
334 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
|
335 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
|
336 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
|
337 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
338 _opt_mountpoint="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
339 _opt_mount_noauto="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
340 _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
|
341 _opt_keep="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
342 _opt_dry_run="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
343 |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
344 while getopts "AM:knu" _opt ; do |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
345 case ${_opt} in |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
346 A) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
347 _opt_mount_noauto="-o canmount=noauto" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
348 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
349 M) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
350 _opt_mountpoint="${OPTARG}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
351 ;; |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
352 k) |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
353 _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
|
354 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
355 n) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
356 _opt_dry_run="-n" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
357 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
358 u) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
359 _opt_nomount="-u" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
360 ;; |
|
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 return 2; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
363 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
364 esac |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
365 done |
|
422
4363929b0a3e
FIX: Typo in variable name "OPTID" -> "OPTIND"
Franz Glasner <fzglas.hg@dom66.de>
parents:
421
diff
changeset
|
366 shift $((OPTIND-1)) |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
367 OPTIND=1 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
368 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
369 _ds_source="${1-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
370 _ds_target="${2-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
371 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
372 [ -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
|
373 [ -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
|
374 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
375 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
|
376 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
|
377 return 1; |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
378 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
379 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
|
380 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
|
381 return 1; |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
382 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
383 |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
384 _ds_source_base="${_ds_source%@*}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
385 _ds_source_snapshot="${_ds_source##*@}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
386 _snapshot_suffix="@${_ds_source_snapshot}" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
387 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
388 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
|
389 # No snapshot given |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
390 [ "${_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
|
391 _ds_source_snapshot="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
392 _snapshot_suffix="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
393 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
394 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
395 _ds_tree="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
396 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
397 while IFS=$'\n' read -r _ds; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
398 if [ -z "${_ds_tree}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
399 _ds_tree="${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
400 else |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
401 _ds_tree="${_ds_tree}"$'\n'"${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
402 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
403 done <<EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
404 $(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
|
405 EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
406 # 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
|
407 IFS=$'\n' |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
408 for _ds in ${_ds_tree}; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
409 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
|
410 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
|
411 return 1 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
412 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
413 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
414 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
415 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
|
416 # Reset IFS |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
417 IFS=$' \t\n' |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
418 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
419 # Determine the relative name of the dataset |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
420 _ds_relname="${_ds#${_ds_source_base}}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
421 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
422 _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
|
423 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
424 if [ "${_ds_canmount}" = "off" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
425 _arg_canmount="-o canmount=off" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
426 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
427 _arg_canmount="${_opt_mount_noauto}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
428 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
429 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
430 if [ -z "${_ds_relname}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
431 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
432 # Source root to target root |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
433 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
434 if [ -z "${_opt_mountpoint}" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
435 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
436 _arg_mp2=mountpoint |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
437 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
438 _arg_mp1=-o |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
439 _arg_mp2="mountpoint=${_opt_mountpoint}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
440 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
441 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
442 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
443 _arg_mp2=mountpoint |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
444 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
445 if [ -z "${_opt_dry_run}" ]; then |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
446 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
|
447 else |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
448 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
|
449 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
450 # for the loop |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
451 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
452 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
453 # Reset to default |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
454 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
|
455 # Remove received snapshots by default |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
456 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
|
457 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
|
458 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
|
459 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
|
460 else |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
461 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
|
462 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
463 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
464 fi |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
465 } |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
466 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
467 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
468 #: |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
469 #: Implementation of "clone-tree" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
470 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
471 command_clone_tree() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
472 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
|
473 local _opt_keep _opt_dry_run |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
474 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
475 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
|
476 local _ds_canmount _ds_mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
477 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
|
478 local _opt _idx _idx_lp _prop _propval |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
479 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
480 _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
|
481 _opt_keep="" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
482 |
|
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
|
483 while getopts "kn" _opt ; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
484 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
|
485 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
|
486 _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
|
487 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
488 n) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
489 _opt_dry_run="yes" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
490 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
491 \?|:) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
492 return 2; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
493 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
494 esac |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
495 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
496 shift $((OPTIND-1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
497 OPTIND=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
498 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
499 _ds_source="${1-}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
500 _ds_dest="${2-}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
501 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
502 [ -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
|
503 [ -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
|
504 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
505 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
|
506 err "source dataset does not exist: ${_ds_source}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
507 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
508 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
509 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
|
510 err "destination dataset already exists: ${_ds_dest}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
511 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
512 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
513 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
514 _ds_source_base="${_ds_source%@*}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
515 _snapshot_name="${_ds_source##*@}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
516 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
517 if [ "${_ds_source_base}" = "${_snapshot_name}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
518 err "no snapshot given" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
519 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
520 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
521 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
522 array_create _ds_tree |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
523 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
524 while IFS=$'\n' read -r _ds; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
525 array_append _ds_tree "${_ds}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
526 done <<EOF_9ef07253679011efa78174d435fd3892 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
527 $(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
|
528 EOF_9ef07253679011efa78174d435fd3892 |
|
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 # 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
|
531 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
532 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
533 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
|
534 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
|
535 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
536 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
537 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
538 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
539 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
540 array_create _cloned_datasets |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
541 alist_create _local_props |
|
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 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
544 # 1. Clone with "safe" canmount settings |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
545 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
546 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
547 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
548 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
549 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
550 _ds_relname="${_ds#${_ds_source_base}}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
551 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
552 # 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
|
553 _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
|
554 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
555 alist_clear _local_props |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
556 while IFS=$'\t' read -r _prop _propval ; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
557 alist_set _local_props "${_prop}" "${_propval}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
558 done <<EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
559 $(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
|
560 EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
561 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
562 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
563 # - "zfs clone" does NOT copy/clone properties. |
|
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 # Clones inherit their properties from the target filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
566 # 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
|
567 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
568 if [ "${_ds_canmount}" = "off" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
569 _arg_canmount="-o canmount=off" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
570 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
571 _arg_canmount="-o canmount=noauto" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
572 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
573 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
574 # 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
|
575 _arg_other_clone_props="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
576 _idx_lp=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
577 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
|
578 if [ "${_prop}" = "mountpoint" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
579 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
580 continue |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
581 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
582 if [ "${_prop}" = "canmount" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
583 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
584 continue |
|
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 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
|
587 _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
|
588 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
589 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
590 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
591 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
592 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
|
593 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
|
594 array_append _cloned_datasets "${_ds_dest}${_ds_relname}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
595 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
|
596 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
|
597 _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
|
598 fi |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
599 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
600 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
601 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
602 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
|
603 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
604 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
605 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
606 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
607 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
608 # 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
|
609 # also handle canmount. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
610 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
611 _idx=1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
612 while array_tryget _ds _ds_tree ${_idx}; do |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
613 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
614 _ds_relname="${_ds#${_ds_source_base}}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
615 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
616 # 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
|
617 _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
|
618 # Local mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
619 _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
|
620 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
621 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
|
622 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
623 # 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
|
624 # already set to "off". |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
625 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
626 _arg_canmount="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
627 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
628 _arg_canmount="-o canmount=${_ds_canmount}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
629 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
630 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
631 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
|
632 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
633 # 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
|
634 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
635 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
|
636 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
|
637 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
638 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
|
639 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
|
640 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
641 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
642 # 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
|
643 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
644 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
|
645 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
646 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
|
647 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
648 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
649 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
650 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
651 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
|
652 array_destroy _cloned_datasets |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
653 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
654 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
655 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
656 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
657 #: |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
658 #: Implement the "create-tree" command |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
659 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
660 #: 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
|
661 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
662 command_create_tree() { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
663 local _source_ds _target_ds |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
664 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
|
665 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
666 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
|
667 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
668 _opt_noauto="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
669 _opt_dry_run="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
670 _opt_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
671 _opt_nomount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
672 _opt_canmount_parent_only="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
673 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
674 while getopts "AM:npu" _opt ; do |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
675 case ${_opt} in |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
676 A) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
677 _opt_noauto="-o canmount=noauto" |
|
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 M) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
680 _opt_mountpoint="${OPTARG}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
681 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
682 n) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
683 _opt_dry_run="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
684 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
685 p) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
686 _opt_canmount_parent_only="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
687 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
688 u) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
689 _opt_nomount="-u" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
690 ;; |
|
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 return 2; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
693 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
694 esac |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
695 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
696 shift $((OPTIND-1)) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
697 OPTIND=1 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
698 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
699 _source_ds="${1-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
700 _target_ds="${2-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
701 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
702 [ -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
|
703 [ -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
|
704 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
705 _source_name="${_source_ds%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
706 if [ "${_source_name}" != "${_source_ds}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
707 _snapshot_name="${_source_ds##*@}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
708 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
709 _snapshot_name="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
710 fi |
|
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 [ -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
|
713 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
714 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
|
715 | { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
716 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
|
717 # Determine the relative name of the dataset |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
718 _relative_name="${_current_name#${_source_name}}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
719 _relative_name="${_relative_name%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
720 if [ "${_current_type}" != "filesystem" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
721 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
|
722 return 1 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
723 fi |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
724 _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
|
725 if [ -z "${_relative_name}" ]; then |
|
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 # Root |
|
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 if [ -z "${_opt_noauto}" ]; then |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
730 _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
|
731 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
732 _zfs_canmount="${_opt_noauto}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
733 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
734 if [ -n "${_opt_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
735 _zfs_mountpoint="${_opt_mountpoint}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
736 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
737 _zfs_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
738 fi |
|
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 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
741 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
742 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
|
743 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
744 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
|
745 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
746 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
747 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
748 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
|
749 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
750 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
|
751 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
752 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
753 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
754 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
755 # Children |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
756 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
757 if [ -z "${_opt_noauto}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
758 if [ "${_opt_canmount_parent_only}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
759 _zfs_canmount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
760 else |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
761 _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
|
762 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
763 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
764 _zfs_canmount="${_opt_noauto}" |
|
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 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
767 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
|
768 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
769 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
|
770 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
771 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
772 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
773 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
774 return 0 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
775 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
776 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
777 |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
778 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
779 #: Helper to destroy some created ZFS filesystems |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
780 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
781 #: Args: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
782 #: $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
|
783 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
784 #: Returns: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
785 #: 0 if successfully destroyed all given datasets, |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
786 #: 1 otherwise |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
787 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
788 #: Destruction is done in the reverse order. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
789 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
790 _destroy_datasets() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
791 array_reversed_for_each "$1" _destroy_datasets_destroy |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
792 } |
|
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 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
795 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
796 #: Array callback to destroy a single ZFS filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
797 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
798 _destroy_datasets_destroy() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
799 if ! zfs destroy -v "$3" ; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
800 warn "Dataset \`${3}' cannot unmounted" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
801 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
802 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
803 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
804 } |
|
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 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
807 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
808 # 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
|
809 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
810 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
|
811 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
|
812 V) |
|
408
bb0a0384b5da
FIX: Program name in fzfs's version string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
386
diff
changeset
|
813 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
|
814 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
815 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
816 h) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
817 echo "${USAGE}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
818 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
819 ;; |
|
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 exit 2; |
|
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 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
824 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
|
825 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
826 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
827 done |
|
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 # 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
|
830 # 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
|
831 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
832 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
|
833 OPTIND=1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
834 |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
835 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
|
836 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
837 command="$1" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
838 shift |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
839 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
840 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
|
841 mount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
842 command_mount "$@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
843 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
844 umount|unmount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
845 command_umount "$@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
846 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
847 clone-tree) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
848 command_clone_tree "$@" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
849 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
850 copy-tree) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
851 command_copy_tree "$@" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
852 ;; |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
853 create-tree) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
854 command_create_tree "$@" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
855 ;; |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
856 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
857 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
|
858 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
859 esac |
