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