11 Commits
Author SHA1 Message Date
fab 8c3c4c1809 upgrade traefik en 3.7.5 2026-06-20 07:50:14 +02:00
fab 99d54b3bc6 bug sur double volume: 2026-06-20 07:50:14 +02:00
fab fef4c5c1d5 pouvoir créer le service webdav (sur un volume wp) 2026-06-20 07:50:14 +02:00
fab fa4e15673e pas de bind avec admin mais avec l'utilisateur 2026-06-20 07:50:14 +02:00
fanch 9e99e1112d les users peuvent se trouver dans le ldap 2026-06-20 07:50:14 +02:00
fanch 682f99efd5 ajout ldapconfvi 2026-06-20 07:50:14 +02:00
fab 74a9023a35 permettre du webdav pour les orga 2026-06-20 07:50:14 +02:00
fab d54e318ac5 oops, rajoute https avec l'url 2026-06-07 18:18:42 +02:00
fanch 9a06d5bc5c plus de smtp par défaut pour les orgas 2026-06-20 07:34:56 +02:00
fanch 7534384473 paheko passe maintenant par smtp principal 2026-06-20 07:34:56 +02:00
fab 2890e7ae09 ajoute usage si 0 param fourni 2026-06-20 07:34:48 +02:00
166 changed files with 350 additions and 1840 deletions
+1 -2
View File
@@ -1,7 +1,6 @@
# kaz # 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 [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.
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)). 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)).
+32 -70
View File
@@ -4,15 +4,12 @@
#Kan: 2021 #Kan: 2021
#Koi: gestion dockers #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 # 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 : 13 fevrier 2025 modif des save en postgres et mysql
# Did : ajout des sauvegardes de mobilizon et mattermost en postgres # 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 : # En cas d'absence de postfix, il faut lancer :
@@ -29,7 +26,6 @@ setKazVars
cd "${KAZ_BIN_DIR}" cd "${KAZ_BIN_DIR}"
PATH_SAUVE="/home/sauve/" PATH_SAUVE="/home/sauve/"
export SIMU="" export SIMU=""
export STRICT=""
declare -a availableComposesNoNeedMail availableMailComposes availableComposesNeedMail availableProxyComposes availableOrga declare -a availableComposesNoNeedMail availableMailComposes availableComposesNeedMail availableProxyComposes availableOrga
availableComposesNoNeedMail=($(getList "${KAZ_CONF_DIR}/container-withoutMail.list")) availableComposesNoNeedMail=($(getList "${KAZ_CONF_DIR}/container-withoutMail.list"))
@@ -100,10 +96,9 @@ updateProxy () {
"${DOCKERS_ENV}" "${DOCKERS_ENV}"
fi fi
done done
for item in "${availableProxyComposes[@]}"; do
# for item in "${availableProxyComposes[@]}"; do ${SIMU} ${KAZ_COMP_DIR}/${item}/proxy-gen.sh
# ${SIMU} ${KAZ_COMP_DIR}/${item}/proxy-gen.sh done
# done
} }
saveDB () { saveDB () {
@@ -234,11 +229,6 @@ saveComposes () {
. $KAZ_KEY_DIR/env-mastodonDB . $KAZ_KEY_DIR/env-mastodonDB
saveDB ${mastodonDBName} "${POSTGRES_USER}" "${POSTGRES_PASSWORD}" "${POSTGRES_DB}" mastodon postgres 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) roundcube)
echo "save roundcube" echo "save roundcube"
. $KAZ_KEY_DIR/env-roundcubeDB . $KAZ_KEY_DIR/env-roundcubeDB
@@ -284,28 +274,15 @@ if [ "$#" -eq 0 ] ; then
usage usage
fi fi
while [[ "$1" == -* ]] ;do if [ "$1" == "-h" ] ; then
case "$1" in usage
"-h" ) shift
usage fi
shift
;; if [ "$1" == "-n" ] ; then
"-n" ) export SIMU=echo
export SIMU=echo shift
shift fi
;;
"-strict" )
export STRICT="_X_Y"
shift
;;
"--" )
shift
;;
* )
break
;;
esac
done
DCK_CMD="" DCK_CMD=""
SAVE_CMD="" SAVE_CMD=""
@@ -345,53 +322,38 @@ else
fi fi
fi fi
argExist=""
for compose in $* for compose in $*
do do
argExist=true
compose=${compose%/} compose=${compose%/}
if [[ -z "${STRICT}" ]] ;then if [[ ! " ${knownedComposes[@]} " =~ " ${compose} " ]]; then
if [[ ! " ${knownedComposes[@]} " =~ " ${compose} " ]]; then declare -a subst
declare -a subst subst=()
subst=() for item in "${knownedComposes[@]}"; do
for item in "${knownedComposes[@]}"; do [[ "${item}" =~ "${compose}" ]] && subst+=(${item})
[[ "${item}" =~ "${compose}" ]] && subst+=(${item}) done
done if [ "${subst}" = "" ] ; then
if [ "${subst}" = "" ] ; then echo
echo echo "Unknown compose: ${RED}${BOLD}${compose}${NC} not in ${YELLOW}${BOLD}${knownedComposes[*]}${NC}"
echo "Unknown compose: ${RED}${BOLD}${compose}${NC} not in ${YELLOW}${BOLD}${knownedComposes[*]}${NC}" echo
echo exit 1
exit 1 else
else echo "substitute compose: ${YELLOW}${BOLD}${compose} => ${subst[@]}${NC}"
echo "substitute compose: ${YELLOW}${BOLD}${compose} => ${subst[@]}${NC}"
fi
fi fi
fi fi
for item in "${availableMailComposes[@]}"; do for item in "${availableMailComposes[@]}"; do
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableMailComposes+=("${item}") [[ "${item}" =~ "${compose}" ]] && enableMailComposes+=("${item}")
done done
for item in "${availableProxyComposes[@]}"; do for item in "${availableProxyComposes[@]}"; do
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableProxyComposes=("${item}") [[ "${item}" =~ "${compose}" ]] && enableProxyComposes=("${item}")
done done
for item in "${availableComposesNoNeedMail[@]}"; do for item in "${availableComposesNoNeedMail[@]}"; do
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableComposesNoNeedMail+=("${item}") [[ "${item}" =~ "${compose}" ]] && enableComposesNoNeedMail+=("${item}")
done done
for item in "${availableComposesNeedMail[@]}"; do for item in "${availableComposesNeedMail[@]}"; do
[[ "${STRICT}${item}${STRICT}" =~ "${STRICT}${compose}${STRICT}" ]] && enableComposesNeedMail+=("${item}") [[ "${item}" =~ "${compose}" ]] && enableComposesNeedMail+=("${item}")
done done
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 "${DCK_CMD}" ]] && "${DCK_CMD}" && exit 0
[[ ! -z "${SAVE_CMD}" ]] && "${SAVE_CMD}" && exit 0 [[ ! -z "${SAVE_CMD}" ]] && "${SAVE_CMD}" && exit 0
+25 -143
View File
@@ -5,9 +5,6 @@
# ki : fab # ki : fab
# test git du 02/10/2023 depuis snster # 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 # !!! need by htpasswd
# apt-get install apache2-utils dos2unix # apt-get install apache2-utils dos2unix
@@ -45,7 +42,6 @@ cd "${KAZ_ROOT}"
. $KAZ_KEY_DIR/env-ldapServ . $KAZ_KEY_DIR/env-ldapServ
. $KAZ_KEY_DIR/env-sympaServ . $KAZ_KEY_DIR/env-sympaServ
. $KAZ_KEY_DIR/env-paheko . $KAZ_KEY_DIR/env-paheko
. $KAZ_KEY_DIR/env-mattermostAdmin
# DOCK_DIR="${KAZ_COMP_DIR}" # ??? # DOCK_DIR="${KAZ_COMP_DIR}" # ???
@@ -222,36 +218,15 @@ FILE_LDIF=/home/sauve/ldap.ldif
gunzip ${FILE_LDIF}.gz -f gunzip ${FILE_LDIF}.gz -f
grep -aEiorh '([[:alnum:]]+([._-][[:alnum:]]+)*@[[:alnum:]]+([._-][[:alnum:]]+)*\.[[:alpha:]]{2,6})' ${FILE_LDIF} | sort -u > ${TFILE_EMAIL} 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... "
# 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}"
# 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}"
dos2unix "${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 # se connecter à l'agora pour ensuite pouvoir passer toutes les commandes mmctl
# . $KAZ_KEY_DIR/env-mattermostAdmin . $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}" 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 # 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,})+$" 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,})+$"
@@ -616,90 +591,25 @@ userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=$
fi fi
if grep -q "^${IDENT_KAZ}$" "${TFILE_MM}" 2>/dev/null; then if grep -q "^${IDENT_KAZ}$" "${TFILE_MM}" 2>/dev/null; then
echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}" echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}"
else else
# on créé le compte mattermost
# 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}"
#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
#on remplace par l'api rest 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}"
#KAZ a quelle team id ? echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
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')
# 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}"
NB_SERVICES_BASE=$((NB_SERVICES_BASE+1)) NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
fi fi
if [ "${EQUIPE_AGORA}" != "" -a "${EQUIPE_AGORA}" != "kaz" ]; then if [ "${EQUIPE_AGORA}" != "" -a "${EQUIPE_AGORA}" != "kaz" ]; then
# l'équipe existe t-elle déjà ? # l'équipe existe t-elle déjà ?
nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
#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
http_code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${mattermost_token}" "https://${URL_AGORA}/api/v4/teams/name/${EQUIPE_AGORA}") echo "docker exec -i mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display-name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
[ "$http_code" -eq 200 ] && nb=1 || nb=0 fi
# puis ajouter le user à l'équipe
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 users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
#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
fi
fi fi
if [ -n "${CREATE_ORGA_SERVICES}" ]; then if [ -n "${CREATE_ORGA_SERVICES}" ]; then
@@ -720,25 +630,12 @@ EOF
if [[ "${mode}" = "dev" ]]; then if [[ "${mode}" = "dev" ]]; then
echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}" echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}"
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1) LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
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 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}"
else else
echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}" echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}"
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1) LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
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 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_SECOURS}\"" | 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}"
#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}"
fi fi
if [ "${service[ADMIN_ORGA]}" == "O" ]; then 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 * 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. 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 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} 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 ;) À bientôt ;)
@@ -863,19 +757,8 @@ bisou!"
EOF" | tee -a "${CMD_MSG}" EOF" | tee -a "${CMD_MSG}"
echo " # on envoie la confirmation d'inscription sur l'agora " | 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}" 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}"
# fin des inscriptions # fin des inscriptions
done <<< "${ALL_LINES}" done <<< "${ALL_LINES}"
@@ -883,8 +766,7 @@ if [[ -n "${ALL_ORGA}" ]]; then
echo "sleep 2" | tee -a "${CMD_PROXY}" echo "sleep 2" | tee -a "${CMD_PROXY}"
echo "${KAZ_BIN_DIR}/container.sh start ${ALL_ORGA}" | tee -a "${CMD_PROXY}" echo "${KAZ_BIN_DIR}/container.sh start ${ALL_ORGA}" | tee -a "${CMD_PROXY}"
for item in "${availableProxyComposes[@]}"; do 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}/\"; ./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}"
done done
fi fi
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/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 do
docker exec -u www-data $cloud php cron.php docker exec -u www-data $cloud php cron.php
+149 -269
View File
@@ -3,8 +3,7 @@
# Ki : Did # Ki : Did
# koi : gestion globale des users Kaz mais aussi les users d'autres domaines hébergés # koi : gestion globale des users Kaz mais aussi les users d'autres domaines hébergés
#KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd) KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
KAZ_ROOT=/kaz
. $KAZ_ROOT/bin/.commonFunctions.sh . $KAZ_ROOT/bin/.commonFunctions.sh
setKazVars setKazVars
@@ -14,7 +13,7 @@ setKazVars
. $KAZ_KEY_DIR/env-sympaServ . $KAZ_KEY_DIR/env-sympaServ
. $KAZ_KEY_DIR/env-paheko . $KAZ_KEY_DIR/env-paheko
VERSION="04-10-2026" VERSION="16-11-2025"
PRG=$(basename $0) PRG=$(basename $0)
RACINE=$(echo $PRG | awk '{print $1}') RACINE=$(echo $PRG | awk '{print $1}')
IFS=' ' IFS=' '
@@ -26,19 +25,19 @@ URL_AGORA=$(echo $matterHost).$(echo $domain)
URL_LISTE=$(echo $sympaHost).$(echo $domain) URL_LISTE=$(echo $sympaHost).$(echo $domain)
URL_PAHEKO="$httpProto://${API_USER}:${API_PASSWORD}@kaz-paheko.$(echo $domain)" URL_PAHEKO="$httpProto://${API_USER}:${API_PASSWORD}@kaz-paheko.$(echo $domain)"
NL_LIST=infos@listes.kaz.bzh NL_LIST=infos@listes.kaz.bzh
URL_AGORA_API=${httpProto}://${URL_AGORA}/api/v4 URL_AGORA_API=${URL_AGORA}/api/v4
EQUIPE=kaz EQUIPE=kaz
LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1) LISTMASTER=$(echo ${LISTMASTERS} | cut -d',' -f1)
#### Test du serveur sur lequel s' execute le script #### #### 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=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_EMAILS)
TFILE_EMAILS_LIST=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_EMAILS_LIST) TFILE_EMAILS_LIST=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_EMAILS_LIST)
TFILE_MAILS_TROUVE=$(mktemp /tmp/$RACINE.XXXXXXXXX.TFILE_MAILS_TROUVE) 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) TFILE_CREATE_MAIL=$(mktemp /tmp/$RACINE.XXXXXXXXTFILE_CREATE_MAIL.sh)
LDAP_IP=$(docker inspect -f '{{.NetworkSettings.Networks.ldapNet.IPAddress}}' ldapServ) LDAP_IP=$(docker inspect -f '{{.NetworkSettings.Networks.ldapNet.IPAddress}}' ldapServ)
@@ -60,11 +59,11 @@ ExpMail() {
} }
PostMattermost() { PostMattermost() {
. $KAZ_KEY_DIR/env-mattermostAdmin . $KAZ_KEY_DIR/env-mattermostAdmin
PostM=$1 PostM=$1
CHANNEL=$2 CHANNEL=$2
TEAMID=$(curl -s -H "Authorization: Bearer ${mattermost_token}" "${URL_AGORA_API}/teams/name/${EQUIPE}" | 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 -r .id ) 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 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,21 +139,26 @@ searchEmail() {
searchMattermost() { searchMattermost() {
#Ici $1 est une adresse email #Ici $1 est une adresse email
. $KAZ_KEY_DIR/env-mattermostAdmin . $KAZ_KEY_DIR/env-mattermostAdmin
curl -s -H "Authorization: Bearer ${mattermost_token}" "${URL_AGORA_API}/users/email/${1}" >${TFILE_CPT_MATTERMOST} 2>/dev/null 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
REP_SEARCH_MATTERMOST=$(jq -r .id ${TFILE_CPT_MATTERMOST}) docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings config set ServiceSettings.EnableAPIUserDeletion "true" >/dev/null 2>&1
if [ ! -z ${REP_SEARCH_MATTERMOST} ] #on créé la list des mails dans mattermost
then 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" ] if [ "$2" = "DETAILS" ]
then then
echo -e -n "${RED} Compte : ${GREEN} " ; jq -r .username ${TFILE_CPT_MATTERMOST} touch /tmp/$1-mattermost.json
echo -e -n "${RED} Mail : ${GREEN} " ; jq -r .email ${TFILE_CPT_MATTERMOST} docker exec -ti ${mattermostServName} bin/mmctl --suppress-warnings --format json user search $1 >/tmp/$1-mattermost.json 2>/dev/null
echo -e -n "${RED} Role : ${GREEN} " ; jq -r .roles ${TFILE_CPT_MATTERMOST} 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 else
echo "${REP_SEARCH_MATTERMOST}" echo "${REP_SEARCH_MATTERMOST}"
fi fi
else else
echo "" echo ""
fi fi
} }
@@ -189,16 +193,16 @@ infoEmail() {
printKazMsg " DETAILS DU COMPTE DANS LDAP ET PAHEKO" printKazMsg " DETAILS DU COMPTE DANS LDAP ET PAHEKO"
echo "" 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 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 .results[].nom /tmp/$CHOIX_MAIL-paheko.json
jq -r .results[].adresse /tmp/$CHOIX_MAIL-paheko.json jq .results[].adresse /tmp/$CHOIX_MAIL-paheko.json
jq -r .results[].code_postal /tmp/$CHOIX_MAIL-paheko.json jq .results[].code_postal /tmp/$CHOIX_MAIL-paheko.json
jq -r .results[].ville /tmp/$CHOIX_MAIL-paheko.json jq .results[].ville /tmp/$CHOIX_MAIL-paheko.json
SERVEUR_PROD=$(jq -r .results[].serveur_prod /tmp/$CHOIX_MAIL-paheko.json) SERVEUR_PROD=$(jq .results[].serveur_prod /tmp/$CHOIX_MAIL-paheko.json)
NOM_ORGA=$(jq -r .results[].nom_orga /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} " [ "${NOM_ORGA}" = "null" ] || echo -e " - ORGA : ${GREEN}${NOM_ORGA}${NC} sur serveur ${GREEN}${SERVEUR_PROD}${NC} "
echo -n " - Quota (Paheko) : " echo -n " - Quota (Paheko) : "
echo -ne "${GREEN}" 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 -ne "${NC}"
echo -n " - Quota Mail (Ldap) : " echo -n " - Quota Mail (Ldap) : "
echo -ne "${GREEN}" echo -ne "${GREEN}"
@@ -215,17 +219,12 @@ infoEmail() {
echo -ne "${NC}" echo -ne "${NC}"
echo -n " - Mail de secours (Paheko ): " echo -n " - Mail de secours (Paheko ): "
echo -ne "${GREEN}" 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 -ne "${NC}"
echo -n " - Mail de secours (Ldap): " echo -n " - Mail de secours (Ldap): "
echo -ne "${GREEN}" 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://' 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 "${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 -n " - Alias (Ldap) : "
echo -ne "${GREEN}" 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) 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 -e "${NC}"
echo " - L' adresse apparait dans :" echo " - L' adresse apparait dans :"
echo -n -e "${GREEN}" 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}" echo -e "${NC}"
read -p " ==> Entrée pour continuer <==" read -p " ==> Entrée pour continuer <=="
;; ;;
@@ -303,21 +302,19 @@ searchDestroy() {
#################################################################################################################### ####################################################################################################################
if [ "${DOMAINE_EN_COURS}" = "${domain}" ] if [ "${DOMAINE_EN_COURS}" = "${domain}" ]
then then
MM_USER_ID=$(searchMattermost $REP_SEARCH_DESTROY) REP_SEARCH=$(searchMattermost $REP_SEARCH_DESTROY)
if [ ! -z ${MM_USER_ID} ] printKazMsg "réponse de mattermost : ${REP_SEARCH_DESTROY}"
if [ ! -z ${REP_SEARCH} ]
then then
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} trouvé dans mattermost ${NC}" echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} dans mattermost ${NC}"
status_del=$(curl -s --request DELETE \ docker exec -ti ${mattermostServName} bin/mmctl user delete ${REP_SEARCH_DESTROY} --confirm >/dev/null 2>&1
--header 'Accept: application/json' \ if [ "$?" -eq "0" ]
-H "Authorization: Bearer ${mattermost_token}" \ then
"${URL_AGORA_API}/api/v4/users/${MM_USER_ID}") printKazMsg "Suppresion ok"
if [ "$(echo ${status_del} | jq -r .status)" -eq "200" ] else
then printKazError -e "Erreur de suppression"
printKazMsg "Suppresion ok" fi
else echo " ----------------- "
printKazError -e "Erreur de suppression"
fi
echo " ----------------- "
else else
echo "Rien a supprimer dans mattermost" echo "Rien a supprimer dans mattermost"
fi fi
@@ -343,13 +340,8 @@ searchDestroy() {
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} et ${MAIL_SECOURS} dans la liste info de sympa" echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} et ${MAIL_SECOURS} dans la liste info de sympa"
echo -e "${NC}" echo -e "${NC}"
echo "" 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},${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}"
#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
echo -e "${NC}" echo -e "${NC}"
echo "" echo ""
echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} dans le serveur de mail" echo -e "${RED} suppression de ${REP_SEARCH_DESTROY} dans le serveur de mail"
@@ -380,7 +372,7 @@ searchDestroy() {
printKazError "Erreur de suppression" printKazError "Erreur de suppression"
fi fi
printKazMsg "Envoi d'un message dans mattermost pour la suppression du compte" 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é" MAIL_SUPPR="Le compte ${REP_SEARCH_DESTROY} est supprimé"
OLDIFS=${IFS} OLDIFS=${IFS}
IFS='' IFS=''
@@ -394,12 +386,17 @@ searchDestroy() {
} }
gestPassword() { gestPassword() {
ACTION_EN_COURS="Gestion du mot de passe d'un compte" ACTION_EN_COURS="Gestion du mot de passe d' un compte"
searchEmail searchEmail
#cree un mdp acceptable par postfix/nc/mattermost #cree un mdp acceptable par postfix/nc/mattermost
PASSWORD=_`apg -n 1 -m 10 -M NCL -d`_ PASSWORD=_`apg -n 1 -m 10 -M NCL -d`_
COMPTE_A_MODIFIER=${CHOIX_MAIL} COMPTE_A_MODIFIER=${CHOIX_MAIL}
# On considère le mot de passe de secours de ldap
# 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} \ MAIL_SECOURS=$(ldapsearch -H ldap://${LDAP_IP} \
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \ -x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
-w "${LDAP_ADMIN_PASSWORD}" \ -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) 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 ] if [ $EMAIL_ORGA_TROUVE -ge 1 ]
then 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 fi
########################################################################## ##########################################################################
read -p "ON CONTINUE ? [ o / n ]: " SEARCH_RESET_INPUT 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 $RED $(searchMattermost $COMPTE_A_MODIFIER) ${NC}"
echo -e "$GREEN Compte Nextcloud $RED ${USER_NEXTCLOUD_MODIF} ${NC}" echo -e "$GREEN Compte Nextcloud $RED ${USER_NEXTCLOUD_MODIF} ${NC}"
echo -e "$GREEN Le mot de passe sera = $RED ${PASSWORD} ${NC}" echo -e "$GREEN Le mot de passe sera = $RED ${PASSWORD} ${NC}"
docker exec -ti mattermostServ bin/mmctl user change-password $(searchMattermost ${COMPTE_A_MODIFIER}) -p ${PASSWORD} >/dev/null 2>&1
#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
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 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}) pass=$(mkpasswd -m sha512crypt ${PASSWORD})
echo -e "\n\ndn: cn=${COMPTE_A_MODIFIER},ou=users,${ldap_root}\n\ echo -e "\n\ndn: cn=${COMPTE_A_MODIFIER},ou=users,${ldap_root}\n\
@@ -476,7 +440,7 @@ changeType: modify\n\
replace: userPassword\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}" 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" 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" ] if [ ${ADRESSE_SEC} == "OUI" ]
then then
echo -e "Envoi d'un message à l' adresse de secours : $GREEN${MAIL_SECOURS}${NC}" 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 site Web de Kaz : https://kaz.bzh
Le mail de la collégiale : contact@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 A bientôt"
https://agora.kaz.bzh/kaz/channels/une-question--un-soucis ExpMail ${MAIL_SECOURS} "Modification du compte" ${MAIL_CHANG}
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 -------------------------"
fi fi
if [ ${ADRESSE_SEC} == "NON" ] if [ ${ADRESSE_SEC} == "NON" ]
then then
@@ -517,31 +472,22 @@ createMail() {
QUOTA=1 QUOTA=1
TRUE_KAZ=TRUE TRUE_KAZ=TRUE
fait=0 fait=0
# si c'est une demande de création non interactive # On demande le mail souhaite on regarde si c' est valide et si ça existe déjà
# la valeur de CREATE_AUTO doit être à TRUE while [ $fait -eq 0 ]
CREATE_AUTO=${1} do
EMAIL_SOUHAITE=${2} clear
EMAIL_SECOURS=${3} echo "----------------------------------------------------------------------"
# Si on est en interactif, On demande le mail souhaite le mail secours et on demande le nom et prenom printKazMsg "${ACTION_EN_COURS}"
# et on regarde si c' est valide et si ça existe déjà echo "----------------------------------------------------------------------"
if [ "${CREATE_AUTO}" != "TRUE" ] read -p "Mail souhaité (r ou R pour quitter ) : " EMAIL_SOUHAITE
then [[ ${EMAIL_SOUHAITE} =~ ^[rRqQ]$ ]] && Main
while [ $fait -eq 0 ] if [[ ${EMAIL_SOUHAITE} =~ ${regexMail} ]]
do then
clear
echo "----------------------------------------------------------------------"
printKazMsg "${ACTION_EN_COURS}"
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} \ ldapsearch -H ldap://${LDAP_IP} \
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \ -x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
-w "${LDAP_ADMIN_PASSWORD}" \ -w "${LDAP_ADMIN_PASSWORD}" \
-b "${ldap_root}" "(&(objectclass=inetOrgPerson)(cn=${EMAIL_SOUHAITE}))" cn | grep ^cn | sed -e 's/^cn: //' >$TFILE_EMAILS -b "${ldap_root}" "(&(objectclass=inetOrgPerson)(cn=${EMAIL_SOUHAITE}))" cn | grep ^cn | sed -e 's/^cn: //' >$TFILE_EMAILS
if grep -q "^${EMAIL_SOUHAITE}$" "${TFILE_EMAILS}" if grep -q "^${EMAIL_SOUHAITE}$" "${TFILE_EMAILS}"
then then
printKazError " - Le mail ${EMAIL_SOUHAITE} existe déjà" printKazError " - Le mail ${EMAIL_SOUHAITE} existe déjà"
fait=0 fait=0
@@ -553,71 +499,45 @@ createMail() {
else else
fait=1 fait=1
fi fi
else else
printKazError " - Mail invalide !" printKazError " - Mail invalide !"
sleep 2 sleep 2
fait=0 fait=0
fi
done
# on renseigne le domaine en cours pour les options qui concernent pas le domaine kaz.bzh
# ----------------------------------------------------------------------
DOMAINE_EN_COURS=$(echo ${EMAIL_SOUHAITE} | sed -e 's/^.*@//')
echo " ---- Domaine: " ${DOMAINE_EN_COURS} ----
# ----------------------------------------------------------------------
fait=0
while [ $fait -eq 0 ]
do
read -p "Mail de secours : " EMAIL_SECOURS
if [[ ${EMAIL_SECOURS} =~ ${regexMail} ]] && [ "${EMAIL_SECOURS}" != "" ]
then
fait=1
else
printKazError "Mail invalide"
fait=0
fi
if [ "${EMAIL_SECOURS}" = "${EMAIL_SOUHAITE}" ]
then
echo -e "${RED}Le mail de secours ne peut pas etre le meme que le mail demande${NC}"
fait=0
fi
done
# On demande le prenom
while [ "${PRENOM}" = "" ]
do
read -p "Prenom : " PRENOM
done
# On demande le nom
while [ "${NOM}" = "" ]
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 fi
if ! grep $(echo ${EMAIL_SOUHAITE} | sed -e 's/^.*@//') ${KAZ_CONF_DIR}/autorized-domains.txt >/dev/null done
# on renseigne le domaine en cours pour les options qui concernent pas le domaine kaz.bzh
# ----------------------------------------------------------------------
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
read -p "Mail de secours : " EMAIL_SECOURS
if [[ ${EMAIL_SECOURS} =~ ${regexMail} ]] && [ "${EMAIL_SECOURS}" != "" ]
then then
ERRMAILAUTO="${ERRMAILAUTO} Le domaine ${DOMAINE_EN_COURS} n' est pas dans la liste autorisée" fait=1
else
printKazError "Mail invalide"
fait=0
fi fi
if [ ! -z "${ERRMAILAUTO}" ] if [ "${EMAIL_SECOURS}" = "${EMAIL_SOUHAITE}" ]
then then
PostMattermost "Erreur de script auto : ${ERRMAILAUTO}" "Creation-Comptes" echo -e "${RED}Le mail de secours ne peut pas etre le meme que le mail demande${NC}"
echo "Erreur de script auto : ${ERRMAILAUTO}" fait=0
exit fi
fi done
# On demande le prenom
fi while [ "${PRENOM}" = "" ]
do
read -p "Prenom : " PRENOM
done
# On demande le nom
while [ "${NOM}" = "" ]
do
read -p "Nom : " NOM
done
# On constitue l' ident kaz pour le ldap # On constitue l' ident kaz pour le ldap
IDENT_KAZ=$(unaccent utf8 "${PRENOM,,}.${NOM,,}") IDENT_KAZ=$(unaccent utf8 "${PRENOM,,}.${NOM,,}")
# on créé le mot de passe # on créé le mot de passe
@@ -626,24 +546,21 @@ createMail() {
LDAPUSER=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}') LDAPUSER=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}')
LDAPDOMAIN=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}') LDAPDOMAIN=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}')
LDAPPASS=$(mkpasswd -m sha512crypt ${PASSWORD}) LDAPPASS=$(mkpasswd -m sha512crypt ${PASSWORD})
if [ "${CREATE_AUTO}" != "TRUE" ] [ "${DOMAINE_EN_COURS}" != "${domain}" ] && TRUE_KAZ=FALSE
then echo "${GREEN}Mail souhaité : ${NC}${EMAIL_SOUHAITE}"
[ "${DOMAINE_EN_COURS}" != "${domain}" ] && TRUE_KAZ=FALSE echo "${GREEN}Mail secours : ${NC}${EMAIL_SECOURS}"
echo "${GREEN}Mail souhaité : ${NC}${EMAIL_SOUHAITE}" echo "${GREEN}Prénom : ${NC}${PRENOM}"
echo "${GREEN}Mail secours : ${NC}${EMAIL_SECOURS}" echo "${GREEN}Nom : ${NC}${NOM}"
echo "${GREEN}Prénom : ${NC}${PRENOM}" echo "${GREEN}Mot de passe : ${NC}${PASSWORD}"
echo "${GREEN}Nom : ${NC}${NOM}" RCREATION=""
echo "${GREEN}Mot de passe : ${NC}${PASSWORD}" repRegEx='^[oOnN]$'
RCREATION="" while ! [[ ${RCREATION} =~ ${repRegEx} ]]
repRegEx='^[oOnN]$' do
while ! [[ ${RCREATION} =~ ${repRegEx} ]] read -p "Création ? o/n : " RCREATION
do done
read -p "Création ? o/n : " RCREATION if [ ${RCREATION} = "n" ] || [ ${RCREATION} = "N" ]
done then
if [ ${RCREATION} = "n" ] || [ ${RCREATION} = "N" ] Main
then
Main
fi
fi fi
echo "echo -e '\n\ndn: cn=${EMAIL_SOUHAITE},ou=users,${ldap_root}\n\ echo "echo -e '\n\ndn: cn=${EMAIL_SOUHAITE},ou=users,${ldap_root}\n\
changeType: add\n\ changeType: add\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} 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 # on execute le fichier avec les données ldap pour créer l' entrée dans l' annuaire
bash ${TFILE_CREATE_MAIL} >/dev/null bash ${TFILE_CREATE_MAIL} >/dev/null
#DID
# on colle le compte et le mot de passe dans le fichier # 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} echo "Création de : ${EMAIL_SOUHAITE} avec le mot de passe : ${PASSWORD}" >>${TFILE_CREATE_MAIL}
OLDIFS=${IFS} OLDIFS=${IFS}
@@ -684,31 +600,18 @@ $(cat ${KAZ_CONF_DIR}/domains/${DOMAINE_EN_COURS})
Bonne journée" Bonne journée"
ExpMail ${EMAIL_SECOURS} "Creation de ${EMAIL_SOUHAITE}" ${MSG_CREATION_MAIL} 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} IFS=${OLDIFS}
# si non interactif on fait une pause pour afficher une eventuelle erreur echo " --------------------------------------------------------------------"
if [ "${CREATE_AUTO}" != "TRUE" ] echo "! INFO : !"
then echo "! Le Mot de passe !"
read -p " - ENTREE pour continuer - " echo "! Est dans le fichier !"
createMail echo "! ${TFILE_CREATE_MAIL} !"
fi echo " --------------------------------------------------------------------"
} echo
read -p " - ENTREE pour continuer - "
createMailAuto() # Retour au menu principal
{ Main
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
} }
createAlias() { createAlias() {
@@ -985,7 +888,7 @@ updateUser() {
MAILDESECOURSACTUEL="" MAILDESECOURSACTUEL=""
MAILDESECOURS="" MAILDESECOURS=""
Ucompteur=1 Ucompteur=1
for attribut in mailDeSecours mailAlias mailQuota nextcloudQuota mobile for attribut in mailDeSecours mailAlias mailQuota nextcloudQuota
do do
ATTRIB+=([${attribut}]=$(ldapsearch -H ldap://${LDAP_IP} \ ATTRIB+=([${attribut}]=$(ldapsearch -H ldap://${LDAP_IP} \
-x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \ -x -D "cn=${LDAP_ADMIN_USERNAME},${ldap_root}" \
@@ -1064,18 +967,6 @@ updateUser() {
fi fi
faitAttrib=0 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 ) mailDeSecours )
echo "------------------------------------------------" echo "------------------------------------------------"
read -p " - Nouveau Mail de Secours : " RCHANGE read -p " - Nouveau Mail de Secours : " RCHANGE
@@ -1190,13 +1081,9 @@ updateUser() {
if [ ! -z ${MAILDESECOURS} ] if [ ! -z ${MAILDESECOURS} ]
then then
# suppression du mail de secours de la liste infos # 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 -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
# ajout de l' adresse de la nouvelle adresse de secours # 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 -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
fi fi
updateUser updateUser
fi fi
@@ -1214,9 +1101,6 @@ updateUser() {
usage () { usage () {
printKazMsg "$PRG [-h] [-v]" printKazMsg "$PRG [-h] [-v]"
printKazMsg "script de gestion des kaznautes" 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 " -h aide sur ce script"
printKazMsg " -v version du script." printKazMsg " -v version du script."
} }
@@ -1236,18 +1120,18 @@ echo "-------------------------------------------------"
echo -e "${BOLD}COMPTES : " echo -e "${BOLD}COMPTES : "
echo -e "${NC}*********" echo -e "${NC}*********"
echo -e "${NC}" echo -e "${NC}"
echo -e " ${NC}1 - Information sur un compte (alias ou Mail)" echo -e " ${NC}1 - Information sur un compte (alias ou Mail )"
echo -e " ${YELLOW}2 - Modification d'un compte" echo -e " ${YELLOW}2 - Modification d' un compte"
echo -e " ${NC}3 - Changement de mot de passe 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 " ${GREEN}4 - Suppression d' un compte "
echo -e " ${NC}5 - Création d'une adresse de messagerie" echo -e " ${NC}5 - Création d' une adresse de messagerie"
echo -e "${NC}" echo -e "${NC}"
echo -e "${BOLD}ALIAS : " echo -e "${BOLD}ALIAS : "
echo -e "${NC}*******" echo -e "${NC}*******"
echo -e "${NC}" echo -e "${NC}"
echo -e " ${NC}6 - Création 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 " ${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 " ${GREEN}8 - Suppression d' un alias Général pour mails Externes"
echo -e "${NC}" echo -e "${NC}"
echo "-------------------------------------------------" echo "-------------------------------------------------"
echo -e "${NC}" echo -e "${NC}"
@@ -1259,7 +1143,7 @@ case "$CHOICE" in
'2' ) '2' )
updateUser updateUser
;; ;;
'3' ) '3' )
gestPassword gestPassword
;; ;;
'4' ) '4' )
@@ -1308,10 +1192,6 @@ case "$1" in
printKazMsg "$PRG version $VERSION" printKazMsg "$PRG version $VERSION"
exit exit
;; ;;
'-c' )
createMailAuto $@
exit
;;
esac esac
# on teste la présence du domaine du site dans le fichier autorized-domains.txt # on teste la présence du domaine du site dans le fichier autorized-domains.txt
-323
View File
@@ -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)
-77
View File
@@ -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}"
)
-32
View File
@@ -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
View File
View File

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

Some files were not shown because too many files have changed in this diff Show More