#!/bin/sh # Debugging function debug() { if [ $DEBUG -eq 1 ]; then echo "DEBUG: "$1 $2 $3 fi; } DEBUG=0 SOURCE=$PROXY TARGET=$TARGET DOMAIN=$DOMAIN PORT=$PORT PUBLIC_PROXY_PATH=$PUBLIC_PROXY_PATH SMARTHOST_PROXY_PATH=$SMARTHOST_PROXY_PATH # 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 | sed s/$D//g); # 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}}'); APP_IP="$APP_IP $DNS_IP"; 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 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"; fi fi SOURCE_IP=$APP_IP; done fi 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"; fi fi for IP in $(echo $APP_IP); do IDX=$(expr 1 + $IDX) eval TARGET_IP_$IDX=$IP; done; done # CHECKING WHETHER IS IT NEEDED TO USE PUBLIC PROXY SERVICE if [ "$PUBLIC_PROXY_PATH" != "" ]; then # check domain config file exits PUBLIC_DOMAIN=$(jq -r .DOMAIN $PUBLIC_PROXY_PATH/$DOMAIN 2>/dev/null) PUBLIC_IP=$(jq -r .LOCAL_IP $PUBLIC_PROXY_PATH/$DOMAIN 2>/dev/null) if [[ -f "$PUBLIC_PROXY_PATH/$DOMAIN" && "$PUBLIC_DOMAIN" == "$DOMAIN" && "$PUBLIC_IP" == "$SOURCE_IP" ]]; then echo "Nothing to do." else #Create public proxy domain file echo ' { "DOMAIN": "'$DOMAIN'", "ALIASES_HTTP": [ ], "ALIASES_HTTPS": [ ], "LOCAL_IP": "'$SOURCE_IP'", "HTTP_PORT": "80", "HTTPS_PORT": "443", "ERROR_PAGE": "", "REDIRECT_HTTP": "", "REDIRECT_HTTPS": "" } ' | jq -r . > $PUBLIC_PROXY_PATH/$DOMAIN fi fi # CHECKING WHETHER IS IT NEEDED TO USE SMARTHOST PROXY SERVICE if [ "$SMARTHOST_PROXY_PATH" != "" ]; then # check domain config file exits SMARTHOST_DOMAIN=$(jq -r .DOMAIN $SMARTHOST_PROXY_PATH/$DOMAIN 2>/dev/null) SMARTHOST_IP=$(jq -r .LOCAL_IP $SMARTHOST_PROXY_PATH/$DOMAIN 2>/dev/null) SMARTHOST_PORT=$(jq -r .HTTP_PORT $SMARTHOST_PROXY_PATH/$DOMAIN 2>/dev/null) if [[ -f "$SMARTHOST_PROXY_PATH/$DOMAIN" && "$SMARTHOST_DOMAIN" == "$DOMAIN" && "$SMARTHOST_IP" == "$TARGET_IP_1" && "$SMARTHOST_PORT" == "$PORT" ]]; then echo "Nothing to do." else #Create public proxy domain file echo ' { "DOMAIN": "'$DOMAIN'", "ALIASES_HTTP": [ ], "ALIASES_HTTPS": [ ], "LOCAL_IP": "'$TARGET_IP_1'", "HTTP_PORT": "", "HTTPS_PORT": "'$PORT'", "ERROR_PAGE": "", "REDIRECT_HTTP": "https://'$DOMAIN'", "REDIRECT_HTTPS": "", "MAX_BODY_SIZE": "512M" } ' | jq -r . > $SMARTHOST_PROXY_PATH/$DOMAIN fi fi