#!/bin/bash # Script de manipulation des containers en masse # init /versions / restart ... # KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd) . $KAZ_ROOT/bin/.commonFunctions.sh setKazVars . $DOCKERS_ENV . $KAZ_ROOT/secret/SetAllPass.sh . $KAZ_ROOT/secret/env-kaz PRG=$(basename $0) ####################################### # tout est dans le env_kaz # NAS_VOL="/mnt/disk-nas1/docker/volumes/" # OPERATE_ON_MAIN= # par defaut NON on ne traite que des orgas # OPERATE_ON_NAS_ORGA="OUI" # par defaut oui, on va aussi sur les orgas du NAS # OPERATE_LOCAL_ORGA="OUI" # par defaut oui # TEMPO_ACTION_STOP=2 # Lors de redémarrage avec tempo, on attend après le stop # TEMPO_ACTION_START=60 # Lors de redémarrage avec tempo, avant de reload le proxy # DEFAULTCONTAINERS="cloud agora wp wiki office paheko castopod" # APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio snappymail ransomware_protection" #rainloop richdocumentscode # QUIET="1" # redirection des echo ################################################################################################################### #GLOBAL VARS availableOrga=($(getList "${KAZ_CONF_DIR}/container-orga.list")) AVAILABLE_ORGAS=${availableOrga[*]//-orga/} availableContainersCommuns=( $(getList "${KAZ_CONF_DIR}/container-withMail.list") $(getList "${KAZ_CONF_DIR}/container-withoutMail.list")) CONTAINERS_TYPES= declare -A DockerServNames # le nom des containers correspondant DockerServNames=( [cloud]="${nextcloudServName}" [agora]="${mattermostServName}" [wiki]="${dokuwikiServName}" [wp]="${wordpressServName}" [office]="${officeServName}" [paheko]="${pahekoServName}" [castopod]="${castopodServName}" ) declare -A FilterLsVolume # Pour trouver quel volume appartient à quel container FilterLsVolume=( [cloud]="cloudMain" [agora]="matterConfig" [wiki]="wikiConf" [wp]="wordpress" [castopod]="castopodMedia" ) declare -A composeDirs # Le nom du repertoire compose pour le commun composeDirs=( [cloud]="cloud" [agora]="mattermost" [wiki]="dokuwiki" [office]="collabora" [paheko]="paheko" [castopod]="castopod" ) declare -A serviceNames # Le nom du du service dans le dockerfile d'orga serviceNames=( [cloud]="cloud" [agora]="agora" [wiki]="dokuwiki" [wp]="wordpress" [office]="collabora" [castopod]="castopod") declare -A subScripts subScripts=( [cloud]="manageCloud.sh" [agora]="manageAgora.sh" [wiki]="manageWiki.sh" [wp]="manageWp.sh" [castopod]="manageCastopod.sh" ) declare -A OrgasOnNAS declare -A OrgasLocales declare -A NbOrgas declare -A RunningOrgas declare -A Posts OCCCOMANDS=() MMCTLCOMANDS=() EXECCOMANDS=() usage() { echo "${PRG} [OPTION] [CONTAINERS_TYPES] [COMMANDES] [ORGAS] Ce script regroupe l'ensemble des opérations que l'on souhaite automatiser sur plusieurs containers Par defaut, sur les orgas, mais on peut aussi ajouter les communs OPTIONS -h|--help Cette aide :-) -n|--simu SIMULATION -q|--quiet On ne parle pas (utile avec le -n pour avoir que les commandes) -m|--main Traite aussi le container commun (cloud commun / agora commun / wiki commun) -M Ne traite que le container commun, et pas les orgas --nas Ne traite QUE les orgas sur le NAS --local Ne traite pas les orgas sur le NAS -v|--version Donne la version des containers et signale les MàJ -l|--list Liste des containers (up / down, local ou nas) de cette machine CONTAINERS_TYPES -cloud Pour agir sur les clouds -agora Pour agir sur les agoras -wp Les wp -wiki Les wiki -office Les collabora -paheko Le paheko -castopod Les castopod COMMANDES (on peut en mettre plusieurs dans l'ordre souhaité) -I|--install L'initialisation du container -t Redémarre avec tempo (docker-compose down puis sleep ${TEMPO_ACTION_STOP} puis up puis sleep ${TEMPO_ACTION_START}) -r Redémarre sans tempo (docker restart) -exec \"command\" Envoie une commande docker exec --optim Lance la procédure Nextcloud pour optimiser les performances ** ** -occ \"command\" Envoie une commande via occ ** ** -u Mets à jour les applis ** SPECIFIQUES ** -i Install des applis ** CLOUD ** -a \"app1 app2 ...\" Choix des appli à installer ou mettre à jour (entre guillemets) ** ** -U|--upgrade Upgrade des clouds ** ** -mmctl \"command\" Envoie une commande via mmctl ** SPECIFIQUES ** -p|--post \"team\" \"message\" Poste un message dans une team agora ** AGORA ** ORGAS [orga1 orga2 ... ] on peut filtrer parmi : ${AVAILABLE_ORGAS} Exemples : ${PRG} -office -m -r restart de tous les collaboras (libére RAM) ${PRG} -cloud -u -r -q -n Affiche toutes les commandes (-n -q ) pour mettre à jour toutes les applis des clouds + restart (-u -r) ${PRG} -p \"monorga:town-square\" \"Hello\" monorga # envoie Hello sur le centreville de l'orga monorga sur son mattermost dédié Valeurs par défaut : Tempo de Stop : ${TEMPO_ACTION_STOP} Tempo de restart : ${TEMPO_ACTION_START} " } #################################################### ################ fonctions clefs ################### #################################################### _populate_lists(){ # récupère les listes d'orga à traiter # on rempli les tableaux OrgasOnNAS / OrgasLocales / NbOrgas ... par type de container if [ -z "${CONTAINERS_TYPES}" ]; then # wow, on traite tout le monde d'un coup... CONTAINERS_TYPES=${DEFAULTCONTAINERS} fi for TYPE in ${CONTAINERS_TYPES}; do if [ -n "${FilterLsVolume[$TYPE]}" ] ; then # on regarde dans les volumes [ -n "$OPERATE_ON_NAS_ORGA" ] && OrgasOnNAS["$TYPE"]=$( _getListOrgas ${NAS_VOL} ${FilterLsVolume[$TYPE]} ) [ -n "$OPERATE_LOCAL_ORGA" ] && OrgasLocales["$TYPE"]=$( _getListOrgas ${DOCK_VOL} ${FilterLsVolume[$TYPE]} "SANSLN") else # un docker ps s'il n'y a pas de volumes [ -n "$OPERATE_LOCAL_ORGA" ] && OrgasLocales["$TYPE"]=$(docker ps --format '{{.Names}}' | grep ${DockerServNames[$TYPE]} | sed -e "s/-*${DockerServNames[$TYPE]}//") fi NbOrgas["$TYPE"]=$(($(echo ${OrgasOnNAS["$TYPE"]} | wc -w) + $(echo ${OrgasLocales["$TYPE"]} | wc -w))) RunningOrgas["$TYPE"]=$(docker ps --format '{{.Names}}' | grep ${DockerServNames[$TYPE]} | sed -e "s/-*${DockerServNames[$TYPE]}//") done } _getListOrgas(){ # retrouve les orgas à partir des volume présents # $1 where to lookup # $2 filter # $3 removeSymbolicLinks [ ! -d $1 ] || [ -z "$2" ] && return 1 # si le repertoire n'existe pas on skip LIST=$(ls "${1}" | grep -i orga | grep -i "$2" | sed -e "s/-${2}$//g" | sed -e 's/^orga_//') [ -n "$3" ] && LIST=$(ls -F "${1}" | grep '/' | grep -i orga | grep -i "$2" | sed -e "s/-${2}\/$//g" | sed -e 's/^orga_//') LIST=$(comm -12 <(printf '%s\n' ${LIST} | sort) <(printf '%s\n' ${AVAILABLE_ORGAS} | sort)) echo "$LIST" } _executeFunctionForAll(){ # Parcours des container et lancement des commandes # Les commandes ont en derniers paramètres le type et l'orga et une string parmi KAZ/ORGANAS/ORGALOCAL pour savoir sur quoi on opère # $1 function # $2 nom de la commande # $3 quel types de containers # $4 params : quels paramètres à passer à la commande (les clefs sont #ORGA# #DOCKERSERVNAME# #SURNAS# #ISMAIN# #TYPE# #COMPOSEDIR# ) for TYPE in ${3}; do if [ -n "$OPERATE_ON_MAIN" ]; then if [[ -n "${composeDirs[$TYPE]}" && "${availableContainersCommuns[*]}" =~ "${composeDirs[$TYPE]}" ]]; then # pas de cloud / agora / wp / wiki sur cette instance Dockername=${DockerServNames[$TYPE]} PARAMS=$(echo $4 | sed -e "s/#ORGA#//g;s/#DOCKERSERVNAME#/$Dockername/g;s/#ISMAIN#/OUI/g;s/#SURNAS#/NON/g;s/#TYPE#/$TYPE/g;s%#COMPOSEDIR#%${KAZ_COMP_DIR}/${composeDirs[$TYPE]}%g" ) echo "-------- $2 $TYPE COMMUN ----------------------------" >& $QUIET eval "$1" $PARAMS fi fi if [[ ${NbOrgas[$TYPE]} -gt 0 ]]; then echo "-------- $2 des $TYPE des ORGAS ----------------------------" >& $QUIET COMPTEUR=1 if [ -n "$OPERATE_LOCAL_ORGA" ]; then for ORGA in ${OrgasLocales[$TYPE]}; do Dockername=${ORGA}-${DockerServNames[$TYPE]} PARAMS=$(echo $4 | sed -e "s/#ORGA#/${ORGA}/g;s/#DOCKERSERVNAME#/$Dockername/g;s/#ISMAIN#/NON/g;s/#SURNAS#/NON/g;s/#TYPE#/$TYPE/g;s%#COMPOSEDIR#%${KAZ_COMP_DIR}/${ORGA}-orga%g" ) echo "${RED} ${ORGA}-orga ${NC}($COMPTEUR/${NbOrgas[$TYPE]})" >& $QUIET eval "$1" $PARAMS COMPTEUR=$((COMPTEUR + 1)) done fi if [ -n "$OPERATE_ON_NAS_ORGA" ]; then for ORGA in ${OrgasOnNAS[$TYPE]}; do Dockername=${ORGA}-${DockerServNames[$TYPE]} PARAMS=$(echo $4 | sed -e "s/#ORGA#/${ORGA}/g;s/#DOCKERSERVNAME#/$Dockername/g;s/#ISMAIN#/NON/g;s/#SURNAS#/OUI/g;s/#TYPE#/$TYPE/g;s%#COMPOSEDIR#%${KAZ_COMP_DIR}/${ORGA}-orga%g" ) echo "${RED} ${ORGA}-orga ${NC}($COMPTEUR/${NbOrgas[$TYPE]})" >& $QUIET eval "$1" $PARAMS COMPTEUR=$((COMPTEUR + 1)) done fi fi done } ############################################## ################ COMMANDES ################### ############################################## Init(){ # Initialisation des containers echo "${NC}--------------------------------------------------------" >& $QUIET echo "Initialisation" >& $QUIET echo "--------------------------------------------------------" >& $QUIET _executeFunctionForAll "_initContainer" "Initialisation" "${CONTAINERS_TYPES[@]}" "#TYPE# #ISMAIN# #SURNAS# #ORGA# " } restart-compose() { # Parcours les containers et redémarre avec tempo echo "${NC}--------------------------------------------------------" >& $QUIET echo "DOCKER-COMPOSE DOWN puis sleep ${TEMPO_ACTION_STOP}" >& $QUIET echo "DOCKER-COMPOSE UP puis sleep ${TEMPO_ACTION_START}" >& $QUIET echo "de ${CONTAINERS_TYPES} pour $NB_ORGAS_STR" >& $QUIET echo "--------------------------------------------------------" >& $QUIET _executeFunctionForAll "_restartContainerAvecTempo" "Restart" "${CONTAINERS_TYPES[@]}" "#TYPE# #ISMAIN# #COMPOSEDIR#" ${SIMU} sleep ${TEMPO_ACTION_START} _reloadProxy echo "--------------------------------------------------------" >& $QUIET echo "${GREEN}FIN${NC} " >& $QUIET echo "--------------------------------------------------------" >& $QUIET } restart() { # Parcours les containers et redémarre echo "${NC}--------------------------------------------------------" >& $QUIET echo "DOCKER RESTART des ${CONTAINERS_TYPES} pour $NB_ORGAS_STR" >& $QUIET echo "--------------------------------------------------------" >& $QUIET _executeFunctionForAll "_restartContainer" "Restart" "${CONTAINERS_TYPES[@]}" "#DOCKERSERVNAME#" _reloadProxy echo "--------------------------------------------------------" >& $QUIET echo "${GREEN}FIN${NC} " >& $QUIET echo "--------------------------------------------------------" >& $QUIET } version(){ # Parcours les containers et affiche leurs versions echo "${NC}--------------------------------------------------------" >& $QUIET echo "VERSIONS" >& $QUIET echo "--------------------------------------------------------" >& $QUIET _executeFunctionForAll "_versionContainer" "Version" "${CONTAINERS_TYPES[@]}" "#TYPE# #ISMAIN# #ORGA#" } listContainers(){ echo "${NC}--------------------------------------------------------" echo "LISTES" echo "------------------------------------------------------------" for TYPE in ${CONTAINERS_TYPES}; do echo "****************** $TYPE ****************" _listContainer "$TYPE" done } ######################## Fonctions génériques ####################### _initContainer(){ # $1 type # $2 COMMUN # $3 ON NAS # $4 orgas if [ -n "${subScripts[$1]}" ] ; then evalStr="${KAZ_BIN_DIR}/${subScripts[$1]} --install" if [ "$3" = "OUI" ]; then evalStr="${evalStr} -nas" ; fi if [ ! "$QUIET" = "1" ]; then evalStr="${evalStr} -q" ; fi if [ -n "$SIMU" ]; then evalStr="${evalStr} -n" ; fi if [ ! "$2" = "OUI" ]; then evalStr="${evalStr} $4" ; fi eval $evalStr fi } _restartContainer(){ # $1 Dockername echo -n "${NC}Redemarrage ... " >& $QUIET ${SIMU} ${SIMU} docker restart $1 echo "${GREEN}OK${NC}" >& $QUIET } _restartContainerAvecTempo(){ # $1 type # $2 main container # $2 composeDir dir=$3 if [ -z $dir ]; then return 1; fi # le compose n'existe pas ... par exemple wordpress commun cd "$dir" echo -n "${NC}Arrêt ... " >& $QUIET ${SIMU} if [ "$2" = "OUI" ]; then ${SIMU} docker-compose stop ; else ${SIMU} docker-compose stop "${serviceNames[$1]}" fi ${SIMU} sleep ${TEMPO_ACTION_STOP} echo "${GREEN}OK${NC}" >& $QUIET echo -n "${NC}Démarrage ... " >& $QUIET if [ "$2" = "OUI" ]; then ${SIMU} docker-compose up -d ; else ${SIMU} docker-compose up -d "${serviceNames[$1]}" fi ${SIMU} sleep ${TEMPO_ACTION_START} echo "${GREEN}OK${NC}" >& $QUIET } _reloadProxy() { availableProxyComposes=($(getList "${KAZ_CONF_DIR}/container-proxy.list")) for item in "${availableProxyComposes[@]}"; do ${SIMU} ${KAZ_COMP_DIR}/${item}/reload.sh done } _versionContainer() { # Affiche la version d'un container donné # $1 type # $2 COMMUN # $3 orgas if [ -n "${subScripts[$1]}" ] ; then evalStr="${KAZ_BIN_DIR}/${subScripts[$1]} --version" if [ ! "$2" = "OUI" ]; then evalStr="${evalStr} $3" ; fi eval $evalStr fi } _listContainer(){ # pour un type donné (cloud / agora / wiki / wp), fait une synthèse de qui est up et down / nas ou local # $1 type RUNNING_FROM_NAS=$(comm -12 <(printf '%s\n' ${OrgasOnNAS[$1]} | sort) <(printf '%s\n' ${RunningOrgas[$1]} | sort) | sed -e ':a;N;$!ba;s/\n/ /g') RUNNING_LOCAL=$(comm -12 <(printf '%s\n' ${OrgasLocales[$1]} | sort) <(printf '%s\n' ${RunningOrgas[$1]} | sort) | sed -e ':a;N;$!ba;s/\n/ /g') # tu l'a vu la belle commande pour faire une exclusion de liste DOWN_ON_NAS=$(comm -23 <(printf '%s\n' ${OrgasOnNAS[$1]} | sort) <(printf '%s\n' ${RunningOrgas[$1]} | sort) | sed -e ':a;N;$!ba;s/\n/ /g') DOWN_LOCAL=$(comm -23 <(printf '%s\n' ${OrgasLocales[$1]} | sort) <(printf '%s\n' ${RunningOrgas[$1]} | sort)| sed -e ':a;N;$!ba;s/\n/ /g') NB_SUR_NAS=$(echo ${OrgasOnNAS[$1]} | wc -w) NB_LOCAUX=$(echo ${OrgasLocales[$1]} | wc -w) NB_RUNNING_SUR_NAS=$(echo $RUNNING_FROM_NAS | wc -w) NB_RUNNING_LOCALLY=$(echo $RUNNING_LOCAL | wc -w) MAIN_RUNNING="${RED}DOWN${NC}" if docker ps | grep -q " ${DockerServNames[$1]}" then MAIN_RUNNING="${GREEN}UP${NC}" fi [ -n "${composeDirs[${1}]}" ] && echo "${NC}Le ${1} commun est $MAIN_RUNNING" if [[ ${NbOrgas[$1]} -gt 0 ]]; then ENLOCALSTR= if [[ ${NB_RUNNING_SUR_NAS[$1]} -gt 0 ]]; then ENLOCALSTR=" en local" ; fi echo "Orgas : $NB_RUNNING_LOCALLY / $NB_LOCAUX running ${1}$ENLOCALSTR" echo "${NC}UP : ${GREEN}${RUNNING_LOCAL}" echo "${NC}DOWN : ${RED}$DOWN_LOCAL${NC}" if [[ ${NB_RUNNING_SUR_NAS[$1]} -gt 0 ]]; then echo "${NC}Orgas : $NB_RUNNING_SUR_NAS / $NB_SUR_NAS running depuis le NAS :" echo "${NC}UP : ${GREEN}${RUNNING_FROM_NAS}" echo "${NC}DOWN : ${RED}$DOWN_ON_NAS${NC}" fi fi } ######################################################### ############# FONCTIONS SPECIFIQUES ##################### ######################################################### ################################## ############### CLOUD ############ ################################## UpgradeClouds() { echo "${NC}--------------------------------------------------------" >& $QUIET echo "UPGRADE des cloud" >& $QUIET echo "--------------------------------------------------------" >& $QUIET RunOCCCommand "upgrade" } OptimiseClouds() { echo "${NC}--------------------------------------------------------" >& $QUIET echo "Optimisation des cloud" >& $QUIET echo "--------------------------------------------------------" >& $QUIET RunOCCCommand "db:add-missing-indices" "db:convert-filecache-bigint --no-interaction" } InstallApps(){ echo "${NC}--------------------------------------------------------" >& $QUIET echo "INSTALL DES APPLIS sur les clouds : ${LISTE_APPS}" >& $QUIET echo "-------------------------------------------------------------" >& $QUIET if [ -z "${LISTE_APPS}" ]; then echo "Aucune appli n'est précisée, j'installe les applis par défaut : ${APPLIS_PAR_DEFAUT}" >& $QUIET LISTE_APPS="${APPLIS_PAR_DEFAUT}" fi PARAMS="-a \"$LISTE_APPS\"" if [ ! "$QUIET" = "1" ]; then PARAMS="${PARAMS} -q" ; fi if [ -n "$SIMU" ]; then PARAMS="${PARAMS} -n" ; fi _executeFunctionForAll "${KAZ_BIN_DIR}/${subScripts["cloud"]} -i $PARAMS" "Install des applis" "cloud" "#ORGA#" } UpdateApplis() { echo "${NC}--------------------------------------------------------" >& $QUIET echo "UPDATE DES APPLIS des cloud : ${LISTE_APPS}" >& $QUIET echo "--------------------------------------------------------" >& $QUIET PARAMS="-a ${LISTE_APPS}" if [ -z "${LISTE_APPS}" ]; then echo "Aucune appli n'est précisée, je les met toutes à jour! " >& $QUIET PARAMS= fi if [ ! "$QUIET" = "1" ]; then PARAMS="${PARAMS} -q" ; fi if [ -n "$SIMU" ]; then PARAMS="${PARAMS} -n" ; fi _executeFunctionForAll "${KAZ_BIN_DIR}/${subScripts["cloud"]} -u $PARAMS" "Maj des applis" "cloud" "#ORGA#" } ################################## ############### AGORA ############ ################################## PostMessages(){ echo "${NC}--------------------------------------------------------" >& $QUIET echo "Envoi de messages sur mattermost" >& $QUIET echo "--------------------------------------------------------" >& $QUIET for TEAM in "${!Posts[@]}" do MSG=${Posts[$TEAM]/\"/\\\"} PARAMS="-p \"$TEAM\" \"$MSG\"" if [ ! "$QUIET" = "1" ]; then PARAMS="${PARAMS} -q" ; fi if [ -n "$SIMU" ]; then PARAMS="${PARAMS} -n" ; fi _executeFunctionForAll "${KAZ_BIN_DIR}/${subScripts["agora"]} $PARAMS" "Post vers $TEAM sur l'agora" "agora" "#ORGA#" done } ########## LANCEMENT COMMANDES OCC / MMCTL ############ RunCommands() { echo "${NC}--------------------------------------------------------" >& $QUIET echo "Envoi de commandes en direct" >& $QUIET echo "--------------------------------------------------------" >& $QUIET # $1 OCC / MMCTL / EXEC # $ suivants : les commandes for command in "${@:2}" do if [ $1 = "OCC" ]; then RunOCCCommand "$command" ; fi if [ $1 = "MMCTL" ]; then RunMMCTLCommand "$command" ; fi if [ $1 = "EXEC" ]; then RunEXECCommand "$command" ; fi done } _runSingleOccCommand(){ # $1 Command # $2 Dockername ${SIMU} docker exec -u 33 $2 /var/www/html/occ $1 } _runSingleMmctlCommand(){ # $1 Command # $2 Dockername ${SIMU} docker exec $2 bin/mmctl $1 } _runSingleExecCommand(){ # $1 Command # $2 Dockername ${SIMU} docker exec $2 $1 } RunOCCCommand() { # $1 Command _executeFunctionForAll "_runSingleOccCommand \"${1}\"" "OCC $1" "cloud" "#DOCKERSERVNAME#" } RunMMCTLCommand() { # $1 Command _executeFunctionForAll "_runSingleMmctlCommand \"${1}\"" "MMCTL $1" "agora" "#DOCKERSERVNAME#" } RunEXECCommand() { # $1 Command _executeFunctionForAll "_runSingleExecCommand \"${1}\"" "docker exec $1" "${CONTAINERS_TYPES[@]}" "#DOCKERSERVNAME#" } ########## Main ################# for ARG in "$@"; do if [ -n "${GETOCCCOMAND}" ]; then # après un -occ OCCCOMANDS+=("${ARG}") GETOCCCOMAND= elif [ -n "${GETEXECCOMAND}" ]; then # après un -exec EXECCOMANDS+=("${ARG}") GETEXECCOMAND= elif [ -n "${GETAPPS}" ]; then # après un -a LISTE_APPS="${LISTE_APPS} ${ARG}" GETAPPS="" elif [ -n "${GETMMCTLCOMAND}" ]; then # après un -mmctl MMCTLCOMANDS+=("${ARG}") GETMMCTLCOMAND= elif [ -n "${GETTEAM}" ]; then # après un --post GETMESSAGE="now" GETTEAM="" TEAM="${ARG}" elif [ -n "${GETMESSAGE}" ]; then # après un --post "team:channel" if [[ $TEAM == "-*" && ${#TEAM} -le 5 ]]; then echo "J'envoie mon message à \"${TEAM}\" ?? Arf, ça me plait pas j'ai l'impression que tu t'es planté sur la commande."; usage ; exit 1 ; fi if [[ $ARG == "-*" && ${#ARG} -le 5 ]]; then echo "J'envoie le message \"${ARG}\" ?? Arf, ça me plait pas j'ai l'impression que tu t'es planté sur la commande."; usage ; exit 1 ; fi if [[ ! $TEAM =~ .*:.+ ]]; then echo "Il faut mettre un destinataire sous la forme team:channel. Recommence !"; usage ; exit 1 ; fi Posts+=( ["${TEAM}"]="$ARG" ) GETMESSAGE="" TEAM="" else case "${ARG}" in '-h' | '--help' ) usage && exit ;; '-n' | '--simu') SIMU="echo" ;; '-q' ) QUIET="/dev/null" ;; '-m' | '--main' ) OPERATE_ON_MAIN="OUI-OUI" ;; '-M' ) AVAILABLE_ORGAS= && OPERATE_ON_MAIN="OUI-OUI" ;; #pas d'orgas '--nas' | '-nas' ) OPERATE_LOCAL_ORGA= ;; # pas les locales '--local' | '-local' ) OPERATE_ON_NAS_ORGA= ;; # pas celles sur NAS '-cloud'|'--cloud') CONTAINERS_TYPES="${CONTAINERS_TYPES} cloud" ;; '-agora'|'--agora'|'-mm'|'--mm'|'-matter'*|'--matter'*) CONTAINERS_TYPES="${CONTAINERS_TYPES} agora" ;; '-wiki'|'--wiki') CONTAINERS_TYPES="${CONTAINERS_TYPES} wiki" ;; '-wp'|'--wp') CONTAINERS_TYPES="${CONTAINERS_TYPES} wp" ;; '-office'|'--office'|'-collab'*|'--collab'*) CONTAINERS_TYPES="${CONTAINERS_TYPES} office" ;; '-paheko'|'--paheko') CONTAINERS_TYPES="${CONTAINERS_TYPES} paheko" ;; '-pod'|'--pod'|'-castopod'|'--castopod') CONTAINERS_TYPES="${CONTAINERS_TYPES} castopod" ;; '-t' ) COMMANDS="${COMMANDS} RESTART-COMPOSE" ;; '-r' ) COMMANDS="${COMMANDS} RESTART-DOCKER" ;; '-l' | '--list' ) COMMANDS="$(echo "${COMMANDS} LIST" | sed "s/\s/\n/g" | sort | uniq)" ;; '-v' | '--version') COMMANDS="$(echo "${COMMANDS} VERSION" | sed "s/\s/\n/g" | sort | uniq)" ;; '-I' | '--install' ) COMMANDS="$(echo "${COMMANDS} INIT" | sed "s/\s/\n/g" | sort | uniq)" ;; # le sed sort uniq, c'est pour pas l'avoir en double '-U' | '--upgrade') COMMANDS="$(echo "${COMMANDS} UPGRADE" | sed "s/\s/\n/g" | sort | uniq)" ;; '--optim' ) COMMANDS="$(echo "${COMMANDS} OPTIMISE-CLOUD" | sed "s/\s/\n/g" | sort | uniq)" ;; '-u' ) COMMANDS="$(echo "${COMMANDS} UPDATE-CLOUD-APP" | sed "s/\s/\n/g" | sort | uniq)" ;; '-i' ) COMMANDS="$(echo "${COMMANDS} INSTALL-CLOUD-APP" | sed "s/\s/\n/g" | sort | uniq)" ;; '-a' ) GETAPPS="now" ;; '-occ' ) COMMANDS="$(echo "${COMMANDS} RUN-CLOUD-OCC" | sed "s/\s/\n/g" | sort | uniq)" GETOCCCOMAND="now" ;; '-mmctl' ) COMMANDS="$(echo "${COMMANDS} RUN-AGORA-MMCTL" | sed "s/\s/\n/g" | sort | uniq)" GETMMCTLCOMAND="now" ;; '-exec' ) COMMANDS="$(echo "${COMMANDS} RUN-DOCKER-EXEC" | sed "s/\s/\n/g" | sort | uniq)" GETEXECCOMAND="now" ;; '-p' | '--post' ) COMMANDS="$(echo "${COMMANDS} POST-AGORA" | sed "s/\s/\n/g" | sort | uniq)" GETTEAM="now" ;; '-*' ) # ignore ;; *) GIVEN_ORGA="${GIVEN_ORGA} ${ARG%-orga}" ;; esac fi done if [[ "${COMMANDS[*]}" =~ "RESTART-COMPOSE" && "${COMMANDS[*]}" =~ "RESTART-TYPE" ]]; then echo "Je restarte via docker-compose ou via docker mais pas les deux !" usage exit 1 fi if [ -z "${COMMANDS}" ]; then usage && exit fi if [ -n "${GIVEN_ORGA}" ]; then # intersection des 2 listes : quelle commande de ouf !! AVAILABLE_ORGAS=$(comm -12 <(printf '%s\n' ${AVAILABLE_ORGAS} | sort) <(printf '%s\n' ${GIVEN_ORGA} | sort)) fi NB_ORGAS=$(echo "${AVAILABLE_ORGAS}" | wc -w ) if [[ $NB_ORGAS = 0 && -z "${OPERATE_ON_MAIN}" ]]; then echo "Aucune orga trouvée." exit 1 fi NB_ORGAS_STR="$NB_ORGAS orgas" [ -n "${OPERATE_ON_MAIN}" ] && NB_ORGAS_STR="$NB_ORGAS_STR + les communs" _populate_lists # on récupère les clouds / agora / wiki / wp correspondants aux orga if [[ $NB_ORGAS -gt 2 && "${COMMANDS[*]}" =~ 'INIT' ]]; then ETLECLOUDCOMMUN= [ -n "${OPERATE_ON_MAIN}" ] && ETLECLOUDCOMMUN=" ainsi que les containers commun" echo "On s'apprête à initialiser les ${CONTAINERS_TYPES} suivants : ${AVAILABLE_ORGAS}${ETLECLOUDCOMMUN}" checkContinue fi for COMMAND in ${COMMANDS}; do case "${COMMAND}" in 'LIST' ) listContainers && exit ;; 'VERSION' ) version && exit ;; 'OPTIMISE-CLOUD' ) OptimiseClouds ;; 'RESTART-COMPOSE' ) restart-compose ;; 'RESTART-DOCKER' ) restart ;; 'UPDATE-CLOUD-APP' ) UpdateApplis ;; 'UPGRADE' ) UpgradeClouds ;; 'INIT' ) Init ;; 'INSTALL-CLOUD-APP' ) InstallApps ;; 'RUN-CLOUD-OCC' ) RunCommands "OCC" "${OCCCOMANDS[@]}" ;; 'RUN-AGORA-MMCTL' ) RunCommands "MMCTL" "${MMCTLCOMANDS[@]}" ;; 'RUN-DOCKER-EXEC' ) RunCommands "EXEC" "${EXECCOMANDS[@]}" ;; 'POST-AGORA' ) PostMessages ${Posts} ;; esac done