/init.d/ctdb

http://github.com/brinkman83/bashrc · Shell · 366 lines · 282 code · 41 blank · 43 comment · 49 complexity · 730a31159683fc915d5df86f7a643e2a MD5 · raw file

  1. #!/bin/sh
  2. #
  3. ##############################
  4. # ctdb: Starts the clustered tdb daemon
  5. #
  6. # chkconfig: - 90 36
  7. #
  8. # description: Starts and stops the clustered tdb daemon
  9. # pidfile: /var/run/ctdbd/ctdbd.pid
  10. #
  11. ### BEGIN INIT INFO
  12. # Provides: ctdb
  13. # Required-Start: $network $local_fs $remote_fs
  14. # Required-Stop: $network $local_fs $remote_fs
  15. # Default-Start: 2 3 4 5
  16. # Default-Stop: 0 1 6
  17. # Short-Description: start and stop ctdb service
  18. # Description: initscript for the ctdb service
  19. ### END INIT INFO
  20. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  21. NAME=ctdb
  22. DESC="Clustered TDB"
  23. #LSB
  24. if [ -f /lib/lsb/init-functions ] ; then
  25. . /lib/lsb/init-functions
  26. fi
  27. if ! type 'log_daemon_msg' >/dev/null; then
  28. log_daemon_msg () {
  29. if [ -z "${1:-}" ]; then
  30. return 1
  31. fi
  32. if [ -z "${2:-}" ]; then
  33. echo -n "$1:"
  34. return
  35. fi
  36. echo -n "$1: $2"
  37. }
  38. fi
  39. if ! type 'log_progress_msg' >/dev/null; then
  40. log_progress_msg () {
  41. if [ -z "${1:-}" ]; then
  42. return 1
  43. fi
  44. echo -n " $@"
  45. }
  46. fi
  47. if ! type 'log_end_msg' >/dev/null; then
  48. log_end_msg () {
  49. # If no arguments were passed, return
  50. if [ -z "${1:-}" ]; then
  51. return 1
  52. fi
  53. retval=$1
  54. if [ $1 -eq 0 ]; then
  55. echo "."
  56. elif [ $1 -eq 255 ]; then
  57. /bin/echo -e " (warning)."
  58. else
  59. /bin/echo -e " failed!"
  60. fi
  61. return $retval
  62. }
  63. fi
  64. # Source function library.
  65. if [ -f /etc/init.d/functions ] ; then
  66. . /etc/init.d/functions
  67. elif [ -f /etc/rc.d/init.d/functions ] ; then
  68. . /etc/rc.d/init.d/functions
  69. fi
  70. #gettext
  71. if [ -f /usr/bin/gettext.sh ] ; then
  72. . /usr/bin/gettext.sh
  73. fi
  74. if ! type 'eval_gettext' >/dev/null; then
  75. eval_gettext() {
  76. echo -n "$1" | (export PATH `envsubst --variables "$1"`; envsubst "$1")
  77. }
  78. fi
  79. [ -f /etc/rc.status ] && {
  80. . /etc/rc.status
  81. rc_reset
  82. LC_ALL=en_US.UTF-8
  83. }
  84. # Avoid using root's TMPDIR
  85. unset TMPDIR
  86. [ -z "$CTDB_BASE" ] && {
  87. export CTDB_BASE="/etc/ctdb"
  88. }
  89. . $CTDB_BASE/functions
  90. loadconfig network
  91. loadconfig ctdb
  92. set -e
  93. # check networking is up (for redhat)
  94. [ "$NETWORKING" = "no" ] && exit 0
  95. detect_init_style
  96. export CTDB_INIT_STYLE
  97. ctdbd=${CTDBD:-/usr/sbin/ctdbd}
  98. test -x $ctdbd || exit 0
  99. if [ "$CTDB_VALGRIND" = "yes" ]; then
  100. init_style="valgrind"
  101. else
  102. init_style="$CTDB_INIT_STYLE"
  103. fi
  104. build_ctdb_options () {
  105. [ -z "$CTDB_RECOVERY_LOCK" ] && {
  106. echo "You must configure the location of the CTDB_RECOVERY_LOCK"
  107. exit 1
  108. }
  109. maybe_set () {
  110. # If the 2nd arg is null then return - don't set anything.
  111. # Else if the 3rd arg is set and it doesn't match the 2nd arg
  112. # then return
  113. [ -z "$2" -o \( -n "$3" -a "$3" != "$2" \) ] && return
  114. val="$2"
  115. case "$1" in
  116. --*) sep="=" ;;
  117. -*) sep=" " ;;
  118. esac
  119. # For these options we're only passing a value-less flag.
  120. [ -n "$3" ] && {
  121. val=""
  122. sep=""
  123. }
  124. CTDB_OPTIONS="${CTDB_OPTIONS}${CTDB_OPTIONS:+ }${1}${sep}${val}"
  125. }
  126. [ -z "$CTDB_RECOVERY_LOCK" ] && {
  127. echo "No recovery lock specified. Starting CTDB without split brain prevention"
  128. }
  129. maybe_set "--reclock" "$CTDB_RECOVERY_LOCK"
  130. # build up CTDB_OPTIONS variable from optional parameters
  131. maybe_set "--logfile" "$CTDB_LOGFILE"
  132. maybe_set "--nlist" "$CTDB_NODES"
  133. maybe_set "--socket" "$CTDB_SOCKET"
  134. maybe_set "--public-addresses" "$CTDB_PUBLIC_ADDRESSES"
  135. maybe_set "--public-interface" "$CTDB_PUBLIC_INTERFACE"
  136. maybe_set "--dbdir" "$CTDB_DBDIR"
  137. maybe_set "--dbdir-persistent" "$CTDB_DBDIR_PERSISTENT"
  138. maybe_set "--event-script-dir" "$CTDB_EVENT_SCRIPT_DIR"
  139. maybe_set "--transport" "$CTDB_TRANSPORT"
  140. maybe_set "-d" "$CTDB_DEBUGLEVEL"
  141. maybe_set "--notification-script" "$CTDB_NOTIFY_SCRIPT"
  142. maybe_set "--start-as-disabled" "$CTDB_START_AS_DISABLED" "yes"
  143. maybe_set "--start-as-stopped " "$CTDB_START_AS_STOPPED" "yes"
  144. maybe_set "--no-recmaster" "$CTDB_CAPABILITY_RECMASTER" "no"
  145. maybe_set "--no-lmaster" "$CTDB_CAPABILITY_LMASTER" "no"
  146. maybe_set "--lvs --single-public-ip" "$CTDB_LVS_PUBLIC_IP"
  147. maybe_set "--script-log-level" "$CTDB_SCRIPT_LOG_LEVEL"
  148. }
  149. check_persistent_databases () {
  150. case $init_style in
  151. debian) PERSISTENT_DB_DIR="${CTDB_DBDIR:-/var/lib/ctdb}/persistent" ;;
  152. *) PERSISTENT_DB_DIR="${CTDB_DBDIR:-/var/ctdb}/persistent" ;;
  153. esac
  154. mkdir -p $PERSISTENT_DB_DIR 2>/dev/null
  155. for PDBASE in `ls $PERSISTENT_DB_DIR/*.tdb.[0-9] 2>/dev/null`; do
  156. /usr/bin/tdbdump $PDBASE >/dev/null 2>/dev/null || {
  157. echo "Persistent database $PDBASE is corrupted! CTDB will not start."
  158. return 1
  159. }
  160. done
  161. }
  162. set_ctdb_variables () {
  163. # set any tunables from the config file
  164. set | grep ^CTDB_SET_ | cut -d_ -f3- |
  165. while read v; do
  166. varname=`echo $v | cut -d= -f1`
  167. value=`echo $v | cut -d= -f2`
  168. ctdb setvar $varname $value || RETVAL=1
  169. done || exit 1
  170. }
  171. set_retval() {
  172. return $1
  173. }
  174. running() {
  175. pkill -0 -f $ctdbd || return 1
  176. return 0
  177. }
  178. start_server() {
  179. build_ctdb_options
  180. check_persistent_databases || return $?
  181. if [ yes == "$CTDB_SUPPRESS_COREFILE" ]; then
  182. ulimit -c 0
  183. else
  184. ulimit -c unlimited
  185. fi
  186. case $init_style in
  187. valgrind)
  188. valgrind -q --log-file=/var/log/ctdb_valgrind \
  189. $ctdbd --nosetsched $CTDB_OPTIONS
  190. RETVAL=$?
  191. echo
  192. ;;
  193. suse)
  194. startproc $ctdbd $CTDB_OPTIONS
  195. rc_status -v
  196. RETVAL=$?
  197. ;;
  198. redhat)
  199. daemon $ctdbd $CTDB_OPTIONS
  200. RETVAL=$?
  201. echo
  202. [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ctdb || RETVAL=1
  203. ;;
  204. debian)
  205. start-stop-daemon --start --quiet --background \
  206. --exec $ctdbd -- $CTDB_OPTIONS
  207. RETVAL=$?
  208. ;;
  209. esac
  210. sleep 1
  211. set_ctdb_variables
  212. return $RETVAL
  213. }
  214. stop_server() {
  215. ctdb shutdown >/dev/null 2>&1
  216. RETVAL=$?
  217. count=0
  218. if [ "$init_style" = "debian" ]; then
  219. start-stop-daemon --stop --quiet --exec $ctdbd
  220. RETVAL=$?
  221. fi
  222. while pkill -0 -f $ctdbd ; do
  223. sleep 1
  224. count=`expr $count + 1`
  225. [ $count -gt 10 ] && {
  226. eval_gettext "killing ctdbd "
  227. pkill -9 -f $ctdbd
  228. pkill -9 -f $CTDB_BASE/events.d/
  229. }
  230. done
  231. case $init_style in
  232. suse)
  233. # re-set the return code to the recorded RETVAL in order
  234. # to print the correct status message
  235. set_retval $RETVAL
  236. rc_status -v
  237. ;;
  238. redhat)
  239. [ $RETVAL -eq 0 ] && success || failure
  240. [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ctdb
  241. echo ""
  242. ;;
  243. esac
  244. return $RETVAL
  245. }
  246. case "$1" in
  247. start)
  248. log_daemon_msg "Starting $DESC " "$NAME"
  249. # Check if it's running first
  250. if running ; then
  251. log_progress_msg "already running"
  252. log_end_msg 0
  253. exit 0
  254. fi
  255. if start_server && running ; then
  256. # It's ok, the server started and is running
  257. log_end_msg 0
  258. else
  259. # Either we could not start it or it is not running
  260. # after we did
  261. log_end_msg 1
  262. fi
  263. ;;
  264. stop)
  265. log_daemon_msg "Stopping $DESC" "$NAME"
  266. if running ; then
  267. # Only stop the server if we see it running
  268. stop_server
  269. log_end_msg $?
  270. else
  271. # If it's not running don't do anything
  272. log_progress_msg "not running"
  273. log_end_msg 0
  274. exit 0
  275. fi
  276. ;;
  277. restart|reload|force-reload)
  278. log_daemon_msg "Restarting $DESC" "$NAME"
  279. running && stop_server
  280. start_server
  281. running
  282. log_end_msg $?
  283. ;;
  284. status)
  285. log_daemon_msg "Checking status of $DESC" "$NAME"
  286. if running ; then
  287. log_progress_msg "running"
  288. echo
  289. ctdb status
  290. log_end_msg 0
  291. else
  292. log_progress_msg "not running"
  293. log_end_msg 1
  294. exit 1
  295. fi
  296. ;;
  297. condrestart)
  298. if running ; then
  299. log_daemon_msg "Restarting $DESC" "$NAME"
  300. stop_server
  301. start_server
  302. log_end_msg $?
  303. fi
  304. ;;
  305. cron)
  306. # used from cron to auto-restart ctdb
  307. if ! running ; then
  308. log_daemon_msg "Starting $DESC " "$NAME"
  309. if start_server && running ; then
  310. # It's ok, the server started and is running
  311. log_end_msg 0
  312. else
  313. # Either we could not start it or it is not running
  314. # after we did
  315. log_end_msg 1
  316. fi
  317. fi
  318. ;;
  319. *)
  320. eval_gettext "Usage: $0 {start|stop|restart|status|cron|condrestart}" >&2
  321. echo >&2
  322. exit 1
  323. ;;
  324. esac
  325. exit $?