301 lines
8.5 KiB
Bash
Executable File
301 lines
8.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Debugging function
|
|
debug() {
|
|
if [ $DEBUG -eq 1 ]; then
|
|
echo "DEBUG: "$1 $2 $3
|
|
fi;
|
|
}
|
|
|
|
EXTRA_OPTIONS="$1 $2 $3";
|
|
|
|
DEBUG=0
|
|
SOURCE=$PROXY
|
|
TARGET=$TARGET
|
|
DOMAIN=$DOMAIN
|
|
LOCATION=$LOCATION
|
|
ALLOWED_NETWORKS=$ALLOWED_NETWORKS
|
|
PORT=$PORT
|
|
PUBLIC_PROXY_PATH=$PUBLIC_PROXY_PATH
|
|
SMARTHOST_PROXY_PATH=$SMARTHOST_PROXY_PATH
|
|
INDIVIDUAL_DOMAIN_FLAG=$INDIVIDUAL_DOMAIN_FLAG
|
|
|
|
OPERATION=$OPERATION
|
|
if [ "$OPERATION" == "" ]; then
|
|
OPERATION="CREATE";
|
|
fi
|
|
|
|
|
|
if [ ! -z "$LOCATION" ]; then
|
|
TEMPFILENAME=$(echo $LOCATION |cut -d '/' -f2- |sed 's#/#-#g' );
|
|
FILENAME="$TEMPFILENAME-$DOMAIN";
|
|
else
|
|
FILENAME="$DOMAIN";
|
|
fi
|
|
|
|
# ADDITIONAL VARIABLES
|
|
ROLES=$ROLES
|
|
|
|
# turn on debug mode by extra option "debug"
|
|
if [[ "$(echo "$EXTRA_OPTIONS" | grep debug)" != "" ]] ; then
|
|
DEBUG=1
|
|
fi;
|
|
|
|
SERVICE_FILES=$SERVICE_FILES
|
|
HOST_FILE=$HOST_FILE
|
|
if [ "$HOST_FILE" == "" ]; then
|
|
HOST_FILE="/etc/dns/hosts.local";
|
|
fi
|
|
|
|
RETRIES_NUMBER=$RETRIES_NUMBER
|
|
if [ -z "$RETRIES_NUMBER" ]; then
|
|
RETRIES_NUMBER=2;
|
|
fi
|
|
|
|
# finding IPv4 addresses from application names.
|
|
name_resolver() {
|
|
|
|
local DNS_IP
|
|
local DNS=$1
|
|
APP_IP=""
|
|
UP_COUNT=0;
|
|
SRV_COUNT=0;
|
|
|
|
echo "DNS: "$DNS;
|
|
|
|
for D in $(echo $DNS);
|
|
do
|
|
|
|
if [ -z "$STRICK_CHECK" ]; then
|
|
# find $D as SELECTOR in hosts file
|
|
EXISTS=$(grep -w $D $HOST_FILE);
|
|
#EXISTS=$(grep -w "$D-" $HOST_FILE); # TODO?
|
|
if [ -n "$EXISTS" ]; then # selector exists in hosts file
|
|
APP_IP=$(echo $EXISTS | awk '{print $1}'); # remove all selectors
|
|
debug "APP_IP: "$APP_IP;
|
|
else
|
|
debug "no matching APPLICATION NAME found in $HOST_FILE"
|
|
fi
|
|
else
|
|
D=$(echo $D | cut -d "-" -f1)
|
|
UP=$(docker ps --format '{{.Names}}\t{{.Status}}' | grep Up | awk '{print $1}' | grep $D"-") ;
|
|
# filtering for ROLES variables if exists.
|
|
if [[ "$ROLES" != "null" && ! -z "$ROLES" ]]; then
|
|
UPS=""
|
|
for U in $(echo $UP); do
|
|
for ROLE in $(echo $ROLES); do
|
|
FILTERED_BY_ROLE=$(docker inspect $U -f '{{.Config.Labels.roles}}' | uniq | grep $ROLE)
|
|
if [[ "$(echo $FILTERED_BY_ROLE)" != "" ]]; then
|
|
UPS="$UPS $U";
|
|
fi
|
|
done
|
|
done
|
|
UP=$UPS
|
|
fi
|
|
|
|
UP_COUNT=$((UP_COUNT+$(echo $UP | wc -w)));
|
|
|
|
for SRV_FILE in $(echo $SERVICE_FILES); do
|
|
CONTAINER_NAMES=$(jq -r .containers[].NAME $SRV_FILE);
|
|
for NAME in $(echo $CONTAINER_NAMES); do
|
|
NEWNAME=$(echo $NAME | cut -d "-" -f1);
|
|
if [ "$D" == "$NEWNAME" ]; then
|
|
if [[ "$ROLES" != "null" && ! -z "$ROLES" ]]; then
|
|
C_ROLES=$(jq -r --arg NAME "$NAME" '.containers[] | select(.NAME==$NAME)' $SRV_FILE | jq -r .ROLES);
|
|
for ROLE in $(echo $ROLES); do
|
|
# TODO, ha C_ROLES tobb erteket tartalmaz
|
|
if [ "$ROLE" == "$C_ROLES" ]; then
|
|
SRV_COUNT=$((SRV_COUNT+1));
|
|
fi
|
|
done
|
|
else
|
|
SRV_COUNT=$((SRV_COUNT+1));
|
|
fi;
|
|
fi;
|
|
|
|
done;
|
|
done
|
|
|
|
if [ ! -z "$UP" ] ; then
|
|
for D_IP in `echo $UP` ;
|
|
do
|
|
DNS_IP=$(docker inspect $D_IP -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}');
|
|
if [ "$APP_IP" == "" ]; then
|
|
APP_IP=$DNS_IP;
|
|
else
|
|
APP_IP="$APP_IP $DNS_IP";
|
|
fi;
|
|
echo "APP_IP: "$APP_IP;
|
|
done
|
|
else
|
|
debug "no matching running process found"
|
|
fi
|
|
fi
|
|
done;
|
|
|
|
if [[ ! -z "$STRICK_CHECK" && $UP_COUNT -lt $SRV_COUNT ]]; then
|
|
if [ "$2" == "" ]; then RETRIES=0;
|
|
else RETRIES=$2;
|
|
fi;
|
|
if [ $RETRIES -le $RETRIES_NUMBER ]; then
|
|
debug "Try to reread container names at $RETRIES";
|
|
sleep 1;
|
|
RETRIES=$((RETRIES+1));
|
|
name_resolver $DNS $RETRIES;
|
|
else
|
|
debug "Not enough running process found for executing domain related rules, exiting";
|
|
exit;
|
|
fi
|
|
fi;
|
|
}
|
|
# GETTING APPLICATIONS IP ADDRESSES
|
|
|
|
if [ ! -z "$SOURCE" ]; then
|
|
for i in $(echo $SOURCE) ; do
|
|
if [[ $i =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
SOURCE_IP=$i;
|
|
NO_TARGET_IP="true";
|
|
else
|
|
name_resolver $i;
|
|
debug "source ip is $APP_IP";
|
|
if [[ -z "$APP_IP" ]]; then
|
|
debug "No any IP address found for SOURCE: $SOURCE, try again to resolv";
|
|
name_resolver $i;
|
|
debug "Source ip is $APP_IP";
|
|
|
|
if [[ -z "$APP_IP" ]]; then
|
|
debug "No any IP address found for SOURCE: $SOURCE, giving up";
|
|
exit;
|
|
fi
|
|
fi
|
|
SOURCE_IP=$APP_IP;
|
|
fi
|
|
done
|
|
else
|
|
debug "SOURCE is empty";
|
|
exit;
|
|
fi
|
|
|
|
if [ ! -z "$TARGET" ]; then
|
|
IDX=0
|
|
for i in $(echo $TARGET) ; do
|
|
name_resolver $i;
|
|
debug "target ip is $APP_IP";
|
|
if [[ -z "$APP_IP" ]]; then
|
|
debug "No any IP address found for TARGET: $TARGET, try again to resolv";
|
|
name_resolver $i;
|
|
debug "Target ip is $APP_IP";
|
|
|
|
if [[ -z "$APP_IP" ]]; then
|
|
debug "No any IP address found for TARGET: $TARGET, giving up";
|
|
exit;
|
|
fi
|
|
fi
|
|
TARGET_IP=$APP_IP;
|
|
#for IP in $(echo $APP_IP); do
|
|
# IDX=$(expr 1 + $IDX)
|
|
# eval TARGET_IP_$IDX=$IP;
|
|
#done;
|
|
|
|
done
|
|
else
|
|
debug "TARGET is empty";
|
|
if [ "$NO_TARGET_IP" != "true" ]; then
|
|
exit;
|
|
fi
|
|
fi;
|
|
|
|
# CHECKING WHETHER IS IT NEEDED TO USE PUBLIC PROXY SERVICE
|
|
if [[ "$PUBLIC_PROXY_PATH" != "" && -z "$LOCATION" ]]; then
|
|
|
|
# check domain config file exits
|
|
LOCAL_NAME="LOCAL_IP";
|
|
PUBLIC_DOMAIN=$(jq -r .DOMAIN $PUBLIC_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
PUBLIC_IP=$(jq -r .LOCAL_IP $PUBLIC_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
|
|
if [ -z "$STRICK_CHECK" ]; then
|
|
LOCAL_NAME="LOCAL_NAME";
|
|
SOURCE_IP=$SOURCE;
|
|
PUBLIC_IP=$(jq -r .LOCAL_NAME $PUBLIC_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
fi;
|
|
|
|
if [[ -f "$PUBLIC_PROXY_PATH/$FILENAME" && "$PUBLIC_DOMAIN" == "$DOMAIN" && "$PUBLIC_IP" == "$SOURCE_IP" && "$OPERATION" == "CREATE" ]]; then
|
|
echo "Nothing to do.";
|
|
else
|
|
#Create public proxy domain file
|
|
|
|
if [[ "$INDIVIDUAL_DOMAIN_FLAG" == "" || "$INDIVIDUAL_DOMAIN_FLAG" == "null" ]]; then
|
|
INDIVIDUAL_DOMAIN_FLAG="";
|
|
else
|
|
INDIVIDUAL_DOMAIN_FLAG='"INDIVIDUAL_DOMAIN": "true",';
|
|
fi
|
|
|
|
echo '
|
|
{
|
|
"DOMAIN": "'$DOMAIN'",
|
|
"ALIASES_HTTP": [ ],
|
|
"ALIASES_HTTPS": [ ],
|
|
"'$LOCAL_NAME'": "'$SOURCE_IP'",
|
|
"HTTP_PORT": "80",
|
|
"HTTPS_PORT": "443",
|
|
"ERROR_PAGE": "",
|
|
"REDIRECT_HTTP": "",
|
|
"REDIRECT_HTTPS": "",
|
|
'$INDIVIDUAL_DOMAIN_FLAG'
|
|
"OPERATION": "'$OPERATION'"
|
|
}
|
|
' | jq -r . > $PUBLIC_PROXY_PATH/$FILENAME
|
|
fi
|
|
fi
|
|
|
|
# CHECKING WHETHER IS IT NEEDED TO USE SMARTHOST PROXY SERVICE
|
|
if [ "$SMARTHOST_PROXY_PATH" != "" ]; then
|
|
|
|
# check domain config file exits
|
|
LOCAL_NAME="LOCAL_IP";
|
|
SMARTHOST_DOMAIN=$(jq -r .DOMAIN $SMARTHOST_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
SMARTHOST_IP=$(jq -r .LOCAL_IP $SMARTHOST_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
SMARTHOST_PORT=$(jq -r .HTTP_PORT $SMARTHOST_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
|
|
if [ -z "$STRICK_CHECK" ]; then
|
|
LOCAL_NAME="LOCAL_NAME";
|
|
TARGET_IP=$TARGET;
|
|
SMARTHOST_IP=$(jq -r .LOCAL_NAME $PUBLIC_PROXY_PATH/$FILENAME 2>/dev/null)
|
|
fi;
|
|
|
|
if [[ -f "$SMARTHOST_PROXY_PATH/$FILENAME" && "$SMARTHOST_DOMAIN" == "$DOMAIN" && "$SMARTHOST_IP" == "$TARGET_IP" && "$SMARTHOST_PORT" == "$PORT" ]]; then
|
|
|
|
echo "Nothing to do."
|
|
else
|
|
#Create public proxy domain file
|
|
if [ -n "$LOCATION" ]; then
|
|
LOCATION_LINE=',
|
|
"ALTERNATE_LOCATION_PATH": [ {
|
|
"LOCAL_PATH": "'$LOCATION'",
|
|
"LOCAL_NAME": "'$TARGET_IP'",
|
|
"LOCAL_PORT": "'$PORT'",
|
|
"LOCAL_ALLOWED_NETWORK": "'$ALLOWED_NETWORKS'"
|
|
} ]
|
|
';
|
|
else
|
|
LOCATION_LINE=',"'$LOCAL_NAME'": "'$TARGET_IP'"';
|
|
fi;
|
|
|
|
echo '
|
|
{
|
|
"DOMAIN": "'$DOMAIN'",
|
|
"ALIASES_HTTP": [ ],
|
|
"ALIASES_HTTPS": [ ],
|
|
"HTTP_PORT": "",
|
|
"HTTPS_PORT": "'$PORT'",
|
|
"ERROR_PAGE": "",
|
|
"REDIRECT_HTTP": "https://'$DOMAIN''$LOCATION'",
|
|
"REDIRECT_HTTPS": "",
|
|
"OPERATION": "'$OPERATION'",
|
|
"MAX_BODY_SIZE": "512M"'$LOCATION_LINE'
|
|
}
|
|
' | jq -r . > $SMARTHOST_PROXY_PATH/$FILENAME
|
|
fi
|
|
fi
|
|
|