383 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
# commun fonctions for KAZ
 | 
						||
 | 
						||
#TODO; toutes les fonctions ci-dessous devraient être commentées
 | 
						||
 | 
						||
#KI  : françois
 | 
						||
#KOI : tout un tas de trucs utiles pour la gestion de l'infra kaz (à mettre dans chaque script)
 | 
						||
#KAN :
 | 
						||
# maj le 27/01/2024 by FAB: recherche de tous les srv kaz dispo (via le DNS)
 | 
						||
# maj le 15/04/2024 by FAB: correction getPahekoOrgaList
 | 
						||
 | 
						||
# https://wiki.bash-hackers.org/scripting/terminalcodes
 | 
						||
BOLD='[1m'
 | 
						||
RED='[0;31m'
 | 
						||
GREEN='[0;32m'
 | 
						||
YELLOW='[0;33m'
 | 
						||
BLUE='[0;34m'
 | 
						||
MAGENTA='[0;35m'
 | 
						||
CYAN='[0;36m'
 | 
						||
NC='[0m' # No Color
 | 
						||
NL='
 | 
						||
'
 | 
						||
 | 
						||
########################################
 | 
						||
setKazVars () {
 | 
						||
    # KAZ_ROOT must be set
 | 
						||
    if [ -z "${KAZ_ROOT}" ]; then
 | 
						||
	printKazError "\n\n   ***   KAZ_ROOT not defined!   ***\n"
 | 
						||
	exit
 | 
						||
    fi
 | 
						||
    export KAZ_KEY_DIR="${KAZ_ROOT}/secret"
 | 
						||
    export KAZ_BIN_DIR="${KAZ_ROOT}/bin"
 | 
						||
    export KAZ_CONF_DIR="${KAZ_ROOT}/config"
 | 
						||
    export KAZ_CONF_PROXY_DIR="${KAZ_CONF_DIR}/proxy"
 | 
						||
    export KAZ_COMP_DIR="${KAZ_ROOT}/dockers"
 | 
						||
    export KAZ_STATE_DIR="${KAZ_ROOT}/state"
 | 
						||
 | 
						||
    export KAZ_GIT_DIR="${KAZ_ROOT}/git"
 | 
						||
    export KAZ_DNLD_DIR="${KAZ_ROOT}/download"
 | 
						||
    export KAZ_DNLD_PAHEKO_DIR="${KAZ_DNLD_DIR}/paheko"
 | 
						||
 | 
						||
    export APPLY_TMPL=${KAZ_BIN_DIR}/applyTemplate.sh
 | 
						||
    export DOCKERS_ENV="${KAZ_CONF_DIR}/dockers.env"
 | 
						||
 | 
						||
    export DOCK_LIB="/var/lib/docker"
 | 
						||
    export DOCK_VOL="${DOCK_LIB}/volumes"
 | 
						||
    export DOCK_VOL_PAHEKO_ORGA="${DOCK_LIB}/volumes/paheko_assoUsers/_data/"
 | 
						||
 | 
						||
    export NAS_VOL="/mnt/disk-nas1/docker/volumes/"
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
 | 
						||
printKazMsg () {
 | 
						||
    # $1 msg
 | 
						||
    echo -e "${CYAN}${BOLD}$1${NC}"
 | 
						||
}
 | 
						||
 | 
						||
printKazError () {
 | 
						||
    # $1 msb
 | 
						||
    echo -e "${RED}${BOLD}$1${NC}"
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
checkContinue () {
 | 
						||
    local rep
 | 
						||
    while : ; do
 | 
						||
	read -p "Do you want to continue? [yes]" rep
 | 
						||
	case "${rep}" in
 | 
						||
            ""|[yYoO]* )
 | 
						||
		break
 | 
						||
		;;
 | 
						||
	    [Nn]* )
 | 
						||
		exit
 | 
						||
		;;
 | 
						||
            * )
 | 
						||
		echo "Please answer yes or no."
 | 
						||
		;;
 | 
						||
	esac
 | 
						||
    done
 | 
						||
}
 | 
						||
 | 
						||
