summaryrefslogtreecommitdiff
path: root/backend/modules/partitions
blob: 0d59323836656ac42b8757a5cc1fae9a7c118665 (plain)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#!/bin/bash

# Synopsis: list_all_disks
#
# This function lists all disks
# Output example:
#   /dev/sda
#   /dev/sdb
function list_all_disks()
{
	awk -vli="$(awk '{if($2=="sd") print $1;}' /proc/devices)" 'BEGIN{m=split(li,list," ")}{for(i=1;i<=m;i++) if($1==list[i]&&$2%16==0) print "/dev/"$4;}' /proc/partitions
}

# Synopsis: send_list_of_disks
#
# This script sends a list of all disks with size-details to the frontend.
# Output example:
#   <installer data> list_of_disks
#   /dev/sda 10001908224
#   /dev/sdb 64023257088
function send_list_of_disks()
{
	send data list_of_disks
	list_all_disks | partitions_size_details
}

# Synopsis: list_all_partitions
#
# This function lists all partitions from all disks
# Output example:
#   /dev/sda1
#   /dev/sda2
#   /dev/sdb5
function list_all_partitions()
{
	awk -vli="$(awk '{if($2=="sd") print $1;}' /proc/devices)" 'BEGIN{m=split(li,list," ")}{for(i=1;i<=m;i++) if($1==list[i]&&$2%16!=0) print "/dev/"$4;}' /proc/partitions
}

# Synopsis: (e.g.) list_all_partitions | partitions_usage_details
#
# This function lists usage details for a list of partitions from STDIN
# Output example:
#   /dev/sda1 filesystem reiserfs
#   /dev/sda2 filesystem ext3
#   /dev/sda3 other swap
function partitions_usage_details()
{
        while read part x
	do
		[ -e "$part" ] || continue
                ID_FS_USAGE="$(/sbin/blkid -p -s USAGE -o value "$part")"
                [ "$ID_FS_USAGE" ] || continue
                ID_FS_TYPE="$(/sbin/blkid -p -s TYPE -o value "$part")"
		echo "$part $ID_FS_USAGE $ID_FS_TYPE"
        done
}

# Synopsis: (e.g.) list_all_partitions | partitions_size_details
#
# This function lists size details for a list of partitions from STDIN
# Output example:
#   /dev/sda 64023257088 
#   /dev/sda1 10001908224
function partitions_size_details()
{
        while read part x
	do
		[ -e "$part" ] || continue
		echo "$part $(blockdev --getsize64 "$part")"
        done
}

# Synopsis: list_partitions [-type <filesystem>] [-disk <disk>] [-usage <usage>]
#
# This function lists all partitions that match all the given parameters
# Output example:
#   /dev/sda1
#   /dev/sda2
#   /dev/sdb5
function list_partitions()
{
        unset required_type required_disk;
        required_usage="filesystem"

        while [ "$1" ]
        do
                case $1 in
                -type)
                        required_type="$2";
                        shift
                        ;;
                -disk)
                        required_disk="$2";
                        shift
                        ;;
                -usage)
                        required_usage="$2";
                        shift
                        ;;
                esac
                shift
        done

        while IFS=" " read part usage type
        do
                if [ "$usage" = "$required_usage" ]; then
                        [ "$required_type" -a "$required_type" != "$(get_filesystem $part)" ] && continue
                        [ "$required_disk" ] && ! echo "$part" | grep -q "^$required_disk" && continue
                        echo $part
                fi
        done < <(list_all_partitions | partitions_usage_details)
}


# Synopsis: list_linux_partitions
#
# This function lists all partitions from the disks (by list_all_disks) which have partition Id 0x83 (= Linux)
# Output example:
#   /dev/sda4
#   /dev/sdb1
function list_linux_partitions()
{
    for disk in $(list_all_disks)
    do
        LC_ALL=C sfdisk -l "$disk" 2>/dev/null | sed 's/[*+]//g;' | gawk '/^\/dev/{if($6 == 83){print $1}}'
    done
}

