2024-06-03 18:43:35 +02:00
#!/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
2024-12-11 15:38:56 +01:00
. $KAZ_ROOT /secret/env-kaz
2024-06-03 18:43:35 +02:00
PRG = $( basename $0 )
2024-12-11 15:38:56 +01:00
#######################################
# 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
###################################################################################################################
2024-06-03 18:43:35 +02:00
#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é
2024-12-11 15:38:56 +01:00
Valeurs par défaut :
Tempo de Stop : ${ TEMPO_ACTION_STOP }
Tempo de restart : ${ TEMPO_ACTION_START }
2024-06-03 18:43:35 +02:00
"
}
####################################################
################ 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...
2024-12-11 15:38:56 +01:00
CONTAINERS_TYPES = ${ DEFAULTCONTAINERS }
2024-06-03 18:43:35 +02:00
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