Initial release

master
Sergey Kalinin 2021-01-15 18:51:12 +03:00
commit 4815dae33e
9 changed files with 527 additions and 0 deletions

10
README.md 100644
View File

@ -0,0 +1,10 @@
# Скрипты для работы с zimbra https://www.zimbra.org/
- delete-closed-accounts.sh - удаление закрытых почтовых аккаунтов.
- zabbix_zimbra_domain_status.sh - мониторинг корректности записей в DNS для всех почтовых доменов
- zabbix_zimbra_service_check.sh - проверка почтовых сервисов
- zimbra_clear_mail_queue.sh - удаление из почтовой очереди сообщений и отправка данных в zabbix
- zimbra_create_users_from_csv.sh - создание пользователя в зимбре из файла
- zimbra_disable_pop3_acces.sh - отключение доступа по pop3 для пользователей у кого он включен
- zimbra_get_list_users.sh - получение участников почтового списка рассылки
- zimbra_mta_relay_change.sh - переключение отправки почты с одного сервера на другой и возврат в исходное состояние.

View File

@ -0,0 +1,69 @@
#!/bin/bash
##############################################################################
#
# Удаление закрытых учетных записей почты через определенное время
# Удаление происходит через месяц после увольнения (на основе комментария)
#
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
##############################################################################
# Список учётных записей со статусом "Закрыта" (closed)
zmaccts | grep closed | grep @ | while read ACCOUNT_STRING
do
#ACCOUNT=`echo ${ACCOUNT_STRING} | grep @ | awk '{ print $1 }'`
# Квота
#QUOTA_TOTAL=`zmprov ga ${ACCOUNT} | grep "zimbraMailQuota" | cut -d ":" -f2`
# Использовано из квоты
#QUOTA_USAGE=`zmmailbox -z -m ${ACCOUNT} gms`
# Сервер с ящиком
#HOSTED_ON=`zmprov ga ${ACCOUNT} | grep zimbraMailHost | awk -F: '{ print $2 }'`
#echo "-------"
#echo ${ACCOUNT_STRING}
ACCOUNT=`echo ${ACCOUNT_STRING} | awk -F' ' '{print $1}'`
ACCOUNT_CREATE_DATE=`echo ${ACCOUNT_STRING} | awk -F' ' '{print $3 " " $4}'`
ACCOUNT_CREATE_DATE=$(date -d "${ACCOUNT_CLOSE_DATE}" +%s)
# Дата и время последнего заходя в ящик
#LAST_ON=`echo ${ACCOUNT_STRING} | grep zimbraLastLogonTimestamp: | awk -F: '{ print $2 }' `
LAST_LOGON_DATE=`echo ${ACCOUNT_STRING} | awk -F' ' '{print $5 " " $6}'`
if [ "${LAST_LOGON_DATE}" != "never " ]; then
LAST_LOGON_DATE_SEC=`date -d "$LAST_LOGON_DATE" +%s`
else
LAST_LOGON_DATE_SEC='0'
fi
#echo "${ACCOUNT} ${ACCOUNT_CLOSE_DATE} ${ACCOUNT_CREATE_DATE} ${LAST_LOGON_DATE} ${LAST_LOGON_DATE_SEC}"
NOW_DATE_SEC=$(date +%s)
NOW_DATE=$(date +%d%m%Y)
# Описание
DESCRIPTION=`zmprov ga ${ACCOUNT} | grep description | awk -F: '{ print $2 }' `
# Дата увольнения
FIRED_DATE=`echo ${DESCRIPTION} | grep -i 'увольнение' | cut -d ' ' -f2 `
DAY=`echo ${FIRED_DATE} | cut -c 1,2`
MONTH=`echo ${FIRED_DATE} | cut -c 3,4`
YEAR=`echo ${FIRED_DATE} | cut -c 5,8`
FIRED_DATE_SEC=$(date -d "${YEAR}${MONTH}${DAY} 23:59" +%s)
#echo "${NOW_DATE} ${NOW_DATE_SEC} ${ACCOUNT}; Close: ${ACCOUNT_CREATE_DATE} ${ACCOUNT_CREATE_DATE}; Last: ${LAST_LOGON_DATE} ${LAST_LOGON_DATE_SEC}; ${DESCRIPTION}; Fired: ${FIRED_DATE} ${FIRED_DATE_SEC}"
#Дата удаления (дата увольнения + 1 месяц)
if [ "${LAST_LOGON_DATE_SEC}" -gt 0 ]; then
DELETE_DATE=$(date +%Y%m%d -d "${YEAR}${MONTH}${DAY} + 1 month")
else
DELETE_DATE=$(date +%Y%m%d -d "${YEAR}${MONTH}${DAY}")
fi
DELETE_DATE_SEC=$(date +%s -d "${DELETE_DATE} 23:59")
if [ "${DELETE_DATE_SEC}" -le "${NOW_DATE_SEC}" ]; then
# Удаление ящика
#echo "${NOW_DATE}: Удаление: ${ACCOUNT}; ${QUOTA_USAGE}; ${HOSTED_ON}; ${LAST_ON}; ${DESCRIPTION}; ${FIRED_DATE}; ${DELETE_DATE}"
zmprov da ${ACCOUNT}
echo "Date: ${NOW_DATE}; Account: ${ACCOUNT}; Create date: ${ACCOUNT_CREATE_DATE}; Last logon: ${LAST_LOGON_DATE}; ${DESCRIPTION}; Fired: ${FIRED_DATE}; Deleted: ${DELETE_DATE}"
fi
done

