File: parted

package info (click to toggle)
partman-base 239
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,016 kB
  • sloc: sh: 2,351; ansic: 2,292; makefile: 33
file content (130 lines) | stat: -rwxr-xr-x 2,720 bytes parent folder | download
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
#!/bin/sh

set -e

. /usr/lib/partman/lib/base.sh

ORIG_IFS="$IFS"

is_inactive_md() {
	local number
	number=$(echo "$1" | sed -n -e 's,/dev/md/\?,,p')
	if [ "$number" ] && ! grep -q "^md$number : active" /proc/mdstat; then
		return 0
	fi
	return 1
}

part_of_mdraid () {
	local holder
	local dev=${1#/dev/}
	for holder in /sys/block/$dev/holders/*; do
		local mddev=${holder##*/}
		case "$mddev" in
			md[0-9]|md[0-9][0-9]|md[0-9][0-9][0-9])
				return 0
				;;
		esac
	done
	return 1
}

part_of_multipath() {
	local mpdev
	type multipath >/dev/null 2>&1 || return 1

	if is_multipath_part $1; then
		return 0
	fi
	# The block devices that make up the multipath:
	# Output looks like "(decoration-symbols) 4:0:0:1 sdc 8:32 ..."
	# (decoration-symbols are not matched; they may change again, and the spaces differ for last device)
	for mpdev in $(multipath -l | \
		       grep -o '\([#0-9]\+:\)\{3\}[#0-9]\+ [hs]d[a-z]\+ [0-9]\+:[0-9]\+' | \
		       cut -f2 -d' '); do
		if [ "$(readlink -f /dev/$mpdev)" = $1 ]; then
			return 0
		fi
	done
	return 1
}

if [ ! -f /var/run/parted_server.pid ]; then
	mkdir -p /var/run
	db_get partman/alignment
	PARTMAN_ALIGNMENT="$RET" parted_server
	RET=$?
	if [ $RET != 0 ]; then
		# TODO: How do we signal we couldn't start parted_server properly?
		exit $RET
	fi

	rm -rf /var/lib/partman/old_devices
	if [ -d $DEVICES ]; then
		mv $DEVICES /var/lib/partman/old_devices
	fi
	mkdir $DEVICES || true

	IFS="$NL"
	for partdev in $(parted_devices |
		sed 's,^/dev/\(ide\|scsi\|[hsuw]d\|md/\?[0-9]\+\),!/dev/\1,' |
		sort |
		sed 's,^!,,' ); do

		IFS="$TAB"
		set -- $partdev
		IFS="$ORIG_IFS"

		device=$1
		size=$2
		model=$3
		label=$4

		# Skip mtd (not supported by parted) and mmcblk odities
		case "${device#/dev/}" in
			mtd* | mmcblk?rpmb | mmcblk?boot? )
				continue
				;;
		esac

		# Skip MD devices which are not active
		if [ -e /proc/mdstat ]; then
			if is_inactive_md $device; then
				continue
			fi
		fi

		# Skip devices that are part of a mdraid device
		if part_of_mdraid $device; then
			continue
		fi

		# Skip devices that are part of a multipathed device
		if part_of_multipath $device; then
			continue
		fi

		dirname=$(echo $device | sed 's:/:=:g')
		dev=$DEVICES/$dirname
		if [ -d /var/lib/partman/old_devices/$dirname ]; then
			mv /var/lib/partman/old_devices/$dirname $dev
		else
			mkdir $dev || continue
		fi
		printf "%s" "$device" >$dev/device
		printf "%s" "$size" >$dev/size
		printf "%s" "$model" >$dev/model
		printf "%s" "$label" >$dev/label

		cd $dev
		open_dialog OPEN "$(cat $dev/device)"
		read_line response
		close_dialog
		if [ "$response" = failed ]; then
			cd /
			rm -rf $dev
		fi
	done

	rm -rf /var/lib/partman/old_devices
fi