~elementary-os/ubuntu-package-imports/ubiquity-bionic

« back to all changes in this revision

Viewing changes to d-i/source/debian-installer-utils/list-devices-linux

  • Committer: RabbitBot
  • Date: 2018-02-05 14:44:42 UTC
  • Revision ID: rabbitbot@elementary.io-20180205144442-vt0fvth7zus90wjh
Initial import, version 17.10.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /bin/sh
 
2
set -e
 
3
TYPE="$1"
 
4
 
 
5
case $TYPE in
 
6
    maybe-floppy)
 
7
        logger -t list-devices "deprecated parameter maybe-floppy"
 
8
        TYPE=floppy
 
9
        ;;
 
10
    cd|disk|partition|floppy|maybe-usb-floppy|usb-partition|mmc-partition) ;;
 
11
    *)
 
12
        echo "Usage: $0 cd|disk|partition|floppy|maybe-usb-floppy|usb-partition|mmc-partition" >&2
 
13
        exit 2
 
14
        ;;
 
15
esac
 
16
 
 
17
if [ ! -d /sys/block ]; then
 
18
        exit 0
 
19
fi
 
20
if type udevadm >/dev/null 2>&1; then
 
21
        device_info () {
 
22
                udevadm info -q "$1" -p "$2" 2>/dev/null
 
23
        }
 
24
elif type udevinfo >/dev/null 2>&1; then
 
25
        device_info () {
 
26
                udevinfo -q "$1" -p "$2" 2>/dev/null
 
27
        }
 
28
else
 
29
        exit 0
 
30
fi
 
31
 
 
32
device_name () {
 
33
        local name
 
34
        if ! name="$(device_info name "$1")"; then
 
35
                name="$(printf %s "${1##*/}" | \
 
36
                        sed 's,!,/,g')"
 
37
        fi
 
38
        echo "/dev/$name"
 
39
}
 
40
 
 
41
is_sataraid () {
 
42
        grep -qs ^DMRAID- "$1/dm/uuid"
 
43
}
 
44
 
 
45
is_sataraid_partition () {
 
46
        # dmraid partitions are always slaved to another dm device
 
47
        for slave in "$1"/slaves/dm-*; do
 
48
                if [ -e "$slave" ]; then
 
49
                        return 0
 
50
                fi
 
51
        done
 
52
        return 1
 
53
}
 
54
 
 
55
if type dmraid >/dev/null 2>&1; then
 
56
        raiddevs="$(dmraid -r -c || true)"
 
57
else
 
58
        raiddevs=
 
59
fi
 
60
 
 
61
# cloned-and-hacked from partman-base/init.d/parted
 
62
part_of_sataraid () {
 
63
        local raiddev
 
64
        for raiddev in $raiddevs; do
 
65
                if [ "$(readlink -f "$raiddev")" = "$1" ]; then
 
66
                        return 0
 
67
                fi
 
68
        done
 
69
        return 1
 
70
}
 
71
 
 
72
syspaths=
 
73
scan_partition=false
 
74
case $TYPE in
 
75
    partition)
 
76
        for x in /sys/block/*/*[0-9]; do
 
77
                [ -d "$x" ] || continue
 
78
                syspaths="${syspaths:+$syspaths }$x"
 
79
        done
 
80
        for x in /sys/block/dm-*; do
 
81
                [ -d "$x" ] || continue
 
82
                (is_sataraid "$x" && is_sataraid_partition "$x") || continue
 
83
                syspaths="${syspaths:+$syspaths }$x"
 
84
        done
 
85
        TYPE=disk
 
86
        # Also allow misdetected USB devices
 
87
        scan_partition=:
 
88
        ;;
 
89
    usb-partition|mmc-partition)
 
90
        for x in /sys/block/*/*; do
 
91
                [ -d "$x" ] || continue
 
92
                syspaths="${syspaths:+$syspaths }$x"
 
93
        done
 
94
        ;;
 
95
    *)
 
96
        for x in /sys/block/*; do
 
97
                [ -d "$x" ] || continue
 
98
                case $x in
 
99
                    /sys/block/dm-*)
 
100
                        if is_sataraid "$x" && is_sataraid_partition "$x"; then
 
101
                                continue
 
102
                        fi
 
103
                        ;;
 
104
                    *)
 
105
                        name="$(device_name "$x")"
 
106
                        if part_of_sataraid "$name"; then
 
107
                                continue
 
108
                        fi
 
109
                        ;;
 
110
                esac
 
111
                syspaths="${syspaths:+$syspaths }$x"
 
112
        done
 
113
        ;;
 
114
esac
 
115
for x in $syspaths; do
 
116
        devpath="${x#/sys}"
 
117
        match=false
 
118
        case $TYPE in
 
119
            floppy)
 
120
                # TODO ugly special case for non-IDE floppies
 
121
                case $devpath in
 
122
                    /block/fd[0-9]*)
 
123
                        match=:
 
124
                        ;;
 
125
                esac
 
126
                ;;
 
127
        esac
 
128
        if ! $match && [ "$TYPE" = cd ]; then
 
129
                if device_info env "$devpath" | grep -q '^ID_CDROM='; then
 
130
                        match=:
 
131
                fi
 
132
        fi
 
133
        if ! $match; then
 
134
                if device_info env "$devpath" | grep -q "^ID_TYPE=$TYPE"; then
 
135
                        match=:
 
136
                fi
 
137
        fi
 
138
        if ! $match && [ "$TYPE" = disk ]; then
 
139
                case $devpath in
 
140
                    /block/cciss\!*|/block/ida\!*|/block/rd\!*|/block/nvme*|/block/mmcblk*|/block/vd[a-z]*|/block/xvd[a-z]*)
 
141
                        match=:
 
142
                        ;;
 
143
                    /block/dm-*)
 
144
                        # for now, we only understand dmraid
 
145
                        if is_sataraid "/sys$devpath"; then
 
146
                                match=:
 
147
                        fi
 
148
                        ;;
 
149
                esac
 
150
        fi
 
151
        # Some USB sticks and CD drives are misdetected as floppy
 
152
        # This allows to scan for those
 
153
        if ! $match && ( $scan_partition || [ "$TYPE" = maybe-usb-floppy ] ); then
 
154
                if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \
 
155
                   device_info env "$devpath" | grep -q '^ID_TYPE=floppy'; then
 
156
                        match=:
 
157
                fi
 
158
        fi
 
159
        # Disk partitions, but only on USB drives
 
160
        if ! $match && [ "$TYPE" = usb-partition ]; then
 
161
                if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \
 
162
                   device_info env "$devpath" | grep -q '^ID_TYPE=disk'; then
 
163
                        match=:
 
164
                fi
 
165
        fi
 
166
        # Disk partitions, but only on (non-USB) MMC devices
 
167
        if ! $match && [ "$TYPE" = mmc-partition ]; then
 
168
                if device_info env "$devpath" | egrep -q '^ID_PATH=(platform-mmc|platform-orion-ehci|platform-mxsdhci|platform-omap)'; then
 
169
                        match=:
 
170
                fi
 
171
        fi
 
172
        if $match && ! device_info env "$devpath" | egrep -q '^ID_PART_ENTRY_TYPE=0x(5|f|85)$'; then
 
173
                device_name "/sys$devpath"
 
174
        fi
 
175
done