#!/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 | 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}}'); 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_FLAG": "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