View File

@ -0,0 +1,119 @@
#!/bin/bash
##############################################################################
#
# Определение корректности записей в DNS
# для доменов заведённых в Zimbra для Zabbix
#
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
##############################################################################
#
# Использование:
#
# Получение списка доменов из zimbra и копирование его в файл:
# zabbix_zimbra_domain_status.sh discover
#
# Создание json-файла со списком доменов для службы обнаружения zabbix
# zabbix_zimbra_domain_status.sh discover-json
#
# Чтение JSON-файла и вывод на экран (в zabbix)
# zabbix_zimbra_domain_status.sh read-json-discover
#
# Получение MX записей из ДНС для всех доменов и копирование их в файл
# zabbix_zimbra_domain_status.sh get-domain-records _RECORD_TYPE_
# где
# _RECORD_TYPE_ - тип записи (MX, TXT (для spf))
#
# Получение MX записи из файла для домена
# zabbix_zimbra_domain_status.sh _ZIMBRA_DOMAIN_NAME_
# где
# _ZIMBRA_DOMAIN_NAME_ - имя домена возвращаемое командой 'zmprov gad'
#
#############################################################################
ZMCOMMAND="sudo -u zimbra /opt/zimbra/bin/zmprov"
EXTDNS=8.8.8.8
RECORD_TYPE=${2:-"MX"}
FILE_ZIMBRA_DOMAIN_STATUS='/tmp/zimbra_domain_status'
FILE_ZIMBRA_DOMAIN_STATUS_TXT='/tmp/zimbra_domain_status_txt'
FILE_ZIMBRA_DOMAIN_LIST='/tmp/zimbra_domain_list'
case "$1" in
discover)
$ZMCOMMAND gad > ${FILE_ZIMBRA_DOMAIN_LIST}
#;;
#discover-json)
# Return a list of running services in JSON
# And create JSON-file
DOMAIN_JSON="{\"data\":["
while read LINE; do
DOMAIN_JSON="${DOMAIN_JSON} {\"{#ZIMBRADOMAIN}\":\"$LINE\"},"
done < "${FILE_ZIMBRA_DOMAIN_LIST}"
echo $(echo $DOMAIN_JSON | sed 's/,\+$//') > ${FILE_ZIMBRA_DOMAIN_LIST}.json
#echo ${DOMAIN_JSON} > ${FILE_ZIMBRA_DOMAIN_LIST}.json
echo -e "]}" >> ${FILE_ZIMBRA_DOMAIN_LIST}.json
exit 0;
;;
read-json-discover)
# Read a JSON and return
if [ ! -f ${FILE_ZIMBRA_DOMAIN_LIST}.json ]; then
echo "File ${FILE_ZIMBRA_DOMAIN_LIST}.json not found"
exit 1
fi
while read LINE; do
echo ${LINE}
done < "${FILE_ZIMBRA_DOMAIN_LIST}.json"
;;
get-domain-records)
# Checking file with domains list
if [ ! -f ${FILE_ZIMBRA_DOMAIN_LIST} ]; then
echo "File ${FILE_ZIMBRA_DOMAIN_LIST} not found"
exit 1
fi
if [ "${RECORD_TYPE}" = "TXT" ]; then
### Getting TXT records
# Delete old file with domain status
if [ -f ${FILE_ZIMBRA_DOMAIN_STATUS_TXT} ]; then
rm -f ${FILE_ZIMBRA_DOMAIN_STATUS_TXT}
fi
# checking SPF records
while read LINE; do
REC=$(dig @${EXTDNS} ${RECORD_TYPE} ${LINE} | grep -i -E -o "spf1 .+")
echo "${LINE} ${REC}" >> "${FILE_ZIMBRA_DOMAIN_STATUS_TXT}"
done < ${FILE_ZIMBRA_DOMAIN_LIST}
else
### Geting MX records from DNS
# Delete old file with domain status
if [ -f ${FILE_ZIMBRA_DOMAIN_STATUS} ]; then
rm -f ${FILE_ZIMBRA_DOMAIN_STATUS}
fi
while read LINE; do
dig @${EXTDNS} ${RECORD_TYPE} ${LINE} | grep -i -E "^([a-z.]+?)\s+?([0-9]+?)\s+?IN\s+?MX\s+?([0-9]+?)" | awk '{print $1 " " $5 " " $6}' | sort -f >> "${FILE_ZIMBRA_DOMAIN_STATUS}"
done < ${FILE_ZIMBRA_DOMAIN_LIST}
fi
;;
*)
CHECK_DOMAIN=$1
if [ "$CHECK_DOMAIN" = "" ]; then
echo "No Zimbra DOMAIN specified..."
exit 1
fi
case "${RECORD_TYPE}" in
MX)
cat ${FILE_ZIMBRA_DOMAIN_STATUS} | grep -i -E "^${CHECK_DOMAIN}" | awk '{print $3 " " $2 }'
;;
TXT)
#cat ${FILE_ZIMBRA_DOMAIN_STATUS_TXT} | awk -v domain=^${CHECK_DOMAIN} 'match($0,domain) {print substr($0,length(domain)+1)}'
REC=$(dig @${EXTDNS} ${RECORD_TYPE} ${CHECK_DOMAIN} | grep -i -E -o "spf1 .+")
echo "${REC}"
;;
esac
;;
esac
exit 0;

