Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / rbdmap
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 mnts=$(findmnt --mtab --source ${rbd_dev} --noheadings \
62                                                         | awk '{print $1'})
63
64         logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'"
65         for mnt in ${mnts}; do
66             logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'"
67             umount "${mnt}" >>/dev/null 2>&1
68             if mountpoint -q "${mnt}"; then
69                   ## Un-mounting failed.
70                   logger -p "daemon.warning" -t rbdmap "Failed to unmount '${mnt}'"
71                   return 1
72             fi
73         done
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