]>
Commit | Line | Data |
---|---|---|
11fdf7f2 | 1 | #!/usr/bin/env bash |
7c673cae | 2 | |
a8e16298 TL |
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 | ||
7c673cae FG |
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 | |
a8e16298 TL |
64 | |
65 | CMDPARAMS="$(create_cmd_params "${PARAMS}")" | |
7c673cae FG |
66 | logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'" |
67 | newrbd="" | |
68 | MAP_RV="" | |
a8e16298 | 69 | |
7c673cae FG |
70 | if [ -b /dev/rbd/$DEV ]; then |
71 | MAP_RV="$(readlink -f /dev/rbd/$DEV)" | |
72 | else | |
11fdf7f2 | 73 | MAP_RV="$(rbd device map $DEV $CMDPARAMS 2>&1)" |
7c673cae FG |
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 | |
3efd9988 | 104 | local mnts=$(findmnt --mtab --source ${rbd_dev} --noheadings \ |
7c673cae FG |
105 | | awk '{print $1'}) |
106 | ||
107 | logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'" | |
3efd9988 | 108 | for mnt in ${mnts}; do |
7c673cae FG |
109 | logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'" |
110 | umount "${mnt}" >>/dev/null 2>&1 | |
3efd9988 FG |
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 | |
7c673cae | 117 | ## Un-mapping. |
11fdf7f2 | 118 | rbd device unmap $rbd_dev >>/dev/null 2>&1 |
7c673cae FG |
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 |