3 #==============================================================================
5 # File ID: 0548a2d2-ea04-11ed-b5e0-83850402c3ce
7 # Mount a LUKS-encrypted disk under /media/
9 # Author: Øyvind A. Holm <sunny@sunbase.org>
10 # License: GNU General Public License version 2 or later.
11 #==============================================================================
20 while test -n "$1"; do
22 -a|
--all) opt_all
=1; shift ;;
23 -h|
--help) opt_help
=1; shift ;;
24 -q|
--quiet) opt_quiet
=$
(($opt_quiet + 1)); shift ;;
25 -u|
--umount) opt_umount
=1; shift ;;
26 -v|
--verbose) opt_verbose
=$
(($opt_verbose + 1)); shift ;;
27 --version) echo $progname $VERSION; exit 0 ;;
30 if printf '%s\n' "$1" |
grep -q ^
-; then
31 echo "$progname: $1: Unknown option" >&2
39 opt_verbose
=$
(($opt_verbose - $opt_quiet))
41 [ -e "$HOME/.mdiskrc" ] && .
"$HOME/.mdiskrc"
44 T_GREEN
=$
(tput setaf
2)
48 if test "$opt_help" = "1"; then
49 test $opt_verbose -gt 0 && { echo; echo $progname $VERSION; }
52 Mount a LUKS-encrypted disk under /media/.
54 Usage: $progname [options] DISKNAME
59 Loop through all directory names under /media/ and mount or unmount
60 all corresponding disks.
64 Be more quiet. Can be repeated to increase silence.
66 Increase level of verbosity. Can be repeated.
70 Print version information.
75 Full path to text file with passphrase for encrypted drives.
80 Init file. A regular shell script that can be used to initialize
81 environment variables and run commands before normal program
84 If this directory exists at the top of the disk, the disk is
85 prevented from sleeping. When a disk with this directory is mounted,
86 a background process is started that writes 512 random bytes to a
87 file in this directory every two minutes. The current user must have
88 write permission in this directory, otherwise sleeping is not
89 prevented. When the disk is unmounted with -u/--umount, the process
97 test $1 -gt $opt_verbose && return;
99 echo "$progname: $*" >&2
103 echo "$progname: $T_BOLD$T_RED$*$T_RESET" >&2
108 sudo cryptsetup status
$disk |
grep -q "/dev/mapper/$disk is active"
112 sudo blkid |
grep -q "LABEL=\"$1\"" && return 0
117 df |
grep -q "/media/$disk\$" && return 0
122 echo $
(echo "$1" |
sed 's.^/media/..; s./$..')
126 echo >$ds_script || err
$ds_dir/: Cannot
write to directory
, \
127 disk
sleep is not prevented
128 cat <<'END' >$ds_script
132 T_RED=$(tput setaf 1)
134 outfile=.dontsleep.bin
138 echo -n "$T_BOLD$T_RED$0: Cannot write pid file to $ds_dir," >&2
139 echo " unable to prevent sleep$T_RESET" >&2
143 head -c 512 /dev/urandom >>$outfile
152 msg
0 Preventing
$disk from sleeping
153 cd "$ds_dir" || err
$ds_dir: chdir error
154 (create_ds_script
&& sh
$ds_script $disk) &
160 pidfile
="$ds_dir/pid"
161 if [ ! -f "$pidfile" ]; then
162 echo $progname: PID
file $pidfile not found
>&2
169 if [ "$opt_all" = "1" ]; then
170 for f
in /media
/*; do
171 is_in_blkid $
(strip_diskname
$f) ||
continue
172 if [ "$opt_umount" = "1" ]; then
181 disk
=$
(strip_diskname
$1)
182 [ -z "$disk" ] && err No disk specified
184 is_in_blkid
$disk || err
$disk: Disk not found
in blkid
186 ds_dir
="/media/$disk/.dontsleep"
189 if [ "$opt_umount" != "1" ]; then
190 is_mounted
$disk && {
191 msg
0 $disk: Already mounted
194 device
=$
(blkid
-L $disk)
195 msg
1 device
= \"$device\"
196 [ -z "$device" ] && err Cannot get device
for $disk
197 echo "$device" |
grep -q ^
/dev
/ || err
$device: Malformed device name
199 || sudo cryptsetup luksOpen \
200 $
([ -n "$MDISK_KEY_FILE" ] && echo "--key-file $MDISK_KEY_FILE") \
201 $device $disk && mount
/media
/$disk
203 && msg
0 $T_BOLD$T_GREEN$disk mounted on
/media
/$disk$T_RESET \
204 || err
$disk: mount failed
205 [ -d "$ds_dir" ] && prevent_sleep
$disk
207 [ -d "$ds_dir" ] && kill_prevent
$disk
208 is_mounted
$disk && umount
/media
/$disk
209 [ -d "$ds_dir" ] && prevent_sleep
$disk
210 is_mounted
$disk && err
/media
/$disk: umount failed
211 sudo cryptsetup luksClose
$disk
213 is_active
$disk && err
$disk is still active
214 msg
0 $T_BOLD$T_GREEN$disk is unmounted and closed
$T_RESET
217 # vim: set ts=8 sw=8 sts=8 noet fo+=w tw=79 fenc=UTF-8 :