649 lines
26 KiB
Bash
Executable File
649 lines
26 KiB
Bash
Executable File
#!/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
|
|
|
|
PRG=$(basename $0)
|
|
|
|
#TODO: ce tab doit être construit à partir de la liste des machines dispos et pas en dur
|
|
tab_sites_destinations_possibles=("kazoulet" "prod2" "prod1")
|
|
|
|
#GLOBAL VARS
|
|
NAS_VOL="/mnt/disk-nas1/docker/volumes/"
|
|
|
|
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"))
|
|
|
|
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
|
|
|
|
CONTAINERS_TYPES=
|
|
|
|
defaultContainersTypes="cloud agora wp wiki office paheko castopod" # les containers gérés par ce script.
|
|
|
|
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
|
|
|
|
QUIET="1" # redirection des echo
|
|
|
|
OCCCOMANDS=()
|
|
MMCTLCOMANDS=()
|
|
EXECCOMANDS=()
|
|
|
|
# CLOUD
|
|
APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio snappymail ransomware_protection" #rainloop richdocumentscode
|
|
|
|
|
|
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é
|
|
|
|
"
|
|
}
|
|
|
|
|
|
####################################################
|
|
################ 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="$defaultContainersTypes"
|
|
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
|