274 lines
8.8 KiB
Bash
274 lines
8.8 KiB
Bash
#! /bin/sh
|
|
|
|
cd /scripts
|
|
|
|
DOCKER_REGISTRY_URL=${DOCKER_REGISTRY_URL:-registry.format.hu}
|
|
USER_INIT_PATH=$USER_INIT_PATH
|
|
|
|
FRAMEWORK_SCHEDULER_IMAGE=${FRAMEWORK_SCHEDULER_IMAGE:-framework-scheduler}
|
|
FRAMEWORK_SCHEDULER_NAME=${FRAMEWORK_SCHEDULER_NAME:-framework-scheduler}
|
|
FRAMEWORK_SCHEDULER_NETWORK=${FRAMEWORK_SCHEDULER_NETWORK:-framework-network}
|
|
FRAMEWORK_NETWORK_SUBNET=${FRAMEWORK_NETWORK_SUBNET:-"172.18.255.0/24"}
|
|
|
|
WEB_SERVER=${WEB_SERVER:-webserver}
|
|
WEB_IMAGE=${WEB_IMAGE:-web-installer}
|
|
WEBSERVER_PORT=${WEBSERVER_PORT:-8080}
|
|
WEBSERVER_VERSION=${WEBSERVER_VERSION:-latest}
|
|
REDIS_SERVER=${REDIS_SERVER:-redis}
|
|
REDIS_PORT=${REDIS_PORT:-6379}
|
|
REDIS_IMAGE=${REDIS_IMAGE:-redis}
|
|
REDIS_VERSION=${REDIS_VERSION:-latest}
|
|
|
|
SOURCE=${SOURCE:-user-config}
|
|
SMARTHOST_PROXY_PATH=$SMARTHOST_PROXY_PATH
|
|
|
|
|
|
GIT_URL=$GIT_URL
|
|
TOKEN=$TOKEN
|
|
REPO=$REPO
|
|
|
|
# scheduler settings
|
|
CURL_SLEEP_SHORT=${CURL_SLEEP_SHORT:-5}
|
|
CURL_RETRIES=${CURL_RETRIES:-360}
|
|
|
|
SCHEDULER_SERVICEFILE_GENERATE_TEST=${SCHEDULER_SERVICEFILE_GENERATE_TEST:-false}
|
|
|
|
|
|
if [[ -n "$DOCKER_REGISTRY_URL" && "$DOCKER_REGISTRY_URL" != "null" ]]; then
|
|
SETUP="/setup"
|
|
else
|
|
SETUP="setup"
|
|
DOCKER_REGISTRY_URL=""
|
|
fi
|
|
|
|
DNS_DIR="/etc/system/data/dns"
|
|
DNS="--env DNS_DIR=$DNS_DIR"
|
|
DNS_PATH="--volume $DNS_DIR:/etc/dns:rw"
|
|
|
|
CA_PATH=/etc/system/data/ssl/certs
|
|
CA="--env CA_PATH=$CA_PATH"
|
|
CA_FILE="--volume $CA_PATH:$CA_PATH:ro"
|
|
|
|
service_exec="docker run --rm \
|
|
$DNS $DNS_PATH \
|
|
$CA $CA_FILE \
|
|
-w /services/ \
|
|
-v $SOURCE/system.json:/etc/user/config/system.json:ro \
|
|
-v $SOURCE/user.json:/etc/user/config/user.json:ro \
|
|
-v $SOURCE/services:/services:ro \
|
|
-v $SOURCE/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"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_manager(){
|
|
|
|
FRAMEWORK_NAME=$1;
|
|
FRAMEWORK_NETWORK=$2;
|
|
FRAMEWORK_SUBNET=$3;
|
|
FRAMEWORK_UPDATE=$4;
|
|
|
|
# TODO service exec json
|
|
if [ "$FRAMEWORK_NETWORK" == "0" ]; then
|
|
echo "Restarting the scheduler with the correct network"
|
|
docker network create $FRAMEWORK_SCHEDULER_NETWORK --subnet $FRAMEWORK_NETWORK_SUBNET
|
|
fi;
|
|
|
|
if [ "$FRAMEWORK_SUBNET" == "0" ]; then
|
|
echo "Creating network $FRAMEWORK_SCHEDULER_NETWORK"
|
|
docker network create $FRAMEWORK_SCHEDULER_NETWORK --subnet $FRAMEWORK_NETWORK_SUBNET
|
|
fi
|
|
|
|
if [ "$FRAMEWORK_NAME" == "0" ]; then
|
|
echo "Restarting the scheduler with the correct name"
|
|
docker stop $ACTUAL_FRAMEWORK_SCHEDULER_NAME
|
|
docker rm $ACTUAL_FRAMEWORK_SCHEDULER_NAME
|
|
docker run -d --name $FRAMEWORK_SCHEDULER_NAME --network $FRAMEWORK_SCHEDULER_NETWORK --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /scripts:/scripts $DOCKER_REGISTRY_URL/$FRAMEWORK_SCHEDULER_NAME
|
|
fi
|
|
|
|
}
|
|
|
|
check_dirs_and_files(){
|
|
|
|
RET=0;
|
|
if [[ -d "/etc/system/data/" && -d "/etc/user/config/" && -d "/services/" && -d "/tmp/" ]]; then
|
|
if [[ -f "/etc/user/config/system.json" && -f "/etc/user/config/user.json" ]]; then
|
|
RET=1;
|
|
fi;
|
|
fi;
|
|
|
|
echo $RET;
|
|
}
|
|
|
|
check_framework_scheduler_status(){
|
|
|
|
ACTUAL_FRAMEWORK_SCHEDULER_NAME=$1;
|
|
|
|
if "$ACTUAL_FRAMEWORK_SCHEDULER_NAME" == "$FRAMEWORK_SCHEDULER_NAME"; then
|
|
echo "Scheduler name not correct, not needed to restart is with the correct name";
|
|
else
|
|
FRAMEWORK_NAME=0;
|
|
fi
|
|
|
|
if [ "$(docker network ls --filter name=^$FRAMEWORK_SCHEDULER_NETWORK$ --format {{.Name}})" ]; then
|
|
echo "Network $FRAMEWORK_SCHEDULER_NETWORK is available, not needed to restart the scheduler"
|
|
|
|
if [ "$(docker network inspect $FRAMEWORK_SCHEDULER_NETWORK --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}')" == "$FRAMEWORK_NETWORK_SUBNET" ]; then
|
|
echo "Network $FRAMEWORK_SCHEDULER_NETWORK is available with the correct subnet, not needed to restart the scheduler"
|
|
else
|
|
check_framework_subnet_availabity
|
|
FRAMEWORK_SUBNET=0;
|
|
fi
|
|
else
|
|
FRAMEWORK_NETWORK=0;
|
|
fi
|
|
|
|
scheduler_manager $FRAMEWORK_NAME $FRAMEWORK_NETWORK $FRAMEWORK_SUBNET $FRAMEWORK_UPDATE
|
|
|
|
#echo '{"FRAMEWORK_NAME": "$FRAMEWORK_NAME", "FRAMEWORK_NETWORK": "$FRAMEWORK_NETWORK"}'
|
|
|
|
}
|
|
|
|
|
|
check_framework_subnet_availabity() {
|
|
|
|
# Define the subnet you want to check
|
|
desired_subnet=$FRAMEWORK_NETWORK_SUBNET
|
|
existing_subnets=$(docker network inspect $(docker network ls -q) --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}')
|
|
|
|
# Check if the desired subnet is in the list of existing subnets
|
|
if echo "$existing_subnets" | grep -q "$desired_subnet"; then
|
|
echo "Subnet $desired_subnet is not available for creation. Need to find another network"
|
|
else
|
|
echo "Subnet $desired_subnet is available for creation."
|
|
fi
|
|
}
|
|
|
|
check_redis_availability() {
|
|
REDIS_SERVER="$1"
|
|
REDIS_PORT="$2"
|
|
CURL_RETRIES="$3"
|
|
CURL_SLEEP_SHORT="$4"
|
|
|
|
for retries in $(seq 0 "$((CURL_RETRIES + 1))"); do
|
|
if [ "$retries" -le "$CURL_RETRIES" ]; then
|
|
CHECK_REDIS_SERVER="redis-cli -h '$REDIS_SERVER' -p '$REDIS_PORT' PING"
|
|
REDIS_RESPONSE="$(eval "$CHECK_REDIS_SERVER")"
|
|
|
|
# echo "$REDIS_SERVER server's reply to PING: $REDIS_RESPONSE"
|
|
|
|
if [ "$REDIS_RESPONSE" = "PONG" ]; then
|
|
echo "Connected to $REDIS_SERVER:$REDIS_PORT"
|
|
break
|
|
else
|
|
sleep "$CURL_SLEEP_SHORT"
|
|
fi
|
|
else
|
|
echo "Couldn't reach server at $REDIS_SERVER:$REDIS_PORT after [$CURL_RETRIES] retries, exiting."
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
start_redis () {
|
|
|
|
/usr/bin/docker run -d --name $REDIS_SERVER $REDIS_IMAGE:$REDIS_VERSION
|
|
|
|
}
|
|
|
|
start_webserver () {
|
|
|
|
/usr/bin/docker run -d -p $WEBSERVER_PORT:80/tcp --name $WEB_SERVER $DOCKER_REGISTRY_URL/$WEB_IMAGE:$WEBSERVER_VERSION
|
|
}
|
|
### SYSTEM INITIALIZATION ###
|
|
|
|
# CHECKING SYSTEM ENVIRONMENTS
|
|
## DOCKER VARIABLES
|
|
## DOCKER NETWORK VARIABLES
|
|
## VERSION CHECK
|
|
## FILESYSTEM VARIABLES
|
|
## PORTS VARIABLES
|
|
### RESTART SCHEDULER IF NEEDED
|
|
|
|
check_dirs_and_files
|
|
|
|
check_framework_scheduler_status $HOSTNAME
|
|
|
|
check_framework_network_availabity
|
|
|
|
# REDIS_SERVER EXISTENCE
|
|
## REDIS_PORT EXISTENCE
|
|
## VERSION CHECK
|
|
start_redis
|
|
echo `date`" Redis initialized"
|
|
# WEBSERVER EXISTENCE
|
|
## WEBSERVER_PORT EXISTENCE
|
|
## VERSION CHECK
|
|
start_webserver
|
|
echo `date`" Webserver initialized"
|
|
|
|
#### SUMMARY
|
|
#########################################
|
|
# TESTING
|
|
sleep 86400
|
|
|
|
exit
|
|
|
|
|
|
# poll redis infinitely for scheduler jobs
|
|
check_redis_availability $REDIS_SERVER $REDIS_PORT $CURL_RETRIES $CURL_SLEEP_SHORT
|
|
echo `date`" Scheduler initialized, starting listening for events"
|
|
while true; do
|
|
|
|
IDS=""
|
|
|
|
# GET DEPLOYMENT IDs FROM generate key
|
|
IDS=$(redis-cli -h $REDIS_SERVER -p $REDIS_PORT SMEMBERS web_in)
|
|
if [[ "$IDS" != "0" && "$IDS" != "" ]]; then
|
|
|
|
# PROCESSING IDS
|
|
for I in $(echo $IDS); do
|
|
|
|
### READ DATA FROM REDIS
|
|
JSON=$(redis-cli -h $REDIS_SERVER -p $REDIS_PORT GET $I | base64 -d)
|
|
DOMAIN=$(echo "$JSON" | jq -r '.DOMAIN')
|
|
TYPE=$(echo "$JSON" | jq -r '.TYPE')
|
|
ACTION=$(echo "$JSON" | jq -r '.ACTION')
|
|
PAYLOAD=$(echo "$JSON" | jq -r '.PAYLOAD')
|
|
|
|
JSON_TARGET=$(echo $JSON | jq -rc .'STATUS="0"' | base64 -w0);
|
|
redis-cli -h $REDIS_SERVER -p $REDIS_PORT SET $I "$JSON_TARGET";
|
|
|
|
if [ "$TYPE" == "DOMAIN" ]; then
|
|
/scripts/zone2git.sh "$I" "$DOMAIN" "$ACTION" "$PAYLOAD" "$GIT_URL" "$TOKEN" "$REPO";
|
|
|
|
elif [ "$TYPE" == "VPN" ]; then
|
|
/scripts/create_vpn.sh "$I" "$DOMAIN" "$ACTION" "$PAYLOAD" "$REDIS_SERVER" "$REDIS_PORT" "$NAMESPACE" "$KUBERNETES" "$KUBERNETES_ENVIRONMENT" "$USER_INIT_PATH" "$VERSIONS_CONFIG_FILE" "$DOCKER_REGISTRY_URL" "$SMARTHOST_PROXY_PATH" "$MAIN_DOMAIN" "$SOURCE" "$PROXY_DELAY";
|
|
fi
|
|
|
|
if [ "$?" == "0" ]; then
|
|
JSON_TARGET=$(echo $JSON | jq -rc .'STATUS="1"' | base64 -w0);
|
|
else
|
|
JSON_TARGET=$(echo $JSON | jq -rc .'STATUS="2"' | base64 -w0);
|
|
fi
|
|
|
|
redis-cli -h $REDIS_SERVER -p $REDIS_PORT SET $I "$JSON_TARGET";
|
|
|
|
# MOVE ID from generate into generated
|
|
redis-cli -h $REDIS_SERVER -p $REDIS_PORT SREM web_in $I
|
|
redis-cli -h $REDIS_SERVER -p $REDIS_PORT SADD web_out $I
|
|
|
|
done
|
|
fi
|
|
|
|
sleep 1
|
|
done
|