File: scsi_ch_swp

package info (click to toggle)
sdparm 1.10-1
  • links: PTS
  • area: main
  • in suites: bullseye, buster
  • size: 1,716 kB
  • sloc: ansic: 20,059; sh: 5,329; makefile: 168
file content (140 lines) | stat: -rwxr-xr-x 4,092 bytes parent folder | download | duplicates (2)
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
#!/bin/bash
# scsi_ch_swp
#
# Script to change the Software Read Protect (SWP) state of a disk in Linux.
# When '-s <n>' (or '--set <n>') is not given then read SWP state.
#
# Uses sdparm and blockdev utilities.
#
# Douglas Gilbert 20130606


rdonly="--readonly"
swp="-1"
verbose=""
bdverbose=""

usage()
{
    echo "Usage: scsi_ch_swp [-h] [-s 0|1] [-v] [-w] <blk_device>"
    echo "  where:"
    echo "    -h, --help           print usage message"
    echo "    -s 0|1, --set 0|1    where:"
    echo "                           0  - clear SWP and set RW mode"
    echo "                           1  - set SWP and set RO mode"
    echo "                                (default: read SWP and get RO flag)"
    echo "    -v, --verbose        more verbose, show commands invoked"
    echo "    -w, --wr             access <blk_device> read-write when '-s 0'"
    echo "                         (default: access read-only in this case)"
    echo ""
    echo "Access the Software Write Protect (SWP) bit in the SCSI control"
    echo "mode page and if changed adjust the Linux block device (e.g."
    echo "/dev/sdc) settings accordingly. If supported, when the SWP bit"
    echo "is set (1) the device is read-only; when clear (0) the device"
    echo "is read-write (i.e. its contents can be read and changed)."
    echo "When no options given it reads SWP and gets blockdev's RO flag."
}

opt="$1"
while test ! -z "$opt" -a -z "${opt##-*}"; do
    opt=${opt#-}
    case "$opt" in
        h|-help) usage ; exit 0 ;;
        s|-set) shift ; let swp=$1 ;;
        v|-verbose) verbose="-v" ;;
        w|-wr) rdonly="" ;;
        vv) verbose="-vv" ;;
        vvv) verbose="-vvv" ;;
        *) echo "Unknown option: -$opt " ; exit 1 ;;
    esac
    shift
    opt="$1"
done

if [ $# -lt 1 ] ; then
    echo "Need at least a <blk_device> argument."
    echo ""
    usage
    exit 1
fi 

if [ ${verbose} ] ; then
    bdverbose="-v"
fi

if ( which sdparm >/dev/null 2>&1 ) ; then
    true
else
    echo "sdparm not found"
    sdparm ${rdonly} ${verbose}
fi

if ( which blockdev >/dev/null 2>&1 ) ; then
    true
else
    echo "blockdev not found"
    blockdev
fi

if [ $swp -lt 0 ] ; then
    if [ ${verbose} ] ; then
        echo sdparm --quiet ${rdonly} ${verbose} --get=SWP=1 $1
    fi
    sdparm --quiet ${rdonly} ${verbose} --get=SWP=1 $1
    if [ ${bdverbose} ] ; then
        echo "blockdev --getro ${bdverbose} $1"
    fi
    echo -n "blockdev's RO flag: "
    blockdev --getro ${bdverbose} $1
elif [ $swp = "0" ] ; then
    if [ ${verbose} ] ; then
        echo sdparm --quiet ${rdonly} ${verbose} --clear=SWP $1
    fi
    sdparm --quiet ${rdonly} ${verbose} --clear=SWP $1
    res=$?
    if [ $res -ne 0 ] ; then
        exit $res
    fi
    if [ ${bdverbose} ] ; then
        echo blockdev --setrw ${bdverbose} $1
    fi
    blockdev --setrw ${bdverbose} $1
    # res=$?
    # if [ $res -ne 0 ] ; then
        # exit $res
    # fi
    ## There is still some uncertainity whether calling blockdev --rereadpt
    ## is needed or defeats this operation. Feedback please.
    # # Need to re-read partition table before --setro takes effect
    # if [ ${bdverbose} ] ; then
        # echo blockdev --rereadpt ${bdverbose} $1
    # fi
    # blockdev --rereadpt ${bdverbose} $1
elif [ $swp = "1" ] ; then
    if [ ${verbose} ] ; then
        echo sdparm --quiet ${verbose} --set=SWP $1
    fi
    sdparm --quiet ${verbose} --set=SWP $1
    res=$?
    if [ $res -ne 0 ] ; then
        exit $res
    fi
    if [ ${bdverbose} ] ; then
        echo blockdev --setro ${bdverbose} $1
    fi
    blockdev --setro ${bdverbose} $1
    # res=$?
    # if [ $res -ne 0 ] ; then
        # exit $res
    # fi
    ## There is still some uncertainity whether calling blockdev --rereadpt
    ## is needed or defeats this operation. Feedback please.
    # # Need to re-read partition table before --setrw takes effect
    # if [ ${bdverbose} ] ; then
        # echo blockdev --rereadpt ${bdverbose} $1
    # fi
    # blockdev --rereadpt ${bdverbose} $1
else
    echo "option --set ${swp} is invalid"
    exit 1
fi