210 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# list/ajout/supprime/ un sous-domaine
 | 
						|
 | 
						|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
 | 
						|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
 | 
						|
setKazVars
 | 
						|
. "${DOCKERS_ENV}"
 | 
						|
 | 
						|
cd "${KAZ_ROOT}"
 | 
						|
export PRG="$0"
 | 
						|
export IP="127.0.0.1"
 | 
						|
export ETC_HOSTS="/etc/hosts"
 | 
						|
 | 
						|
# no more export in .env
 | 
						|
export $(set | grep "domain=")
 | 
						|
 | 
						|
declare -a forbidenName
 | 
						|
forbidenName=(${calcHost} calc ${cloudHost} bureau ${dateHost} date ${dokuwikiHost} dokuwiki ${fileHost} file ${ldapHost} ${pahekoHost} ${gitHost} ${gravHost} ${matterHost} ${officeHost} collabora ${padHost} ${sympaHost} listes ${webmailHost} ${wordpressHost} www ${vigiloHost} form)
 | 
						|
 | 
						|
export FORCE="NO"
 | 
						|
export CMD=""
 | 
						|
export SIMU=""
 | 
						|
 | 
						|
usage(){
 | 
						|
    echo "Usage: ${PRG} list [sub-domain...]"
 | 
						|
    echo "       ${PRG} [-n] [-f] {add/del} sub-domain..."
 | 
						|
    echo "  -h help"
 | 
						|
    echo "  -n simulation"
 | 
						|
    echo "  -f force protected domain"
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
for ARG in $@
 | 
						|
do
 | 
						|
    case "${ARG}" in
 | 
						|
	'-h' | '-help' )
 | 
						|
	    usage
 | 
						|
	    ;;
 | 
						|
	'-f' )
 | 
						|
	    shift
 | 
						|
	    export FORCE="YES"
 | 
						|
	    ;;
 | 
						|
	'-n' )
 | 
						|
	    shift
 | 
						|
	    export SIMU="echo"
 | 
						|
	    ;;
 | 
						|
	'list'|'add'|'del' )
 | 
						|
	    shift
 | 
						|
	    CMD="${ARG}"
 | 
						|
	    break
 | 
						|
	    ;;
 | 
						|
	* )
 | 
						|
	    usage
 | 
						|
	    ;;
 | 
						|
    esac
 | 
						|
done
 | 
						|
 | 
						|
if [ -z "${CMD}" ]; then
 | 
						|
    usage
 | 
						|
fi
 | 
						|
 | 
						|
. "${KAZ_KEY_DIR}/env-gandi"
 | 
						|
 | 
						|
