]> git.proxmox.com Git - ceph.git/blob - ceph/src/rbdmap
import ceph 12.2.12
[ceph.git] / ceph / src / rbdmap
1 #!/bin/bash
2
3 create_cmd_params() {
4 local PARAMS="$1"
5 local CMDPARAMS=""
6 local STATE="START"
7 for (( i=0; i<${#PARAMS}; i++ )); do
8 CHAR="${PARAMS:$i:1}"
9 case $CHAR in
10 "#")
11 break
12 ;;
13 "'")
14 if [ "$STATE" == "INQUOTE" ];then
15 STATE="NORMAL"
16 else
17 STATE="INQUOTE"
18 fi
19 ;;
20 "=")
21 if [ "$STATE" == "INQUOTE" ]; then
22 CMDPARAMS="${CMDPARAMS}${CHAR}"
23 else
24 CMDPARAMS="${CMDPARAMS} "
25 fi
26 ;;
27 ",")
28 if [ "$STATE" == "INQUOTE" ]; then
29 CMDPARAMS="${CMDPARAMS}${CHAR}"
30 elif [ "$STATE" == "START" ]; then
31 STATE="NORMAL"
32 CMDPARAMS="${CMDPARAMS} --"
33 else
34 CMDPARAMS="${CMDPARAMS} --"
35 fi
36 ;;
37 *)
38 if [ "$STATE" == "START" ];then
39 STATE="NORMAL"
40 CMDPARAMS="${CMDPARAMS}--${CHAR}"
41 else
42 CMDPARAMS="${CMDPARAMS}${CHAR}"
43 fi
44 ;;
45 esac
46 done
47 echo -n "$CMDPARAMS"
48 }
49
50 do_map() {
51 # Read /etc/rbdtab to create non-existant mapping
52 RET=0
53 while read DEV PARAMS; do
54 case "$DEV" in
55 ""|\#*)
56 continue
57 ;;
58 */*)
59 ;;
60 *)
61 DEV=rbd/$DEV
62 ;;
63 esac
64
65 CMDPARAMS="$(create_cmd_params "${PARAMS}")"
66 logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'"
67 newrbd=""
68 MAP_RV=""
69
70 if [ -b /dev/rbd/$DEV ]; then
71 MAP_RV="$(readlink -f /dev/rbd/$DEV)"
72 else
73 MAP_RV="$(rbd map $DEV $CMDPARAMS 2>&1)"
74 if [ $? -eq 0 ]; then
75 newrbd="yes"
76 else
77 RET=$((${RET}+$?))
78 logger -p "daemon.warning" -t rbdmap "Failed to map '${DEV}"
79 continue
80 fi
81 fi
82 logger -p "daemon.debug" -t rbdmap "Mapped '${DEV}' to '${MAP_RV}'"
83
84 if [ "$newrbd" ]; then
85 ## Mount new rbd
86 MNT_RV=""
87 mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \
88 && MNT_RV=$(mount -vn /dev/rbd/$DEV 2>&1)
89 [ -n "${MNT_RV}" ] && logger -p "daemon.debug" -t rbdmap "Mounted '${MAP_RV}' to '${MNT_RV}'"
90
91 ## post-mapping
92 if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
93 logger -p "daemon.debug" -t rbdmap "Running post-map hook '/etc/ceph/rbd.d/${DEV}'"
94 /etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"
95 fi
96 fi
97 done < $RBDMAPFILE
98 exit ${RET}
99
100 }
101
102 unmount_unmap() {
103 local rbd_dev=$1
104 local mnts=$(findmnt --mtab --source ${rbd_dev} --noheadings \
105 | awk '{print $1'})
106
107 logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'"
108 for mnt in ${mnts}; do
109 logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'"
110 umount "${mnt}" >>/dev/null 2>&1
111 if mountpoint -q "${mnt}"; then
112 ## Un-mounting failed.
113 logger -p "daemon.warning" -t rbdmap "Failed to unmount '${mnt}'"
114 return 1
115 fi
116 done
117 ## Un-mapping.
118 rbd unmap $rbd_dev >>/dev/null 2>&1
119 if [ $? -ne 0 ]; then
120 logger -p "daemon.warning" -t rbdmap "Failed to unmap '${mnt}'"
121 return 1
122 fi
123 logger -p "daemon.debug" -t rbdmap "Unmapped '${rbd_dev}'"
124
125 return 0
126 }
127
128 do_unmap_all() {
129 RET=0
130 ## Unmount and unmap all rbd devices
131 if ls /dev/rbd[0-9]* >/dev/null 2>&1; then
132 for DEV in /dev/rbd[0-9]*; do
133 ## pre-unmapping
134 for L in $(find /dev/rbd -type l); do
135 LL="${L##/dev/rbd/}"
136 if [ "$(readlink -f $L)" = "${DEV}" ] \
137 && [ -x "/etc/ceph/rbd.d/${LL}" ]; then
138 logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook for '${DEV}': '/etc/ceph/rbd.d/${LL}'"
139 /etc/ceph/rbd.d/${LL} unmap "$L"
140 break
141 fi
142 done
143
144 unmount_unmap "$DEV" || RET=$((${RET}+$?))
145
146 done
147 fi
148 exit ${RET}
149 }
150
151 do_unmap() {
152 RET=0
153 ## skip if nothing is mapped
154 ls /dev/rbd[0-9]* >/dev/null 2>&1 || exit ${RET}
155
156 # Read /etc/rbdtab to create non-existant mapping
157 while read DEV PARAMS; do
158 case "$DEV" in
159 ""|\#*)
160 continue
161 ;;
162 */*)
163 ;;
164 *)
165 DEV=rbd/$DEV
166 ;;
167 esac
168
169 MAP_RV="$(readlink -f /dev/rbd/$DEV)"
170 if [ ! -b $MAP_RV ]; then
171 logger -p "daemon.debug" -t rbdmap "$DEV not mapped, skipping unmap"
172 continue
173 fi
174
175 ## pre-unmapping
176 if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
177 logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook '/etc/ceph/rbd.d/${DEV}'"
178 /etc/ceph/rbd.d/${DEV} unmap "/dev/rbd/${DEV}"
179 fi
180
181 unmount_unmap "$MAP_RV" || RET=$((${RET}+$?))
182
183 done < $RBDMAPFILE
184 exit ${RET}
185 }
186
187 # default to reasonable value if RBDMAPFILE not set in environment
188 RBDMAPFILE="${RBDMAPFILE:-/etc/ceph/rbdmap}"
189
190 if [ ! -f "$RBDMAPFILE" ]; then
191 logger -p "daemon.warning" -t rbdmap "No $RBDMAPFILE found."
192 exit 0
193 fi
194
195 case "$1" in
196 map)
197 do_map
198 ;;
199
200 unmap)
201 do_unmap
202 ;;
203
204 unmap-all)
205 do_unmap_all
206 ;;
207
208 *)
209 echo "Usage: rbdmap map | unmap | unmap-all"
210 esac