Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
annotate sbin/fzfs @ 539:f6dc405ddd58
fzfs: switch to farray.sh
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 09 Sep 2024 15:16:01 +0200 |
| parents | 9f8f3e9b3d84 |
| children | 566ecdd9e73b |
| 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 |
|
538
9f8f3e9b3d84
fzfs: FIX: typo in help msg
Franz Glasner <fzglas.hg@dom66.de>
parents:
537
diff
changeset
|
31 clone-tree [-k] [-n] SOURCE-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" |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
48 . "${_p_datadir}/farray.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 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
62 local _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
|
63 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
64 _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
|
65 _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
|
66 _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
|
67 _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
|
68 _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
|
69 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
|
70 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
|
71 O) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
72 _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
|
73 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
74 N) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
75 _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
|
76 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
77 P) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
78 _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
|
79 ;; |
|
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
|
80 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
|
81 _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
|
82 ;; |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
83 n|u) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
84 _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
|
85 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
86 \?|:) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
87 return 2; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
88 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
89 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
90 done |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
91 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
|
92 OPTIND=1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
93 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
94 _dsname="${1-}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
95 _mountpoint="${2-}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
96 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
97 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
|
98 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
|
99 return 2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
100 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
101 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
102 _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
|
103 { 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
|
104 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
105 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
|
106 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
|
107 _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
|
108 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
109 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
|
110 return 2 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
111 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
112 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
113 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
|
114 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
|
115 return 2 |
|
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 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
118 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
119 # 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
|
120 _mountpoint="${_mountpoint%/}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
121 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
|
122 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
|
123 return 1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
124 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
125 |
|
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
|
126 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
|
127 _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
|
128 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
|
129 _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
|
130 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
|
131 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
132 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
|
133 | { |
|
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
|
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 # |
|
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_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
|
137 # 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
|
138 # -- 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
|
139 # |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
140 farray_create _mounted_datasets |
|
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
|
141 |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
142 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
|
143 # 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
|
144 [ "${_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
|
145 # 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
|
146 [ "${_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
|
147 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
148 # 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
|
149 # if required |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
150 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
151 [ \( "${_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
|
152 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
|
153 "none"|"legacy") |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
154 # 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
|
155 ;; |
|
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
|
156 "${_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
|
157 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
158 # 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
|
159 # 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
|
160 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
161 |
|
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
|
162 # |
|
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 # 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
|
164 # 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
|
165 # 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
|
166 # |
|
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 [ "${_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
|
168 if [ "${_name}" != "${_dsname}" ]; then |
| 498 | 169 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
|
170 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
|
171 _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
|
172 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
|
173 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
|
174 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
|
175 _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
|
176 _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
|
177 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
|
178 _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
|
179 # 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
|
180 _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
|
181 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
|
182 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
|
183 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
|
184 _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
|
185 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
|
186 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
|
187 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
|
188 # 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
|
189 _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
|
190 fi |
|
276
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 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
193 # 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
|
194 # 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
|
195 # is given. |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
196 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
197 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
|
198 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
|
199 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
|
200 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
|
201 _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
|
202 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
203 return 1 |
|
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 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
206 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
207 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
|
208 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
|
209 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
210 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
|
211 { 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
|
212 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
|
213 if /sbin/mount -t zfs "${_name}" "${_real_mp}"; then |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
214 farray_append _mounted_datasets "${_name}" |
|
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
|
215 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
|
216 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
|
217 _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
|
218 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
|
219 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
|
220 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
221 fi |
|
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 *) |
|
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_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
|
225 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
|
226 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
|
227 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
228 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
|
229 if zfs mount "${_name}"; then |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
230 farray_append _mounted_datasets "${_name}" |
|
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
|
231 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
|
232 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
|
233 _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
|
234 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
|
235 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
|
236 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
237 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
238 else |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
239 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
|
240 fi |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
241 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
242 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
243 done |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
244 farray_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
|
245 return 0 |
|
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 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
250 #: |
|
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
|
251 #: 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
|
252 #: |
|
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 #: 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
|
254 #: $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
|
255 #: |
|
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 #: 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
|
257 #: 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
|
258 #: 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
|
259 #: |
|
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 #: 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
|
261 #: |
|
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 _umount_datasets() { |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
263 farray_reversed_for_each "$1" _umount_datasets_umount |
|
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
|
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 #: |
|
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 #: 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
|
269 #: |
|
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 _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
|
271 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
|
272 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
|
273 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
|
274 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
|
275 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
|
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 |
|
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
|
279 #: |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
280 #: 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
|
281 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
282 #: 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
|
283 #: |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
284 command_umount() { |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
285 local _dsname |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
286 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
|
287 |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
288 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
|
289 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
290 _opt_dry_run="" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
291 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
292 while getopts "k" _opt ; do |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
293 case ${_opt} in |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
294 k) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
295 _opt_dry_run="yes" |
|
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 \?) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
298 return 2; |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
299 ;; |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
300 esac |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
301 done |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
302 shift $((OPTIND-1)) |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
303 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
|
304 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
305 _dsname="${1-}" |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
306 [ -z "${_dsname}" ] && { err "no dataset given"; return 2; } |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
307 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
308 # Just determine whether the given dataset name exists |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
309 _rootds_mountpoint="$(zfs list -H -o mountpoint -t filesystem "${_dsname}" 1>/dev/null 2>/dev/null)" || { err "dataset not found"; return 1; } |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
310 |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
311 if [ -x "${JQ}" ]; then |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
312 /sbin/mount -t zfs -p --libxo=json,no-locale \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
313 | LC_ALL=C "${JQ}" -r $'.mount.fstab.[] | [.device, .mntpoint, .fstype, .opts, .dump, .pass] | @tsv ' \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
314 | LC_ALL=C /usr/bin/awk -F $'\\t+' -v OFS=$'\t' -v ds1="${_dsname}" -v ds2="${_dsname}/" $'{ if (($1 == ds1) || (index($1, ds2) == 1)) { print $1, $2; } }' \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
315 | LC_ALL=C /usr/bin/sort -t $'\t' -k 1 -r \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
316 | while IFS=$'\t' read -r _name _mp ; do |
|
528
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
317 if checkyes _opt_dry_run ; then |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
318 echo "Would umount ${_name} from ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
319 else |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
320 echo "Umounting ${_name} on ${_mp}" |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
321 /sbin/umount "${_mp}" || return 1 |
|
93b98803219b
fzfs umount: implemented option "-k" (dry-run)
Franz Glasner <fzglas.hg@dom66.de>
parents:
527
diff
changeset
|
322 fi |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
323 done |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
324 else |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
325 /sbin/mount -t zfs -p \ |
|
537
62cd970aea9c
Replace the use of "deprecated" egrep calls with "grep -E"
Franz Glasner <fzglas.hg@dom66.de>
parents:
533
diff
changeset
|
326 | LC_ALL=C /usr/bin/grep -E "^${_dsname}(/|\s)" \ |
|
529
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
327 | LC_ALL=C /usr/bin/sort -n -r \ |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
328 | while IFS=' '$'\t' read -r _name _mp _rest ; do |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
329 if checkyes _opt_dry_run ; then |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
330 echo "Would umount ${_name} from ${_mp}" |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
331 else |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
332 echo "Umounting ${_name} on ${_mp}" |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
333 /sbin/umount "${_mp}" || return 1 |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
334 fi |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
335 done |
|
703e9f357339
fzfs umount: umounting now also works for datasets and/or mountpoints that have spaces in their values.
Franz Glasner <fzglas.hg@dom66.de>
parents:
528
diff
changeset
|
336 fi |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
337 return 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
338 } |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
339 |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
340 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
341 #: |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
342 #: Implementation of "copy-tree" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
343 #: |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
344 command_copy_tree() { |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
345 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
|
346 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
|
347 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
348 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
|
349 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
|
350 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
|
351 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
352 _opt_mountpoint="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
353 _opt_mount_noauto="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
354 _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
|
355 _opt_keep="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
356 _opt_dry_run="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
357 |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
358 while getopts "AM:knu" _opt ; do |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
359 case ${_opt} in |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
360 A) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
361 _opt_mount_noauto="-o canmount=noauto" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
362 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
363 M) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
364 _opt_mountpoint="${OPTARG}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
365 ;; |
|
429
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
366 k) |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
367 _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
|
368 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
369 n) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
370 _opt_dry_run="-n" |
|
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 u) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
373 _opt_nomount="-u" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
374 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
375 \?) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
376 return 2; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
377 ;; |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
378 esac |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
379 done |
|
422
4363929b0a3e
FIX: Typo in variable name "OPTID" -> "OPTIND"
Franz Glasner <fzglas.hg@dom66.de>
parents:
421
diff
changeset
|
380 shift $((OPTIND-1)) |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
381 OPTIND=1 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
382 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
383 _ds_source="${1-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
384 _ds_target="${2-}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
385 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
386 [ -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
|
387 [ -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
|
388 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
389 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
|
390 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
|
391 return 1; |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
392 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
393 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
|
394 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
|
395 return 1; |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
396 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
397 |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
398 _ds_source_base="${_ds_source%@*}" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
399 _ds_source_snapshot="${_ds_source##*@}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
400 _snapshot_suffix="@${_ds_source_snapshot}" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
401 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
402 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
|
403 # No snapshot given |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
404 [ "${_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
|
405 _ds_source_snapshot="" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
406 _snapshot_suffix="" |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
407 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
408 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
409 _ds_tree="" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
410 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
411 while IFS=$'\n' read -r _ds; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
412 if [ -z "${_ds_tree}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
413 _ds_tree="${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
414 else |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
415 _ds_tree="${_ds_tree}"$'\n'"${_ds}" |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
416 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
417 done <<EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
418 $(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
|
419 EOF20ee7ea0781414fab8c305d3875d15e |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
420 # 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
|
421 IFS=$'\n' |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
422 for _ds in ${_ds_tree}; do |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
423 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
|
424 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
|
425 return 1 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
426 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
427 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
428 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
429 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
|
430 # Reset IFS |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
431 IFS=$' \t\n' |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
432 |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
433 # Determine the relative name of the dataset |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
434 _ds_relname="${_ds#${_ds_source_base}}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
435 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
436 _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
|
437 |
|
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
438 if [ "${_ds_canmount}" = "off" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
439 _arg_canmount="-o canmount=off" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
440 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
441 _arg_canmount="${_opt_mount_noauto}" |
|
426
2cd4777821fc
More work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
424
diff
changeset
|
442 fi |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
443 |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
444 if [ -z "${_ds_relname}" ]; then |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
445 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
446 # Source root to target root |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
447 # |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
448 if [ -z "${_opt_mountpoint}" ]; then |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
449 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
450 _arg_mp2=mountpoint |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
451 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
452 _arg_mp1=-o |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
453 _arg_mp2="mountpoint=${_opt_mountpoint}" |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
454 fi |
|
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
455 else |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
456 _arg_mp1=-x |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
457 _arg_mp2=mountpoint |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
458 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
459 if [ -z "${_opt_dry_run}" ]; then |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
460 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
|
461 else |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
462 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
|
463 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
464 # for the loop |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
465 IFS=$'\n' |
|
424
a200c18603c9
Further work on "fzfs copy-tree"
Franz Glasner <fzglas.hg@dom66.de>
parents:
423
diff
changeset
|
466 done |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
467 # Reset to default |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
468 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
|
469 # Remove received snapshots by default |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
470 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
|
471 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
|
472 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
|
473 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
|
474 else |
|
bbdb1ab0ea00
Implement "-k" option for "fzfs copy-tree" to keep received snapshots
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
475 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
|
476 fi |
|
428
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
477 fi |
|
824e88618376
The first version of "fzfs copy-tree" completed
Franz Glasner <hg@dom66.de>
parents:
427
diff
changeset
|
478 fi |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
479 } |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
480 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
481 |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
482 #: |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
483 #: Implementation of "clone-tree" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
484 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
485 command_clone_tree() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
486 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
|
487 local _opt_keep _opt_dry_run |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
488 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
489 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
|
490 local _ds_canmount _ds_mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
491 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
|
492 local _opt _idx _idx_lp _prop _propval |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
493 local _ds_tree _cloned_datasets _local_props |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
494 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
495 _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
|
496 _opt_keep="" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
497 |
|
521
c05ef1c86c9c
fzfs: Implement option "-k" for clone-tree and mount to keep cloned datasets or keep datasets mounted on errors
Franz Glasner <fzglas.hg@dom66.de>
parents:
520
diff
changeset
|
498 while getopts "kn" _opt ; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
499 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
|
500 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
|
501 _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
|
502 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
503 n) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
504 _opt_dry_run="yes" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
505 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
506 \?|:) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
507 return 2; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
508 ;; |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
509 esac |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
510 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
511 shift $((OPTIND-1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
512 OPTIND=1 |
|
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="${1-}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
515 _ds_dest="${2-}" |
|
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 [ -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
|
518 [ -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
|
519 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
520 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
|
521 err "source dataset does not exist: ${_ds_source}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
522 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
523 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
524 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
|
525 err "destination dataset already exists: ${_ds_dest}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
526 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
527 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
528 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
529 _ds_source_base="${_ds_source%@*}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
530 _snapshot_name="${_ds_source##*@}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
531 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
532 if [ "${_ds_source_base}" = "${_snapshot_name}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
533 err "no snapshot given" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
534 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
535 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
536 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
537 farray_create _ds_tree |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
538 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
539 while IFS=$'\n' read -r _ds; do |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
540 farray_append _ds_tree "${_ds}" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
541 done <<EOF_9ef07253679011efa78174d435fd3892 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
542 $(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
|
543 EOF_9ef07253679011efa78174d435fd3892 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
544 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
545 # 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
|
546 _idx=1 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
547 while farray_tryget _ds _ds_tree ${_idx}; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
548 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
|
549 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
|
550 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
551 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
552 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
553 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
554 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
555 farray_create _cloned_datasets |
|
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
556 falist_create _local_props |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
557 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
558 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
559 # 1. Clone with "safe" canmount settings |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
560 # |
|
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 _idx=1 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
563 while farray_tryget _ds _ds_tree ${_idx}; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
564 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
565 _ds_relname="${_ds#${_ds_source_base}}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
566 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
567 # 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
|
568 _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
|
569 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
570 falist_clear _local_props |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
571 while IFS=$'\t' read -r _prop _propval ; do |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
572 falist_set _local_props "${_prop}" "${_propval}" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
573 done <<EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
574 $(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
|
575 EOF_ce8c76187f33471f8e8c1607ed09c42e |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
576 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
577 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
578 # - "zfs clone" does NOT copy/clone properties. |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
579 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
580 # Clones inherit their properties from the target filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
581 # 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
|
582 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
583 if [ "${_ds_canmount}" = "off" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
584 _arg_canmount="-o canmount=off" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
585 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
586 _arg_canmount="-o canmount=noauto" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
587 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
588 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
589 # 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
|
590 _arg_other_clone_props="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
591 _idx_lp=1 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
592 while falist_tryget_key_at_index _prop _local_props ${_idx_lp}; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
593 if [ "${_prop}" = "mountpoint" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
594 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
595 continue |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
596 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
597 if [ "${_prop}" = "canmount" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
598 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
599 continue |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
600 fi |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
601 falist_tryget_value_at_index _propvalue _local_props ${_idx_lp} |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
602 _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
|
603 _idx_lp=$((${_idx_lp} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
604 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
605 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
606 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
607 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
|
608 if zfs clone ${_arg_canmount} ${_arg_other_clone_props} "${_ds}@${_snapshot_name}" "${_ds_dest}${_ds_relname}"; then |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
609 farray_append _cloned_datasets "${_ds_dest}${_ds_relname}" |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
610 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
|
611 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
|
612 _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
|
613 fi |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
614 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
615 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
616 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
617 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
|
618 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
619 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
620 done |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
621 |
|
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 # 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
|
624 # also handle canmount. |
|
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 _idx=1 |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
627 while farray_tryget _ds _ds_tree ${_idx}; do |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
628 # Determine the relative name of the dataset |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
629 _ds_relname="${_ds#${_ds_source_base}}" |
|
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 # 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
|
632 _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
|
633 # Local mountpoint |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
634 _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
|
635 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
636 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
|
637 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
638 # 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
|
639 # already set to "off". |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
640 # |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
641 _arg_canmount="" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
642 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
643 _arg_canmount="-o canmount=${_ds_canmount}" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
644 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
645 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
646 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
|
647 if ! checkyes _opt_dry_run; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
648 # 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
|
649 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
650 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
|
651 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
|
652 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
653 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
|
654 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
|
655 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
656 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
657 # 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
|
658 if [ -n "${_ds_mountpoint}" ]; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
659 echo "Would execute: zfs set -u ${_arg_canmount} mountpoint='${_ds_mountpoint}' '${_ds_dest}${_ds_relname}'" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
660 else |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
661 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
|
662 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
663 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
664 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
665 _idx=$((${_idx} + 1)) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
666 done |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
667 farray_destroy _cloned_datasets |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
668 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
669 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
670 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
671 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
672 #: |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
673 #: Implement the "create-tree" command |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
674 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
675 #: 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
|
676 #: |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
677 command_create_tree() { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
678 local _source_ds _target_ds |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
679 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
|
680 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
681 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
|
682 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
683 _opt_noauto="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
684 _opt_dry_run="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
685 _opt_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
686 _opt_nomount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
687 _opt_canmount_parent_only="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
688 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
689 while getopts "AM:npu" _opt ; do |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
690 case ${_opt} in |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
691 A) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
692 _opt_noauto="-o canmount=noauto" |
|
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 M) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
695 _opt_mountpoint="${OPTARG}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
696 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
697 n) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
698 _opt_dry_run="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
699 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
700 p) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
701 _opt_canmount_parent_only="yes" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
702 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
703 u) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
704 _opt_nomount="-u" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
705 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
706 \?|:) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
707 return 2; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
708 ;; |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
709 esac |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
710 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
711 shift $((OPTIND-1)) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
712 OPTIND=1 |
|
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 _source_ds="${1-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
715 _target_ds="${2-}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
716 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
717 [ -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
|
718 [ -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
|
719 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
720 _source_name="${_source_ds%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
721 if [ "${_source_name}" != "${_source_ds}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
722 _snapshot_name="${_source_ds##*@}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
723 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
724 _snapshot_name="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
725 fi |
|
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 [ -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
|
728 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
729 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
|
730 | { |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
731 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
|
732 # Determine the relative name of the dataset |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
733 _relative_name="${_current_name#${_source_name}}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
734 _relative_name="${_relative_name%@*}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
735 if [ "${_current_type}" != "filesystem" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
736 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
|
737 return 1 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
738 fi |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
739 _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
|
740 if [ -z "${_relative_name}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
741 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
742 # Root |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
743 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
744 if [ -z "${_opt_noauto}" ]; then |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
745 _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
|
746 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
747 _zfs_canmount="${_opt_noauto}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
748 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
749 if [ -n "${_opt_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
750 _zfs_mountpoint="${_opt_mountpoint}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
751 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
752 _zfs_mountpoint="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
753 fi |
|
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 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
756 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
757 echo "Would call: zfs create ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} ${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
758 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
759 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
|
760 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
761 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
762 if [ -z "${_zfs_mountpoint}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
763 zfs create -v ${_opt_nomount} ${_zfs_opts} ${_zfs_canmount} "${_target_ds}${_relative_name}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
764 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
765 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
|
766 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
767 fi |
|
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 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
770 # Children |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
771 # |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
772 if [ -z "${_opt_noauto}" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
773 if [ "${_opt_canmount_parent_only}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
774 _zfs_canmount="" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
775 else |
|
441
f06998866c01
Renamed local helper function
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
776 _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
|
777 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
778 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
779 _zfs_canmount="${_opt_noauto}" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
780 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
781 if [ "${_opt_dry_run}" = "yes" ]; then |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
782 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
|
783 else |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
784 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
|
785 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
786 fi |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
787 done |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
788 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
789 return 0 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
790 } |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
791 |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
792 |
|
520
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 #: Helper to destroy some created ZFS filesystems |
|
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 #: Args: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
797 #: $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
|
798 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
799 #: Returns: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
800 #: 0 if successfully destroyed all given datasets, |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
801 #: 1 otherwise |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
802 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
803 #: Destruction is done in the reverse order. |
|
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 _destroy_datasets() { |
|
539
f6dc405ddd58
fzfs: switch to farray.sh
Franz Glasner <fzglas.hg@dom66.de>
parents:
538
diff
changeset
|
806 farray_reversed_for_each "$1" _destroy_datasets_destroy |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
807 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
808 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
809 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
810 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
811 #: Array callback to destroy a single ZFS filesystem |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
812 #: |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
813 _destroy_datasets_destroy() { |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
814 if ! zfs destroy -v "$3" ; then |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
815 warn "Dataset \`${3}' cannot unmounted" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
816 return 1 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
817 fi |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
818 return 0 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
819 } |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
820 |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
821 |
|
276
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 # 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
|
824 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
825 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
|
826 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
|
827 V) |
|
408
bb0a0384b5da
FIX: Program name in fzfs's version string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
386
diff
changeset
|
828 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
|
829 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
830 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
831 h) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
832 echo "${USAGE}" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
833 exit 0 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
834 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
835 \?) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
836 exit 2; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
837 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
838 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
839 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
|
840 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
841 esac |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
842 done |
|
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 # 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
|
845 # 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
|
846 # |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
847 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
|
848 OPTIND=1 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
849 |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
850 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
|
851 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
852 command="$1" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
853 shift |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
854 |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
855 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
|
856 mount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
857 command_mount "$@" |
|
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 umount|unmount) |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
860 command_umount "$@" |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
861 ;; |
|
520
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
862 clone-tree) |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
863 command_clone_tree "$@" |
|
7d08fd78775c
fzfs: implement "fzfs clone-tree".
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
864 ;; |
|
421
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
865 copy-tree) |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
866 command_copy_tree "$@" |
|
a571a30bcf8a
Begin the implementation of "fzfs copy-tree"
Franz Glasner <hg@dom66.de>
parents:
408
diff
changeset
|
867 ;; |
|
380
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
868 create-tree) |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
869 command_create_tree "$@" |
|
6be930eb7490
Implement the "fzfs create-tree" command
Franz Glasner <fzglas.hg@dom66.de>
parents:
283
diff
changeset
|
870 ;; |
|
276
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
871 *) |
|
497
eb42828c0cbf
Use the new output routinges for errors in fzfs' global error handling
Franz Glasner <fzglas.hg@dom66.de>
parents:
492
diff
changeset
|
872 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
|
873 ;; |
|
3c24b07240f2
Move the implementation of "mount" and "umount" into the new tool fzfs.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
874 esac |
