summaryrefslogtreecommitdiff
path: root/package/utils/mdadm/files/mdadm.init
blob: e6624a776ed0f5d34bd09a85c499237159b56166 (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
#!/bin/sh /etc/rc.common

START=13
STOP=98

USE_PROCD=1
PROG=/sbin/mdadm
NAME=mdadm

CONF="/var/etc/mdadm.conf"

append_list_item() {
	append "$2" "$1" "$3"
}

append_option() {
	local var="$1"
	local cfg="$2"
	local opt="$3"
	local name="$4"
	local sep="$5"
	local str

	if [ -n "$sep" ]; then
		config_list_foreach "$cfg" "$opt" append_list_item str "$sep"
	else
		config_get str "$cfg" "$opt"
	fi

	[ -n "$str" ] && append "$var" $(printf "%s=%s" "${name:-${opt//_/-}}" "$str")
}

mdadm_common() {
	local cfg="$1"
	local email devices

	if [ -x /sbin/sendmail ]; then
		append_option email "$cfg" email "MAILADDR"

	fi

	append_option devices "$cfg" devices DEVICE " "

	printf "%s\n%s\n" "$email" "$devices" >> $CONF
}

mdadm_array() {
	local cfg="$1"
	local uuid device devices name array

	config_get uuid "$cfg" uuid
	config_get name "$cfg" name
	config_get device "$cfg" device

	if [ -z "$device" ] || [ -z "$uuid$name" ]; then
		echo "Skipping array without device, uuid or name" >&2
		return
	fi

	[ -n "$uuid" ] && append array "uuid=$uuid"
	[ -n "$name" ] && append array "name=$name"

	append_option array "$cfg" super_minor
	append_option array "$cfg" spares
	append_option array "$cfg" spare_group
	append_option array "$cfg" bitmap
	append_option array "$cfg" container
	append_option array "$cfg" member
	append_option array "$cfg" devices devices ","

	printf "ARRAY %s %s\n" "$device" "$array" >> $CONF
}

start_service() {
	local email

	mkdir -p "${CONF%/*}"
	printf "# Autogenerated from /etc/config/mdadm, do not edit!\n" > $CONF

	config_load mdadm
	config_foreach mdadm_common mdadm
	config_foreach mdadm_array array

	$PROG --assemble --scan --config="$CONF"

	procd_open_instance
	procd_set_param command "$PROG" --monitor --syslog --scan --config="$CONF"
	procd_close_instance
}

stop_service() {
	$PROG --stop --scan
}