initial code repo
[stor4nfv.git] / src / ceph / src / init-ceph.in
diff --git a/src/ceph/src/init-ceph.in b/src/ceph/src/init-ceph.in
new file mode 100755 (executable)
index 0000000..26704d6
--- /dev/null
@@ -0,0 +1,555 @@
+#!/bin/sh
+# Start/stop ceph daemons
+# chkconfig: 2345 60 80
+
+### BEGIN INIT INFO
+# Provides:          ceph
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Required-Start:    $remote_fs $named $network $time
+# Required-Stop:     $remote_fs $named $network $time
+# Short-Description: Start Ceph distributed file system daemons at boot time
+# Description:       Enable Ceph distributed file system services.
+### END INIT INFO
+
+# TODO: on FreeBSD/OSX, use equivalent script file
+if [ -e /lib/lsb/init-functions ]; then
+    . /lib/lsb/init-functions
+fi
+
+if [ `dirname $0` = "." ] && [ $PWD != "/etc/init.d" ]; then
+    # looks like an autotools src dir build
+    BINDIR=.
+    SBINDIR=.
+    LIBEXECDIR=.
+    ETCDIR=.
+    ASSUME_DEV=1
+else
+    if [ -e CMakeCache.txt ] && [ -e bin/init-ceph ]; then
+       # looks like a cmake build directory
+       CEPH_ROOT=`grep ceph_SOURCE_DIR CMakeCache.txt | cut -d "=" -f 2`
+       BINDIR=bin
+       SBINDIR=bin
+       LIBEXECDIR=$CEPH_ROOT/src
+       ETCDIR=.
+       ASSUME_DEV=1
+       CEPH_LIB=$CEPH_ROOT/build/lib
+       echo "$PYTHONPATH" | grep -q $CEPH_LIB || export PYTHONPATH=$CEPH_LIB/cython_modules/lib.2:$PYTHONPATH
+       echo "$LD_LIBRARY_PATH" | grep -q $CEPH_LIB || export LD_LIBRARY_PATH=$CEPH_LIB:$LD_LIBRARY_PATH
+       echo "$DYLD_LIBRARY_PATH" | grep -q $CEPH_LIB || export DYLD_LIBRARY_PATH=$CEPH_LIB:$DYLD_LIBRARY_PATH
+    else
+       BINDIR=@bindir@
+       SBINDIR=@sbindir@
+       LIBEXECDIR=@libexecdir@/ceph
+       ETCDIR=@sysconfdir@/ceph
+       ASSUME_DEV=0
+    fi
+fi
+
+if [ -n "$CEPH_BIN" ] && [ -n "$CEPH_ROOT" ] && [ -n "$CEPH_BUILD_DIR" ]; then
+  BINDIR=$CEPH_BIN
+  SBINDIR=$CEPH_ROOT/src
+  ETCDIR=$CEPH_BIN
+  LIBEXECDIR=$CEPH_ROOT/src
+  ASSUME_DEV=1
+fi
+
+if [ `uname` = FreeBSD ]; then
+  GETOPT=/usr/local/bin/getopt
+else
+  GETOPT=getopt
+fi
+
+if id ceph > /dev/null 2>&1; then
+  SET_CEPHUSER_ARGS=" --setuser ceph --setgroup ceph"
+fi
+
+usage_exit() {
+    echo "usage: $0 [options] {start|stop|restart|condrestart} [mon|osd|mds]..."
+    printf "Core options:\n"
+    printf "\t--allhosts / -a           execute (via ssh) on all hosts in conf file\n"
+    printf "\t--cluster [cluster name]  define the cluster name\n"
+    printf "\t--conf / -c [conf file]   use [conf file] instead of default\n"
+    printf "\t--help / -h               show this usage message\n"
+    printf "\t--hostname [hostname]     override hostname lookup\n"
+    printf "\t-m [mon addr]             mon address\n"
+    printf "\n"
+    printf "Other options:\n"
+    printf "\t--btrfs                   btrfs\n"
+    printf "\t--nobtrfs                 no btrfs\n"
+    printf "\t--btrfsumount             btrfs umount\n"
+    printf "\t--fsmount                 fsmount\n"
+    printf "\t--nofsmount               no fsmount\n"
+    printf "\t--fsumount                fsumount\n"
+    printf "\t--restart                 restart on core dump\n"
+    printf "\t--norestart               do not restart on core dump\n"
+    printf "\t--valgrind                run via valgrind\n"
+    printf "\t--novalgrind              do not run via valgrind\n"
+    printf "\t--verbose / -v            be verbose\n"
+    exit
+}
+
+# behave if we are not completely installed (e.g., Debian "removed,
+# config remains" state)
+test -f $LIBEXECDIR/ceph_common.sh || exit 0
+
+. $LIBEXECDIR/ceph_common.sh
+
+EXIT_STATUS=0
+
+signal_daemon() {
+    name=$1
+    daemon=$2
+    pidfile=$3
+    signal=$4
+    action=$5
+    [ -z "$action" ] && action="Stopping"
+    printf "$action Ceph $name on $host..."
+    do_cmd "if [ -e $pidfile ]; then
+        pid=\`cat $pidfile\`
+        if ps -p \$pid -o args= | grep -q $daemon; then
+           cmd=\"kill $signal \$pid\"
+           printf \"\$cmd...\"
+           \$cmd
+        fi
+    fi"
+    echo done
+}
+
+daemon_is_running() {
+    name=$1
+    daemon=$2
+    daemon_id=$3
+    pidfile=$4
+    do_cmd "[ -e $pidfile ] || exit 1   # no pid, presumably not running
+       pid=\`cat $pidfile\`
+       ps -p \$pid -o args= | grep $daemon | grep -qwe -i.$daemon_id && exit 0 # running
+        exit 1  # pid is something else" "" "okfail"
+}
+
+stop_daemon() {
+    name=$1
+    daemon=$2
+    pidfile=$3
+    signal=$4
+    action=$5
+    [ -z "$action" ] && action="Stopping"
+    printf "$action Ceph $name on $host..."
+    do_cmd "if [ -e $pidfile ] ; then 
+       pid=\`cat $pidfile\`
+       while ps -p \$pid -o args= | grep -q $daemon; do
+           cmd=\"kill $signal \$pid\"
+           printf \"\$cmd...\"
+           \$cmd
+           sleep 1
+           continue
+       done
+    fi"
+    echo done
+}
+
+## command line options
+options=
+
+OPTS=$(${GETOPT} -n 'init-ceph' -o 'hvam:c:' -l 'help,verbose,valgrind,novalgrind,allhosts,restart,norestart,btrfs,nobtrfs,fsmount,nofsmount,btrfsumount,fsumount,conf:,cluster:,hostname:' -- "$@")
+if [ $? != 0 ]
+then
+    exit 1
+fi
+
+eval set -- "$OPTS"
+
+dovalgrind=
+docrun=
+allhosts=0
+monaddr=
+dofsmount=1
+dofsumount=0
+verbose=0
+use_default_conf=1
+
+## set variables like cluster or conf
+[ -e /etc/sysconfig/ceph ] && . /etc/sysconfig/ceph
+[ -e /etc/default/ceph ] && . /etc/default/ceph
+
+
+while echo $1 | grep -q '^-'; do     # FIXME: why not '^-'?
+case $1 in
+    -v | --verbose)
+           verbose=1
+           ;;
+    --valgrind)
+           dovalgrind=1
+           ;;
+    --novalgrind)
+           dovalgrind=0
+           ;;
+    --allhosts | -a)
+           allhosts=1;
+           ;;
+    --restart)
+           docrun=1
+           ;;
+    --norestart)
+           docrun=0
+           ;;
+    -h | --help)
+            usage_exit
+            ;;
+    -m )
+           [ -z "$2" ] && usage_exit
+           options="$options $1"
+           shift
+           MON_ADDR=$1
+           ;;
+    --btrfs | --fsmount)
+           dofsmount=1
+           ;;
+    --nobtrfs | --nofsmount)
+           dofsmount=0
+           ;;
+    --btrfsumount | --fsumount)
+           dofsumount=1
+           ;;
+    --conf | -c)
+           [ -z "$2" ] && usage_exit
+           options="$options $1"
+           shift
+        use_default_conf=0
+           conf=$1
+           ;;
+    --cluster )
+           [ -z "$2" ] && usage_exit
+           options="$options $1"
+           shift
+           cluster=$1
+           ;;
+    --hostname )
+           [ -z "$2" ] && usage_exit
+           options="$options $1"
+           shift
+           hostname=$1
+            ;;
+    -- )
+            shift
+            break
+            ;;
+    *)
+           echo unrecognized option \'$1\'
+           usage_exit
+           ;;
+esac
+options="$options $1"
+shift
+done
+
+# if `--cluster` was not passed in, fallback to looking at the config name
+if [ -z "$cluster" ]; then
+    cluster=`echo $conf | awk -F'/' '{print $(NF)}' | cut -d'.' -f 1`
+else
+    # if we were told to use a given cluster name then $conf needs to be updated
+    # but just define it if `--conf` was not specified, otherwise we would be silently
+    # overriding $conf even if it was defined with `--conf`
+    if [ $use_default_conf -eq 1 ]; then
+        conf="/etc/ceph/$cluster.conf"
+    fi
+fi
+
+
+verify_conf
+
+command=$1
+[ -n "$*" ] && shift
+
+get_local_name_list
+get_name_list "$@"
+
+# Reverse the order if we are stopping
+
+if [ "$command" = "stop" -o "$command" = "onestop" ]; then
+    for f in $what; do
+       new_order="$f $new_order"
+    done
+    what="$new_order"
+fi
+
+for name in $what; do
+    type=`echo $name | cut -c 1-3`   # e.g. 'mon', if $item is 'mon1'
+    id=`echo $name | cut -c 4- | sed 's/^\\.//'`
+    num=$id
+    name="$type.$id"
+
+    check_host $cluster || continue
+
+    binary="$BINDIR/ceph-$type"
+    cmd="$binary -i $id"
+    if [ $ASSUME_DEV -eq 1 ]; then
+      cmd="PATH=$PWD:$PATH $cmd"
+    fi
+
+    get_conf run_dir "/var/run/ceph" "run dir"
+
+    get_conf pid_file "$run_dir/$type.$id.pid" "pid file"
+
+    if [ "$command" = "start" -o "$command" = "onestart" ]; then
+       if [ -n "$pid_file" ]; then
+           do_cmd "mkdir -p "`dirname $pid_file`
+           cmd="$cmd --pid-file $pid_file"
+       fi
+
+       get_conf log_dir "" "log dir"
+       [ -n "$log_dir" ] && do_cmd "mkdir -p $log_dir"
+
+        get_conf auto_start "" "auto start"
+        if [ "$auto_start" = "no" ] || [ "$auto_start" = "false" ] || [ "$auto_start" = "0" ]; then
+            if [ -z "$@" ]; then
+                echo "Skipping Ceph $name on $host... auto start is disabled"
+                continue
+            fi
+        fi
+
+       if daemon_is_running $name ceph-$type $id $pid_file; then
+           echo "Starting Ceph $name on $host...already running"
+           continue
+       fi
+
+       get_conf copy_executable_to "" "copy executable to"
+       if [ -n "$copy_executable_to" ]; then
+           scp $binary "$host:$copy_executable_to"
+           binary="$copy_executable_to"
+       fi
+    fi
+
+    # conf file
+    cmd="$cmd -c $conf"
+
+    if echo $name | grep -q ^osd; then
+       get_conf osd_data "/var/lib/ceph/osd/$cluster-$id" "osd data"
+       get_conf fs_path "$osd_data" "fs path"  # mount point defaults so osd data
+        get_conf fs_devs "" "devs"
+       if [ -z "$fs_devs" ]; then
+           # try to fallback to old keys
+           get_conf tmp_btrfs_devs "" "btrfs devs"
+           if [ -n "$tmp_btrfs_devs" ]; then
+               fs_devs="$tmp_btrfs_devs"
+           fi
+       fi
+        first_dev=`echo $fs_devs | cut '-d ' -f 1`
+    fi
+
+    # do lockfile, if RH
+    get_conf lockfile "/var/lock/subsys/ceph" "lock file"
+    lockdir=`dirname $lockfile`
+    if [ ! -d "$lockdir" ]; then
+       lockfile=""
+    fi
+
+    get_conf asok "$run_dir/$cluster-$type.$id.asok" "admin socket"
+
+    case "$command" in
+       start|onestart)
+            # Increase max_open_files, if the configuration calls for it.
+            get_conf max_open_files "32768" "max open files"
+
+            # build final command
+           wrap=""
+           runmode=""
+           runarg=""
+
+           [ -z "$docrun" ] && get_conf_bool docrun "0" "restart on core dump"
+           [ "$docrun" -eq 1 ] && wrap="$BINDIR/ceph-run"
+
+           [ -z "$dovalgrind" ] && get_conf_bool valgrind "" "valgrind"
+           [ -n "$valgrind" ] && wrap="$wrap valgrind $valgrind"
+
+           [ -n "$wrap" ] && runmode="-f &" && runarg="-f"
+           [ -n "$max_open_files" ] && files="ulimit -n $max_open_files;"
+
+           [ -n "$TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES" ] && tcmalloc="TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=$TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES"
+
+           cmd="$files $tcmalloc $wrap $cmd --cluster $cluster ${SET_CEPHUSER_ARGS} $runmode"
+
+           if [ $dofsmount -eq 1 ] && [ -n "$fs_devs" ]; then
+               get_conf pre_mount "true" "pre mount command"
+               get_conf fs_type "" "osd mkfs type"
+
+               if [ -z "$fs_type" ]; then
+                   # try to fallback to old keys
+                   get_conf tmp_devs "" "btrfs devs"
+                   if [ -n "$tmp_devs" ]; then
+                       fs_type="btrfs"
+                   else
+                       echo No filesystem type defined!
+                       exit 0
+                    fi
+               fi
+
+               get_conf fs_opt "" "osd mount options $fs_type"
+               if [ -z "$fs_opt" ]; then
+                   if [ "$fs_type" = "btrfs" ]; then
+                       #try to fallback to old keys
+                       get_conf fs_opt "" "btrfs options"
+                   fi
+
+                   if [ -z "$fs_opt" ]; then
+                       if [ "$fs_type" = "xfs" ]; then
+                           fs_opt="rw,noatime,inode64"
+                       else
+                           #fallback to use at least noatime
+                           fs_opt="rw,noatime"
+                       fi
+                   fi
+               fi
+
+               [ -n "$fs_opt" ] && fs_opt="-o $fs_opt"
+               [ -n "$pre_mount" ] && do_cmd "$pre_mount"
+
+               do_root_cmd_okfail "mkdir -p $fs_path"
+               if [ "$fs_type" = "btrfs" ]; then
+                   echo Mounting Btrfs on $host:$fs_path
+                   do_root_cmd_okfail "modprobe btrfs ; btrfs device scan || btrfsctl -a ; egrep -q '^[^ ]+ $fs_path ' /proc/mounts && umount $fs_path ; mount -t btrfs $fs_opt $first_dev $fs_path"
+               else
+                   echo Mounting $fs_type on $host:$fs_path
+                   do_root_cmd_okfail "modprobe $fs_type ; egrep -q '^[^ ]+ $fs_path ' /proc/mounts && umount $fs_path ; mount -t $fs_type $fs_opt $first_dev $fs_path"
+               fi
+               if [ "$ERR" != "0" ]; then
+                   EXIT_STATUS=$ERR
+                   continue
+               fi
+           fi
+
+           if [ "$type" = "osd" ]; then
+               get_conf update_crush "" "osd crush update on start"
+               case "${update_crush:-1}" in 1|[Tt][Rr][Uu][Ee])
+                   # update location in crush
+                   get_conf osd_location_hook "$BINDIR/ceph-crush-location" "osd crush location hook"
+                   if [ ! -e "$osd_location_hook" ]; then
+                       EXIT_STATUS=2
+                       continue
+                   fi
+                   osd_location=`$osd_location_hook --cluster $cluster --id $id --type osd`
+                   get_conf osd_weight "" "osd crush initial weight"
+                   defaultweight="$(df -P -k $osd_data/. | tail -1 | awk '{ print sprintf("%.4f",$2/1073741824) }')"
+                   get_conf osd_keyring "$osd_data/keyring" "keyring"
+                   do_cmd_okfail "timeout 30 $BINDIR/ceph -c $conf --name=osd.$id --keyring=$osd_keyring osd crush create-or-move -- $id ${osd_weight:-${defaultweight:-1}} $osd_location"
+                   if [ "$ERR" != "0" ]; then
+                       EXIT_STATUS=$ERR
+                       continue
+                   fi
+               esac
+           fi
+
+           echo Starting Ceph $name on $host...
+           if [ ! -d $run_dir ]; then
+               # assume /var/run exists
+               install -d -m0770 -o ceph -g ceph /var/run/ceph
+           fi
+           get_conf pre_start_eval "" "pre start eval"
+           [ -n "$pre_start_eval" ] && $pre_start_eval
+           get_conf pre_start "" "pre start command"
+           get_conf post_start "" "post start command"
+           [ -n "$pre_start" ] && do_cmd "$pre_start"
+           do_cmd_okfail "$cmd" $runarg
+           if [ "$ERR" != "0" ]; then
+               EXIT_STATUS=$ERR
+               continue
+           fi
+
+           [ -n "$post_start" ] && do_cmd "$post_start"
+           [ -n "$lockfile" ] && [ "$?" -eq 0 ] && touch $lockfile
+           ;;
+
+       stop|onestop)
+           get_conf pre_stop "" "pre stop command"
+           get_conf post_stop "" "post stop command"
+           [ -n "$pre_stop" ] && do_cmd "$pre_stop"
+           stop_daemon $name ceph-$type $pid_file
+           [ -n "$pidfile" ] && rm -f $pidfile
+           [ -n "$asok" ] && rm -f $asok
+           [ -n "$post_stop" ] && do_cmd "$post_stop"
+           [ -n "$lockfile" ] && [ "$?" -eq 0 ] && rm -f $lockfile
+           if [ $dofsumount -eq 1 ] && [ -n "$fs_devs" ]; then
+               echo Unmounting OSD volume on $host:$fs_path
+               do_root_cmd "umount $fs_path || true"
+           fi
+           ;;
+
+       status)
+           if daemon_is_running $name ceph-$type $id $pid_file; then
+               printf "$name: running "
+               do_cmd "$BINDIR/ceph daemon $name version 2>/dev/null" || printf unknown
+               printf "\n"
+            elif [ -e "$pid_file" ]; then
+                # daemon is dead, but pid file still exists
+                echo "$name: dead."
+                EXIT_STATUS=1
+            else
+                # daemon is dead, and pid file is gone
+                echo "$name: not running."
+                EXIT_STATUS=3
+            fi
+           ;;
+
+       ssh)
+           $ssh
+           ;;
+
+       forcestop)
+           get_conf pre_forcestop "" "pre forcestop command"
+           get_conf post_forcestop "" "post forcestop command"
+           [ -n "$pre_forcestop" ] && do_cmd "$pre_forcestop"
+           stop_daemon $name ceph-$type $pid_file -9
+           [ -n "$post_forcestop" ] && do_cmd "$post_forcestop"
+           [ -n "$lockfile" ] && [ "$?" -eq 0 ] && rm -f $lockfile
+           ;;
+
+       killall)
+           echo "killall ceph-$type on $host"
+           do_cmd "pkill ^ceph-$type || true"
+           [ -n "$lockfile" ] && [ "$?" -eq 0 ] && rm -f $lockfile
+           ;;
+
+       force-reload | reload)
+           signal_daemon $name ceph-$type $pid_file -1 "Reloading"
+           ;;
+
+       restart|onerestart)
+           $0 $options stop $name
+           $0 $options start $name
+           ;;
+
+        condrestart)
+            if daemon_is_running $name ceph-$type $id $pid_file; then
+                $0 $options stop $name
+                $0 $options start $name
+            else
+                echo "$name: not running."
+            fi
+            ;;
+
+       cleanlogs)
+           echo removing logs
+           [ -n "$log_dir" ] && do_cmd "rm -f $log_dir/$type.$id.*"
+           ;;
+
+       cleanalllogs)
+           echo removing all logs
+           [ -n "$log_dir" ] && do_cmd "rm -f $log_dir/* || true"
+           ;;
+
+       *)
+           usage_exit
+           ;;
+    esac
+done
+
+# activate latent osds?
+if [ "$command" = "start" -a "$BINDIR" != "." ]; then
+    if [ "$*" = "" ] || echo $* | grep -q ^osd\$ ; then
+       if [ -x $SBINDIR/ceph-disk ]; then
+           ceph-disk activate-all
+       fi
+    fi
+fi
+
+exit $EXIT_STATUS