if [[ -z "${GANDI_KEY}" ]] ; then
 | 
						|
    echo
 | 
						|
    echo "no GANDI_KEY set in ${KAZ_KEY_DIR}/env-gandi"
 | 
						|
    usage
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
waitNet () {
 | 
						|
    if [[ "${domain}" = "kaz.local" ]]; then
 | 
						|
	return
 | 
						|
    fi
 | 
						|
 | 
						|
    ###  wait when error code 503
 | 
						|
    if [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]; then
 | 
						|
	echo "DNS not available. Please wait..."
 | 
						|
	while [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]
 | 
						|
	do
 | 
						|
	    sleep 5
 | 
						|
	done
 | 
						|
	exit
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
list(){
 | 
						|
    if [[ "${domain}" = "kaz.local" ]]; then
 | 
						|
	grep --perl-regex "^${IP}\s.*${domain}" "${ETC_HOSTS}" 2> /dev/null | sed -e "s|^${IP}\s*\([0-9a-z.-]${domain}\)$|\1|g"
 | 
						|
	return
 | 
						|
    fi
 | 
						|
    waitNet
 | 
						|
    trap 'rm -f "${TMPFILE}"' EXIT
 | 
						|
    TMPFILE="$(mktemp)" || exit 1
 | 
						|
    if [[ -n "${SIMU}" ]] ; then
 | 
						|
	${SIMU} curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}"
 | 
						|
    else
 | 
						|
	curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null | \
 | 
						|
	    sed "s/,{/\n/g" | \
 | 
						|
	    sed 's/.*rrset_name":"\([^"]*\)".*rrset_values":\["\([^"]*\)".*/\1:\2/g'| \
 | 
						|
	    grep -v '^[_@]'| \
 | 
						|
	    grep -e ":${domain}\.*$" -e ":prod[0-9]*$" > ${TMPFILE}
 | 
						|
    fi
 | 
						|
    if [ $# -lt 1 ]; then
 | 
						|
	cat ${TMPFILE}
 | 
						|
    else
 | 
						|
	for ARG in $@
 | 
						|
	do
 | 
						|
	    cat ${TMPFILE} | grep "${ARG}.*:"
 | 
						|
	done
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
saveDns () {
 | 
						|
    for ARG in $@ ; do
 | 
						|
	if [[ "${ARG}" =~ .local$ ]] ; then
 | 
						|
	    echo "${PRG}: old fasion style (remove .local at the end)"
 | 
						|
	    usage;
 | 
						|
	fi
 | 
						|
	if [[ "${ARG}" =~ .bzh$ ]] ; then
 | 
						|
	    echo "${PRG}: old fasion style (remove .bzh at the end)"
 | 
						|
	    usage;
 | 
						|
	fi
 | 
						|
	if [[ "${ARG}" =~ .dev$ ]] ; then
 | 
						|
	    echo "${PRG}: old fasion style (remove .dev at the end)"
 | 
						|
	    usage;
 | 
						|
	fi
 | 
						|
    done
 | 
						|
    if [[ "${domain}" = "kaz.local" ]]; then
 | 
						|
	return
 | 
						|
    fi
 | 
						|
    waitNet
 | 
						|
    ${SIMU} curl -X POST "${GANDI_API}/snapshots" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null
 | 
						|
}
 | 
						|
 | 
						|
badName(){
 | 
						|
    [[ -z "$1" ]] && return 0;
 | 
						|
    for item in "${forbidenName[@]}"; do
 | 
						|
	[[ "${item}" == "$1" ]] && [[ "${FORCE}" == "NO" ]] && return 0
 | 
						|
    done
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
add(){
 | 
						|
    if [ $# -lt 1 ]; then
 | 
						|
	exit
 | 
						|
    fi
 | 
						|
    saveDns $@
 | 
						|
    declare -a ADDED
 | 
						|
    for ARG in $@
 | 
						|
    do
 | 
						|
	if badName "${ARG}" ; then
 | 
						|
	    echo "can't manage '${ARG}'. Use -f option"
 | 
						|
	    continue
 | 
						|
	fi
 | 
						|
	case "${domain}" in
 | 
						|
	    kaz.local )
 | 
						|
		if grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
 | 
						|
		    break
 | 
						|
		fi
 | 
						|
		if grep -q --perl-regex "^${IP}[ \t]" "${ETC_HOSTS}" 2> /dev/null ; then
 | 
						|
		    ${SIMU} sudo sed -i -e "0,/^${IP}[ \t]/s/^\(${IP}[ \t]\)/\1${ARG}.${domain} /g" "${ETC_HOSTS}"
 | 
						|
		else
 | 
						|
		    ${SIMU} sudo sed -i -e "$ a ${IP}\t${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null
 | 
						|
		fi
 | 
						|
		;;
 | 
						|
	    *)
 | 
						|
		${SIMU} curl -X POST "${GANDI_API}/records" -H "authorization: Apikey  ${GANDI_KEY}" -H 'content-type: application/json' -d '{"rrset_type":"CNAME", "rrset_name":"'${ARG}'", "rrset_values":["'${site}'"]}'
 | 
						|
		echo
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
	ADDED+=("${ARG}")
 | 
						|
    done
 | 
						|
    echo "Domains added to ${domain}: ${ADDED[@]}"
 | 
						|
}
 | 
						|
 | 
						|
del(){
 | 
						|
    if [ $# -lt 1 ]; then
 | 
						|
	exit
 | 
						|
    fi
 | 
						|
    saveDns $@
 | 
						|
    declare -a REMOVED
 | 
						|
    for ARG in $@
 | 
						|
    do
 | 
						|
	if badName "${ARG}" ; then
 | 
						|
	    echo "can't manage '${ARG}'. Use -f option"
 | 
						|
	    continue
 | 
						|
	fi
 | 
						|
	case "${domain}" in
 | 
						|
	    kaz.local )
 | 
						|
		if !grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
 | 
						|
		    break
 | 
						|
		fi
 | 
						|
		${SIMU} sudo sed -i -e "/^${IP}[ \t]*${ARG}.${domain}[ \t]*$/d" \
 | 
						|
			-e "s|^\(${IP}.*\)[ \t]${ARG}.${domain}|\1|g" "${ETC_HOSTS}"
 | 
						|
		;;
 | 
						|
	    * )
 | 
						|
		${SIMU} curl -X DELETE "${GANDI_API}/records/${ARG}" -H "authorization: Apikey ${GANDI_KEY}"
 | 
						|
		echo
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
	REMOVED+=("${ARG}")
 | 
						|
    done
 | 
						|
    echo "Domains removed from ${domain}: ${REMOVED[@]}"
 | 
						|
}
 | 
						|
 | 
						|
#echo "CMD: ${CMD} $*"
 | 
						|
${CMD} $*
 |