260 lines
7.6 KiB
Bash
Executable File
260 lines
7.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
[ $(id -u) != '0' ] && echo "root is needed" && exit 1
|
|
|
|
# get some path of docklet
|
|
bindir=${0%/*}
|
|
# $bindir maybe like /opt/docklet/src/../sbin
|
|
# use command below to make $bindir in normal absolute path
|
|
DOCKLET_BIN=$(cd $bindir; pwd)
|
|
DOCKLET_HOME=${DOCKLET_BIN%/*}
|
|
DOCKLET_CONF=$DOCKLET_HOME/conf
|
|
LXC_SCRIPT=$DOCKLET_CONF/lxc-script
|
|
DOCKLET_SRC=$DOCKLET_HOME/src
|
|
DOCKLET_LIB=$DOCKLET_SRC
|
|
DOCKLET_WEB=$DOCKLET_HOME/web
|
|
DOCKLET_USER=$DOCKLET_HOME/user
|
|
|
|
# default working directory, default to /opt/docklet
|
|
FS_PREFIX=/opt/docklet
|
|
|
|
RUN_DIR=$FS_PREFIX/local/run
|
|
LOG_DIR=$FS_PREFIX/local/log
|
|
|
|
#network interface , default is eth0
|
|
NETWORK_DEVICE=eth0
|
|
#etcd server address, default is localhost:2379
|
|
ETCD=localhost:2379
|
|
#unique cluster_name, default is docklet-vc
|
|
CLUSTER_NAME=docklet-vc
|
|
#web port, default is 8888
|
|
WEB_PORT=8888
|
|
USER_PORT=9100
|
|
#cluster net, default is 172.16.0.1/16
|
|
CLUSTER_NET="172.16.0.1/16"
|
|
# ip addresses range of containers for batch job, default is 10.0.3.0/24
|
|
BATCH_NET="10.0.3.0/24"
|
|
#configurable-http-proxy public port, default is 8000
|
|
PROXY_PORT=8000
|
|
#configurable-http-proxy api port, default is 8001
|
|
PROXY_API_PORT=8001
|
|
DISTRIBUTED_GATEWAY=False
|
|
|
|
. $DOCKLET_CONF/docklet.conf
|
|
|
|
export FS_PREFIX
|
|
|
|
# This next line determines what user the script runs as.
|
|
DAEMON_USER=root
|
|
|
|
# settings for docklet master
|
|
DAEMON_MASTER=$DOCKLET_LIB/master/httprest.py
|
|
DAEMON_NAME_MASTER=docklet-master
|
|
DAEMON_OPTS_MASTER=
|
|
# The process ID of the script when it runs is stored here:
|
|
PIDFILE_MASTER=$RUN_DIR/$DAEMON_NAME_MASTER.pid
|
|
|
|
# settings for docklet web
|
|
DAEMON_WEB=$DOCKLET_WEB/web.py
|
|
DAEMON_NAME_WEB=docklet-web
|
|
PIDFILE_WEB=$RUN_DIR/docklet-web.pid
|
|
DAEMON_OPTS_WEB=
|
|
|
|
# settings for docklet proxy, which is required for web access
|
|
DAEMON_PROXY=`which configurable-http-proxy`
|
|
DAEMON_NAME_PROXY=docklet-proxy
|
|
PIDFILE_PROXY=$RUN_DIR/proxy.pid
|
|
DAEMON_OPTS_PROXY=
|
|
# settings for docklet user
|
|
DAEMON_USER_MODULE=$DOCKLET_USER/user.py
|
|
DAEMON_NAME_USER=docklet-user
|
|
PIDFILE_USER=$RUN_DIR/docklet-user.pid
|
|
DAEMON_OPTS_USER=
|
|
|
|
RUNNING_CONFIG=$FS_PREFIX/local/docklet-running.conf
|
|
export CONFIG=$RUNNING_CONFIG
|
|
|
|
. /lib/lsb/init-functions
|
|
|
|
###########
|
|
|
|
pre_start_master () {
|
|
log_daemon_msg "Starting $DAEMON_NAME_MASTER in $FS_PREFIX"
|
|
|
|
[ ! -d $FS_PREFIX/global ] && mkdir -p $FS_PREFIX/global
|
|
[ ! -d $FS_PREFIX/local ] && mkdir -p $FS_PREFIX/local
|
|
[ ! -d $FS_PREFIX/global/users ] && mkdir -p $FS_PREFIX/global/users
|
|
[ ! -d $FS_PREFIX/global/sys ] && mkdir -p $FS_PREFIX/global/sys
|
|
[ ! -d $FS_PREFIX/global/images/private ] && mkdir -p $FS_PREFIX/global/images/private
|
|
[ ! -d $FS_PREFIX/global/images/public ] && mkdir -p $FS_PREFIX/global/images/public
|
|
[ ! -d $FS_PREFIX/local/volume ] && mkdir -p $FS_PREFIX/local/volume
|
|
[ ! -d $FS_PREFIX/local/temp ] && mkdir -p $FS_PREFIX/local/temp
|
|
[ ! -d $FS_PREFIX/local/run ] && mkdir -p $FS_PREFIX/local/run
|
|
[ ! -d $FS_PREFIX/local/log ] && mkdir -p $FS_PREFIX/local/log
|
|
|
|
grep -P "^[\s]*[a-zA-Z]" $DOCKLET_CONF/docklet.conf > $RUNNING_CONFIG
|
|
|
|
echo "DOCKLET_HOME=$DOCKLET_HOME" >> $RUNNING_CONFIG
|
|
echo "DOCKLET_BIN=$DOCKLET_BIN" >> $RUNNING_CONFIG
|
|
echo "DOCKLET_CONF=$DOCKLET_CONF" >> $RUNNING_CONFIG
|
|
echo "LXC_SCRIPT=$LXC_SCRIPT" >> $RUNNING_CONFIG
|
|
echo "DOCKLET_SRC=$DOCKLET_SRC" >> $RUNNING_CONFIG
|
|
echo "DOCKLET_LIB=$DOCKLET_LIB" >> $RUNNING_CONFIG
|
|
|
|
|
|
# iptables for NAT network for containers to access web
|
|
iptables -t nat -F
|
|
iptables -t nat -A POSTROUTING -s $CLUSTER_NET -j MASQUERADE
|
|
iptables -t nat -A POSTROUTING -s $BATCH_NET -j MASQUERADE
|
|
|
|
}
|
|
|
|
do_start_master () {
|
|
|
|
DAEMON_OPTS_MASTER=$1
|
|
|
|
# MODE : start mode
|
|
# new : clean old data in etcd, global directory and start a new cluster
|
|
# recovery : start cluster and recover status from etcd and global directory
|
|
# Default is "recovery"
|
|
|
|
start-stop-daemon --start --oknodo --background --pidfile $PIDFILE_MASTER --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON_MASTER -- $DAEMON_OPTS_MASTER
|
|
log_end_msg $?
|
|
}
|
|
|
|
pre_start_web () {
|
|
log_daemon_msg "Starting $DAEMON_NAME_WEB in $FS_PREFIX"
|
|
|
|
webip=$(ip addr show $NETWORK_DEVICE | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+")
|
|
|
|
[ $? != "0" ] && echo "wrong NETWORK_DEVICE $NETWORK_DEVICE" && exit 1
|
|
|
|
webip=${webip%/*}
|
|
|
|
AUTH_COOKIE_URL=http://$webip:$WEB_PORT/jupyter
|
|
#echo "set AUTH_COOKIE_URL:$AUTH_COOKIE_URL in etcd with key:$CLUSTER_NAME/web/authurl"
|
|
curl -XPUT http://$ETCD/v2/keys/$CLUSTER_NAME/web/authurl -d value="$AUTH_COOKIE_URL" > /dev/null 2>&1
|
|
[ $? != 0 ] && echo "set AUTH_COOKIE_URL failed in etcd" && exit 1
|
|
}
|
|
|
|
do_start_web () {
|
|
pre_start_web
|
|
|
|
DAEMON_OPTS_WEB="-p $WEB_PORT"
|
|
|
|
start-stop-daemon --start --background --pidfile $PIDFILE_WEB --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON_WEB -- $DAEMON_OPTS_WEB
|
|
log_end_msg $?
|
|
}
|
|
|
|
do_start_proxy () {
|
|
if [ "$DISTRIBUTED_GATEWAY" = "True" ]
|
|
then
|
|
return 1
|
|
fi
|
|
log_daemon_msg "Starting $DAEMON_NAME_PROXY daemon in $FS_PREFIX"
|
|
DAEMON_OPTS_PROXY="--port $PROXY_PORT --api-port $PROXY_API_PORT --default-target=http://localhost:8888"
|
|
start-stop-daemon --start --background --pidfile $PIDFILE_PROXY --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON_PROXY -- $DAEMON_OPTS_PROXY
|
|
log_end_msg $?
|
|
}
|
|
|
|
do_start_user () {
|
|
log_daemon_msg "Starting $DAEMON_NAME_USER in $FS_PREFIX"
|
|
|
|
DAEMON_OPTS_USER="-p $USER_PORT"
|
|
|
|
start-stop-daemon --start --background --pidfile $PIDFILE_USER --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON_USER_MODULE -- $DAEMON_OPTS_USER
|
|
log_end_msg $?
|
|
}
|
|
|
|
do_stop_master () {
|
|
log_daemon_msg "Stopping $DAEMON_NAME_MASTER daemon"
|
|
start-stop-daemon --stop --quiet --oknodo --remove-pidfile --pidfile $PIDFILE_MASTER --retry 10
|
|
log_end_msg $?
|
|
}
|
|
|
|
do_stop_web () {
|
|
log_daemon_msg "Stopping $DAEMON_NAME_WEB daemon"
|
|
start-stop-daemon --stop --quiet --oknodo --remove-pidfile --pidfile $PIDFILE_WEB --retry 10
|
|
log_end_msg $?
|
|
}
|
|
|
|
|
|
do_stop_proxy () {
|
|
if [ "$DISTRIBUTED_GATEWAY" = "True" ]
|
|
then
|
|
return 1
|
|
fi
|
|
log_daemon_msg "Stopping $DAEMON_NAME_PROXY daemon"
|
|
start-stop-daemon --stop --quiet --oknodo --remove-pidfile --pidfile $PIDFILE_PROXY --retry 10
|
|
log_end_msg $?
|
|
}
|
|
do_stop_user () {
|
|
log_daemon_msg "Stopping $DAEMON_NAME_USER daemon"
|
|
start-stop-daemon --stop --quiet --oknodo --remove-pidfile --pidfile $PIDFILE_USER --retry 10
|
|
log_end_msg $?
|
|
}
|
|
|
|
case "$1" in
|
|
init)
|
|
pre_start_master
|
|
do_start_master "new"
|
|
do_start_proxy
|
|
do_start_web
|
|
;;
|
|
start)
|
|
pre_start_master
|
|
do_start_master "recovery"
|
|
do_start_proxy
|
|
do_start_web
|
|
;;
|
|
|
|
stop)
|
|
do_stop_master
|
|
do_stop_proxy
|
|
do_stop_web
|
|
;;
|
|
|
|
restart)
|
|
do_stop_master
|
|
do_stop_proxy
|
|
do_stop_web
|
|
pre_start_master
|
|
do_start_master "recovery"
|
|
do_start_proxy
|
|
do_start_web
|
|
;;
|
|
|
|
start_proxy)
|
|
do_start_proxy
|
|
;;
|
|
|
|
start_web)
|
|
do_start_web
|
|
;;
|
|
|
|
stop_web)
|
|
do_stop_web
|
|
;;
|
|
|
|
reinit)
|
|
do_stop_master
|
|
do_stop_proxy
|
|
pre_start_master
|
|
do_start_master "new"
|
|
do_start_proxy
|
|
;;
|
|
|
|
status)
|
|
status=0
|
|
status_of_proc -p $PIDFILE_MASTER "$DAEMON_MASTER" "$DAEMON_NAME_MASTER" || status=$?
|
|
status_of_proc -p $PIDFILE_PROXY "$DAEMON_PROXY" "$DAEMON_NAME_PROXY" || status=$?
|
|
exit $status
|
|
;;
|
|
|
|
*)
|
|
echo "Usage: $DAEMON_NAME_MASTER {init|start|stop|restart|reinit|status|start_proxy|stop_proxy|start_web|stop_web}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
exit 0
|