treewide: change email
[feed/packages.git] / utils / uvol / files / autopart.defaults
1 #!/bin/sh
2
3 . /lib/functions.sh
4 . /lib/upgrade/common.sh
5 . /usr/share/libubox/jshn.sh
6
7 OWRT_VOLUMES=owrt-volumes
8
9
10 get_partition_by_name_gpt() {
11 local dev="$1"
12 local part parts node name
13 json_load "$(sfdisk -J "/dev/$dev" 2>/dev/null)"
14 json_select "partitiontable" || return
15 json_select "partitions" || return
16 json_get_keys parts
17 for part in $parts; do
18 json_select "$part"
19 json_get_vars node name
20 if [ "$2" = "$name" ]; then
21 echo "$node"
22 break
23 fi
24 json_select ..
25 done
26 }
27
28 part_fixup() {
29 echo "write" | sfdisk --force -q -w never "$1"
30 }
31
32 get_free_area() {
33 local found=
34 sfdisk -q -F "$1" 2>/dev/null | while read -r start end sectors size; do
35 case $start in
36 *"Unpartitioned"* | *"Units:"* | *"Sector"* | *"Start"* )
37 continue
38 ;;
39 [0-9]*)
40 case "$size" in
41 *"M")
42 [ "${size%%M}" -lt 100 ] && continue
43 ;;
44 *"G" | *"T")
45 ;;
46 *"k" | *"b")
47 continue
48 ;;
49 esac
50 [ "$found" ] || echo "start=$start, size=$((end - start))"
51 found=1
52 ;;
53 esac
54 done
55 }
56
57 create_lvm_part() {
58 local disk="$1"
59 local freepart
60
61 freepart="$(get_free_area "$disk")"
62 if [ "$freepart" ]; then
63 echo "$freepart, type=lvm, name=$OWRT_VOLUMES" | sfdisk --force -w never -a "$disk"
64 partx -a "$disk" 1>/dev/null 2>/dev/null || true
65 return 0
66 else
67 return 1
68 fi
69 }
70
71 lvm_init() {
72 lvm pvcreate -f "$1"
73 lvm vgcreate "$2" "$1"
74 lvm vgs
75 }
76
77 autopart_init() {
78 local diskdev
79 local lvmpart
80 local diskserial diskhash
81
82 export_bootdevice && export_partdevice diskdev 0
83
84 [ "$diskdev" ] || return
85
86 [ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial="$(cat "/sys/class/block/$diskdev/device/serial")"
87 [ -e "/sys/class/block/$diskdev/device/cid" ] && diskserial="$diskserial$(cat "/sys/class/block/$diskdev/device/cid")"
88 [ "$diskserial" ] || diskserial="$(cat /proc/sys/kernel/random/uuid)"
89 diskhash="$(echo "$diskserial" | sha256sum | cut -d' ' -f1)"
90 part_fixup "/dev/$diskdev"
91 create_lvm_part "/dev/$diskdev" || return
92 lvmpart="$(get_partition_by_name_gpt "$diskdev" "$OWRT_VOLUMES")"
93
94 [ "$lvmpart" ] || return
95 lvm_init "$lvmpart" "${OWRT_VOLUMES}-${diskhash:0:16}"
96 }
97
98 autopart_init
99 exit 0