comparison bin/fjail @ 73:2e991a00035b

Creation of Jail datasets done
author Franz Glasner <hg@dom66.de>
date Thu, 15 Aug 2019 15:31:28 +0200
parents 929051be7845
children 247d35f910ca
comparison
equal deleted inserted replaced
72:929051be7845 73:2e991a00035b
1 #!/bin/sh 1 #!/bin/sh
2 # -*- indent-tabs-mode: nil; -*- 2 # -*- indent-tabs-mode: nil; -*-
3 # @(#)$HGid$ 3 # @(#)$HGid$
4 4
5 VERSION=@@VERSION@@ 5 set -e
6
7 VERSION="@@VERSION@@"
8
9 # Reset to standard umask
10 umask 0022
11
12 #
13 # "datasets" -- create the ZFS dataset tree
14 #
15 # command_datasets parent-dataset child-dataset
16 #
17 command_datasets() {
18 # parent ZFS dataset -- child ZFS dataset name
19 local _pds _cds
20 # and its mount point
21 local _pmp _get _dummy
22 # full name of the dataset
23 local _ds
24
25 _pds="$1"
26 if [ -z "${_pds}" ]; then
27 echo "ERROR: no parent dataset given" >&2
28 return 2
29 fi
30 _get=$(zfs get -H mountpoint "${_pds}" 2>/dev/null) || { echo "ERROR: dataset \`${_pds}' does not exist" >&2; return 1; }
31 IFS=$'\t' read _dummy _dummy _pmp _dummy <<EOF
32 ${_get}
33 EOF
34 case "${_pmp}" in
35 none)
36 echo "ERROR: dataset \`${_pds}' has no mountpoint" >&2
37 return 1
38 ;;
39 legacy)
40 echo "ERROR: dataset \`${_pds}' has a \`${_mp}' mountpoint" >&2
41 return 1
42 ;;
43 *)
44 # VOID
45 ;;
46 esac
47 _cds="$2"
48 if [ -z "${_cds}" ]; then
49 echo "ERROR: no child dataset given" >&2
50 return 2
51 fi
52 _ds="${_pds}/${_cds}"
53 echo "Resulting new root dataset is \`${_ds}' at mountpoint \`${_pmp}/${_cds}'"
54 if zfs get -H mountpoint "${_ds}" >/dev/null 2>/dev/null; then
55 echo "ERROR: dataset \`${_ds}' does already exist" >&2
56 return 1
57 fi
58 zfs create -o atime=off "${_ds}"
59 zfs create -o sync=disabled -o setuid=off "${_ds}/tmp"
60 zfs create "${_ds}/usr"
61 zfs create "${_ds}/var"
62 zfs create -o exec=off -o setuid=off "${_ds}/var/audit"
63 zfs create -o exec=off -o setuid=off "${_ds}/var/cache"
64 zfs create -o exec=off -o setuid=off -o compression=off "${_ds}/var/cache/pkg"
65 zfs create -o exec=off -o setuid=off -o compression=off "${_ds}/var/crash"
66 zfs create -o exec=off -o setuid=off "${_ds}/var/db"
67 zfs create -o exec=on -o setuid=off "${_ds}/var/db/pkg"
68 zfs create -o readonly=on -o exec=off -o setuid=off "${_ds}/var/empty"
69 zfs create -o exec=off -o setuid=off -o primarycache=metadata "${_ds}/var/log"
70 zfs create -o exec=off -o setuid=off -o atime=on "${_ds}/var/mail"
71 zfs create -o sync=disabled -o exec=off -o setuid=off -o compression=off -o primarycache=all "${_ds}/var/run"
72 zfs create -o sync=disabled -o setuid=off "${_ds}/var/tmp"
73 }
74
75 #
76 # "privs" -- adjust privileges
77 #
78 # To be used when all ZFS datasets are mounted.
79 #
80 command_privs() {
81 # mountpoint
82 local _mp _d
83
84 _mp="$1"
85 if [ -z "${_mp}" ]; then
86 echo "ERROR: no mountpoint given" >&2
87 return 2
88 fi
89 if [ ! -d "${_mp}" ]; then
90 echo "ERROR: directory \`${_mp}' does not exist" >&2
91 return 1
92 fi
93 for _d in tmp var/tmp ; do
94 chmod 01777 "${_mp}/${_d}"
95 done
96 chown root:mail "${_mp}/var/mail"
97 chmod 0775 "${_mp}/var/mail"
98 }
6 99
7 # 100 #
8 # Global option handling 101 # Global option handling
9 # 102 #
10 while getopts "h" _opt ; do 103 while getopts "h" _opt ; do
11 case ${_opt} in 104 case ${_opt} in
12 h) 105 h)
13 echo "Usage:" 106 echo "Usage: XXX TBD"
14 exit 0 107 exit 0
15 ;; 108 ;;
16 \?|:) 109 \?|:)
17 exit 2; 110 exit 2;
18 ;; 111 ;;
28 121
29 command="$1" 122 command="$1"
30 shift 123 shift
31 124
32 case "${command}" in 125 case "${command}" in
126 datasets)
127 command_datasets "$@"
128 ;;
129 privs)
130 command_privs "$@"
131 ;;
33 test) 132 test)
34 echo "TEST" 133 echo "TEST"
35 ;; 134 ;;
36 *) 135 *)
37 echo "ERROR" >&2 136 echo "ERROR" >&2