summaryrefslogtreecommitdiff
blob: fa5832d113b8c5d5bb025e888cf5b9986453551c (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
#!/sbin/runscript

DESC="RBD Mapping:"
RBDMAPFILE="/etc/ceph/rbdmap"

extra_started_commands="reload"

depend() {
	need localmount net
	before netmount
}

start() {

	if [ ! -f "${RBDMAPFILE}" ]; then
		ewarn "$DESC : No ${RBDMAPFILE} found."
		exit 0
	fi

	RET=0
	# Read /etc/ceph/rbdmap to create non-existant mapping
	while read DEV PARAMS; do
		case "$DEV" in
		  ""|\#*)
		  	continue
			;;
		  */*)
		  	;;
		  *)
		  	DEV=rbd/$DEV
			;;
		esac
		ebegin "${DESC} '${DEV}'"
		newrbd=""
		MAP_RV=""
		RET_OP=0
		OIFS=$IFS
		IFS=','
		for PARAM in ${PARAMS[@]}; do
			CMDPARAMS="${CMDPARAMS} --$(echo ${PARAM} | tr '=' ' ')"
		done
		IFS=$OIFS
		if [ ! -b /dev/rbd/${DEV} ]; then
			MAP_RV=$(rbd map ${DEV} ${CMDPARAMS} 2>&1)
			if [ $? -eq 0 ]; then
				newrbd="yes"
			else
				RET=$((${RET}+$?))
				RET_OP=1
			fi
		fi
		eend ${RET_OP} "${MAP_RV}"

		if [ "$newrbd" ]; then
			## Mount new rbd
			MNT_RV=""
			mount --fake /dev/rbd/${DEV} >>/dev/null 2>&1 \
			&& MNT_RV=$(mount -vn /dev/rbd/${DEV} 2>&1)
			[ -n "${MNT_RV}" ] && einfo "mount: ${MNT_RV}"

			## post-mapping
			if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
				einfo "RBD Running post-map hook '/etc/ceph/rbd.d/${DEV}'"
				/etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"
			fi
		fi
	done < ${RBDMAPFILE}
	eend ${RET}
}

stop() {

	RET=0
	## Unmount and unmap all rbd devices
	if ls /dev/rbd[0-9]* >/dev/null 2>&1; then
		for DEV in /dev/rbd[0-9]*; do
			## pre-unmapping
			for L in $(find /dev/rbd -type l); do
				LL="${L##/dev/rbd/}"
				if [ "$(readlink -f $L)" = "${DEV}" ] \
				&& [ -x "/etc/ceph/rbd.d/${LL}" ]; then
					einfo "RBD pre-unmap:  '${DEV}' hook '/etc/ceph/rbd.d/${LL}'"
					/etc/ceph/rbd.d/${LL} unmap "$L"
					break
				fi
			done

			ebegin "Unmapping RBD device: '${DEV}'"
			UMNT_RV=""
			UMAP_RV=""
			RET_OP=0
			MNT=$(findmnt --mtab --source ${DEV} --noheadings | awk '{print $1'})
			if [ -n "${MNT}" ]; then
				einfo "un-mounting '${MNT}'"
				UMNT_RV=$(umount "${MNT}" 2>&1)
			fi
			if mountpoint -q "${MNT}"; then
				## Un-mounting failed.
				RET_OP=1
				RET=$((${RET}+1))
			else
				## Un-mapping.
				UMAP_RV=$(rbd unmap $DEV 2>&1)
				if [ $? -ne 0 ]; then
					RET=$((${RET}+$?))
					RET_OP=1
				fi
			fi
			eend ${RET_OP} "${UMAP_RV}"
			[ -n "${UMNT_RV}" ] && einfo "${UMNT_RV}"
		done
	fi
	eend ${RET}
}

reload() {
	start
}

status() {
	rbd showmapped
}