# Synopsis: list_swap_partitions
#
# This function lists all partitions from the disks (by list_all_disks) which have partition Id 0x82 (= Linux swap)
# Output example:
#   /dev/sda4
#   /dev/sdb1
function list_swap_partitions()
{
    for disk in $(list_all_disks)
    do
        LC_ALL=C sfdisk -l "$disk" 2>/dev/null | sed 's/[*+]//g;' | gawk '/^\/dev/{if($6 == 82){print $1}}'
    done
}

# Synopsis: get_disk <partition>
#
# This function returns the disk containing the given partition
# Output example:
#   /dev/sda
function get_disk()
{
	path="$(udevadm info -q path -n "$1")"
	while [ "$path" ]
	do
		udevadm info -q env -p "$path" | grep -q "^DEVTYPE=disk$" && break
		path="$(dirname "$path")"
	done
	[ "$path" ] && udevadm info --root -q name -p "$path" && return 0
	return 1
}

# Synopsis: is_removeable <disk/partition>
#
# This function checks if a disk or partition is removeable (returncode 0) or not (returncode 1)
function is_removeable()
{
        DEV="$(get_disk "$1")"
        REM=$(cat /sys/block/${DEV#/dev/}/removable 2>/dev/null)
        case $(readlink -f /sys/block/${DEV#/dev}) in *usb*) REM=1; esac
        [ "$REM" = "1" ] && return 0 || return 1
}

# Synopsis: list_possible_root_partitions
#
# This script lists all possible root-partitions.
#   * all linux-partitions and all partitions that have a linux-filesystem
# Output example:
#   /dev/sda4
#   /dev/sdb1
function list_possible_root_partitions()
{
	( list_linux_partitions; list_partitions -type Linux ) | sort -u
}

# Synopsis: send_possible_root_partitions
#
# This script sends a list of all possible root-partitions with size-details to the frontend.
# Output example:
#   <installer data> possible_root_partitions
#   /dev/sda4 10001908224
#   /dev/sdb1 64023257088
function send_possible_root_partitions()
{
	send data possible_root_partitions
	list_possible_root_partitions | partitions_size_details
}

# Synopsis: send_possible_root_filesystems
#
# This script sends a list of all possible filesystems to format the root-partition with to the frontend.
# Output example:
#   <installer data> possible_root_filesystems
#   ext4
#   ext3
#   reiserfs
function send_possible_root_filesystems()
{
	send data possible_root_filesystems
	for fs in ext4 ext3 reiserfs xfs jfs; do echo $fs; done
}

# Synopsis: get_filesystem <device>
#
# This function returns the filesystem on the supplied device.
# Returned filesystem could be:
#   ext4, ext3, ext2, reiserfs, xfs, minix, hfs, efs, reiser4,
#   jfs, iso9660, vfat, ntfs, swap, oracleasm, jbd, gfs,
#   gfs2, vxfs, romfs, bfs, cramfs, qnx4, udf, ufs, hpfs,
#   sysv, swsuspend, ocfs, ocfs2
# Output example:
#   ext4
function get_filesystem()
{
        [ -x /sbin/blkid ] && /sbin/blkid -s TYPE -o value "$1"
}

# Synopsis: get_filesystem_type [-fs <filesystem>]|<device>
#
# This function returns the type of the filesystem on the supplied device (or filesystem).
# Returned type could be:
#   Linux, CD-ROM, Windows, Swap, (not recognized type -> filesystem)
# Output example:
#   Linux
function get_filesystem_type()
{
        if [ "$1" = "-fs" ]; then
                filesystem="$2"
        else
                filesystem="$(get_filesystem "$1")"
        fi
        case $filesystem in
        ext4|ext3|ext2|reiserfs|xfs|minix|hfs|efs|reiser4|jfs) echo Linux;;
        iso9660) echo CD-ROM;;
        vfat|ntfs) echo Windows;;
        swap) echo Swap;;
        *) echo "$filesystem";;
        esac
        # Other (not recognized) Filesystems:
        # oracleasm, jbd, gfs, gfs2, vxfs, romfs, bfs, cramfs,
        # qnx4, udf, ufs, hpfs, sysv, swsuspend, ocfs, ocfs2
}