View File

@ -0,0 +1,121 @@
#!/bin/bash
################################################
# Get and checking Zimbra services.
#
# Author: Sergey Kalinin
# https://nuk-svk.ru
# svk@nuk-svk.ru
################################################
#
# Discover services and making JSON file for Zabbix
# ./zabbix_zimbra_service_check.sh discover
#
# Get status for all zimbra services and create file for next tasks
# ./zabbix_zimbra_service_check.sh get-all-status
#
# Read JSON for send into zabbix
# ./zabbix_zimbra_service_check.sh read-json-discover
#
# Checking service
# ./zabbix_zimbra_service_check.sh _ZIMBRA_SERVICE_NAME_
#
# Where _ZIMBRA_SERVICE_NAME_ - name of zimbra service returned by command "zmcontrol status"
#
###################################################
# Based on:
#
# Zabbix script to check Zimbra services and perform service discovery.
# Supports Zimbra 8.6 and "two-worded" service names
# Author: Lorenzo Milesi <maxxer@yetopen.it>
# Copytight: YetOpen S.r.l. 2015
# License: GPLv3
#
###################################################
# uncomment for debug
#set -x
COMMAND="sudo -u zimbra /opt/zimbra/bin/./zmcontrol"
FILE_ZIMBRA_SERVICE_STATUS='/tmp/zimbra_service_status'
FILE_ZIMBRA_SERVICE_LIST='/tmp/zimbra_service_list'
# Maximum file age in seconds (20 min)
MAXAGE=1200
case "$1" in
version)
# Return zimbra version
VERS=$($COMMAND -v)
if [ $? -eq 0 ] ; then
echo $VERS
exit 0;
fi
# error
exit 1;
;;
discover)
# Return a list of running services in JSON
# And create JSON-file
echo "{" > ${FILE_ZIMBRA_SERVICE_LIST}.json
echo -e "\t\"data\":[\n" >> ${FILE_ZIMBRA_SERVICE_LIST}.json
SRVCS=$($COMMAND status | grep -v Host | awk '{$(NF--)=""; print}' | sed 's/^/\t{ \"{#ZIMBRASERVICE}\":\"/' | sed 's/\ $/\" },/')
# Remove last comma from the sting, to make a good JSON
echo $(echo $SRVCS | sed 's/,\+$//') >> ${FILE_ZIMBRA_SERVICE_LIST}.json
echo -e "\n\t]\n" >> ${FILE_ZIMBRA_SERVICE_LIST}.json
echo "}" >> ${FILE_ZIMBRA_SERVICE_LIST}.json
exit 0;
;;
read-json-discover)
# Read a JSON and return
if [ ! -f ${FILE_ZIMBRA_SERVICE_LIST}.json ]; then
echo "File ${FILE_ZIMBRA_SERVICE_LIST}.json not found"
exit 1
fi
while read LINE; do
echo ${LINE}
done < "${FILE_ZIMBRA_SERVICE_LIST}.json"
;;
get-all-status)
$COMMAND status| grep -v Host | /usr/bin/tr -d "\t" > ${FILE_ZIMBRA_SERVICE_STATUS}
;;
*)
# move on...
CHECK=$1
if [ "$CHECK" = "" ]; then
echo "No Zimbra service specified..."
exit 1
fi
if [ ! -f $FILE_ZIMBRA_SERVICE_STATUS ]; then
echo "File $FILE_ZIMBRA_SERVICE_STATUS not found"
exit 1
fi
#check if cached status file size > 0
# and age of file
if [ -s ${file} ]; then
OLD=`stat -c %Z $FILE_ZIMBRA_SERVICE_STATUS`
NOW=`date +%s`
#echo $OLD
# if older then maxage, update file
if [ `expr $NOW - $OLD` -gt ${MAXAGE} ]; then
echo "File $FILE_ZIMBRA_SERVICE_STATUS is to old"
exit 1
fi
fi
STATUS="$(cat $FILE_ZIMBRA_SERVICE_STATUS | grep -w "$CHECK" | awk '{print $NF}')"
if [ "$STATUS" != "Running" ]; then
echo 0
else
echo 1
fi
;;
esac
exit 0;

