blob: b5704e8e3e6970a27b35c2ca35f4dc5f43516239 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
# /lib/rcscripts/addons/dm-crypt-start.sh
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/cryptsetup/files/dm-crypt-start.sh,v 1.5 2005/05/21 06:10:25 vapier Exp $
# Setup mappings for an individual mount/swap
#
# Note: This relies on variables localized in the main body below.
dm-crypt-execute-checkfs() {
local dev target ret
if [[ -n ${loop_file} ]] ; then
dev="/dev/mapper/${target}"
ebegin " Setting up loop device ${source}"
/sbin/losetup ${source} ${loop_file}
fi
if [[ -n ${mount} ]] ; then
target=${mount}
: ${options:='-c aes -h sha1'}
[[ -n ${key} ]] && : ${gpg_options:='-q -d'}
elif [[ -n ${swap} ]] ; then
target=${swap}
: ${options:='-c aes -h sha1 -d /dev/urandom'}
: ${pre_mount:='mkswap ${dev}'}
else
return
fi
if /bin/cryptsetup status ${target} | egrep -q '\<active:' ; then
einfo "dm-crypt mapping ${target} is already configured"
return
fi
splash svc_input_begin checkfs
ebegin "dm-crypt map ${target}"
if [[ -z ${key} ]] ; then
/bin/cryptsetup ${options} create ${target} ${source} >/dev/console </dev/console
ret=$?
eend ${ret} "failure running cryptsetup"
else
if type -p gpg >/dev/null ; then
ret=1
while [[ ${ret} -gt 0 ]] ; do
keystring=$(gpg ${gpg_options} ${key} 2>/dev/null </dev/console)
if [[ -z ${keystring} ]] ; then
ret=5
else
echo ${keystring} | /bin/cryptsetup ${options} create ${target} ${source}
ret=$?
fi
done
eend ${ret}
else
einfo "You have to install app-crypt/gpg first"
fi
fi
splash svc_input_end checkfs
if [[ ${ret} != 0 ]] ; then
cryptfs_status=1
else
if [[ -n ${pre_mount} ]] ; then
dev="/dev/mapper/${target}"
ebegin " Running pre_mount commands for ${target}"
eval "${pre_mount}" > /dev/null
ewend $? || cryptfs_status=1
fi
fi
}
# Run any post_mount commands for an individual mount
#
# Note: This relies on variables localized in the main body below.
dm-crypt-execute-localmount() {
local mount_point target
if [[ -n ${mount} && -n ${post_mount} ]] ; then
target=${mount}
else
return
fi
if ! /bin/cryptsetup status ${target} | egrep -q '\<active:' ; then
ewarn "Skipping unmapped target ${target}"
cryptfs_status=1
return
fi
mount_point=$(grep "/dev/mapper/${target}" /proc/mounts | cut -d' ' -f2)
if [[ -z ${mount_point} ]] ; then
ewarn "Failed to find mount point for ${target}, skipping"
cryptfs_status=1
fi
if [[ -n ${post_mount} ]] ; then
ebegin "Running post_mount commands for target ${target}"
eval "${post_mount}" >/dev/null
eend $? || cryptfs_status=1
fi
}
local cryptfs_status=0
local gpg_options key loop_file mount mountline options pre_mount post_mount source swap
if [[ -f /etc/conf.d/cryptfs ]] && [[ -x /bin/cryptsetup ]] ; then
ebegin "Setting up dm-crypt mappings"
while read mountline ; do
# skip comments and blank lines
[[ ${mountline}\# == \#* ]] && continue
# check for the start of a new mount/swap
case ${mountline} in
mount=*|swap=*)
# If we have a mount queued up, then execute it
dm-crypt-execute-${myservice}
# Prepare for the next mount/swap by resetting variables
unset gpg_options key loop_file mount options pre_mount post_mount source swap
;;
gpg_options=*|key=*|loop_file=*|options=*|pre_mount=*|post_mount=*|source=*)
if [[ -z ${mount} && -z ${swap} ]] ; then
ewarn "Ignoring setting outside mount/swap section: ${mountline}"
continue
fi
;;
*)
ewarn "Skipping invalid line in /etc/conf.d/cryptfs: ${mountline}"
;;
esac
# Queue this setting for the next call to dm-crypt-execute-${myservice}
eval "${mountline}"
done < /etc/conf.d/cryptfs
# If we have a mount queued up, then execute it
dm-crypt-execute-${myservice}
ewend ${cryptfs_status} "Failed to setup dm-crypt devices"
fi
# vim:ts=4
|