| 1 | #!/sbin/openrc-run |
| 2 | # Copyright 1999-2013 Gentoo Foundation |
| 3 | # Distributed under the terms of the GNU General Public License, v2 or later |
| 4 | # $Header: /var/cvsroot/gentoo-x86/sys-cluster/drbd/files/drbd-8.0.rc,v 1.8 2013/01/17 19:09:04 robbat2 Exp $ |
| 5 | |
| 6 | extra_started_commands="reload" |
| 7 | |
| 8 | depend() { |
| 9 | use logger |
| 10 | need net |
| 11 | before heartbeat |
| 12 | after sshd |
| 13 | } |
| 14 | |
| 15 | DEFAULTFILE="/etc/conf.d/drbd" |
| 16 | DRBDADM="/usr/sbin/drbdadm" |
| 17 | PROC_DRBD="/proc/drbd" |
| 18 | MODPROBE="/sbin/modprobe" |
| 19 | RMMOD="/sbin/rmmod" |
| 20 | UDEV_TIMEOUT=10 |
| 21 | ADD_MOD_PARAM="" |
| 22 | |
| 23 | if [ -f $DEFAULTFILE ]; then |
| 24 | . $DEFAULTFILE |
| 25 | fi |
| 26 | |
| 27 | # Just in case drbdadm want to display any errors in the configuration |
| 28 | # file, or we need to ask the user about registering this installation |
| 29 | # at http://usage.drbd.org, we call drbdadm here without any IO |
| 30 | # redirection. |
| 31 | $DRBDADM sh-nop |
| 32 | |
| 33 | assure_module_is_loaded() { |
| 34 | [ -e "$PROC_DRBD" ] && return |
| 35 | ebegin "Loading drbd module" |
| 36 | ret=0 |
| 37 | |
| 38 | $MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || ret=20 |
| 39 | eend $ret |
| 40 | return $ret |
| 41 | } |
| 42 | |
| 43 | adjust_with_progress() { |
| 44 | IFS_O=$IFS |
| 45 | NEWLINE=' |
| 46 | ' |
| 47 | IFS=$NEWLINE |
| 48 | local D=0 |
| 49 | local S=0 |
| 50 | local N=0 |
| 51 | |
| 52 | einfon "Setting drbd parameters " |
| 53 | COMMANDS=`$DRBDADM -d adjust all` || { |
| 54 | eend 20 "Error executing drbdadm" |
| 55 | return 20 |
| 56 | } |
| 57 | echo -n "[ " |
| 58 | |
| 59 | for CMD in $COMMANDS; do |
| 60 | if echo $CMD | grep -q disk; then echo -n "d$D "; D=$(( D+1 )); |
| 61 | elif echo $CMD | grep -q syncer; then echo -n "s$S "; S=$(( S+1 )); |
| 62 | elif echo $CMD | grep -q net; then echo -n "n$N "; N=$(( N+1 )); |
| 63 | else echo -n ".. "; |
| 64 | fi |
| 65 | IFS=$IFS_O |
| 66 | $CMD || { |
| 67 | echo |
| 68 | eend 20 "cmd $CMD failed!" |
| 69 | return 20 |
| 70 | } |
| 71 | IFS=$NEWLINE |
| 72 | done |
| 73 | echo "]" |
| 74 | eend 0 |
| 75 | |
| 76 | IFS=$IFS_O |
| 77 | } |
| 78 | |
| 79 | start() { |
| 80 | einfo "Starting DRBD resources:" |
| 81 | eindent |
| 82 | assure_module_is_loaded || return $? |
| 83 | adjust_with_progress || return $? |
| 84 | |
| 85 | # make sure udev has time to create the device files |
| 86 | ebegin "Waiting for udev device creation" |
| 87 | for RESOURCE in `$DRBDADM sh-resources`; do |
| 88 | for DEVICE in `$DRBDADM sh-dev $RESOURCE`; do |
| 89 | UDEV_TIMEOUT_LOCAL=$UDEV_TIMEOUT |
| 90 | while [ ! -e $DEVICE ] && [ $UDEV_TIMEOUT_LOCAL -gt 0 ] ; do |
| 91 | sleep 1 |
| 92 | UDEV_TIMEOUT_LOCAL=$(( $UDEV_TIMEOUT_LOCAL-1 )) |
| 93 | done |
| 94 | done |
| 95 | done |
| 96 | eend 0 |
| 97 | |
| 98 | einfon "Waiting for connection " |
| 99 | $DRBDADM wait-con-int |
| 100 | ret=$? |
| 101 | echo |
| 102 | |
| 103 | sleep 5 |
| 104 | |
| 105 | einfon "Become primary if configured " |
| 106 | $DRBDADM sh-b-pri all |
| 107 | echo |
| 108 | |
| 109 | eend $ret |
| 110 | return $ret |
| 111 | } |
| 112 | |
| 113 | stop() { |
| 114 | ebegin "Stopping all DRBD resources" |
| 115 | |
| 116 | # Check for mounted drbd devices |
| 117 | if ! grep -q '^/dev/drbd' /proc/mounts &>/dev/null; then |
| 118 | if [ -e ${PROC_DRBD} ]; then |
| 119 | ${DRBDADM} down all |
| 120 | ret=$? |
| 121 | sleep 3 |
| 122 | if [ -e /proc/modules ] && grep -q '^drbd' /proc/modules ; then |
| 123 | ${RMMOD} drbd |
| 124 | fi |
| 125 | fi |
| 126 | eend $ret |
| 127 | return $ret |
| 128 | else |
| 129 | einfo "drbd devices mounted, please umount them before trying to stop drbd!" |
| 130 | eend 1 |
| 131 | return 1 |
| 132 | fi |
| 133 | } |
| 134 | |
| 135 | status() { |
| 136 | # NEEDS to be heartbeat friendly... |
| 137 | # so: put some "OK" in the output. |
| 138 | |
| 139 | if [ -e $PROC_DRBD ]; then |
| 140 | ret=0 |
| 141 | ebegin "drbd driver loaded OK; device status:" |
| 142 | eend $ret |
| 143 | cat $PROC_DRBD |
| 144 | else |
| 145 | ebegin "drbd not loaded" |
| 146 | ret=3 |
| 147 | eend $ret |
| 148 | fi |
| 149 | return $ret |
| 150 | } |
| 151 | |
| 152 | reload() { |
| 153 | ebegin "Reloading DRBD" |
| 154 | ${DRBDADM} adjust all |
| 155 | ret=$? |
| 156 | eend $ret |
| 157 | return $ret |
| 158 | } |