checkDockerRunning () {
 | 
						||
    # $1 docker name
 | 
						||
    # $2 service name
 | 
						||
    if ! [[ "$(docker ps -f "name=$1" | grep -w "$1")" ]]; then
 | 
						||
	printKazError "$2 not running... abort"
 | 
						||
	return 1
 | 
						||
    fi
 | 
						||
    return 0
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
testValidIp () {
 | 
						||
    # $1 ip
 | 
						||
    local  ip=$1
 | 
						||
    local  stat=1
 | 
						||
 | 
						||
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
 | 
						||
        OIFS=$IFS
 | 
						||
        IFS='.'
 | 
						||
        ip=($ip)
 | 
						||
        IFS=$OIFS
 | 
						||
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
 | 
						||
        stat=$?
 | 
						||
    fi
 | 
						||
    return $stat
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
getValInFile () {
 | 
						||
    # $1 filename
 | 
						||
    # $2 varname
 | 
						||
    grep "^\s*$2\s*=" $1 2>/dev/null | head -1 | sed "s%^\s*$2\s*=\(.*\)$%\1%"
 | 
						||
}
 | 
						||
 | 
						||
getList () {
 | 
						||
    # $1 filename
 | 
						||
    (cat  "$1"|sort; echo) | sed -e "s/\(.*\)[ \t]*#.*$/\1/" -e "s/^[ \t]*\(.*\)$/\1/" -e "/^$/d"
 | 
						||
}
 | 
						||
 | 
						||
getPahekoPluginList () {
 | 
						||
    ls "${KAZ_DNLD_PAHEKO_DIR}" | grep -v "paheko-"
 | 
						||
}
 | 
						||
 | 
						||
getPahekoOrgaList () {
 | 
						||
#    ls "${DOCK_VOL_PAHEKO_ORGA}"
 | 
						||
    find ${DOCK_VOL_PAHEKO_ORGA} -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort
 | 
						||
}
 | 
						||
 | 
						||
getAvailableComposes () {
 | 
						||
    ls "${KAZ_COMP_DIR}" | grep -v -- "^.*-orga$"
 | 
						||
}
 | 
						||
 | 
						||
getAvailableOrgas () {
 | 
						||
 | 
						||
#KI  : Fab
 | 
						||
#KOI : donne la liste de toutes les orgas pour un serveur donné sinon serveur courant
 | 
						||
#KAN : 27/01/2024
 | 
						||
 | 
						||
#en entrée
 | 
						||
SITE_DST="$1"
 | 
						||
 | 
						||
    if [ -n "${SITE_DST}" ];then
 | 
						||
      ssh -p 2201 root@${SITE_DST}.${domain} "ls \"${KAZ_COMP_DIR}\" | grep -- \"^.*-orga$\""
 | 
						||
    else
 | 
						||
      ls "${KAZ_COMP_DIR}" | grep -- "^.*-orga$"
 | 
						||
    fi
 | 
						||
 | 
						||
}
 | 
						||
 | 
						||
getAvailableServices () {
 | 
						||
    local service
 | 
						||
    for service in paheko cloud collabora agora wiki wp; do
 | 
						||
	echo "${service}"
 | 
						||
    done
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
filterInList () {
 | 
						||
    # $* ref list filter
 | 
						||
    # stdin candidats
 | 
						||
    local compose
 | 
						||
    while read compose ; do
 | 
						||
	if [[ " $* " =~ " ${compose} " ]]; then
 | 
						||
	    echo ${compose}
 | 
						||
	fi
 | 
						||
    done | sort -u
 | 
						||
}
 | 
						||
 | 
						||
filterNotInList () {
 | 
						||
    # $* ref list filter
 | 
						||
    # stdin candidats
 | 
						||
    local compose
 | 
						||
    while read compose ; do
 | 
						||
	if [[ ! " $* " =~ " ${compose} " ]]; then
 | 
						||
	    echo ${compose}
 | 
						||
	fi
 | 
						||
    done | sort -u
 | 
						||
}
 | 
						||
 | 
						||
filterAvailableComposes () {
 | 
						||
    # $* candidats
 | 
						||
    local AVAILABLE_COMPOSES=$(getAvailableComposes;getAvailableOrgas)
 | 
						||
    if [ $# -eq 0 ] ; then
 | 
						||
	echo ${AVAILABLE_COMPOSES}
 | 
						||
    fi
 | 
						||
    local compose
 | 
						||
    for compose in $*
 | 
						||
    do
 | 
						||
	compose=${compose%/}
 | 
						||
	if [[ ! "${NL}${AVAILABLE_COMPOSES}${NL}" =~ "${NL}${compose}${NL}" ]]; then
 | 
						||
	    local subst=""
 | 
						||
	    for item in ${AVAILABLE_COMPOSES}; do
 | 
						||
		[[ "${item}" =~ "${compose}" ]] && echo ${item} && subst="${subst} ${item}"
 | 
						||
	    done
 | 
						||
	    if [ -z "${subst}" ] ; then
 | 
						||
		echo "${RED}${BOLD}Unknown compose: ${compose} not in "${AVAILABLE_COMPOSES}"${NC}" >&2
 | 
						||
		#exit 1
 | 
						||
	    else
 | 
						||
		echo "${BLUE}${BOLD}substitute compose: ${compose} => "${subst}"${NC}" >&2
 | 
						||
	    fi
 | 
						||
	else
 | 
						||
	    echo "${compose}"
 | 
						||
	fi
 | 
						||
    done | sort -u
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
serviceOnInOrga () {
 | 
						||
    # $1 orga name
 | 
						||
    # $2 service name
 | 
						||
    # default value
 | 
						||
    local composeFile="${KAZ_COMP_DIR}/$1-orga/docker-compose.yml"
 | 
						||
    if [[ ! -f "${composeFile}" ]]
 | 
						||
    then
 | 
						||
	echo "$3"
 | 
						||
    else
 | 
						||
	grep -q "$2" "${composeFile}" 2>/dev/null && echo on || echo off
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
waitUrl () {
 | 
						||
    # $1 URL to waitfor
 | 
						||
    # $2 timeout en secondes (optional)
 | 
						||
    starttime=$(date +%s)
 | 
						||
    if [[ $(curl -k --connect-timeout 2 -s -D - "$1" -o /dev/null 2>/dev/null | head -n1) != *[23]0[0-9]* ]]; then
 | 
						||
	printKazMsg "service not available ($1). Please wait..."
 | 
						||
  echo curl -k --connect-timeout 2 -s -D - "$1" -o /dev/null \|  head -n1
 | 
						||
  while [[ $(curl -k --connect-timeout 2 -s -D - "$1" -o /dev/null 2>/dev/null | head -n1) != *[23]0[0-9]* ]]
 | 
						||
	do
 | 
						||
	    sleep 5
 | 
						||
        if [ $# -gt 1 ]; then
 | 
						||
            actualtime=$(date +%s)
 | 
						||
            delta=$(($actualtime-$starttime))
 | 
						||
            [[ $2 -lt $delta ]] && return 1
 | 
						||
        fi
 | 
						||
	done
 | 
						||
    fi
 | 
						||
    return 0
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
waitContainerHealthy () {
 | 
						||
    # $1 ContainerName
 | 
						||
    # $2 timeout en secondes (optional)
 | 
						||
 | 
						||
    healthy="false"
 | 
						||
    starttime=$(date +%s)
 | 
						||
    running="false"
 | 
						||
    [[ $(docker ps -f name="$1" | grep -w "$1") ]] && running="true"
 | 
						||
    [[ $running == "true" && $(docker inspect -f {{.State.Health.Status}} "$1") == "healthy" ]] && healthy="true"
 | 
						||
    if [[ ! $running == "true" || ! $healthy == "true" ]]; then
 | 
						||
        printKazMsg "Docker not healthy ($1). Please wait..."
 | 
						||
        while [[ ! $running == "true" || ! $healthy == "true" ]]
 | 
						||
        do
 | 
						||
            sleep 5
 | 
						||
            if [ $# -gt 1 ]; then
 | 
						||
                actualtime=$(date +%s)
 | 
						||
                delta=$(($actualtime-$starttime))
 | 
						||
                [[ $2 -lt $delta ]] && printKazMsg "Docker not healthy ($1)... abort..." && return 1
 | 
						||
            fi
 | 
						||
            [[ ! $running == "true" ]] && [[ $(docker ps -f name="$1" | grep -w "$1") ]] && running="true"
 | 
						||
            [[ $running == "true" && $(docker inspect -f {{.State.Health.Status}} "$1") == "healthy" ]] && healthy="true"
 | 
						||
        done
 | 
						||
    fi
 | 
						||
    return 0
 | 
						||
}
 | 
						||
########################################
 | 
						||
waitContainerRunning () {
 | 
						||
    # $1 ContainerName
 | 
						||
    # $2 timeout en secondes (optional)
 | 
						||
 | 
						||
    starttime=$(date +%s)
 | 
						||
    running="false"
 | 
						||
    [[ $(docker ps -f name="$1" | grep -w "$1") ]] && running="true"
 | 
						||
    if [[ ! $running == "true" ]]; then
 | 
						||
        printKazMsg "Docker not running ($1). Please wait..."
 | 
						||
        while [[ ! $running == "true" ]]
 | 
						||
        do
 | 
						||
            sleep 5
 | 
						||
            if [ $# -gt 1 ]; then
 | 
						||
                actualtime=$(date +%s)
 | 
						||
                delta=$(($actualtime-$starttime))
 | 
						||
                [[ $2 -lt $delta ]] && printKazMsg "Docker did not start ($1)... abort..." && return 1
 | 
						||
            fi
 | 
						||
            [[ ! $running == "true" ]] && [[ $(docker ps -f name="$1" | grep -w "$1") ]] && running="true"
 | 
						||
	done
 | 
						||
    fi
 | 
						||
    return 0
 | 
						||
}
 | 
						||
 | 
						||
########################################
 | 
						||
downloadFile () {
 | 
						||
    # $1 URL to download
 | 
						||
    # $2 new filename (optional)
 | 
						||
    if [ $# -lt 1 ] || [ $# -gt 2 ]; then
 | 
						||
	printKazError "downloadFile: bad arg number"
 | 
						||
	return
 | 
						||
    fi
 | 
						||
    URL=$1
 | 
						||
    if [ -z "$2" ]; then
 | 
						||
	FILENAME="$(basename $1)"
 | 
						||
    else
 | 
						||
	FILENAME="$2"
 | 
						||
    fi
 | 
						||
 | 
						||
    if [ ! -f "${FILENAME}" ]; then
 | 
						||
	printKazMsg "  - load ${URL}"
 | 
						||
	curl -L -o "${FILENAME}" "${URL}"
 | 
						||
    else
 | 
						||
	TMP="${FILENAME}.tmp"
 | 
						||
	rm -f "${TMP}"
 | 
						||
	curl -L -o "${TMP}" "${URL}"
 | 
						||
	if ! cmp -s "${TMP}" "${FILENAME}" 2>/dev/null; then
 | 
						||
	    mv "${TMP}" "${FILENAME}"
 | 
						||
	else
 | 
						||
	    rm -f "${TMP}"
 | 
						||
	fi
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
unzipInDir () {
 | 
						||
    # $1 zipfile
 | 
						||
    # $2 destDir
 | 
						||
 | 
						||
    if [ $# -ne 2 ]; then
 | 
						||
	printKazError "unzipInDir: bad arg number"
 | 
						||
	return
 | 
						||
    fi
 | 
						||
    if ! [[ $1 == *.zip ]]; then
 | 
						||
	printKazError "unzipInDir: $1 is not a zip file"
 | 
						||
	return
 | 
						||
    fi
 | 
						||
    if ! [[ -d $2 ]]; then
 | 
						||
	printKazError "$2 is not destination dir"
 | 
						||
	return
 | 
						||
    fi
 | 
						||
 | 
						||
    destName="$2/$(basename "${1%.zip}")"
 | 
						||
    if [[ -d "${destName}" ]]; then
 | 
						||
	printKazError "${destName} already exist"
 | 
						||
	return
 | 
						||
    fi
 | 
						||
 | 
						||
    tmpDir=$2/tmp-$$
 | 
						||
    trap 'rm -rf "${tmpDir}"' EXIT
 | 
						||
    unzip "$1" -d "${tmpDir}"
 | 
						||
    srcDir=$(ls -1 "${tmpDir}")
 | 
						||
    case $(wc -l <<< $srcDir) in
 | 
						||
	0)
 | 
						||
	    printKazError "empty zip file : $1"
 | 
						||
	    rmdir "${tmpDir}"
 | 
						||
	    return
 | 
						||
	    ;;
 | 
						||
	1)
 | 
						||
	    mv "${tmpDir}/${srcDir}" "${destName}"
 | 
						||
	    rmdir "${tmpDir}"
 | 
						||
	    ;;
 | 
						||
	*)
 | 
						||
	    printKazError "zip file $1 is not a tree (${srcDir})"
 | 
						||
	    return
 | 
						||
	    ;;
 | 
						||
    esac
 | 
						||
}
 | 
						||
########################################
 | 
						||
 | 
						||
get_Serveurs_Kaz () {
 | 
						||
 | 
						||
#KI  : Fab
 | 
						||
#KOI : donne la liste de tous les serveurs kaz sous le format srv1;srv2;srv3;.... en intérogeant le DNS
 | 
						||
#KAN : 27/01/2024
 | 
						||
 | 
						||
  liste=`dig -t TXT srv.kaz.bzh +short`
 | 
						||
  #on nettoie
 | 
						||
  liste=$(echo "$liste" | sed 's/\;/ /g')
 | 
						||
  liste=$(echo "$liste" | sed 's/\"//g')
 | 
						||
  #renvoi srv1 srv2 srv3 ....
 | 
						||
  echo ${liste}
 | 
						||
}
 | 
						||
########################################
 | 
						||
 |