View File

@ -0,0 +1,48 @@
#!/bin/bash
############################################################№
# Удаление из почтовой очереди сообщений зависших с ошибкой:
# "lost connection with 127.0.0.1"
#############################################################
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
##############################################################################
# Количество сообщений после которого нужно бить тревогу
MESSAGE_COUNT=30
ZIMBRA_BIN_PATH="/opt/zimbra/common/sbin/"
ZABBIX_SENDER="/usr/bin/zabbix_sender"
MAIL_SERVER=${HOSTNAME}
TODAY=$(date +"%d")
# получаем список потребных сообщений из очереди
MESSAGE_LIST=$(${ZIMBRA_BIN_PATH}/postqueue -p | grep -A 1 -B 1 "lost connection with 127.0.0.1")
#MESSAGE_LIST=$(cat /tmp/queue | grep -A 1 -B 1 "lost connection with 127.0.0.1")
# считаем их количество иесли превышает установленное значение завершаем скрипт с ошибкой
MSG_COUNT=$(echo "${MESSAGE_LIST}" | cut -d " " -f 1 | grep -E "[A-Z0-9].+" | wc -l)
# отправлям данные в заббикс
${ZABBIX_SENDER} -c /etc/zabbix/zabbix_agentd.conf -s "${MAIL_SERVER}" -k queue.error.message.count -o $MSG_COUNT
if [ "${MSG_COUNT}" -ge "${MESSAGE_COUNT}" ]; then
echo "Many error messages"
exit 1
fi
# Удаление сообщений старше 1 дня
echo "${MESSAGE_LIST}" | while read LINE; do
MSG_DAY=$(echo ${LINE} | grep -E "^[A-Z0-9].+" | awk '{print $3,$4,$5,$6}')
if [[ -n ${MSG_DAY} ]]; then
# определяем дату (число) сообщения
MSG_DAY=$(date -d "$(echo ${LINE} | grep -E "^[A-Z0-9].+" | awk '{print $3,$4,$5,$6}')" +%d)
#echo $MSG_DAY
if [ ${MSG_DAY} != ${TODAY} ]; then
MESSAGE_ID=$(echo "${LINE}" | cut -d " " -f 1 | grep -E "[A-Z0-9].+")
# echo "$MSG_DAY $MESSAGE_ID"
# Delete messages
${ZIMBRA_BIN_PATH}/postsuper -d $MESSAGE_ID
fi
fi
done

