Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd1e6ff8a3 | ||
|
|
93e97024ac | ||
|
|
98b3893db3 |
@@ -1,7 +1,6 @@
|
||||
# kaz
|
||||
|
||||
[Kaz](https://kaz.bzh/) est un CHATONS du Morbihan. Nous proposons ici un moyen de le répliquer dans d'autres lieux. Il y a des éléments de configuration à définir avant d'initialiser ce
|
||||
simulateur..
|
||||
[Kaz](https://kaz.bzh/) est un CHATONS du Morbihan. Nous proposons ici un moyen de le répliquer dans d'autres lieux. Il y a des éléments de configuration à définir avant d'initialiser ce simulateur.
|
||||
|
||||
|
||||
Il est possible de simuler notre CHATONS dans une VirtualBox pour mettre au point nos différents services (voir [kaz-vagrant](https://git.kaz.bzh/KAZ/kaz-vagrant)).
|
||||
|
||||
@@ -4,15 +4,12 @@
|
||||
#Kan: 2021
|
||||
#Koi: gestion dockers
|
||||
|
||||
#29/09/2026: fab: supprime lien avec proxy-gen.sh
|
||||
#02/07/2026: fab: ajout de la sauvegarde pour pollaris
|
||||
|
||||
# 20/04/2025: Did : Ajout des sauvegardes de peertube dans les services generaux
|
||||
|
||||
# 15/01/2025: Dernière modif by fab: ne pas redémarrer Traefik en cas de créaio d'orga
|
||||
# Did : 13 fevrier 2025 modif des save en postgres et mysql
|
||||
# Did : ajout des sauvegardes de mobilizon et mattermost en postgres
|
||||
|
||||
# 20/04/2025
|
||||
# Did : Ajout des sauvegardes de peertube dans les services generaux
|
||||
|
||||
|
||||
# En cas d'absence de postfix, il faut lancer :
|
||||
@@ -29,7 +26,6 @@ setKazVars
|
||||
cd "${KAZ_BIN_DIR}"
|
||||
PATH_SAUVE="/home/sauve/"
|
||||
export SIMU=""
|
||||
export STRICT=""
|
||||
|
||||
declare -a availableComposesNoNeedMail availableMailComposes availableComposesNeedMail availableProxyComposes availableOrga
|
||||
availableComposesNoNeedMail=($(getList "${KAZ_CONF_DIR}/container-withoutMail.list"))
|
||||
@@ -100,10 +96,9 @@ updateProxy () {
|
||||
"${DOCKERS_ENV}"
|
||||
fi
|
||||
done
|
||||
|
||||
# for item in "${availableProxyComposes[@]}"; do
|
||||
# ${SIMU} ${KAZ_COMP_DIR}/${item}/proxy-gen.sh
|
||||
# done
|
||||
for item in "${availableProxyComposes[@]}"; do
|
||||
${SIMU} ${KAZ_COMP_DIR}/${item}/proxy-gen.sh
|
||||
done
|
||||
}
|
||||
|
||||
saveDB () {
|
||||
@@ -234,11 +229,6 @@ saveComposes () {
|
||||
. $KAZ_KEY_DIR/env-mastodonDB
|
||||
saveDB ${mastodonDBName} "${POSTGRES_USER}" "${POSTGRES_PASSWORD}" "${POSTGRES_DB}" mastodon postgres
|
||||
;;
|
||||
pollaris)
|
||||
echo "save pollaris (new kazdate)"
|
||||
. $KAZ_KEY_DIR/env-pollarisDB
|
||||
saveDB ${pollarisDBName} "${POSTGRES_USER}" "${POSTGRES_PASSWORD}" "${POSTGRES_DB}" pollaris postgres
|
||||
;;
|
||||
roundcube)
|
||||
echo "save roundcube"
|
||||
. $KAZ_KEY_DIR/env-roundcubeDB
|
||||
@@ -284,28 +274,15 @@ if [ "$#" -eq 0 ] ; then
|
||||
usage
|
||||
fi
|
||||
|
||||
while [[ "$1" == -* ]] ;do
|
||||
case "$1" in
|
||||
"-h" )
|
||||
if [ "$1" == "-h" ] ; then
|
||||
usage
|
||||
shift
|
||||
;;
|
||||
"-n" )
|
||||
fi
|
||||
|
||||
if [ "$1" == "-n" ] ; then
|
||||
export SIMU=echo
|
||||
shift
|
||||
;;
|
||||
"-strict" )
|
||||
export STRICT="_X_Y"
|
||||
shift
|
||||
;;
|
||||
"--" )
|
||||
shift
|
||||
;;
|
||||
* )
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
DCK_CMD=""
|
||||
SAVE_CMD=""
|
||||
@@ -345,13 +322,9 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
argExist=""
|
||||
|
||||
for compose in $*
|
||||
do
|
||||
argExist=true
|
||||
compose=${compose%/}
|
||||
if [[ -z "${STRICT}" ]] ;then
|
||||
if [[ ! " ${knownedComposes[@]} " =~ " ${compose} " ]]; then
|
||||
declare -a subst
|
||||
subst=()
|
||||
@@ -367,31 +340,20 @@ do
|
||||
echo "substitute compose: ${YELLOW}${BOLD}${compose} => ${subst[@]}${NC}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
for item in "${availableMailComposes[@]}"; do
|
||||
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableMailComposes+=("${item}")
|
||||
[[ "${item}" =~ "${compose}" ]] && enableMailComposes+=("${item}")
|
||||
done
|
||||
for item in "${availableProxyComposes[@]}"; do
|
||||
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableProxyComposes=("${item}")
|
||||
[[ "${item}" =~ "${compose}" ]] && enableProxyComposes=("${item}")
|
||||
done
|
||||
for item in "${availableComposesNoNeedMail[@]}"; do
|
||||
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableComposesNoNeedMail+=("${item}")
|
||||
[[ "${item}" =~ "${compose}" ]] && enableComposesNoNeedMail+=("${item}")
|
||||
done
|
||||
for item in "${availableComposesNeedMail[@]}"; do
|
||||
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableComposesNeedMail+=("${item}")
|
||||
[[ "${item}" =~ "${compose}" ]] && enableComposesNeedMail+=("${item}")
|
||||
done
|
||||
done
|
||||
|
||||
if [[ ! -z "${argExist}" ]] ;then
|
||||
if [[ -z "${enableMailComposes[@]}${enableProxyComposes[@]}${enableComposesNoNeedMail[@]}${enableComposesNeedMail[@]}" ]] ;then
|
||||
echo
|
||||
echo "Unknown arg: ${RED}${BOLD}" $* "${NC} not in ${YELLOW}${BOLD}${knownedComposes[*]}${NC}"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ ! -z "${DCK_CMD}" ]] && "${DCK_CMD}" && exit 0
|
||||
|
||||
[[ ! -z "${SAVE_CMD}" ]] && "${SAVE_CMD}" && exit 0
|
||||
|
||||
@@ -5,9 +5,6 @@
|
||||
# ki : fab
|
||||
# test git du 02/10/2023 depuis snster
|
||||
|
||||
#maj by fab du 29/09/2026: supprime le lien à proxy-gen.sh
|
||||
#maj by fab du 05/07/2026: remplacer les appels mmctl soit par l'api REST soit par un webhook entrant
|
||||
|
||||
# !!! need by htpasswd
|
||||
# apt-get install apache2-utils dos2unix
|
||||
|
||||
@@ -45,7 +42,6 @@ cd "${KAZ_ROOT}"
|
||||
. $KAZ_KEY_DIR/env-ldapServ
|
||||
. $KAZ_KEY_DIR/env-sympaServ
|
||||
. $KAZ_KEY_DIR/env-paheko
|
||||
. $KAZ_KEY_DIR/env-mattermostAdmin
|
||||
|
||||
# DOCK_DIR="${KAZ_COMP_DIR}" # ???
|
||||
|
||||
@@ -222,36 +218,15 @@ FILE_LDIF=/home/sauve/ldap.ldif
|
||||
gunzip ${FILE_LDIF}.gz -f
|
||||
grep -aEiorh '([[:alnum:]]+([._-][[:alnum:]]+)*@[[:alnum:]]+([._-][[:alnum:]]+)*\.[[:alpha:]]{2,6})' ${FILE_LDIF} | sort -u > ${TFILE_EMAIL}
|
||||
|
||||
# remplacé par la l'API REST
|
||||
# echo "récupération des login mattermost... "
|
||||
# docker exec -i mattermostServ bin/mmctl user list --all | grep ":.*(" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort > "${TFILE_MM}"
|
||||
|
||||
> "${TFILE_MM}"
|
||||
|
||||
page=0
|
||||
while true; do
|
||||
json=$(curl -s \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
"https://${URL_AGORA}/api/v4/users?page=${page}&per_page=200")
|
||||
|
||||
nb=$(echo "${json}" | jq 'length')
|
||||
|
||||
if [ "${nb}" -eq 0 ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
echo "${json}" | jq -r '.[].username' >> "${TFILE_MM}"
|
||||
page=$((page + 1))
|
||||
done
|
||||
sort -o "${TFILE_MM}" "${TFILE_MM}"
|
||||
|
||||
echo "récupération des login mattermost... "
|
||||
docker exec -i mattermostServ bin/mmctl user list --all | grep ":.*(" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort > "${TFILE_MM}"
|
||||
|
||||
dos2unix "${TFILE_MM}"
|
||||
echo "done"
|
||||
|
||||
# remplacé par la l'API REST
|
||||
# se connecter à l'agora pour ensuite pouvoir passer toutes les commandes mmctl
|
||||
# . $KAZ_KEY_DIR/env-mattermostAdmin
|
||||
# echo "docker exec -i mattermostServ bin/mmctl auth login ${httpProto}://${URL_AGORA} --name local-server --username ${mattermost_user} --password ${mattermost_pass}" | tee -a "${CMD_INIT}"
|
||||
. $KAZ_KEY_DIR/env-mattermostAdmin
|
||||
echo "docker exec -i mattermostServ bin/mmctl auth login ${httpProto}://${URL_AGORA} --name local-server --username ${mattermost_user} --password ${mattermost_pass}" | tee -a "${CMD_INIT}"
|
||||
|
||||
# vérif des emails
|
||||
regex="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
|
||||
@@ -618,88 +593,23 @@ userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=$
|
||||
if grep -q "^${IDENT_KAZ}$" "${TFILE_MM}" 2>/dev/null; then
|
||||
echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}"
|
||||
else
|
||||
|
||||
# on créé le compte mattermost
|
||||
#echo "docker exec -i mattermostServ bin/mmctl user create --email ${EMAIL_SOUHAITE} --username ${IDENT_KAZ} --password ${PASSWORD}" | tee -a "${CMD_LOGIN}"
|
||||
#on remplace par l'api rest
|
||||
|
||||
#KAZ a quelle team id ?
|
||||
KAZ_ID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "https://${URL_AGORA}/api/v4/teams/name/kaz" | jq -r '.id')
|
||||
CHAN1_ID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "https://${URL_AGORA}/api/v4/teams/name/kaz/channels/name/une-question--un-soucis" | jq -r '.id')
|
||||
CHAN2_ID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "https://${URL_AGORA}/api/v4/teams/name/kaz/channels/name/cafe-du-commerce--ouvert-2424h" | jq -r '.id')
|
||||
|
||||
cat >> "${CMD_LOGIN}" <<EOF
|
||||
resp=\$(curl -s -X POST "https://${URL_AGORA}/api/v4/users" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"${EMAIL_SOUHAITE}","username":"${IDENT_KAZ}","password":"${PASSWORD}"}')
|
||||
|
||||
USER_ID=\$(echo "\$resp" | jq -r '.id')
|
||||
|
||||
echo "docker exec -i mattermostServ bin/mmctl user create --email ${EMAIL_SOUHAITE} --username ${IDENT_KAZ} --password ${PASSWORD}" | tee -a "${CMD_LOGIN}"
|
||||
# et enfin on ajoute toujours le user à l'équipe KAZ et aux 2 channels publiques
|
||||
|
||||
curl -s -X POST "https://${URL_AGORA}/api/v4/teams/${KAZ_ID}/members" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "team_id": "${KAZ_ID}", "user_id": "'"\${USER_ID}"'"}'
|
||||
|
||||
curl -s -X POST "https://${URL_AGORA}/api/v4/channels/${CHAN1_ID}/members" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "user_id": "'"\${USER_ID}"'"}'
|
||||
|
||||
curl -s -X POST "https://${URL_AGORA}/api/v4/channels/${CHAN2_ID}/members" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "user_id": "'"\${USER_ID}"'"}'
|
||||
EOF
|
||||
|
||||
# echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:une-question--un-soucis ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||
# echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||
|
||||
echo "docker exec -i mattermostServ bin/mmctl team users add kaz ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||
echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:une-question--un-soucis ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||
echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||
NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
|
||||
fi
|
||||
|
||||
if [ "${EQUIPE_AGORA}" != "" -a "${EQUIPE_AGORA}" != "kaz" ]; then
|
||||
# l'équipe existe t-elle déjà ?
|
||||
|
||||
#nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
|
||||
http_code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${mattermost_token}" "https://${URL_AGORA}/api/v4/teams/name/${EQUIPE_AGORA}")
|
||||
[ "$http_code" -eq 200 ] && nb=1 || nb=0
|
||||
|
||||
nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
|
||||
if [ "${nb}" == "0" ];then # non, on la créé en mettant le user en admin de l'équipe
|
||||
|
||||
#echo "docker exec -i mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display-name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
|
||||
|
||||
#################################
|
||||
cat >> "${CMD_LOGIN}" <<EOF
|
||||
resp=\$(curl -s -X POST "https://${URL_AGORA}/api/v4/teams" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "name":"${EQUIPE_AGORA}", "display_name":"${EQUIPE_AGORA}", "type":"O"}')
|
||||
|
||||
TEAM_ID=\$(echo "\$resp" | jq -r '.id')
|
||||
|
||||
#puis ajouter le user à l'équipe
|
||||
#echo "docker exec -i mattermostServ bin/mmctl team users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
|
||||
|
||||
curl -s -X POST "https://${URL_AGORA}/api/v4/teams/\${TEAM_ID}/members" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{ "team_id": "'"\${TEAM_ID}"'", "user_id": "'"\${USER_ID}"'" }'
|
||||
|
||||
#et on le rend admin de son équipe
|
||||
curl -s -X PUT "https://${URL_AGORA}/api/v4/teams/\${TEAM_ID}/members/\${USER_ID}/roles" \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"roles":"team_user team_admin"}'
|
||||
EOF
|
||||
|
||||
|
||||
echo "docker exec -i mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display-name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# puis ajouter le user à l'équipe
|
||||
echo "docker exec -i mattermostServ bin/mmctl team users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
|
||||
fi
|
||||
|
||||
if [ -n "${CREATE_ORGA_SERVICES}" ]; then
|
||||
@@ -720,25 +630,12 @@ EOF
|
||||
if [[ "${mode}" = "dev" ]]; then
|
||||
echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}"
|
||||
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
|
||||
|
||||
#avec le vieux client soap
|
||||
#echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||
|
||||
#avec le nouveau clt soap
|
||||
echo "docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\" ${httpProto}://${URL_LISTE}/sympasoap" | tee -a "${CMD_SYMPA}"
|
||||
|
||||
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||
else
|
||||
echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}"
|
||||
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
|
||||
|
||||
#avec le vieux client soap
|
||||
#echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||
#echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\"" | tee -a "${CMD_SYMPA}"
|
||||
|
||||
#avec le nouveau clt soap
|
||||
echo "docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\" ${httpProto}://${URL_LISTE}/sympasoap" | tee -a "${CMD_SYMPA}"
|
||||
echo "docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\" ${httpProto}://${URL_LISTE}/sympasoap" | tee -a "${CMD_SYMPA}"
|
||||
|
||||
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\"" | tee -a "${CMD_SYMPA}"
|
||||
fi
|
||||
|
||||
if [ "${service[ADMIN_ORGA]}" == "O" ]; then
|
||||
@@ -778,9 +675,6 @@ Par retour de mail, dites-nous de quoi vous avez besoin tout de suite entre:
|
||||
* un cloud : bureau virtuel pour stocker des fichiers/calendriers/contacts et partager avec vos connaissances
|
||||
|
||||
Une fois que vous aurez répondu à ce mail, votre demande sera traitée manuellement.
|
||||
|
||||
Pour rappel, le cloud général https://cloud.kaz.bzh est dédié aux particuliers. Pour les orgas, il est préférable de créer des clouds dédiés où vous serez administrateur.
|
||||
|
||||
"
|
||||
fi
|
||||
|
||||
@@ -828,7 +722,7 @@ Enfin, vous disposez de tous les autres services KAZ où l'authentification n'es
|
||||
|
||||
En cas de soucis, n'hésitez pas à poser vos questions sur le canal 'Une question ? un soucis' de l'agora dispo ici : ${httpProto}://${URL_AGORA}
|
||||
|
||||
Si vous avez besoin d'accompagnement pour votre site, votre cloud, votre compta, votre migration de messagerie,... nous proposons des formations mensuelles gratuites. Si vous souhaitez être accompagné par un professionnel, voici une liste de pros, référencés par KAZ: https://kaz.bzh/nos-partenaires/
|
||||
Si vous avez besoin d'accompagnement pour votre site, votre cloud, votre compta, votre migration de messagerie,... nous proposons des formations mensuelles gratuites. Si vous souhaitez être accompagné par un professionnel, nous pouvons vous donner une liste de pros, référencés par KAZ.
|
||||
|
||||
À bientôt ;)
|
||||
|
||||
@@ -863,18 +757,7 @@ bisou!"
|
||||
EOF" | tee -a "${CMD_MSG}"
|
||||
|
||||
echo " # on envoie la confirmation d'inscription sur l'agora " | tee -a "${CMD_MSG}"
|
||||
#echo "docker exec -i mattermostServ bin/mmctl post create kaz:Creation-Comptes --message \"${MAIL_KAZ}\"" | tee -a "${CMD_MSG}"
|
||||
|
||||
#pas réussi à le mettre dans CMD_MSG :(, je balance direct)
|
||||
payload=$(jq -n \
|
||||
--arg channel "creation-comptes" \
|
||||
--arg text "$MAIL_KAZ" \
|
||||
'{channel: $channel, text: $text}')
|
||||
|
||||
curl -i -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$payload" \
|
||||
"https://${URL_AGORA}/hooks/${token_webhook}"
|
||||
echo "docker exec -i mattermostServ bin/mmctl post create kaz:Creation-Comptes --message \"${MAIL_KAZ}\"" | tee -a "${CMD_MSG}"
|
||||
|
||||
# fin des inscriptions
|
||||
done <<< "${ALL_LINES}"
|
||||
@@ -883,8 +766,7 @@ if [[ -n "${ALL_ORGA}" ]]; then
|
||||
echo "sleep 2" | tee -a "${CMD_PROXY}"
|
||||
echo "${KAZ_BIN_DIR}/container.sh start ${ALL_ORGA}" | tee -a "${CMD_PROXY}"
|
||||
for item in "${availableProxyComposes[@]}"; do
|
||||
#echo "cd \"${KAZ_COMP_DIR}/${item}/\"; ./proxy-gen.sh; docker-compose up -d; ./reload.sh " | tee -a "${CMD_PROXY}"
|
||||
echo "cd \"${KAZ_COMP_DIR}/${item}/\"; docker-compose up -d; ./reload.sh " | tee -a "${CMD_PROXY}"
|
||||
echo "cd \"${KAZ_COMP_DIR}/${item}/\"; ./proxy-gen.sh; docker-compose up -d; ./reload.sh " | tee -a "${CMD_PROXY}"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
for cloud in $(docker ps --format "{{json .Names}}" | grep nextcloud | jq -r .)
|
||||
for cloud in $(docker ps | grep -i nextcloudServ |awk '{print $12}')
|
||||
do
|
||||
docker exec -u www-data $cloud php cron.php
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
# Ki : Did
|
||||
# koi : gestion globale des users Kaz mais aussi les users d'autres domaines hébergés
|
||||
|
||||
#KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||
KAZ_ROOT=/kaz
|
||||
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||
. $KAZ_ROOT/bin/.commonFunctions.sh
|
||||
setKazVars
|
||||
|
||||
@@ -14,7 +13,7 @@ setKazVars
|
||||
. $KAZ_KEY_DIR/env-sympaServ
|
||||
. $KAZ_KEY_DIR/env-paheko
|
||||
|
||||
VERSION="04-10-2026"
|
||||
VERSION="16-11-2025"
|
||||
PRG=$(basename $0)
|
||||
RACINE=$(echo $PRG | awk '{print $1}')
|
||||
IFS=' '
|
||||
@@ -26,19 +25,19 @@ URL_AGORA=$(echo $matterHost).$(echo $domain)
|
||||
URL_LISTE=$(echo $sympaHost).$(echo $domain)
|
||||
URL_PAHEKO="$httpProto://${API_USER}:${API_PASSWORD}@kaz-paheko.$(echo $domain)"
|
||||
NL_LIST=infos@listes.kaz.bzh
|
||||
URL_AGORA_API=${httpProto}://${URL_AGORA}/api/v4
|
||||
URL_AGORA_API=${URL_AGORA}/api/v4
|
||||
EQUIPE=kaz
|
||||
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
|
||||
|
||||
|
||||
#### Test du serveur sur lequel s' execute le script ####
|
||||
echo ${site} | grep -E 'prod1|dev' >/dev/null 2>&1 || { echo "Le script ne fonctionne que sur Prod1 et Dev ";exit;}
|
||||
echo ${site} | grep -E 'prod1|dev' || { echo "Le script ne fonctionne que sur Prod1 et Dev ";exit;}
|
||||
##############################
|
||||
|
||||
TFILE_EMAILS=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_EMAILS)
|
||||
TFILE_EMAILS_LIST=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_EMAILS_LIST)
|
||||
TFILE_MAILS_TROUVE=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_MAILS_TROUVE)
|
||||
TFILE_CPT_MATTERMOST=$(mktemp /tmp/$RACINE.XXXXXXXXTFILE_CPT_MATTERMOST)
|
||||
TFILE_MAILS_MATTERMOST=$(mktemp /tmp/$RACINE.XXXXXXXXTFILE_MAILS_MATTERMOST)
|
||||
TFILE_CREATE_MAIL=$(mktemp /tmp/$RACINE.XXXXXXXXTFILE_CREATE_MAIL.sh)
|
||||
LDAP_IP=$(docker inspect -f '{{.NetworkSettings.Networks.ldapNet.IPAddress}}' ldapServ)
|
||||
|
||||
@@ -63,8 +62,8 @@ PostMattermost() {
|
||||
. $KAZ_KEY_DIR/env-mattermostAdmin
|
||||
PostM=$1
|
||||
CHANNEL=$2
|
||||
TEAMID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "${URL_AGORA_API}/teams/name/${EQUIPE}" | jq -r .id )
|
||||
CHANNELID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" ${URL_AGORA_API}/teams/${TEAMID}/channels/name/${CHANNEL} | jq -r .id )
|
||||
TEAMID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "${URL_AGORA_API}/teams/name/${EQUIPE}" | jq .id | sed -e 's/"//g')
|
||||
CHANNELID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" ${URL_AGORA_API}/teams/${TEAMID}/channels/name/${CHANNEL} | jq .id | sed -e 's/"//g')
|
||||
curl -s i-X POST -i -H "Authorization: Bearer ${mattermost_token}" -d "{\"channel_id\":\"${CHANNELID}\",\"message\":\"${PostM}\"}" "${URL_AGORA_API}/posts" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
@@ -140,15 +139,20 @@ searchEmail() {
|
||||
searchMattermost() {
|
||||
#Ici $1 est une adresse email
|
||||
. $KAZ_KEY_DIR/env-mattermostAdmin
|
||||
curl -s -H "Authorization: Bearer ${mattermost_token}" "${URL_AGORA_API}/users/email/${1}" >${TFILE_CPT_MATTERMOST} 2>/dev/null
|
||||
REP_SEARCH_MATTERMOST=$(jq -r .id ${TFILE_CPT_MATTERMOST})
|
||||
docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings auth login $httpProto://$URL_AGORA --name local-server --username $mattermost_user --password $mattermost_pass >/dev/null 2>&1
|
||||
docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings config set ServiceSettings.EnableAPIUserDeletion "true" >/dev/null 2>&1
|
||||
#on créé la list des mails dans mattermost
|
||||
docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings user list --all >${TFILE_MAILS_MATTERMOST} 2>/dev/null
|
||||
REP_SEARCH_MATTERMOST=$(cat ${TFILE_MAILS_MATTERMOST} | grep $1 | awk '{print $2}' | tr -d '[:space:]')
|
||||
if [ ! -z ${REP_SEARCH_MATTERMOST} ]
|
||||
then
|
||||
if [ "$2" = "DETAILS" ]
|
||||
then
|
||||
echo -e -n "${RED} Compte : ${GREEN} " ; jq -r .username ${TFILE_CPT_MATTERMOST}
|
||||
echo -e -n "${RED} Mail : ${GREEN} " ; jq -r .email ${TFILE_CPT_MATTERMOST}
|
||||
echo -e -n "${RED} Role : ${GREEN} " ; jq -r .roles ${TFILE_CPT_MATTERMOST}
|
||||
touch /tmp/$1-mattermost.json
|
||||
docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings --format json user search $1 >/tmp/$1-mattermost.json 2>/dev/null
|
||||
echo -e "${RED} Compte : ${GREEN} " ;jq .username /tmp/$1-mattermost.json
|
||||
echo -e "${RED} Mail : ${GREEN} " ; jq .email /tmp/$1-mattermost.json
|
||||
echo -e "${RED} Role : ${GREEN} " ; jq .roles /tmp/$1-mattermost.json
|
||||
else
|
||||
echo "${REP_SEARCH_MATTERMOST}"
|
||||
fi
|
||||
@@ -189,16 +193,16 @@ infoEmail() {
|
||||
printKazMsg " DETAILS DU COMPTE DANS LDAP ET PAHEKO"
|
||||
echo ""
|
||||
curl -s ${URL_PAHEKO}/api/sql -d "SELECT nom,adresse,code_postal,ville,email,email_secours,admin_orga,nom_orga,quota_disque,serveur_prod FROM users where email='${CHOIX_MAIL}' LIMIT 1;" >/tmp/$CHOIX_MAIL-paheko.json
|
||||
jq -r .results[].nom /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq -r .results[].adresse /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq -r .results[].code_postal /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq -r .results[].ville /tmp/$CHOIX_MAIL-paheko.json
|
||||
SERVEUR_PROD=$(jq -r .results[].serveur_prod /tmp/$CHOIX_MAIL-paheko.json)
|
||||
NOM_ORGA=$(jq -r .results[].nom_orga /tmp/$CHOIX_MAIL-paheko.json)
|
||||
jq .results[].nom /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq .results[].adresse /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq .results[].code_postal /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq .results[].ville /tmp/$CHOIX_MAIL-paheko.json
|
||||
SERVEUR_PROD=$(jq .results[].serveur_prod /tmp/$CHOIX_MAIL-paheko.json)
|
||||
NOM_ORGA=$(jq .results[].nom_orga /tmp/$CHOIX_MAIL-paheko.json)
|
||||
[ "${NOM_ORGA}" = "null" ] || echo -e " - ORGA : ${GREEN}${NOM_ORGA}${NC} sur serveur ${GREEN}${SERVEUR_PROD}${NC} "
|
||||
echo -n " - Quota (Paheko) : "
|
||||
echo -ne "${GREEN}"
|
||||
jq -r .results[].quota_disque /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq .results[].quota_disque /tmp/$CHOIX_MAIL-paheko.json
|
||||
echo -ne "${NC}"
|
||||
echo -n " - Quota Mail (Ldap) : "
|
||||
echo -ne "${GREEN}"
|
||||
@@ -215,17 +219,12 @@ infoEmail() {
|
||||
echo -ne "${NC}"
|
||||
echo -n " - Mail de secours (Paheko ): "
|
||||
echo -ne "${GREEN}"
|
||||
jq -r .results[].email_secours /tmp/$CHOIX_MAIL-paheko.json
|
||||
jq .results[].email_secours /tmp/$CHOIX_MAIL-paheko.json | sed -e 's/"//g'
|
||||
echo -ne "${NC}"
|
||||
echo -n " - Mail de secours (Ldap): "
|
||||
echo -ne "${GREEN}"
|
||||
ldapsearch -H ldap://${LDAP_IP} -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" -x -w "${LDAP_ADMIN_PASSWORD}" -b "cn=${CHOIX_MAIL},ou=users,${ldap_root}" | grep -i maildeSecours | sed -e 's/mailDeSecours://'
|
||||
echo -ne "${NC}"
|
||||
echo -ne " - Tel Mobile : "
|
||||
echo -ne "${GREEN}"
|
||||
REPMOBILE=$(ldapsearch -H ldap://${LDAP_IP} -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" -x -w "${LDAP_ADMIN_PASSWORD}" -b "cn=${CHOIX_MAIL},ou=users,${ldap_root}" | grep -i mobile | sed -e 's/mobile://')
|
||||
[ -z ${REPMOBILE} ] && echo "NC" || echo ${REPMOBILE}
|
||||
echo -ne "${NC}"
|
||||
echo -n " - Alias (Ldap) : "
|
||||
echo -ne "${GREEN}"
|
||||
LDAP_ALIAS=$(ldapsearch -H ldap://${LDAP_IP} -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" -x -w "${LDAP_ADMIN_PASSWORD}" -b "cn=${CHOIX_MAIL},ou=users,${ldap_root}" | grep -i alias | cut -c 11-60)
|
||||
@@ -239,7 +238,7 @@ infoEmail() {
|
||||
echo -e "${NC}"
|
||||
echo " - L' adresse apparait dans :"
|
||||
echo -n -e "${GREEN}"
|
||||
curl -s ${URL_PAHEKO}/api/sql -d "SELECT * FROM users where emails_Rattaches like '%$CHOIX_MAIL%' ;" | jq -r .results[].nom
|
||||
curl -s ${URL_PAHEKO}/api/sql -d "SELECT * FROM users where emails_Rattaches like '%$CHOIX_MAIL%' ;" | jq .results[].nom
|
||||
echo -e "${NC}"
|
||||
read -p " ==> Entrée pour continuer <=="
|
||||
;;
|
||||
@@ -303,15 +302,13 @@ searchDestroy() {
|
||||
####################################################################################################################
|
||||
if [ "${DOMAINE_EN_COURS}" = "${domain}" ]
|
||||
then
|
||||
MM_USER_ID=$(searchMattermost $REP_SEARCH_DESTROY)
|
||||
if [ ! -z ${MM_USER_ID} ]
|
||||
REP_SEARCH=$(searchMattermost $REP_SEARCH_DESTROY)
|
||||
printKazMsg "réponse de mattermost : ${REP_SEARCH_DESTROY}"
|
||||
if [ ! -z ${REP_SEARCH} ]
|
||||
then
|
||||
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} trouvé dans mattermost ${NC}"
|
||||
status_del=$(curl -s --request DELETE \
|
||||
--header 'Accept: application/json' \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
"${URL_AGORA_API}/api/v4/users/${MM_USER_ID}")
|
||||
if [ "$(echo ${status_del} | jq -r .status)" -eq "200" ]
|
||||
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} dans mattermost ${NC}"
|
||||
docker exec -ti ${mattermostServName} bin/mmctl user delete ${REP_SEARCH_DESTROY} --confirm >/dev/null 2>&1
|
||||
if [ "$?" -eq "0" ]
|
||||
then
|
||||
printKazMsg "Suppresion ok"
|
||||
else
|
||||
@@ -343,13 +340,8 @@ searchDestroy() {
|
||||
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} et ${MAIL_SECOURS} dans la liste info de sympa"
|
||||
echo -e "${NC}"
|
||||
echo ""
|
||||
#avec ancien client soap
|
||||
#docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${REP_SEARCH_DESTROY}"
|
||||
#docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${MAIL_SECOURS}"
|
||||
#avec nouveau client soap
|
||||
docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=del --service_parameters=\"${NL_LIST},${REP_SEARCH_DESTROY}\" ${httpProto}://${URL_LISTE}/sympasoap
|
||||
docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=del --service_parameters=\"${NL_LIST},${MAIL_SECOURS}\" ${httpProto}://${URL_LISTE}/sympasoap
|
||||
|
||||
docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${REP_SEARCH_DESTROY}"
|
||||
docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${MAIL_SECOURS}"
|
||||
echo -e "${NC}"
|
||||
echo ""
|
||||
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} dans le serveur de mail"
|
||||
@@ -380,7 +372,7 @@ searchDestroy() {
|
||||
printKazError "Erreur de suppression"
|
||||
fi
|
||||
printKazMsg "Envoi d'un message dans mattermost pour la suppression du compte"
|
||||
PostMattermost "Le compte ${REP_SEARCH_DESTROY} est supprimé , mail envoyé à ${MAIL_SECOURS}" "Creation-Comptes"
|
||||
docker exec -ti mattermostServ bin/mmctl post create kaz:Creation-Comptes --message "Le compte ${REP_SEARCH_DESTROY} est supprimé , mail envoyé à ${MAIL_SECOURS}" >/dev/null 2>&1
|
||||
MAIL_SUPPR="Le compte ${REP_SEARCH_DESTROY} est supprimé"
|
||||
OLDIFS=${IFS}
|
||||
IFS=''
|
||||
@@ -394,12 +386,17 @@ searchDestroy() {
|
||||
}
|
||||
|
||||
gestPassword() {
|
||||
ACTION_EN_COURS="Gestion du mot de passe d'un compte"
|
||||
ACTION_EN_COURS="Gestion du mot de passe d' un compte"
|
||||
searchEmail
|
||||
#cree un mdp acceptable par postfix/nc/mattermost
|
||||
PASSWORD=_`apg -n 1 -m 10 -M NCL -d`_
|
||||
COMPTE_A_MODIFIER=${CHOIX_MAIL}
|
||||
|
||||
# On considère le mot de passe de secours de ldap
|
||||
# FICMAILSECOURS=$(mktemp /tmp/FICMAILSECOURSXXXXX.json)
|
||||
# curl -s ${URL_PAHEKO}/api/sql -d "SELECT email_secours FROM users where email='${COMPTE_A_MODIFIER}' LIMIT 1 ;" >$FICMAILSECOURS
|
||||
# MAIL_SECOURS=$(jq .results[].email_secours $FICMAILSECOURS | sed -e 's/\"//g')
|
||||
|
||||
MAIL_SECOURS=$(ldapsearch -H ldap://${LDAP_IP} \
|
||||
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
|
||||
-w "${LDAP_ADMIN_PASSWORD}" \
|
||||
@@ -418,7 +415,7 @@ gestPassword() {
|
||||
EMAIL_ORGA_TROUVE=$(curl -s ${URL_PAHEKO}/api/sql -d "SELECT id FROM users where emails_Rattaches like '%$CHOIX_MAIL%' ;" | jq .results[].id | wc -l)
|
||||
if [ $EMAIL_ORGA_TROUVE -ge 1 ]
|
||||
then
|
||||
printKazError "L'adresse apparait dans plusieurs orga comme mails rattaché IL EST PREFERABLE DE REPONDRE NON !!!"
|
||||
printKazError "L' adresse apparait dans plusieurs orga comme mails rattaché IL EST PREFERABLE DE REPONDRE NON !!!"
|
||||
fi
|
||||
##########################################################################
|
||||
read -p "ON CONTINUE ? [ o / n ]: " SEARCH_RESET_INPUT
|
||||
@@ -435,40 +432,7 @@ gestPassword() {
|
||||
echo -e "$GREEN Compte $RED $(searchMattermost $COMPTE_A_MODIFIER) ${NC}"
|
||||
echo -e "$GREEN Compte Nextcloud $RED ${USER_NEXTCLOUD_MODIF} ${NC}"
|
||||
echo -e "$GREEN Le mot de passe sera = $RED ${PASSWORD} ${NC}"
|
||||
|
||||
#maj du mdp sur mattermost avec l'api et non plus avec mmctl
|
||||
#docker exec -ti mattermostServ bin/mmctl user change-password $(searchMattermost ${COMPTE_A_MODIFIER}) -p ${PASSWORD} >/dev/null 2>&1
|
||||
USER_ID=$(searchMattermost "${COMPTE_A_MODIFIER}")
|
||||
#echo "user_id = "$USER_ID
|
||||
|
||||
. "$KAZ_KEY_DIR/env-mattermostAdmin"
|
||||
#il arrive que l'api MM sorte un 401, je boucle
|
||||
while true
|
||||
do
|
||||
HTTP_CODE=$(curl -sS -o /dev/null -w "%{http_code}" \
|
||||
-X PUT \
|
||||
-H "Authorization: Bearer ${mattermost_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
"${URL_AGORA_API}/users/${USER_ID}/password" \
|
||||
-d "{\"new_password\":\"${PASSWORD}\"}")
|
||||
|
||||
#echo "Mattermost : HTTP <${HTTP_CODE}>"
|
||||
|
||||
if [ "${HTTP_CODE}" = "200" ]
|
||||
then
|
||||
break
|
||||
fi
|
||||
|
||||
if [ "${HTTP_CODE}" = "401" ]
|
||||
then
|
||||
echo "Authentification Mattermost refusée, nouvelle tentative dans 2 secondes..."
|
||||
sleep 2
|
||||
else
|
||||
echo "ERREUR : changement du mot de passe Mattermost : HTTP ${HTTP_CODE}"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
docker exec -ti mattermostServ bin/mmctl user change-password $(searchMattermost ${COMPTE_A_MODIFIER}) -p ${PASSWORD} >/dev/null 2>&1
|
||||
curl -H 'OCS-APIREQUEST: true' -X PUT $httpProto://admin:$NEXTCLOUD_ADMIN_PASSWORD@$URL_NC/ocs/v1.php/cloud/users/${USER_NEXTCLOUD_MODIF} -d key=password -d value=${PASSWORD} >/dev/null 2>&1
|
||||
pass=$(mkpasswd -m sha512crypt ${PASSWORD})
|
||||
echo -e "\n\ndn: cn=${COMPTE_A_MODIFIER},ou=users,${ldap_root}\n\
|
||||
@@ -476,7 +440,7 @@ changeType: modify\n\
|
||||
replace: userPassword\n\
|
||||
userPassword: {CRYPT}${pass}\n\n" | ldapmodify -c -H ldap://${LDAP_IP} -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" -x -w "${LDAP_ADMIN_PASSWORD}"
|
||||
echo -e "Envoi d'un message dans mattermost pour la modification du mot de passe"
|
||||
PostMattermost "Le mot de passe du compte ${COMPTE_A_MODIFIER} a été modifié" "Creation-Comptes"
|
||||
docker exec -ti mattermostServ bin/mmctl post create kaz:Creation-Comptes --message "Le mot de passe du compte ${COMPTE_A_MODIFIER} a été modifié" >/dev/null 2>&1
|
||||
if [ ${ADRESSE_SEC} == "OUI" ]
|
||||
then
|
||||
echo -e "Envoi d'un message à l' adresse de secours : $GREEN${MAIL_SECOURS}${NC}"
|
||||
@@ -490,17 +454,8 @@ Le site d' aide pour la configuration des services : https://wiki.kaz.bzh
|
||||
Le site Web de Kaz : https://kaz.bzh
|
||||
Le mail de la collégiale : contact@kaz.bzh
|
||||
|
||||
Pour tes prochaines questions, je t'invite à les (re)poser sur notre agora, dans le canal \"Un soucis, une question\" sur
|
||||
https://agora.kaz.bzh/kaz/channels/une-question--un-soucis
|
||||
Il faut te connecter avec ton compte kaz.
|
||||
|
||||
Ainsi, tout le monde pourra répondre mais aussi bénéficier des réponses apportées. On la joue collectif.
|
||||
|
||||
Bonne journée 😉
|
||||
"
|
||||
ExpMail ${MAIL_SECOURS} "Modification du compte" "${MAIL_CHANG}"
|
||||
read -p " ---------------------- Appuyer sur une touche pour continuer -------------------------"
|
||||
|
||||
A bientôt"
|
||||
ExpMail ${MAIL_SECOURS} "Modification du compte" ${MAIL_CHANG}
|
||||
fi
|
||||
if [ ${ADRESSE_SEC} == "NON" ]
|
||||
then
|
||||
@@ -517,15 +472,7 @@ createMail() {
|
||||
QUOTA=1
|
||||
TRUE_KAZ=TRUE
|
||||
fait=0
|
||||
# si c'est une demande de création non interactive
|
||||
# la valeur de CREATE_AUTO doit être à TRUE
|
||||
CREATE_AUTO=${1}
|
||||
EMAIL_SOUHAITE=${2}
|
||||
EMAIL_SECOURS=${3}
|
||||
# Si on est en interactif, On demande le mail souhaite le mail secours et on demande le nom et prenom
|
||||
# et on regarde si c' est valide et si ça existe déjà
|
||||
if [ "${CREATE_AUTO}" != "TRUE" ]
|
||||
then
|
||||
# On demande le mail souhaite on regarde si c' est valide et si ça existe déjà
|
||||
while [ $fait -eq 0 ]
|
||||
do
|
||||
clear
|
||||
@@ -534,7 +481,6 @@ createMail() {
|
||||
echo "----------------------------------------------------------------------"
|
||||
read -p "Mail souhaité (r ou R pour quitter ) : " EMAIL_SOUHAITE
|
||||
[[ ${EMAIL_SOUHAITE} =~ ^[rRqQ]$ ]] && Main
|
||||
EMAIL_SOUHAITE=$(unaccent utf8 ${EMAIL_SOUHAITE})
|
||||
if [[ ${EMAIL_SOUHAITE} =~ ${regexMail} ]]
|
||||
then
|
||||
ldapsearch -H ldap://${LDAP_IP} \
|
||||
@@ -564,6 +510,7 @@ createMail() {
|
||||
DOMAINE_EN_COURS=$(echo ${EMAIL_SOUHAITE} | sed -e 's/^.*@//')
|
||||
echo " ---- Domaine: " ${DOMAINE_EN_COURS} ----
|
||||
# ----------------------------------------------------------------------
|
||||
# On demande le mail de secours et on teste si c' est un mail valide
|
||||
fait=0
|
||||
while [ $fait -eq 0 ]
|
||||
do
|
||||
@@ -591,33 +538,6 @@ createMail() {
|
||||
do
|
||||
read -p "Nom : " NOM
|
||||
done
|
||||
else
|
||||
ERRMAILAUTO=""
|
||||
# on renseigne DOMAINE EN COURS pour cette partie de script ( puisque l'autre déclaration se fait dasn la boucle interactive
|
||||
DOMAINE_EN_COURS=$(echo ${EMAIL_SOUHAITE} | sed -e 's/^.*@//')
|
||||
NOM=kaz
|
||||
PRENOM=$(apg -m 8 -x 5 -n 1)
|
||||
# on cherche le mail dans l'annuaire
|
||||
ldapsearch -H ldap://${LDAP_IP} \
|
||||
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
|
||||
-w "${LDAP_ADMIN_PASSWORD}" \
|
||||
-b "${ldap_root}" "(&(objectclass=inetOrgPerson)(cn=${EMAIL_SOUHAITE}))" cn | grep ^cn | sed -e 's/^cn: //' >$TFILE_EMAILS
|
||||
if grep -q "^${EMAIL_SOUHAITE}$" "${TFILE_EMAILS}"
|
||||
then
|
||||
ERRMAILAUTO="${ERRMAILAUTO} Le mail ${EMAIL_SOUHAITE} existe déjà"
|
||||
fi
|
||||
if ! grep $(echo ${EMAIL_SOUHAITE} | sed -e 's/^.*@//') ${KAZ_CONF_DIR}/autorized-domains.txt >/dev/null
|
||||
then
|
||||
ERRMAILAUTO="${ERRMAILAUTO} Le domaine ${DOMAINE_EN_COURS} n' est pas dans la liste autorisée"
|
||||
fi
|
||||
if [ ! -z "${ERRMAILAUTO}" ]
|
||||
then
|
||||
PostMattermost "Erreur de script auto : ${ERRMAILAUTO}" "Creation-Comptes"
|
||||
echo "Erreur de script auto : ${ERRMAILAUTO}"
|
||||
exit
|
||||
fi
|
||||
|
||||
fi
|
||||
# On constitue l' ident kaz pour le ldap
|
||||
IDENT_KAZ=$(unaccent utf8 "${PRENOM,,}.${NOM,,}")
|
||||
# on créé le mot de passe
|
||||
@@ -626,8 +546,6 @@ createMail() {
|
||||
LDAPUSER=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}')
|
||||
LDAPDOMAIN=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}')
|
||||
LDAPPASS=$(mkpasswd -m sha512crypt ${PASSWORD})
|
||||
if [ "${CREATE_AUTO}" != "TRUE" ]
|
||||
then
|
||||
[ "${DOMAINE_EN_COURS}" != "${domain}" ] && TRUE_KAZ=FALSE
|
||||
echo "${GREEN}Mail souhaité : ${NC}${EMAIL_SOUHAITE}"
|
||||
echo "${GREEN}Mail secours : ${NC}${EMAIL_SECOURS}"
|
||||
@@ -644,7 +562,6 @@ createMail() {
|
||||
then
|
||||
Main
|
||||
fi
|
||||
fi
|
||||
echo "echo -e '\n\ndn: cn=${EMAIL_SOUHAITE},ou=users,${ldap_root}\n\
|
||||
changeType: add\n\
|
||||
objectclass: inetOrgPerson\n\
|
||||
@@ -669,7 +586,6 @@ agoraEnabled: ${TRUE_KAZ}\n\
|
||||
userPassword: {CRYPT}${LDAPPASS}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=${LDAP_ADMIN_USERNAME},${ldap_root}\" -x -w ${LDAP_ADMIN_PASSWORD}" >${TFILE_CREATE_MAIL}
|
||||
# on execute le fichier avec les données ldap pour créer l' entrée dans l' annuaire
|
||||
bash ${TFILE_CREATE_MAIL} >/dev/null
|
||||
#DID
|
||||
# on colle le compte et le mot de passe dans le fichier
|
||||
echo "Création de : ${EMAIL_SOUHAITE} avec le mot de passe : ${PASSWORD}" >>${TFILE_CREATE_MAIL}
|
||||
OLDIFS=${IFS}
|
||||
@@ -684,31 +600,18 @@ $(cat ${KAZ_CONF_DIR}/domains/${DOMAINE_EN_COURS})
|
||||
|
||||
Bonne journée"
|
||||
ExpMail ${EMAIL_SECOURS} "Creation de ${EMAIL_SOUHAITE}" ${MSG_CREATION_MAIL}
|
||||
PostMattermost "création du compte ${EMAIL_SOUHAITE} avec l' adresse de secours ${EMAIL_SECOURS}" "Creation-Comptes"
|
||||
docker exec -ti mattermostServ bin/mmctl post create kaz:Creation-Comptes --message "création du compte ${EMAIL_SOUHAITE} avec l' adresse de secours ${EMAIL_SECOURS}" >/dev/null 2>&1
|
||||
IFS=${OLDIFS}
|
||||
# si non interactif on fait une pause pour afficher une eventuelle erreur
|
||||
if [ "${CREATE_AUTO}" != "TRUE" ]
|
||||
then
|
||||
read -p " - ENTREE pour continuer - "
|
||||
createMail
|
||||
fi
|
||||
}
|
||||
|
||||
createMailAuto()
|
||||
{
|
||||
if [ "$#" -ne "3" ]
|
||||
then
|
||||
echo "$0 pas assez d'arguments"
|
||||
PostMattermost "Erreur de script $0 ,constacter les sysadmins " "Creation-Comptes"
|
||||
exit 1
|
||||
fi
|
||||
if [[ ${2} =~ ${regexMail} ]] && [[ ${3} =~ ${regexMail} ]]
|
||||
then
|
||||
createMail TRUE ${2} ${3}
|
||||
else
|
||||
echo "Les mails sont invalides"
|
||||
PostMattermost "Erreur de script $0 ,les mails demandés sont malformés" "Creation-Comptes"
|
||||
fi
|
||||
echo " --------------------------------------------------------------------"
|
||||
echo "! INFO : !"
|
||||
echo "! Le Mot de passe !"
|
||||
echo "! Est dans le fichier !"
|
||||
echo "! ${TFILE_CREATE_MAIL} !"
|
||||
echo " --------------------------------------------------------------------"
|
||||
echo
|
||||
read -p " - ENTREE pour continuer - "
|
||||
# Retour au menu principal
|
||||
Main
|
||||
}
|
||||
|
||||
createAlias() {
|
||||
@@ -985,7 +888,7 @@ updateUser() {
|
||||
MAILDESECOURSACTUEL=""
|
||||
MAILDESECOURS=""
|
||||
Ucompteur=1
|
||||
for attribut in mailDeSecours mailAlias mailQuota nextcloudQuota mobile
|
||||
for attribut in mailDeSecours mailAlias mailQuota nextcloudQuota
|
||||
do
|
||||
ATTRIB+=([${attribut}]=$(ldapsearch -H ldap://${LDAP_IP} \
|
||||
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
|
||||
@@ -1064,18 +967,6 @@ updateUser() {
|
||||
fi
|
||||
faitAttrib=0
|
||||
;;
|
||||
mobile )
|
||||
read -p "Quel est le numéo du mobile au format 0XXXXXXXXXXX : " RCHANGE
|
||||
if [[ ${RCHANGE} =~ ^[0-9]+$ ]] && [ "$(echo ${RCHANGE} | wc -L)" -eq "10" ]
|
||||
then
|
||||
# prévoir un passage en +33XXXXXXXXXX ?
|
||||
CHANGED+=([mobile]="${RCHANGE}")
|
||||
else
|
||||
echo "Valeur incorecte"
|
||||
sleep 3
|
||||
fi
|
||||
faitAttrib=0
|
||||
;;
|
||||
mailDeSecours )
|
||||
echo "------------------------------------------------"
|
||||
read -p " - Nouveau Mail de Secours : " RCHANGE
|
||||
@@ -1190,13 +1081,9 @@ updateUser() {
|
||||
if [ ! -z ${MAILDESECOURS} ]
|
||||
then
|
||||
# suppression du mail de secours de la liste infos
|
||||
#docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${MAILDESECOURSACTUEL}"
|
||||
docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars="USER_EMAIL=${LISTMASTER}" --service=del --service_parameters="${NL_LIST},${MAIL_SECOURS}" ${httpProto}://${URL_LISTE}/sympasoap
|
||||
|
||||
docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=del --service_parameters="${NL_LIST},${MAILDESECOURSACTUEL}"
|
||||
# ajout de l' adresse de la nouvelle adresse de secours
|
||||
#docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=add --service_parameters="${NL_LIST},${MAILDESECOURS}"
|
||||
docker exec -i sympaServ sympa test soap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars="USER_EMAIL=${LISTMASTER}" --service=add --service_parameters="${NL_LIST},${MAIL_SECOURS}" ${httpProto}://${URL_LISTE}/sympasoap
|
||||
|
||||
docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${SOAP_USER} --trusted_application_password=${SOAP_PASSWORD} --proxy_vars=USER_EMAIL=${LISTMASTER} --service=add --service_parameters="${NL_LIST},${MAILDESECOURS}"
|
||||
fi
|
||||
updateUser
|
||||
fi
|
||||
@@ -1214,9 +1101,6 @@ updateUser() {
|
||||
usage () {
|
||||
printKazMsg "$PRG [-h] [-v]"
|
||||
printKazMsg "script de gestion des kaznautes"
|
||||
printKazMsg " -c permet de créer un mail avec son mail de secours en non intereactif"
|
||||
printKazMsg " syntax : $0 -c mail mailsecours"
|
||||
printKazMsg " exemple $0 user@kaz.bzh user@apple.fr"
|
||||
printKazMsg " -h aide sur ce script"
|
||||
printKazMsg " -v version du script."
|
||||
}
|
||||
@@ -1236,18 +1120,18 @@ echo "-------------------------------------------------"
|
||||
echo -e "${BOLD}COMPTES : "
|
||||
echo -e "${NC}*********"
|
||||
echo -e "${NC}"
|
||||
echo -e " ${NC}1 - Information sur un compte (alias ou Mail)"
|
||||
echo -e " ${YELLOW}2 - Modification d'un compte"
|
||||
echo -e " ${NC}3 - Changement de mot de passe d'un compte"
|
||||
echo -e " ${GREEN}4 - Suppression d'un compte"
|
||||
echo -e " ${NC}5 - Création d'une adresse de messagerie"
|
||||
echo -e " ${NC}1 - Information sur un compte (alias ou Mail )"
|
||||
echo -e " ${YELLOW}2 - Modification d' un compte"
|
||||
echo -e " ${NC}3 - Changement de mot de passe d' un compte"
|
||||
echo -e " ${GREEN}4 - Suppression d' un compte "
|
||||
echo -e " ${NC}5 - Création d' une adresse de messagerie"
|
||||
echo -e "${NC}"
|
||||
echo -e "${BOLD}ALIAS : "
|
||||
echo -e "${NC}*******"
|
||||
echo -e "${NC}"
|
||||
echo -e " ${NC}6 - Création d'un alias Général pour mails Externes"
|
||||
echo -e " ${YELLOW}7 - Modification d'un alias Général pour mails Externes"
|
||||
echo -e " ${GREEN}8 - Suppression d'un alias Général pour mails Externes"
|
||||
echo -e " ${NC}6 - Création d' un alias Général pour mails Externes"
|
||||
echo -e " ${YELLOW}7 - Modification d' un alias Général pour mails Externes"
|
||||
echo -e " ${GREEN}8 - Suppression d' un alias Général pour mails Externes"
|
||||
echo -e "${NC}"
|
||||
echo "-------------------------------------------------"
|
||||
echo -e "${NC}"
|
||||
@@ -1308,10 +1192,6 @@ case "$1" in
|
||||
printKazMsg "$PRG version $VERSION"
|
||||
exit
|
||||
;;
|
||||
'-c' )
|
||||
createMailAuto $@
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
|
||||
# on teste la présence du domaine du site dans le fichier autorized-domains.txt
|
||||
|
||||
@@ -1,323 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
#KAN: 29/09/2026
|
||||
#KOI: permettre de lancer des actions pour les orga depuis paheko
|
||||
#KI: fab
|
||||
|
||||
#structure:
|
||||
#
|
||||
#/kaz/
|
||||
#├── docker/paheko/config/
|
||||
#| └── kaz_detect_changes.php
|
||||
#├── bin/
|
||||
#| ├── worker_transfert.sh
|
||||
#│ ├── worker.py
|
||||
#│ └── worker_actions
|
||||
#│ ├── modifier_services.py
|
||||
#│ ├── definir_quota.py
|
||||
#│ └── etc...
|
||||
#├── log/
|
||||
#│ └── worker.log
|
||||
#├── tmp/
|
||||
#│ └── jobs/
|
||||
#│ └── job-6abcbb939dc43.json.transfere
|
||||
#└── jobs/
|
||||
# ├── job-6abcd79243e75.json.mail
|
||||
# ├── job-6abcd79243e75.json.OK
|
||||
# ├── job-3efab81234521.json.KO
|
||||
# └── ...
|
||||
|
||||
import glob
|
||||
import importlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
|
||||
BASE_DIR = "/kaz/bin"
|
||||
JOBS_DIR = "/kaz/jobs"
|
||||
|
||||
if BASE_DIR not in sys.path:
|
||||
sys.path.insert(0, BASE_DIR)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# LOG
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
LOG_DIR = "/kaz/log"
|
||||
LOG_FILE = os.path.join(LOG_DIR, "worker.log")
|
||||
|
||||
os.makedirs(LOG_DIR, exist_ok=True)
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s %(levelname)s %(message)s",
|
||||
datefmt="%Y-%m-%d %H:%M:%S",
|
||||
handlers=[
|
||||
logging.FileHandler(LOG_FILE, encoding="utf-8"),
|
||||
logging.StreamHandler(sys.stdout),
|
||||
],
|
||||
)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# ENVOI D'UN MESSAGE MATTERMOST
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
def send_mattermost(message):
|
||||
|
||||
url_agora = "agora.kaz.bzh"
|
||||
|
||||
result = subprocess.run(
|
||||
[
|
||||
"bash",
|
||||
"-c",
|
||||
". /kaz/secret/env-mattermostAdmin && "
|
||||
"printf '%s' \"$token_webhook\""
|
||||
],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
)
|
||||
|
||||
token_webhook = result.stdout
|
||||
|
||||
url = f"https://{url_agora}/hooks/{token_webhook}"
|
||||
|
||||
payload = json.dumps({
|
||||
"channel": "creation-comptes",
|
||||
"text": message,
|
||||
}).encode("utf-8")
|
||||
|
||||
request = urllib.request.Request(
|
||||
url,
|
||||
data=payload,
|
||||
headers={
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
method="POST",
|
||||
)
|
||||
|
||||
with urllib.request.urlopen(request) as response:
|
||||
|
||||
if response.status < 200 or response.status >= 300:
|
||||
raise RuntimeError(
|
||||
f"Erreur Mattermost : HTTP {response.status}"
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# ENVOI DU MAIL
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
def send_mail(mail_file, emails):
|
||||
|
||||
if not emails:
|
||||
log.info("Aucun destinataire de mail.")
|
||||
return
|
||||
|
||||
if not os.path.isfile(mail_file):
|
||||
log.info(f"Aucun mail à envoyer : {mail_file}")
|
||||
return
|
||||
|
||||
with open(mail_file, "r", encoding="utf-8") as f:
|
||||
mail = f.read()
|
||||
|
||||
if not mail.strip():
|
||||
log.info(f"Le fichier mail est vide : {mail_file}")
|
||||
return
|
||||
|
||||
#PROD
|
||||
recipients = [email.strip() for email in emails if email.strip()]
|
||||
#TEST
|
||||
# recipients = ["contact@kaz.bzh"]
|
||||
|
||||
if not recipients:
|
||||
log.info("Aucun destinataire de mail valide.")
|
||||
return
|
||||
|
||||
#TEST
|
||||
# annonce = (
|
||||
# "#################################################\n"
|
||||
# "Pendant quelques temps, contact@kaz.bzh va recevoir les mails de modification des services.\n"
|
||||
# "Vérifier le contenu du mail et si OK, le transférer à :\n"
|
||||
# + "\n".join(emails)
|
||||
# + "\n"
|
||||
# "En supprimant bien sûr cette annonce.\n"
|
||||
# "Plus tard, le mail partira directement, aussi, il faut bien le valider.\n"
|
||||
# "#################################################\n"
|
||||
# "\n"
|
||||
# )
|
||||
# mail = annonce + mail
|
||||
#FIN TEST
|
||||
|
||||
message = (
|
||||
"From: contact@kaz.bzh\n"
|
||||
f"To: {', '.join(recipients)}\n"
|
||||
"Subject: KAZ - informations\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"\n"
|
||||
+ mail
|
||||
)
|
||||
|
||||
log.info(f"Envoi du mail à : {', '.join(recipients)}")
|
||||
|
||||
result = subprocess.run(
|
||||
["/usr/sbin/sendmail", "-t", "-i"],
|
||||
input=message,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"sendmail a échoué avec le code {result.returncode}: "
|
||||
f"{result.stderr}"
|
||||
)
|
||||
|
||||
log.info("Mail envoyé avec succès.")
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# RECHERCHE D'UN JOB
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
jobs = sorted(
|
||||
glob.glob(os.path.join(JOBS_DIR, "job-*.json")),
|
||||
#on trie par date de fichier
|
||||
key=os.path.getmtime
|
||||
)
|
||||
|
||||
if not jobs:
|
||||
log.info("Aucun job à traiter.")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# UN SEUL JOB
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
job = jobs[0]
|
||||
|
||||
encours = job + ".encours"
|
||||
ok = job + ".OK"
|
||||
ko = job + ".KO"
|
||||
mail_file = job + ".mail"
|
||||
|
||||
log.info(f"Job trouvé : {job}")
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# PRISE EN CHARGE DU JOB
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
try:
|
||||
os.rename(job, encours)
|
||||
|
||||
except FileNotFoundError:
|
||||
# Le fichier a disparu entre le glob() et le rename().
|
||||
log.info(f"Job disparu entre temps : {job}")
|
||||
sys.exit(0)
|
||||
|
||||
except OSError as e:
|
||||
log.error(f"Impossible de prendre le job en charge : {e}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
log.info(f"Job en cours : {encours}")
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# LECTURE DU JSON
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
try:
|
||||
|
||||
with open(encours, "r", encoding="utf-8") as f:
|
||||
message = json.load(f)
|
||||
|
||||
log.info(f"Message : {message}")
|
||||
|
||||
action = message.get("action")
|
||||
|
||||
if not action:
|
||||
raise ValueError("Le champ 'action' est absent du JSON")
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# CHARGEMENT ET EXECUTION DE L'ACTION
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
log.info(f"Action demandée : {action}")
|
||||
|
||||
module = importlib.import_module(
|
||||
f"worker_actions.{action}"
|
||||
)
|
||||
|
||||
module.run(message, encours)
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# ENVOI DU MAIL
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
send_mail(
|
||||
mail_file,
|
||||
message.get("emails", [])
|
||||
)
|
||||
|
||||
# if os.path.isfile(mail_file):
|
||||
# os.remove(mail_file)
|
||||
# log.info(f"Fichier mail supprimé : {mail_file}")
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# ENVOI DU MSG MM
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
message_mattermost = json.dumps(
|
||||
message,
|
||||
indent=2,
|
||||
ensure_ascii=False
|
||||
)
|
||||
send_mattermost(message_mattermost)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# SUCCES
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
os.rename(encours, ok)
|
||||
|
||||
log.info(f"Job terminé avec succès : {ok}")
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# ERREUR
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
except Exception as e:
|
||||
|
||||
log.exception(
|
||||
f"Erreur lors du traitement du job : {e}"
|
||||
)
|
||||
|
||||
message_mattermost = (
|
||||
"**Erreur lors du traitement d'un job KAZ**\n\n"
|
||||
f"Job : `{job}`\n"
|
||||
f"Erreur : `{e}`\n"
|
||||
)
|
||||
send_mattermost(message_mattermost)
|
||||
|
||||
try:
|
||||
os.rename(encours, ko)
|
||||
log.info(f"Job marqué KO : {ko}")
|
||||
|
||||
except OSError as rename_error:
|
||||
log.error(
|
||||
f"Impossible de renommer le job en .KO : {rename_error}"
|
||||
)
|
||||
|
||||
sys.exit(1)
|
||||
@@ -1,77 +0,0 @@
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
#ex de json accepté:
|
||||
#{
|
||||
# "action": "modifier_services",
|
||||
# "creer": [
|
||||
# "cloud"
|
||||
# ],
|
||||
# "enlever": [
|
||||
# "paheko",
|
||||
# "wp"
|
||||
# ],
|
||||
# "nom_court_orga": "monorga11",
|
||||
# "emails": [
|
||||
# "admin@kaz.bzh",
|
||||
# "contact@kaz.bzh"
|
||||
# ]
|
||||
# }
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def run(message, encours):
|
||||
|
||||
nom_court_orga = message["nom_court_orga"]
|
||||
|
||||
services_creer = message.get("creer", [])
|
||||
services_enlever = message.get("enlever", [])
|
||||
|
||||
script = "/kaz/config/orgaTmpl/orga-gen.sh"
|
||||
|
||||
mail_file = encours.removesuffix(".encours") + ".mail"
|
||||
|
||||
command = [script]
|
||||
|
||||
command.extend(
|
||||
f"+{service}"
|
||||
for service in services_creer
|
||||
)
|
||||
|
||||
command.extend(
|
||||
f"-{service}"
|
||||
for service in services_enlever
|
||||
)
|
||||
|
||||
command.append(nom_court_orga)
|
||||
|
||||
log.info(
|
||||
f"Exécution : {' '.join(command)}"
|
||||
)
|
||||
|
||||
env = os.environ.copy()
|
||||
env["ORGA_GEN_MAIL_FILE"] = mail_file
|
||||
|
||||
result = subprocess.run(
|
||||
command,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
env=env,
|
||||
)
|
||||
|
||||
log.info(
|
||||
f"Résultat du script :\n{result.stdout}"
|
||||
)
|
||||
|
||||
if result.stderr:
|
||||
log.warning(
|
||||
f"Sortie stderr du script :\n{result.stderr}"
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"Le script a échoué avec le code "
|
||||
f"{result.returncode}"
|
||||
)
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
#KAN: 30/09/2026
|
||||
#KOI: transférer les jobs vers les serveurs secondaires
|
||||
#KI: fab
|
||||
|
||||
JOBS_DIR="/kaz/tmp/jobs"
|
||||
|
||||
for job in "$JOBS_DIR"/*.json; do
|
||||
|
||||
[ -e "$job" ] || continue
|
||||
|
||||
destination=$(jq -r '.destination // empty' "$job")
|
||||
|
||||
if [ -z "$destination" ]; then
|
||||
echo "Destination absente dans $job"
|
||||
continue
|
||||
fi
|
||||
|
||||
destination="${destination}.kaz.bzh"
|
||||
|
||||
echo "Transfert de $job vers $destination:/kaz/jobs/"
|
||||
|
||||
if rsync -a -e 'ssh -p 2201' "$job" "$destination:/kaz/jobs/"; then
|
||||
echo "Transfert OK : $job"
|
||||
mv "$job" "$job.transfere"
|
||||
else
|
||||
echo "Échec du transfert : $job"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |