264 lines
6.9 KiB
Bash
Executable File
264 lines
6.9 KiB
Bash
Executable File
# Initial parameters
|
|
|
|
DATE=`date +%F-%H-%M-%S`
|
|
TIMEOUT=$TIMEOUT
|
|
RESTART=$RESTART
|
|
RESTART_COUNTER=0
|
|
REGISTRY_URL=$DOCKER_REGISTRY_URL
|
|
|
|
# Set env variables
|
|
FILENAME="$1"
|
|
DOMAIN_DIR=$DOMAIN_DIR
|
|
if [ -f $DOMAIN_DIR"/"$FILENAME ]; then
|
|
DOMAIN=$(jq -r .DOMAIN $DOMAIN_DIR"/"$FILENAME)
|
|
else
|
|
# in case of CERT_DIR
|
|
DOMAIN=$FILENAME
|
|
fi;
|
|
PROXY_SERVICE_FILE=$PROXY_SERVICE_FILE
|
|
ROLE=$ROLE
|
|
SERVICE_NAME=$SERVICE_NAME
|
|
PROXY_CONFIG_DIR=$PROXY_CONFIG_DIR
|
|
|
|
|
|
# Setup docker registry url path
|
|
|
|
if [[ -n "$DOCKER_REGISTRY_URL" && "$DOCKER_REGISTRY_URL" != "null" ]] ; then
|
|
SETUP="/setup";
|
|
else
|
|
SETUP="setup";
|
|
DOCKER_REGISTRY_URL="";
|
|
fi
|
|
# SPECIAL MOUNTS CHEKING
|
|
|
|
DNS_DIR=$DNS_DIR
|
|
if [ "$DNS_DIR" == "" ] ; then
|
|
DNS_DIR="/etc/system/data/dns";
|
|
else
|
|
DNS="--env DNS_DIR=$DNS_DIR";
|
|
DNS_PATH="--volume $DNS_DIR:/etc/dns:rw";
|
|
fi
|
|
|
|
USER_INIT_PATH=$USER_INIT_PATH
|
|
|
|
if [ "$USER_INIT_PATH" == "" ]; then
|
|
USER_INIT_PATH=/etc/user/config;
|
|
else
|
|
USER_ENV="--env $USER_INIT_PATH=/etc/user/config";
|
|
USER_PATH="--volume $USER_INIT_PATH:/etc/user/config:ro";
|
|
fi
|
|
|
|
# Setting service files path
|
|
|
|
SERVICE_FILES=$SERVICE_FILES
|
|
|
|
if [ "$SERVICE_FILES" == "" ]; then
|
|
SERVICE_FILES=/etc/user/config/services
|
|
fi
|
|
|
|
CA_PATH=$CA_PATH
|
|
if [ "$CA_PATH" == "" ]; then
|
|
CA_PATH=/etc/ssl/certs;
|
|
else
|
|
CA="--env CA_PATH=$CA_PATH";
|
|
CA_FILE="--volume $CA_PATH:$CA_PATH:ro";
|
|
fi
|
|
|
|
|
|
service_exec="docker run --rm \
|
|
$DNS $DNS_PATH \
|
|
$CA $CA_FILE \
|
|
$USER_ENV $USER_PATH \
|
|
-w /services/ \
|
|
-v $SERVICE_FILES/:/services/:ro \
|
|
-v $SERVICE_FILES/tmp/:/services/tmp/:rw \
|
|
-w /services/ \
|
|
-v /etc/user/config/services/:/services/:ro \
|
|
-v /etc/user/config/services/tmp/:/services/tmp/:rw \
|
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
--env DOCKER_REGISTRY_URL=$DOCKER_REGISTRY_URL \
|
|
$DOCKER_REGISTRY_URL$SETUP"
|
|
|
|
do_proxy_restart() {
|
|
|
|
local NAMES="$1"
|
|
|
|
|
|
for PROXY_NAME in $NAMES ; do
|
|
|
|
DO_RESTART="true";
|
|
if [ "$FORCE_RESTART" != "true" ]; then
|
|
docker stop $PROXY_NAME;
|
|
docker start $PROXY_NAME;
|
|
sleep $TIMEOUT;
|
|
|
|
if docker ps | grep $PROXY_NAME | grep Up ; then
|
|
echo "$PROXY_NAME restarted successful";
|
|
DO_RESTART="false";
|
|
fi
|
|
fi
|
|
|
|
if [ "$DO_RESTART" == "true" ]; then
|
|
for retries in $(seq 0 $((RESTART + 1))); do
|
|
if [[ $retries -le $RESTART ]] ; then
|
|
echo "Proxy "$PROXY_NAME" restarting in progress";
|
|
$service_exec $SERVICE_NAME.containers.$PROXY_NAME stop force;
|
|
|
|
## finding network name for starting affected network
|
|
#NETWORK_NAME=$(jq -r --arg NAME $PROXY_NAME '.containers[] | select(.NAME==$NAME)' $PROXY_SERVICE_FILE | jq -r .NETWORK)
|
|
#$service_exec $SERVICE_NAME.networks.$NETWORK_NAME start
|
|
|
|
$service_exec $SERVICE_NAME.containers.$PROXY_NAME start
|
|
sleep $TIMEOUT;
|
|
if docker ps | grep $PROXY_NAME | grep Up ; then
|
|
echo "$PROXY_NAME restarted successful";
|
|
break ;
|
|
else
|
|
echo "Restarting number is only: "$retries" so try again"
|
|
fi
|
|
else
|
|
echo "Reached retrying limit: "$RESTART" ,giving up, starting recocer previous state"
|
|
recover_process;
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
check_domain() {
|
|
echo "Checking $DOMAIN name";
|
|
CURL_CHECK="curl -m 5 -s -o /dev/null -w "%{http_code}" https://$DOMAIN";
|
|
if [[ "$(eval $CURL_CHECK)" == "200" ]] ; then
|
|
echo "$DOMAIN accessed successful";
|
|
else
|
|
send_error_msg $DOMAIN;
|
|
fi
|
|
}
|
|
|
|
recover_process() {
|
|
echo "Recovering previous state";
|
|
rm $DOMAIN_DIR/$FILENAME;
|
|
|
|
echo "#############################################################################"
|
|
echo "######## DOMAIN ##### $DOMAIN #### DELETED ################"
|
|
echo "#############################################################################"
|
|
exit;
|
|
|
|
}
|
|
|
|
send_error_msg () { echo "Sending error messages"
|
|
}
|
|
|
|
check_proxy_state() {
|
|
|
|
# Set restart counter to zero
|
|
CONTAINER_NAMES="";
|
|
CONTAINERS_BY_ROLE=0
|
|
RUNNING_CONTAINERS=0
|
|
|
|
# Check services with running containers by roles
|
|
for CONTAINER in $(jq -r --arg ROLE $ROLE '.containers[] | select(.ROLES==$ROLE)' $PROXY_SERVICE_FILE | jq -r .NAME) ; do
|
|
|
|
CONTAINERS_BY_ROLE=$((CONTAINERS_BY_ROLE +1))
|
|
|
|
UP=$(docker ps | grep $CONTAINER | grep Up | wc -l)
|
|
RUNNING_CONTAINERS=$((RUNNING_CONTAINERS + UP))
|
|
|
|
CONTAINERS=$CONTAINERS" "$CONTAINER;
|
|
|
|
if [[ "$UP" != 0 ]]; then
|
|
CONTAINER_NAMES=$CONTAINER_NAMES" "$CONTAINER;
|
|
fi;
|
|
done;
|
|
|
|
# The roles numbers and the running containers numbers are equal or greater than 2
|
|
if [[ "$RUNNING_CONTAINERS" == "$CONTAINERS_BY_ROLE" || "$RUNNING_CONTAINERS" -ge 2 ]] ; then
|
|
echo "Starting proxy restart process";
|
|
do_proxy_restart "$CONTAINER_NAMES";
|
|
|
|
# In case of no running proxies found, try to start the service
|
|
elif [[ "$RUNNING_CONTAINERS" -eq 0 ]] ; then
|
|
echo "No running proxies found, starting all";
|
|
|
|
do_proxy_restart "$CONTAINERS";
|
|
|
|
for proxies in $CONTAINERS ; do
|
|
|
|
if docker ps | grep $proxies | grep Up; then
|
|
echo "$proxies started successful";
|
|
else
|
|
echo "$proxies starting was unsuccesful";
|
|
# In case of unsuccessfuly restarted proxy needed to start the proxy containers restarting process.
|
|
do_proxy_restart $proxies;
|
|
fi
|
|
done
|
|
|
|
# In case of only one running proxy found, try to start the others of the service
|
|
elif [[ "$RUNNING_CONTAINERS" -eq 1 ]] ; then
|
|
echo "Only one running proxy found, starting all of the others";
|
|
for proxies in $CONTAINERS ; do
|
|
if [[ $proxies != $CONTAINER_NAMES ]] ; then
|
|
echo "No running containers: "$proxies" found.";
|
|
|
|
do_proxy_restart $proxies;
|
|
|
|
if docker ps | grep $proxies | grep Up ; then
|
|
echo "$proxies started successful";
|
|
else
|
|
echo "$proxies starting was unsuccesful";
|
|
fi
|
|
else
|
|
ONLY_RUNNING_PROXY_NAME=$proxies;
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
# At last need to restart the only one running proxy when the others started successful.
|
|
for CHECK_PROXIES in $CONTAINERS ; do
|
|
if [[ $CHECK_PROXIES != $ONLY_RUNNING_PROXY_NAME ]] ; then
|
|
if docker ps | grep $CHECK_PROXIES | grep Up ; then
|
|
echo "Not running proxies successfuly started, let's start the only running one.";
|
|
do_proxy_restart $ONLY_RUNNING_PROXY_NAME;
|
|
else
|
|
echo "Not enough running proxies found, can't start the only running one.";
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
} # end of check_proxy_state
|
|
|
|
|
|
# call method
|
|
check_proxy_state
|
|
|
|
echo "PROXY RESTARTED SUCCESSFULY"
|
|
# in case of new proxy configuration generated needed to copy the domain name to the configs file.then remove new_config flag.
|
|
if [[ -f $PROXY_CONFIG_DIR/new_config ]] ; then
|
|
if [[ ! -f $PROXY_CONFIG_DIR/config || "$(grep $DOMAIN $PROXY_CONFIG_DIR/config 2>/dev/null)" == "" ]] ; then
|
|
cat $PROXY_CONFIG_DIR/new_config >> $PROXY_CONFIG_DIR/config;
|
|
fi
|
|
|
|
rm $PROXY_CONFIG_DIR/new_config;
|
|
fi
|
|
|
|
# At last check the previously settings of domain.
|
|
check_domain
|
|
|
|
# sleep $TIMEOUT;
|
|
# RESTART_COUNTER=$((RESTART_COUNTER +1))
|
|
#
|
|
# echo "RUNNING CONTAINERS: "$RUNNING_CONTAINERS;
|
|
#
|
|
# if [[ "$RESTART_COUNTER" -le "$RESTART" ]] ; then
|
|
# echo "ELSE: check proxy state";
|
|
# check_proxy_state;
|
|
# else
|
|
# recover_process;
|
|
# fi
|
|
# for CONTAINER in `echo $CONTAINER_NAMES`; do
|
|
|
|
|
|
# done;
|