View File

@ -0,0 +1,28 @@
#!/usr/bin/bash
####################################################
#
# Создание юзеров в почте из csv
#
# Формат файла:
# ----------
# Наименование 1;user1@example.com;password1
# Наименование 2;user2@example.com;password2
# Наменование 3;user2@example.com;password3
# ...
#####################################################
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
#####################################################
ZMPROV=/opt/zimbra/bin/zmprov
while read LINE; do
#echo $LINE
name=$(echo ${LINE} | cut -d ";" -f 1)
email=$(echo ${LINE} | cut -d ";" -f 2)
pass=$(echo ${LINE} | cut -d ";" -f 3 | tr -d "\r\n")
login=$(echo ${email} | cut -d "@" -f 1)
${ZMPROV} ca ${email} ${pass} zimbraCOSid "11ababa-22-ccc-2222aaa" sn "${login}" cn "${email}" displayName "${name}" zimbraPasswordMustChange FALSE zimbraFeaturePop3DataSourceEnabled FALSE zimbraPop3Enabled FALSE zimbraMailQuota 5728640000
done < ${1}

View File

@ -0,0 +1,39 @@
#!/usr/bin/bash
#########################################################
#
# Получение списка учёток с включенным доступом по POP3
# и выключение доступа
#
#########################################################
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
#########################################################
# Получаем список аккаунтов со статусом "active"
/opt/zimbra/bin/zmaccts | /usr/bin/grep -E "active" | grep -E "@(domain1|domain2|domain3)\.ru" | awk '{print $1}' | while read ACCOUNT; do
# для каждого аккаунта получаем настройки доступа
ACCOUNT_STR=$(/opt/zimbra/bin/zmprov ga ${ACCOUNT} zimbraFeaturePop3DataSourceEnabled zimbraPop3Enabled)
#echo ${ACCOUNT_STR}
POP3_EXT_ACCESS=$(echo $ACCOUNT_STR | grep -E -i -o "zimbraFeaturePop3DataSourceEnabled:\s+(TRUE)" | awk '{print $2}')
# и если статус TRUE, генерим команду для изменения
if [ ${POP3_EXT_ACCESS} ]; then
POP3_EXT_DISABLED_CMD="zimbraFeaturePop3DataSourceEnabled FALSE"
fi
POP3_ACCESS=$(echo $ACCOUNT_STR | grep -E -i -o "zimbraPop3Enabled:\s+(TRUE)" | awk '{print $2}')
if [ ${POP3_ACCESS} ]; then
POP3_DISABLED_CMD="zimbraPop3Enabled FALSE"
fi
# если хоть одна из настроек была включена (статус TRUE) то выполняем команду.
echo "$ACCOUNT, POP3=${POP3_ACCESS}, POP3_EXT=${POP3_EXT_ACCESS}"
if [[ $POP3_EXT_ACCESS || ${POP3_ACCESS} ]]; then
/opt/zimbra/bin/zmprov ma ${ACCOUNT} ${POP3_EXT_DISABLED_CMD} ${POP3_DISABLED_CMD}
fi
done

