Only set device to read-only if parent is also read-only
[grml-udev-config.git] / scripts / forensic-mark-readonly
1 #!/bin/sh
2 # Filename:      forensic-mark-readonly
3 # Purpose:       force device to readonly mode when booting with bootoption forensic/readonly
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2 or any later version.
7 ################################################################################
8
9 function get_blockdev_dir() {
10     for dir in /sys/subsystem/block/ /sys/class/block/ /sys/block/ ; do
11         [ -d $dir ] && echo $dir && return
12     done
13 }
14
15 function base() {
16     echo ${1##*/}
17 }
18 function dir() {
19     echo ${1%/*}
20 }
21
22 function is_ro() {
23     [ "$(blockdev --getro $1)" = "1" ] && return 0 || return 1
24
25
26 }
27 # check for forensic/readonly bootoption
28 if : ; then
29  # we get $DEVNAME via udev's environment
30  if [ -n "$DEVNAME" ] ; then
31     NAME=$(base $DEVNAME)
32     SYS_DIR=$(get_blockdev_dir)
33
34     if [ -n $SYS_DIR ] && [ -n $NAME ] ; then
35         DEVICE=$SYS_DIR/*/$NAME
36         if [ -d $DEVICE ] ; then
37             PARENT=$(dir $DEVICE)
38             PARENT=$(base $PARENT)
39             PARENT=/dev/$PARENT
40         fi
41     fi
42
43    if is_ro "$DEVNAME" ; then
44      logger "forensic mode: device $DEVNAME already set to readonly mode, nothing to do"
45    elif [ -n "$PARENT" ] && ! is_ro "$PARENT" ; then
46      logger "forensic mode: parent device $PARENT is set readwrite, not modifying"
47      logger "forensic mode: use blockdev --setro $DEVNAME to set it manually"
48    else
49      logger "forensic mode: setting $DEVNAME [$ID_SERIAL] to readonly"
50      if blockdev --setro "$DEVNAME" ; then
51        logger "|-> done; execute 'blockdev --setrw $DEVNAME' to unlock"
52      else
53        logger "|-> error while executing blockdev: $(blockdev --setro $DEVNAME 2>&1)"
54      fi
55    fi
56  fi
57 fi
58
59 ## END OF FILE #################################################################