Restore repo
This commit is contained in:
1
check_dns_records/.gitignore
vendored
Executable file
1
check_dns_records/.gitignore
vendored
Executable file
@@ -0,0 +1 @@
|
||||
.env
|
22
check_dns_records/Dockerfile
Executable file
22
check_dns_records/Dockerfile
Executable file
@@ -0,0 +1,22 @@
|
||||
FROM debian:buster-slim
|
||||
|
||||
RUN apt update -y \
|
||||
&& apt install -y zabbix-agent dnsutils curl jq && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY zabbix_dns_records_check.sh /usr/local/bin/zabbix_dns_records_check.sh
|
||||
COPY zabbix_create_host.sh /usr/local/bin/zabbix_create_host.sh
|
||||
COPY run.sh /usr/local/bin/run.sh
|
||||
|
||||
ADD zabbix_jrpc_files/* /usr/local/lib/
|
||||
COPY zabbix_templates/* /usr/local/lib/
|
||||
|
||||
RUN chmod 755 /usr/local/bin/*
|
||||
|
||||
RUN sed -i -e 's/^Server=127.0.0.1$/Server=${ZABBIX_SERVER}/' /etc/zabbix/zabbix_agentd.conf; \
|
||||
sed -i -e 's/^ServerActive=127.0.0.1$/ServerActive=${ZABBIX_SERVER}/' /etc/zabbix/zabbix_agentd.conf
|
||||
|
||||
CMD /usr/local/bin/run.sh
|
||||
|
||||
|
||||
|
100
check_dns_records/README.md
Executable file
100
check_dns_records/README.md
Executable file
@@ -0,0 +1,100 @@
|
||||
# Отслеживание изменений всех типов DNS-записей для домена
|
||||
|
||||
## Описание
|
||||
|
||||
Набор скриптов для мониторинга изменений в DNS для любого количества доменов.
|
||||
Отслеживаются все записи представленные в БД DNS. Проверку можно осуществлять как просто в консоли, запуская скрипты, так и в интеграции с zabbix. Запуск сервиса может производиться как локально в системе (при помощи cron) так и ввиде docker-контейнера.
|
||||
|
||||
В состав сервиса входит:
|
||||
- zabbix_create_host.sh - позволяет создать в zabbix группу узлов, шаблон, узел. В случае если объект уже есть, то будет получен его идентификатор. Используется Zabbix JSON RPC.
|
||||
- zabbix_dns_records_check.sh - опрос DNS и получение всех типов записей с добавлением их в zabbix.
|
||||
- run.sh - для запуска полного цикла проверки
|
||||
- zabbix_jrpc_files - каталог содержит JSON-файлы с описанием процедур по взаимодействия с zabbix
|
||||
- zabbix_templates - шаблоны zabbix
|
||||
|
||||
## Использование
|
||||
|
||||
Получения всех типов записей и создание элементов (items) в zabbix:
|
||||
|
||||
```zabbix_dns_records_check.sh read-json-discover```
|
||||
|
||||
Для получения данных по конкретному домену:
|
||||
|
||||
```zabbix_dns_records_check.sh domain.name.ru```
|
||||
|
||||
Для получения данных по конкретному домену и конкретному типу записи (A, MX, NS и т.д.):
|
||||
|
||||
```zabbix_dns_records_check.sh domain.name.ru MX```
|
||||
|
||||
Так как сервис заточен под работу с zabbix, то вышеозначенная операция сработает только в случае выставления переменной ```ZABBIX_AGENT="TRUE"```. Если значение данной переменной "FALSE", проверка будет производится сразу по всем записям и результат не будет выведен в консоль а будет отправлен в zabbix (при помощи zabbix-sender). Это правило верно и для режима "read-json-discover".
|
||||
|
||||
Получение всех записей для домена:
|
||||
|
||||
```zabbix_zimbra_domain_status.sh get-domain-records domain.name.ru```
|
||||
|
||||
Получение списка всех типов записей для домена:
|
||||
|
||||
```zabbix_zimbra_domain_status.sh get-domain-records-type domain.name.ru```
|
||||
|
||||
### Настройка переменных окружения для zabbix_zimbra_domain_status.sh
|
||||
|
||||
Список переменных с значениями по умолчанию:
|
||||
```
|
||||
BIN_DIR=/usr/local/bin
|
||||
ETC_DIR=/usr/local/etc
|
||||
# Адрес ДНС сервера
|
||||
EXT_DNS=8.8.8.8
|
||||
# Список доменов
|
||||
DOMAIN_LIST="domain.1 domain.2 domain.n"
|
||||
# Временные файлы
|
||||
FILE_ZIMBRA_DOMAIN_STATUS='/tmp/domain_status'
|
||||
FILE_ZIMBRA_DOMAIN_LIST='/tmp/domain_list'
|
||||
# конфигурация заббикс-агента
|
||||
ZABBIX_AGENT=FALSE
|
||||
ZABBIX_SENDER=/usr/bin/zabbix_sender
|
||||
ZABBIX_AGENT_CONFIG=/etc/zabbix/zabbix_agentd.conf
|
||||
# имя узла в zabbix
|
||||
ZABBIX_HOST="DNS records check"
|
||||
```
|
||||
|
||||
### Настройка переменных окружения для zabbix_create_host.sh и значения по умолчанию
|
||||
|
||||
```
|
||||
BIN_DIR=/usr/local/bin
|
||||
ETC_DIR=/usr/local/etc
|
||||
LIB_DIR=/usr/local/lib
|
||||
# адрес zabbix сервера
|
||||
ZABBIX_SERVER='http://zabbix.example.com'
|
||||
# пользователь и пароль для доступа к zabbix-API
|
||||
# по умолчанию не определены
|
||||
ZABBIX_USER=
|
||||
ZABBIX_PASSWORD=
|
||||
# Название группы узлов в заббикс
|
||||
ZABBIX_HOST_GROUP='Virtual Hosts'
|
||||
# название узла в заббикс
|
||||
ZABBIX_HOST="DNS records check"
|
||||
# имя шаблона для прикрепления к узлу
|
||||
ZABBIX_TEMPLATE_NAME="Template_DNS_Check"
|
||||
```
|
||||
|
||||
### Запуск в Docker-контейнере
|
||||
|
||||
Предварительно требуется создать файл .env куда прописать имя и пароль пользователя для zabbix:
|
||||
|
||||
```
|
||||
ZABBIX_USER=user
|
||||
ZABBIX_PASSWORD=password
|
||||
```
|
||||
Если требуется переопеределить значения переменных то их можно либо прописать в этом-же файле либо в docker-compose.yml
|
||||
|
||||
Сборка контейнера в локальном репозитории:
|
||||
|
||||
```docker build --rm -t dns_records_check .```
|
||||
|
||||
Запуск осуществляется при помощи docker-compose:
|
||||
|
||||
```docker-compose up```
|
||||
|
||||
При первых запусках (2-3, связано с таймаутами в zabbix при создании новых элементов) в случае отсутствия в zabbix будут созданы: группа узлов, шаблон, узел, прикреплен к узлу шаблон.
|
||||
При каждом запуске будет производится автоопределение типов DNS-записей и создание требуемых ключей (items) в заббикс (автообнаружение) для каждого домена.
|
||||
Контейнер будет перезапускаться каждые 10 минут (настройка в файле run.sh).
|
14
check_dns_records/docker-compose.yml
Executable file
14
check_dns_records/docker-compose.yml
Executable file
@@ -0,0 +1,14 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
dns_check:
|
||||
image: ${CONTAINER_TEST_IMAGE:-dns_records_check:debug}
|
||||
env_file: .env
|
||||
environment:
|
||||
- ZABBIX_HOST=DNS records check
|
||||
- DOMAIN_LIST=example1.com example1.org example3.ru
|
||||
#- ZABBX_USER="$ZABBIX_USER"
|
||||
#- ZABBIX_PASSWORD="$ZABBIX_PASSWORD"
|
||||
restart: always
|
||||
build:
|
||||
context: .
|
56
check_dns_records/gitlab-ci.yml
Normal file
56
check_dns_records/gitlab-ci.yml
Normal file
@@ -0,0 +1,56 @@
|
||||
stages:
|
||||
- build
|
||||
- release
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
# CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
|
||||
# CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest
|
||||
DOCKER_DRIVER: overlay2
|
||||
IMAGE_PATH: $CI_REGISTRY/$CI_PROJECT_PATH
|
||||
|
||||
before_script:
|
||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||||
- mkdir -p .ci_status
|
||||
|
||||
.dedicated-runner: &dedicated-runner
|
||||
tags:
|
||||
- build1-shell
|
||||
|
||||
dns_check_build:
|
||||
<<: *dedicated-runner
|
||||
stage: build
|
||||
script:
|
||||
- DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose build dns_check
|
||||
- docker push $IMAGE_PATH/dns_records_check:dev
|
||||
- touch .ci_status/dns_check_build
|
||||
only:
|
||||
refs:
|
||||
- master
|
||||
changes:
|
||||
- ./*/*.json
|
||||
- ./*/*.xml
|
||||
- Dockerfile
|
||||
- *.sh
|
||||
- docker-compose.yml
|
||||
artifacts:
|
||||
paths:
|
||||
- .ci_status/
|
||||
|
||||
dns_check_release:
|
||||
<<: *dedicated-runner
|
||||
stage: release
|
||||
script:
|
||||
- if [ -e .ci_status/dns_check_build ]; then docker pull $IMAGE_PATH/dns_records_check:dev; docker tag $IMAGE_PATH/dns_records_check:dev $IMAGE_PATH/dns_records_check:latest; docker push $IMAGE_PATH/dns_records_check:latest; touch .ci_status/dns_check_release; fi
|
||||
artifacts:
|
||||
paths:
|
||||
- .ci_status/
|
||||
|
||||
dns_check_deploy:
|
||||
<<: *dedicated-runner
|
||||
stage: deploy
|
||||
script:
|
||||
- if [ -e .ci_status/dns_check_release ]; then docker-compose up -d --no-deps --build dns_check; fi
|
||||
|
||||
|
||||
|
26
check_dns_records/run.sh
Executable file
26
check_dns_records/run.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
BIN_DIR=${BIN_DIR:-/usr/local/bin}
|
||||
ETC_DIR=${ETC_DIR:-/usr/local/etc}
|
||||
LIB_DIR=${LIB_DIR:-/usr/local/lib}
|
||||
|
||||
# Check host presents into zabbix
|
||||
#/usr/local/bin/zabbix_create_host.sh
|
||||
echo "Creating host into zabbix"
|
||||
${BIN_DIR}/zabbix_create_host.sh
|
||||
|
||||
echo "Creating zabbix items for host"
|
||||
# Get DNS records for all domain and send them into zabbix
|
||||
#/usr/local/bin/zabbix_dns_records_check.sh read-json-discover
|
||||
${BIN_DIR}/zabbix_dns_records_check.sh read-json-discover
|
||||
|
||||
echo "Getting DNS data"
|
||||
|
||||
DOMAIN_LIST=${DOMAIN_LIST:-"example1.com example1.org example3.ru"}
|
||||
|
||||
for LINE in ${DOMAIN_LIST}; do
|
||||
#/usr/local/bin/zabbix_dns_records_check.sh $LINE
|
||||
${BIN_DIR}/zabbix_dns_records_check.sh $LINE
|
||||
done
|
||||
|
||||
sleep 600
|
213
check_dns_records/zabbix_create_host.sh
Executable file
213
check_dns_records/zabbix_create_host.sh
Executable file
@@ -0,0 +1,213 @@
|
||||
#!/bin/bash
|
||||
###################################################################
|
||||
#
|
||||
# Скрипт для работы с Zabbix Rest API
|
||||
# Позволяет создавать группу узлов, шаблон, узел.
|
||||
# Создан по мотивам
|
||||
# https://www.reddit.com/r/zabbix/comments/bhdhgq/zabbix_api_example_using_just_bash_curl_and_jq/
|
||||
#
|
||||
# Автор: Сергей Калинин
|
||||
# https://nuk-svk.ru
|
||||
# svk@nuk-svk.ru
|
||||
#####################################################################
|
||||
#
|
||||
# Использование:
|
||||
# ./zabbix_create_host.sh
|
||||
#
|
||||
# Запуск без параметров создаст группу узлов, шаблон и узел если они
|
||||
# отсутствуют. Данные берутся из переменных окружения
|
||||
#####################################################################
|
||||
|
||||
|
||||
#####################################################################
|
||||
# Custom variables
|
||||
|
||||
BIN_DIR=${BIN_DIR:-/usr/local/bin}
|
||||
ETC_DIR=${ETC_DIR:-/usr/local/etc}
|
||||
LIB_DIR=${LIB_DIR:-/usr/local/lib}
|
||||
|
||||
zabbixServer=${ZABBIX_SERVER:-'http://zabbix.example.com'}
|
||||
zabbixUsername=${ZABBIX_USER}
|
||||
zabbixPassword=${ZABBIX_PASSWORD}
|
||||
zabbixHostGroup=${ZABBIX_HOST_GROUP:-'Virtual Hosts'}
|
||||
ZABBIX_HOST_NAME=${ZABBIX_HOST:-"DNS records check"}
|
||||
ZABBIX_TEMPLATE_NAME=${ZABBIX_TEMPLATE_NAME:-"Template_DNS_Check"}
|
||||
|
||||
#End of custom variables
|
||||
#####################################################################
|
||||
|
||||
header='Content-Type:application/json'
|
||||
zabbixApiUrl="$zabbixServer/api_jsonrpc.php"
|
||||
|
||||
function exit_with_error() {
|
||||
echo '********************************'
|
||||
echo "$errorMessage"
|
||||
echo '--------------------------------'
|
||||
echo 'INPUT'
|
||||
echo '--------------------------------'
|
||||
echo "$json"
|
||||
echo '--------------------------------'
|
||||
echo 'OUTPUT'
|
||||
echo '--------------------------------'
|
||||
echo "$result"
|
||||
echo '********************************'
|
||||
exit 1
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Auth to zabbix
|
||||
# https://www.zabbix.com/documentation/3.4/manual/api/reference/user/login
|
||||
function auth() {
|
||||
errorMessage='*ERROR* - Unable to get Zabbix authorization token'
|
||||
json=$(cat ${LIB_DIR}/user.login.json)
|
||||
json=${json/USER/$zabbixUsername}
|
||||
json=${json/PASSWORD/$zabbixPassword}
|
||||
#echo $json
|
||||
result=$(curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl)
|
||||
|
||||
auth=$(echo $result | jq '.result')
|
||||
echo "Auth: $auth"
|
||||
if [ -z "$auth" ]; then
|
||||
exit_with_error
|
||||
fi
|
||||
echo "Login successful - Auth ID: $auth"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Create hostgroup
|
||||
function create_host_group() {
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
errorMessage="*ERROR* - Unable to create hostgroup ID for host group named '$zabbixHostGroup'"
|
||||
json=`cat ${LIB_DIR}/hostgroup.create.json`
|
||||
json=${json/HOSTGROUP/$zabbixHostGroup}
|
||||
json=${json/AUTHID/$auth}
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
HOSTGROUP_ID=`echo $result | jq -r '.result | .groupids | .[0]'`
|
||||
if [ "$HOSTGROUP_ID" == "null" ]; then
|
||||
exit_with_error
|
||||
fi
|
||||
echo "Hostgroup '$zabbixHostGroup' was created with ID: $HOSTGROUP_ID"
|
||||
}
|
||||
|
||||
|
||||
#####################################################################
|
||||
# Get hostgroup
|
||||
function get_host_group() {
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
errorMessage="*ERROR* - Unable to get hostgroup ID for host group named '$zabbixHostGroup'"
|
||||
json=`cat ${LIB_DIR}/hostgroup.get.json`
|
||||
json=${json/HOSTGROUP/$zabbixHostGroup}
|
||||
json=${json/AUTHID/$auth}
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
HOSTGROUP_ID=`echo $result | jq -r '.result | .[0] | .groupid'`
|
||||
if [ "$HOSTGROUP_ID" == "null" ]; then
|
||||
create_host_group
|
||||
fi
|
||||
echo "Hostgroup ID for '$zabbixHostGroup': $HOSTGROUP_ID"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Create template
|
||||
function create_template(){
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
echo "Creating zabbix template '$ZABBIX_TEMPLATE_NAME'"
|
||||
errorMessage="*ERROR* - Unable to create Template ID for '$ZABBIX_TEMPLATE_NAME'"
|
||||
json=`cat ${LIB_DIR}/template.create.json`
|
||||
TEMPLATE_XML=$(cat ${LIB_DIR}/$ZABBIX_TEMPLATE_NAME.xml)
|
||||
TEMPLATE_XML="$(echo $TEMPLATE_XML | sed 's/"/\\"/g')"
|
||||
json=${json/XMLSTRING/$TEMPLATE_XML}
|
||||
json=${json/AUTHID/$auth}
|
||||
#echo $json
|
||||
#echo "curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl"
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
#echo $result
|
||||
#exit
|
||||
#RESULT=`echo $result | jq -r '.result'`
|
||||
if [ "$RESULT" == "null" ]; then
|
||||
exit_with_error
|
||||
else
|
||||
get_template
|
||||
#echo "Template '$ZABBIX_TEMPLATE_NAME' was created with ID: $TEMPLATE_ID"
|
||||
fi
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Get template
|
||||
function get_template(){
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
errorMessage="*ERROR* - Unable to get Template ID for '$ZABBIX_TEMPLATE_NAME'"
|
||||
json=`cat ${LIB_DIR}/template.get.json`
|
||||
json=${json/TEMPLATE_NAME/$ZABBIX_TEMPLATE_NAME}
|
||||
json=${json/AUTHID/$auth}
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
TEMPLATE_ID=`echo $result | jq -r '.result | .[0] | .templateid'`
|
||||
if [ "$TEMPLATE_ID" == "null" ]; then
|
||||
create_template
|
||||
fi
|
||||
echo "Template ID for '$ZABBIX_TEMPLATE_NAME': $TEMPLATE_ID"
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Get host
|
||||
function get_host() {
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
errorMessage="*ERROR* - Unable to get host ID for host '$zabbixHost'"
|
||||
json=`cat ${LIB_DIR}/host.get.json`
|
||||
json=${json/HOSTNAME/$ZABBIX_HOST_NAME}
|
||||
json=${json/AUTHID/$auth}
|
||||
#echo $json
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
#echo $result
|
||||
hostId=`echo $result | jq -r '.result | .[0] | .hostid'`
|
||||
# if [ "$hostId" == "null" ]; then exit_with_error; fi
|
||||
# echo "Host ID for '$zabbixHost': $hostId"
|
||||
if [ "$hostId" == "null" ]; then
|
||||
create_host
|
||||
#exit_with_error
|
||||
else
|
||||
echo "Host ID for '$zabbixHost': $hostId"
|
||||
fi
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# Create host
|
||||
function create_host() {
|
||||
if [ -z "$auth" ]; then
|
||||
auth
|
||||
fi
|
||||
if [ -z "$TEMPLATE_ID" ]; then
|
||||
get_template
|
||||
fi
|
||||
if [ -z "$HOSTGROUP_ID" ]; then
|
||||
get_host_group
|
||||
fi
|
||||
|
||||
echo "Create host \"$ZABBIX_HOST_NAME\""
|
||||
errorMessage="*ERROR* - Host '$zabbixHost' does not created"
|
||||
json=$(cat ${LIB_DIR}/host.create.json)
|
||||
json=${json/HOSTNAME/$ZABBIX_HOST_NAME}
|
||||
json=${json/HOSTGROUPID/$HOSTGROUP_ID}
|
||||
json=${json/TEMPLATE_ID/$TEMPLATE_ID}
|
||||
json=${json/AUTHID/$auth}
|
||||
#echo $json
|
||||
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
|
||||
#echo $result
|
||||
HOST_ID=`echo $result | jq -r '.result | .hostids | .[0]'`
|
||||
if [ -z "$HOST_ID" ]; then
|
||||
exit_with_error
|
||||
else
|
||||
echo "Host \"${ZABBIX_HOST_NAME}\" was created with id $HOST_ID"
|
||||
fi
|
||||
}
|
||||
|
||||
get_host
|
134
check_dns_records/zabbix_dns_records_check.sh
Executable file
134
check_dns_records/zabbix_dns_records_check.sh
Executable file
@@ -0,0 +1,134 @@
|
||||
#!/bin/bash
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Определение корректности записей в DNS
|
||||
# для доменов для Zabbix
|
||||
# Может работать как с zabbix-agent так и zabbix-sender
|
||||
#
|
||||
# Автор: Сергей Калинин
|
||||
# https://nuk-svk.ru
|
||||
# svk@nuk-svk.ru
|
||||
##############################################################################
|
||||
#
|
||||
# Использование:
|
||||
#
|
||||
# Получение DNS записей доменов и создание JSON-файла для Zabbix:
|
||||
# zabbix_zimbra_domain_status.sh discover
|
||||
#
|
||||
# Чтение JSON-файла и вывод на экран (в zabbix)
|
||||
# zabbix_zimbra_domain_status.sh read-json-discover
|
||||
#
|
||||
# Получение всех записей для домена из DNS
|
||||
# zabbix_zimbra_domain_status.sh get-domain-records _DOMAIN_NAME_
|
||||
#
|
||||
# Получение всех типов записей для домена из DNS
|
||||
# zabbix_zimbra_domain_status.sh get-domain-records-type _DOMAIN_NAME_
|
||||
#
|
||||
# Получение ДНС записи определенного типа для домена
|
||||
# zabbix_zimbra_domain_status.sh _ZIMBRA_DOMAIN_NAME_ _DNS_RECORD_TYPE_
|
||||
#
|
||||
# Где
|
||||
# _DOMAIN_NAME_ - имя домена в DNS
|
||||
# _DNS_RECORD_TYPE_ - тип DNS-записи (A, CNAME, TXT, MX, и т.д.)
|
||||
#############################################################################
|
||||
|
||||
BIN_DIR=${BIN_DIR:-/usr/local/bin}
|
||||
ETC_DIR=${ETC_DIR:-/usr/local/etc}
|
||||
|
||||
EXT_DNS=${EXT_DNS:-8.8.8.8}
|
||||
|
||||
DOMAIN_LIST=${DOMAIN_LIST:-"example1.com example1.org example3.ru"}
|
||||
|
||||
FILE_ZIMBRA_DOMAIN_STATUS='/tmp/domain_status'
|
||||
FILE_ZIMBRA_DOMAIN_LIST='/tmp/domain_list'
|
||||
|
||||
ZABBIX_AGENT=${ZABBIX_AGENT:-FALSE}
|
||||
ZABBIX_SENDER=${ZABBIX_SENDER:-/usr/bin/zabbix_sender}
|
||||
ZABBIX_AGENT_CONFIG=${ZABBIX_AGNT_CONFIG:-/etc/zabbix/zabbix_agentd.conf}
|
||||
ZABBIX_HOST="${ZABBIX_HOST:-DNS records check}"
|
||||
|
||||
case "$1" in
|
||||
discover)
|
||||
# Return a list of running services in JSON
|
||||
# And create JSON-file
|
||||
DOMAIN_JSON="{\"data\":["
|
||||
for LINE in ${DOMAIN_LIST}; do
|
||||
RECORDS_TYPE=$($0 get-domain-records-type ${LINE})
|
||||
DOMAIN_JSON="${DOMAIN_JSON}"
|
||||
for TYPE in ${RECORDS_TYPE}; do
|
||||
DOMAIN_JSON="${DOMAIN_JSON} {\"{#DOMAIN}\":\"$LINE\", \"{#DOMAINDNSRECORD}\":\"$TYPE\"},"
|
||||
done
|
||||
DOMAIN_JSON="${DOMAIN_JSON}"
|
||||
done
|
||||
JSON_STRING="$(echo $DOMAIN_JSON | sed 's/,\+$//') ]}"
|
||||
echo "${JSON_STRING}" > ${FILE_ZIMBRA_DOMAIN_LIST}.json
|
||||
if [ "$ZABBIX_AGENT" = "FALSE" ]; then
|
||||
$ZABBIX_SENDER -vv -c $ZABBIX_AGENT_CONFIG -s "$ZABBIX_HOST" -k domain -o "${JSON_STRING}"
|
||||
fi
|
||||
exit 0;
|
||||
;;
|
||||
read-json-discover)
|
||||
# create a JSON-file for zabbix
|
||||
$0 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)
|
||||
if [ "$2" = "" ]; then
|
||||
echo "No Zimbra DOMAIN specified..."
|
||||
exit 1
|
||||
fi
|
||||
dig @${EXT_DNS} +nocmd $2 any +noall +answer > ${FILE_ZIMBRA_DOMAIN_STATUS}
|
||||
;;
|
||||
get-domain-records-type)
|
||||
if [ "$2" = "" ]; then
|
||||
echo "No DOMAIN specified..."
|
||||
exit 1
|
||||
fi
|
||||
$0 get-domain-records $2
|
||||
cat ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{print $4}' | sort -u
|
||||
;;
|
||||
|
||||
*)
|
||||
CHECK_DOMAIN=$1
|
||||
if [ "$CHECK_DOMAIN" = "" ]; then
|
||||
echo "No DOMAIN specified..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Формируем список всех DNS-записей для домена
|
||||
#dig @${EXT_DNS} +nocmd ${CHECK_DOMAIN} any +noall +answer > ${FILE_ZIMBRA_DOMAIN_STATUS}
|
||||
$0 get-domain-records "${CHECK_DOMAIN}"
|
||||
|
||||
if [ "$ZABBIX_AGENT" = "TRUE" ]; then
|
||||
# получаем данные по конкретному типу записи
|
||||
# использвется при работе через zabbix-agent
|
||||
RECORD_TYPE=$2
|
||||
if [ "$RECORD_TYPE" = "" ]; then
|
||||
echo "No DNS record type specified..."
|
||||
exit 1
|
||||
fi
|
||||
grep -E "\s${RECORD_TYPE}\s" ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort
|
||||
else
|
||||
# Формируем список типов записей для домена
|
||||
#RECORD_TYPES_LIST=$(cat ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{print $4}' | sort -u)
|
||||
RECORD_TYPES_LIST=$($0 get-domain-records-type "${CHECK_DOMAIN}")
|
||||
for RECORD_TYPE in ${RECORD_TYPES_LIST}; do
|
||||
# Запрос в DNS
|
||||
#dig @${EXT_DNS} +nocmd ${RECORD_TYPE} ${CHECK_DOMAIN} +noall +answer | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort
|
||||
# Читаем из файла с ранее полученными данными и шлем в заббикс
|
||||
#grep ${RECORD_TYPE} ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort
|
||||
$ZABBIX_SENDER -c $ZABBIX_AGENT_CONFIG -s "$ZABBIX_HOST" -k "domain.status[${CHECK_DOMAIN}, ${RECORD_TYPE}]" \
|
||||
-o "$(grep -E "\s${RECORD_TYPE}\s" ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort)"
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
exit 0;
|
29
check_dns_records/zabbix_jrpc_files/host.create.json
Executable file
29
check_dns_records/zabbix_jrpc_files/host.create.json
Executable file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "host.create",
|
||||
"params": {
|
||||
"host": "HOSTNAME",
|
||||
"interfaces": [
|
||||
{
|
||||
"type": 1,
|
||||
"main": 1,
|
||||
"useip": 1,
|
||||
"ip": "127.0.0.1",
|
||||
"dns": "",
|
||||
"port": "10050"
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"groupid": "HOSTGROUPID"
|
||||
}
|
||||
],
|
||||
"templates": [
|
||||
{
|
||||
"templateid": "TEMPLATE_ID"
|
||||
}
|
||||
]
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
9
check_dns_records/zabbix_jrpc_files/host.exists.json
Executable file
9
check_dns_records/zabbix_jrpc_files/host.exists.json
Executable file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "host.exists",
|
||||
"params": {
|
||||
"host": "HOSTNAME"
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
13
check_dns_records/zabbix_jrpc_files/host.get.json
Executable file
13
check_dns_records/zabbix_jrpc_files/host.get.json
Executable file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "host.get",
|
||||
"params": {
|
||||
"filter": {
|
||||
"host": [
|
||||
"HOSTNAME"
|
||||
]
|
||||
}
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
9
check_dns_records/zabbix_jrpc_files/hostgroup.create.json
Executable file
9
check_dns_records/zabbix_jrpc_files/hostgroup.create.json
Executable file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "hostgroup.create",
|
||||
"params": {
|
||||
"name": "HOSTGROUP"
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
15
check_dns_records/zabbix_jrpc_files/hostgroup.get.json
Executable file
15
check_dns_records/zabbix_jrpc_files/hostgroup.get.json
Executable file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "hostgroup.get",
|
||||
"params": {
|
||||
"output": "groupid",
|
||||
"filter": {
|
||||
"name": [
|
||||
"HOSTGROUP"
|
||||
]
|
||||
}
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
||||
|
30
check_dns_records/zabbix_jrpc_files/template.create.json
Executable file
30
check_dns_records/zabbix_jrpc_files/template.create.json
Executable file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "configuration.import",
|
||||
"params": {
|
||||
"format": "xml",
|
||||
"rules": {
|
||||
"templates": {
|
||||
"createMissing": true
|
||||
},
|
||||
"items": {
|
||||
"createMissing": true
|
||||
},
|
||||
"discoveryRules": {
|
||||
"createMissing": true
|
||||
},
|
||||
"triggers": {
|
||||
"createMissing": true
|
||||
},
|
||||
"graphs": {
|
||||
"createMissing": true
|
||||
},
|
||||
"applications": {
|
||||
"createMissing": true
|
||||
}
|
||||
},
|
||||
"source": "XMLSTRING"
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
14
check_dns_records/zabbix_jrpc_files/template.get.json
Executable file
14
check_dns_records/zabbix_jrpc_files/template.get.json
Executable file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "template.get",
|
||||
"params": {
|
||||
"output": "extend",
|
||||
"filter": {
|
||||
"host": [
|
||||
"TEMPLATE_NAME"
|
||||
]
|
||||
}
|
||||
},
|
||||
"auth": AUTHID,
|
||||
"id": 1
|
||||
}
|
9
check_dns_records/zabbix_jrpc_files/user.login.json
Executable file
9
check_dns_records/zabbix_jrpc_files/user.login.json
Executable file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "user.login",
|
||||
"params": {
|
||||
"user": "USER",
|
||||
"password": "PASSWORD"
|
||||
},
|
||||
"id": 1
|
||||
}
|
182
check_dns_records/zabbix_templates/Template_DNS_Check.xml
Executable file
182
check_dns_records/zabbix_templates/Template_DNS_Check.xml
Executable file
@@ -0,0 +1,182 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zabbix_export>
|
||||
<version>4.0</version>
|
||||
<date>2020-10-09T07:22:33Z</date>
|
||||
<groups>
|
||||
<group>
|
||||
<name>Templates</name>
|
||||
</group>
|
||||
</groups>
|
||||
<templates>
|
||||
<template>
|
||||
<template>Template_DNS_Check</template>
|
||||
<name>Template_DNS_Check</name>
|
||||
<description/>
|
||||
<groups>
|
||||
<group>
|
||||
<name>Templates</name>
|
||||
</group>
|
||||
</groups>
|
||||
<applications>
|
||||
<application>
|
||||
<name>Domain DNS Records</name>
|
||||
</application>
|
||||
</applications>
|
||||
<items/>
|
||||
<discovery_rules>
|
||||
<discovery_rule>
|
||||
<name>Domain Discovery</name>
|
||||
<type>2</type>
|
||||
<snmp_community/>
|
||||
<snmp_oid/>
|
||||
<key>domain</key>
|
||||
<delay>0</delay>
|
||||
<status>0</status>
|
||||
<allowed_hosts/>
|
||||
<snmpv3_contextname/>
|
||||
<snmpv3_securityname/>
|
||||
<snmpv3_securitylevel>0</snmpv3_securitylevel>
|
||||
<snmpv3_authprotocol>0</snmpv3_authprotocol>
|
||||
<snmpv3_authpassphrase/>
|
||||
<snmpv3_privprotocol>0</snmpv3_privprotocol>
|
||||
<snmpv3_privpassphrase/>
|
||||
<params/>
|
||||
<ipmi_sensor/>
|
||||
<authtype>0</authtype>
|
||||
<username/>
|
||||
<password/>
|
||||
<publickey/>
|
||||
<privatekey/>
|
||||
<port/>
|
||||
<filter>
|
||||
<evaltype>0</evaltype>
|
||||
<formula/>
|
||||
<conditions/>
|
||||
</filter>
|
||||
<lifetime>30d</lifetime>
|
||||
<description/>
|
||||
<item_prototypes>
|
||||
<item_prototype>
|
||||
<name>"{#DOMAINDNSRECORD}" record for "{#DOMAIN}"</name>
|
||||
<type>2</type>
|
||||
<snmp_community/>
|
||||
<snmp_oid/>
|
||||
<key>domain.status[{#DOMAIN}, {#DOMAINDNSRECORD}]</key>
|
||||
<delay>0</delay>
|
||||
<history>90d</history>
|
||||
<trends>0</trends>
|
||||
<status>0</status>
|
||||
<value_type>4</value_type>
|
||||
<allowed_hosts/>
|
||||
<units/>
|
||||
<snmpv3_contextname/>
|
||||
<snmpv3_securityname/>
|
||||
<snmpv3_securitylevel>0</snmpv3_securitylevel>
|
||||
<snmpv3_authprotocol>0</snmpv3_authprotocol>
|
||||
<snmpv3_authpassphrase/>
|
||||
<snmpv3_privprotocol>0</snmpv3_privprotocol>
|
||||
<snmpv3_privpassphrase/>
|
||||
<params/>
|
||||
<ipmi_sensor/>
|
||||
<authtype>0</authtype>
|
||||
<username/>
|
||||
<password/>
|
||||
<publickey/>
|
||||
<privatekey/>
|
||||
<port/>
|
||||
<description/>
|
||||
<inventory_link>0</inventory_link>
|
||||
<applications>
|
||||
<application>
|
||||
<name>Domain DNS Records</name>
|
||||
</application>
|
||||
</applications>
|
||||
<valuemap/>
|
||||
<logtimefmt/>
|
||||
<preprocessing/>
|
||||
<jmx_endpoint/>
|
||||
<timeout>3s</timeout>
|
||||
<url/>
|
||||
<query_fields/>
|
||||
<posts/>
|
||||
<status_codes>200</status_codes>
|
||||
<follow_redirects>1</follow_redirects>
|
||||
<post_type>0</post_type>
|
||||
<http_proxy/>
|
||||
<headers/>
|
||||
<retrieve_mode>0</retrieve_mode>
|
||||
<request_method>0</request_method>
|
||||
<output_format>0</output_format>
|
||||
<allow_traps>0</allow_traps>
|
||||
<ssl_cert_file/>
|
||||
<ssl_key_file/>
|
||||
<ssl_key_password/>
|
||||
<verify_peer>0</verify_peer>
|
||||
<verify_host>0</verify_host>
|
||||
<application_prototypes/>
|
||||
<master_item/>
|
||||
</item_prototype>
|
||||
</item_prototypes>
|
||||
<trigger_prototypes>
|
||||
<trigger_prototype>
|
||||
<expression>{Template_DNS_Check:domain.status[{#DOMAIN}, {#DOMAINDNSRECORD}].nodata(20m)}=1</expression>
|
||||
<recovery_mode>0</recovery_mode>
|
||||
<recovery_expression/>
|
||||
<name>{HOSTNAME}. Нет данных о проверке DNS зон</name>
|
||||
<correlation_mode>0</correlation_mode>
|
||||
<correlation_tag/>
|
||||
<url/>
|
||||
<status>0</status>
|
||||
<priority>3</priority>
|
||||
<description/>
|
||||
<type>0</type>
|
||||
<manual_close>0</manual_close>
|
||||
<dependencies/>
|
||||
<tags/>
|
||||
</trigger_prototype>
|
||||
<trigger_prototype>
|
||||
<expression>{Template_DNS_Check:domain.status[{#DOMAIN}, {#DOMAINDNSRECORD}].diff()}=1</expression>
|
||||
<recovery_mode>2</recovery_mode>
|
||||
<recovery_expression/>
|
||||
<name>Изменение {#DOMAINDNSRECORD}-записи для "{#DOMAIN}</name>
|
||||
<correlation_mode>0</correlation_mode>
|
||||
<correlation_tag/>
|
||||
<url/>
|
||||
<status>0</status>
|
||||
<priority>2</priority>
|
||||
<description/>
|
||||
<type>0</type>
|
||||
<manual_close>1</manual_close>
|
||||
<dependencies/>
|
||||
<tags/>
|
||||
</trigger_prototype>
|
||||
</trigger_prototypes>
|
||||
<graph_prototypes/>
|
||||
<host_prototypes/>
|
||||
<jmx_endpoint/>
|
||||
<timeout>3s</timeout>
|
||||
<url/>
|
||||
<query_fields/>
|
||||
<posts/>
|
||||
<status_codes>200</status_codes>
|
||||
<follow_redirects>1</follow_redirects>
|
||||
<post_type>0</post_type>
|
||||
<http_proxy/>
|
||||
<headers/>
|
||||
<retrieve_mode>0</retrieve_mode>
|
||||
<request_method>0</request_method>
|
||||
<allow_traps>0</allow_traps>
|
||||
<ssl_cert_file/>
|
||||
<ssl_key_file/>
|
||||
<ssl_key_password/>
|
||||
<verify_peer>0</verify_peer>
|
||||
<verify_host>0</verify_host>
|
||||
</discovery_rule>
|
||||
</discovery_rules>
|
||||
<httptests/>
|
||||
<macros/>
|
||||
<templates/>
|
||||
<screens/>
|
||||
</template>
|
||||
</templates>
|
||||
</zabbix_export>
|
Reference in New Issue
Block a user