View File

@ -0,0 +1,47 @@
#!/usr/bin/bash
####################################################################
#
# Получение списка пользователей участников списка(ов) рассылки
#
####################################################################
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
####################################################################
#
# Использование:
#
# get_lists_users.sh mail-lists.txt
#
# Где mail-lists.txt файл с перечислением списков рассылки
#
# Формат файла:
# ----------
# list1@example.com
# list2@example.com
# ...
# -----------
#
# На выходе будет CSV формата:
# ----------
# Список - list1@example.com;
# user1@example.com
# user2@example.com
# ...
# Список - list2@example.com;
# user1@example.com
# user3@example.com
# ...
#
####################################################################
IN_FILE=$1
while read LIST_NAME; do
echo "Список - $LIST_NAME;"
/opt/zimbra/bin/zmprov gdl $LIST_NAME | grep zimbraMailForwardingAddress | cut -d":" -f 2 | tr -d " "| while read USER; do
NAME=$(/opt/zimbra/bin/zmprov ga $USER | grep displayName | cut -d":" -f 2)
echo "$USER;$NAME"
done
done < $IN_FILE

View File

@ -0,0 +1,46 @@
#!/bin/bash
################################################
#
# Включение отправки исходящей почты
# через другой сервер
#
# Автор: Сергей Калинин
# https://nuk-svk.ru
# svk@nuk-svk.ru
################################################
#
# Использование:
# - включение отправки через релей:
#
# ./zimbra_mta_relay_change TARGET_HOST RELAY_HOST
#
# - отключение отправки через релей
#
# ./zimbra_mta_relay_change TARGET_HOST
#
###############################################
ZIMBRA_BIN=/opt/zimbra/bin
TARGET_HOST=${1}
RELAY_HOST=${2}
if [ -z "$1" ]; then
echo "usage for enable relay sending:"
echo " ./zimbra_mta_relay_change TARGET_HOST RELAY_HOST"
echo ""
echo "usage for disable relay sending:"
echo " ./zimbra_mta_relay_change TARGET_HOST"
exit
fi
if [ -z "$2" ]; then
$ZIMBRA_BIN/zmprov ms "${TARGET_HOST}" zimbraMtaRelayHost ""
$ZIMBRA_BIN/zmprov ms "${TARGET_HOST}" zimbraMtaMyDestination "localhost"
else
$ZIMBRA_BIN/zmprov ms "${TARGET_HOST}" zimbraMtaRelayHost "${RELAY_HOST}:25"
$ZIMBRA_BIN/zmprov ms "${TARGET_HOST}" zimbraMtaMyDestination "localhost ${RELAY_HOST}"
fi
$ZIMBRA_BIN/zmmtactl stop
$ZIMBRA_BIN/zmmtactl start