Авто-закрытие триггеров

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Авто-закрытие триггеров

Сообщение Артём Мамзиков »

Авто-закрытие триггеров
Множественные одинаковые
Триггер открыт более дней (времени)
Авто-закрытие триггеров
Авто-закрытие триггеров
Авто-закрытие триггеров Элементы данных Триггеры
Авто-закрытие триггеров Элементы данных Триггеры
Макросы
{HOST.CONN} - IP-Узла
{HOST.HOST} - Имя-Узла
{HOST.NAME} - Имя-видимое
{$HOST.PORTS} - Порт (10050)
{$OLDNEW} - Сортировка (ASC - по возрастанию, DESC - по убыванию, влияет на закрытие старых и новых триггеров)
{$NAMETRIG} - Имя-триггера (не обязательно)
{$SOVPAD} - Вид-Совпадения (тега и имени триггера -1; имени триггера -2; тегу -3; любое другой число правило выполняться не будет)
{$CLOSETIME} - Время в секундах (Закрыть триггер открытый больше чем по времени) 86400 - сутки можно задать пустым не будет выполняться

Проверка скрипта
cd /usr/local/share/zabbix/externalscripts/
./duplicate-triggers-close.sh 192.168.XXX.XXX "hostname" "" "10050" "ASC" "" "1" "86400"
./duplicate-triggers-close.sh IP-Узла "Имя-Узла" "Имя-видимое" "Порт" "Сортировка" "Имя-триггера" "Вид-Совпадения" "Время"

СКАЧАТЬ
Авто-закрытие триггеров.7z
Авто-закрытие триггеров.7z
(6.32 КБ) 12 скачиваний

duplicate_triggers_close.sh

Код: Выделить всё

#!/bin/bash

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3
# Порт
PORT=${4:-10050}
# Оставить старый триггер новый закрыть=ASC (по умолчанию) - по возрастанию, Зкрыть старый оставить новый=DESC - по убыванию.
OLDNEW=${5:-ASC}
# Имя триггера
NAMETRIG=$6
if [[ "$NAMETRIG" != "" ]]; then nametriggers="\"description\": \"$NAMETRIG\",";else nametriggers=""; fi
# Закрыть по совпадению: тега и имени триггера -1; имени триггера -2; тегу -3.
SOVPAD=${7:-1}
# Закрыть триггер открытый больше чем по времени
CLOSETIME=$8

#echo $IP $HOSTHOST $HOSTNAME $PORT $OLDNEW $NAMETRIG $SOVPAD $CLOSETIME >> triggclos.log

# Закрытие одинаковых триггеров в узле из режима множественный или подвиших триггеров более цать дней
# По имени узла получаем ID узла, запрашиваем триггеры в состоянии проблема

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

function exit_with_error() {
  echo '**********************************'
  echo "$errorMessage"
  echo '----------------------------------'
  echo 'Сформированная Команда выполнения'
  echo '----------------------------------'
  echo  curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
  echo '----------------------------------'
  echo 'Выходные данные'
  echo '----------------------------------'
  echo "$result"
  echo '**********************************'
  zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTHOST}" -k errordupltriggers -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}


#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
errorMessage="";json="";result="";check="" # Очистка переменных


function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}


# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"


function close_trigger(){
#------------------------------------------------------
# Событие https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/event/acknowledge
#------------------------------------------------------
# Закрыть событие. Если событие уже решено, это действие будет пропущено.
# Подтвердить событие. Если событие уже подтверждено, это действие будет пропущено.
# Добавление комментария
# Изменение важности события. Если событие уже с такой же важностью, это действие будет пропущено.
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 6,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 1,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
echo "Авто-закрытие-триггеров-api :" $result
errorMessage="";json="";result="";check="" # Очистка переменных
}

#------------------------------------------------------
# Получение узлов сети в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/host/get
#------------------------------------------------------
#errorMessage='*ERROR* - Не удается проверить узел сети'
#json="{\"jsonrpc\": \"2.0\",\"method\":\"host.get\",\"params\": {\"output\": [\"hostid\"],\"filter\": {\"host\": [\"$HOSTHOST\"]}},\"auth\":\"$auth\", \"id\": 1 }"
#result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
#check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
#if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Поиск Узла сети
#echo -e "Найденые Узлы сети:" "${result}"
#idhost=$(echo "${result}"|sed 's|.*hostid":"||'|sed 's|"}.*||')
#echo "ID Узла:"$idhost
#errorMessage="";json="";result="";check="" # Очистка переменных

#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"selectTriggerDiscovery\": [\"parent_triggerid\"], \"active\": true, \"monitored\": \"True\", \"output\": [\"triggerid\",\"description\",\"priority\",\"status\",\"value\"], \"expandComment\": \"True\", \"expandDescription\": \"True\",  \"expandExpression\": \"True\", \"filter\": {$nametriggers\"host\": \"$HOSTHOST\", \"value\": 1},\"sortfield\": \"priority\", \"sortorder\": \"DESC\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Разделим на строки
resultn=$(echo $result|sed 's/{"triggerid/\\n{"triggerid/g')
# Поиск триггера и получение его ID
triggerid=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"triggerid":"||'|sed 's/","description.*/;/g')
# Имя триггера
triggername=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"description":"||'|sed 's/","priority.*/;/g')
# Если триггер создан из прототипа, получаем ID прототипа триггера в узле
prototypetrigid=$(echo -e $resultn|egrep -i '"parent_triggerid":"[0-9]+"'|sed 's|.*"parent_triggerid":"||'|sed 's/"}.*/;/g')
#echo "Найденые триггеры :" $result
echo "Получаем ID триггера :" $triggerid
echo "Получаем ID прототипа триггера :" $prototypetrigid
echo "Получаем имя триггера :" $triggername
#echo "Важность триггера :"
#echo "Получаем тег :"
#echo "Время открытия триггера :"
errorMessage="";json="";result="";check="" # Очистка переменных

# Цикл переберм id пораздельности
IFS=';' read -ra razbivkatrigid < <(echo $triggerid$prototypetrigid|sed 's/\s//g')
for zavtrigid in "${razbivkatrigid[@]}"
do
#------------------------------------------------------
# Получение триггеров в статусе проблема https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/problem/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить проблемы'
json="{\"jsonrpc\": \"2.0\",\"method\":\"problem.get\",\"params\": \
{\"output\": \"extend\",\
\"acknowledged\": false,\
\"selectAcknowledges\": \"extend\",\
\"selectTags\": \"extend\",\
\"selectSuppressionData\": \"extend\",\
\"objectids\": \"$zavtrigid\",\
\"recent\": \"true\",\
\"sortfield\": [\"eventid\"],\
\"sortorder\": \"$OLDNEW\"},\
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Собираем данные
problem=$problem$result
errorMessage="";json="";result="";check="" # Очистка переменных
done

# Цикл | Разделим на строки
IFS=';' read -ra razproblem < <(echo $problem|sed 's/{"eventid/;{"eventid/g')
for strproblem in "${razproblem[@]}"
do
# Разберем значения в отдельные переменные
echo -e "Найденые Проблемы :" $strproblem
# ID Проблемы
eventid=$(echo $strproblem|egrep -i '"eventid":"[0-9]+"'|sed 's|.*"eventid":"||'|sed 's/","source.*//g')
# Тип проблемы 0 - событие создано на триггер;3 - внутреннее событие.
#sources=$(echo $strproblem|egrep -i '"source":"[0-9]+"'|sed 's|.*"source":"||'|sed 's/","object.*//g')
# Тип объекта проблемы 0 - триггер; 4 - элемент данных;5 - правило LLD.
#object=$(echo $strproblem|egrep -i '"object":"[0-9]+"'|sed 's|.*"object":"||'|sed 's/","objectid.*//g')
# ID связанного объекта триггера (узла,шаблона).
#objectid=$(echo $strproblem|egrep -i '"objectid":"[0-9]+"'|sed 's|.*"objectid":"||'|sed 's/","clock.*//g')
# Время, проблеме было создано.
clock=$(echo $strproblem|egrep -i '"clock":"[0-9]+"'|sed 's|.*"clock":"||'|sed 's/","ns.*//g')
# Наносекунды, проблеме было создано.
#ns=$(echo $strproblem|egrep -i '"ns":"[0-9]+"'|sed 's|.*"ns":"||'|sed 's/","r_eventid.*//g')
# ID события восстановления.
#r_eventid=$(echo $strproblem|egrep -i '"r_eventid":"[0-9]+"'|sed 's|.*"r_eventid":"||'|sed 's/","r_clock.*//g')
# Время, восстановления было создано.
#r_clock=$(echo $strproblem|egrep -i '"r_clock":"[0-9]+"'|sed 's|.*"r_clock":"||'|sed 's/","r_ns.*//g')
# Наносекунды, восстановления было создано.
#r_ns=$(echo $strproblem|egrep -i '"r_ns":"[0-9]+"'|sed 's|.*"r_ns":"||'|sed 's/","correlationid.*//g')
# ID правила корреляции, если событие было решено при помощи глобального правила корреляции.
#correlationid=$(echo $strproblem|egrep -i '"correlationid":"[0-9]+"'|sed 's|.*"correlationid":"||'|sed 's/","userid.*//g')
# ID пользователя, если проблема была закрыта вручную.
#userid=$(echo $strproblem|egrep -i '"userid":"[0-9]+"'|sed 's|.*"userid":"||'|sed 's/","name.*//g')
# Имя проблемы.
name=$(echo -e $strproblem|egrep -i '"name":".*"'|sed 's|.*"name":"||'|sed 's/","acknowledged.*//g'|sed -e '/\s+$/d')
# Состояние подтверждения проблемы. 0 - не подтверждена; 1 - подтверждена.
#acknowledged=$(echo $strproblem|egrep -i '"acknowledged":"[0-9]+"'|sed 's|.*"acknowledged":"||'|sed 's/","severity.*//g')
# Текущая важность проблемы.
#severity=$(echo $strproblem|egrep -i '"severity":"[0-9]+"'|sed 's|.*"severity":"||'|sed 's/","acknowledges.*//g')
# Обновлений проблемы
#acknowledges=$(echo -e $strproblem|egrep -i '"acknowledges":".*"'|sed 's|.*"acknowledges":"[||'|sed 's/]","suppression_data.*//g')
# Возврат списка обслуживаний в свойстве maintenanceid - (строка) ID обслуживания; suppress_until - (целое число) время, до которого проблема подавлена.
#suppression_data=$(echo -e $strproblem|egrep -i '"suppression_data":".*"'|sed 's|.*"suppression_data":"[||'|sed 's/]","suppressed.*//g')
# Подавлена ли проблема или нет. 0 - нет, 1 - Да
#suppressed=$(echo -e $strproblem|egrep -i '"suppressed":".*"'|sed 's|.*"suppressed":"||'|sed 's/","tags.*//g')
# Если тегов больше 1 нужно делать разбивку
tags=$(echo -e $strproblem|egrep -i '"tag":".*"'|sed 's|.*"tag":||'|sed 's/}].*//g')
# Сброс переменой
strproblem=""

#echo -e "Тест переменых :" $eventid $clock $name $tags

# Если триггер отрыт больше чем * по времени закрываем
data=`date +%c`
echo "Текущая дата :" $data
opendata=`date -d@$clock`
echo "Дата открытия триггера :" $opendata
# Unix, - это количество секунд, прошедших с 1 января 1970 года в 00:00:00 UTC, количество секунд от эпохи до текущего дня.
dataunix=`date +%s`
# Из текущей даты вычитаем дату срабатывания триггера
let "timepblem=$dataunix-$clock"
echo "разница :" $timepblem
if [ -n "${CLOSETIME}" ]; then
if [ -n "${clock}" ]; then
# Закрыть если дата больше или равно $CLOSETIME
if [ $timepblem -ge $CLOSETIME ]; then close_trigger &echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m";fi
fi;fi


sovpadenname=$(echo $vsename|egrep -i "$name"|sed "s/.*/$name/g")
echo "Совпадения имен :" $sovpadenname
#echo -e "\n"
#echo "Искомое имя"$name
#echo "текст для поиска"$vsename
#echo $vsename|grep -i "$name"
#echo -e "\033[33m"'триггер-eventid :' $eventid"\033[0m"
#echo -e "\n"

sovpadentags=$(echo $vsetags|egrep -i "$tags"|sed "s/.*/$tags/g")
echo "Совпадения тегов :" $sovpadentags

# В самом начале при открытии триггера были какие то ложные срабатывания при 4 парах дублей средние триггеры были как 3шт вместо 2х и закрывались полностью, а нетолько дубль.
# Если проходит 30-60 секунд после открытия все отрабатывает хорошо. Поэтому будем закрывать дубли которые открыти больше 1 минуты.
echo $timepblem "Больше-Равно чем: 40 секунд ?"
if [ $timepblem -ge 40 ]; then
# Если совпадения Имени триггера и Тегов найдены закрываем одинаковые триггеры
if [ $SOVPAD == 1 ]; then
if [ -n "${sovpadenname}" ]; then
if [ -n "${sovpadentags}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi; fi

# Если совпадения Имени триггера найдены закрываем одинаковые триггеры
if [ $SOVPAD == 2 ]; then
if [ -n "${sovpadenname}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi

# Если совпадения Тегов найдены закрываем одинаковые триггеры
if [ $SOVPAD == 3 ]; then
if [ -n "${sovpadentags}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi
fi
vsename=$vsename" $name"
#echo "Совпадает с именем ?" $name
#echo "Накопительная строка имен :" $vsename
vsetags=$vsetags" $tags"
#echo "Накопительная строка тегов :" $vsetags

# Сброс переменых в цикле
strproblem=""
name=""
sovpadenname=""
sovpadentags=""

done

outapi

Обновленый скрипт 28.03.2024
Вид-Совпадения:
1 - тег(имя+значение (берутся последние теги с триггера)) + Имени триггера;
2 - по Имени триггера;
3 - тег(имя+значение (берутся последние теги с триггера));
4 - Все теги (имя+значение) + Имени триггера;
5 - Все теги раздельно с триггера (имя+значение) + Имени триггера;
6 - Все имена тегов + Имени триггера;
7 - Все значения тегов + Имени триггера;
8 - Все теги (имя+значение);
9 - Все теги раздельно с триггера (имя+значение);
10 - Все имена тегов;
11 - Все значения тегов;

Код: Выделить всё

#!/bin/bash

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Пользователь'
zabbixPassword='Пароль'
#Конец пользовательских переменных
#***********************************************************************
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3
# Порт
PORT=${4:-10050}
# Оставить старый триггер новый закрыть=ASC (по умолчанию) - по возрастанию, Зкрыть старый оставить новый=DESC - по убыванию.
OLDNEW=${5:-ASC}
# Имя триггера
NAMETRIG=$6
if [[ "$NAMETRIG" != "" ]]; then nametriggers="\"description\": \"$NAMETRIG\",";else nametriggers=""; fi
# Закрыть по совпадению: тега и имени триггера -1; имени триггера -2; тегу -3.
SOVPAD=${7:-1}
# Закрыть триггер открытый больше чем по времени
CLOSETIME=$8
# Выборка по совпадению имени триггера, имени тега, значению тега через ; перечисление.
#filter=$9

#echo $IP $HOSTHOST $HOSTNAME $PORT $OLDNEW $NAMETRIG $SOVPAD $CLOSETIME >> triggclos.log

# Закрытие одинаковых триггеров в узле из режима множественный или подвиших триггеров более цать дней
# По имени узла получаем ID узла, запрашиваем триггеры в состоянии проблема

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

function exit_with_error() {
  echo '**********************************'
  echo -e "\033[1;31m""$errorMessage""\033[0m"
  echo '----------------------------------'
  echo 'Сформированная Команда выполнения'
  echo '----------------------------------'
  echo  curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
  echo '----------------------------------'
  echo 'Выходные данные'
  echo '----------------------------------'
  echo "$result"
  echo '**********************************'
  zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTHOST}" -k errordupltriggers -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}


#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo -e "\033[1;42m""Вход в систему выполнен успешно - Идентификатор авторизации: $auth""\033[0m"
errorMessage="";json="";result="";check="" # Очистка переменных


function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo -e "\033[1;42m"'Успешно вышел из Zabbix' "${logout}""\033[0m"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}


# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"


function close_trigger(){
#------------------------------------------------------
# Событие https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/event/acknowledge
#------------------------------------------------------
# Закрыть событие. Если событие уже решено, это действие будет пропущено.
# Подтвердить событие. Если событие уже подтверждено, это действие будет пропущено.
# Добавление комментария
# Изменение важности события. Если событие уже с такой же важностью, это действие будет пропущено.
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 6,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 1,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
echo -e "\033[1;31m""Авто-закрытие-триггеров-api:" $result "\033[0m"
errorMessage="";json="";result="";check="" # Очистка переменных
}

#------------------------------------------------------
# Получение узлов сети в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/host/get
#------------------------------------------------------
#errorMessage='*ERROR* - Не удается проверить узел сети'
#json="{\"jsonrpc\": \"2.0\",\"method\":\"host.get\",\"params\": {\"output\": [\"hostid\"],\"filter\": {\"host\": [\"$HOSTHOST\"]}},\"auth\":\"$auth\", \"id\": 1 }"
#result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
#check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
#if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
# Поиск Узла сети
#echo -e "Найденые Узлы сети:" "${result}"
#idhost=$(echo "${result}"|sed 's|.*hostid":"||'|sed 's|"}.*||')
#echo "ID Узла:"$idhost
#errorMessage="";json="";result="";check="" # Очистка переменных

#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"selectTriggerDiscovery\": [\"parent_triggerid\"], \"active\": true, \"monitored\": \"True\", \"output\": [\"triggerid\",\"description\",\"priority\",\"status\",\"value\"], \"expandComment\": \"True\", \"expandDescription\": \"True\",  \"expandExpression\": \"True\", \"filter\": {$nametriggers\"host\": \"$HOSTHOST\", \"value\": 1},\"sortfield\": \"priority\", \"sortorder\": \"DESC\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Разделим на строки
resultn=$(echo $result|sed 's/{"triggerid/\\n{"triggerid/g')
# Поиск триггера и получение его ID
triggerid=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"triggerid":"||'|sed 's/","description.*/;/g')
# Имя триггера
triggername=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"description":"||'|sed 's/","priority.*/;/g')
# Если триггер создан из прототипа, получаем ID прототипа триггера в узле
prototypetrigid=$(echo -e $resultn|egrep -i '"parent_triggerid":"[0-9]+"'|sed 's|.*"parent_triggerid":"||'|sed 's/"}.*/;/g')
#echo -e "\033[1;46m""Найденые триггеры :" $result"\033[0m"
echo -e "\033[1;46m""Получаем ID триггера :" $triggerid"\033[0m"
echo -e "\033[1;46m""Получаем ID прототипа триггера :" $prototypetrigid"\033[0m"
echo -e "\033[1;46m""Получаем имя триггера :" $triggername"\033[0m"
#echo -e "\033[1;46m""Важность триггера :""\033[0m"
#echo -e "\033[1;46m""Получаем тег :""\033[0m"
#echo -e "\033[1;46m""Время открытия триггера :""\033[0m"
errorMessage="";json="";result="";check="" # Очистка переменных

# Цикл переберм id пораздельности
IFS=';' read -ra razbivkatrigid < <(echo $triggerid$prototypetrigid|sed 's/\s//g')
for zavtrigid in "${razbivkatrigid[@]}"
do
#------------------------------------------------------
# Получение триггеров в статусе проблема https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/problem/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить проблемы'
json="{\"jsonrpc\": \"2.0\",\"method\":\"problem.get\",\"params\": \
{\"output\": \"extend\",\
\"acknowledged\": false,\
\"selectAcknowledges\": \"extend\",\
\"selectTags\": \"extend\",\
\"selectSuppressionData\": \"extend\",\
\"objectids\": \"$zavtrigid\",\
\"recent\": \"true\",\
\"sortfield\": [\"eventid\"],\
\"sortorder\": \"$OLDNEW\"},\
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Собираем данные
problem=$problem$result
errorMessage="";json="";result="";check="" # Очистка переменных
done

# Цикл | Разделим на строки
IFS=';' read -ra razproblem < <(echo $problem|sed 's/{"eventid/;{"eventid/g')
for strproblem in "${razproblem[@]}"
do
# Разберем значения в отдельные переменные
echo -e '\n'"\033[1;47m""Найденые Проблемы :" $strproblem"\033[0m"
# ID Проблемы
eventid=$(echo $strproblem|egrep -i '"eventid":"[0-9]+"'|sed 's|.*"eventid":"||'|sed 's/","source.*//g')
# Тип проблемы 0 - событие создано на триггер;3 - внутреннее событие.
#sources=$(echo $strproblem|egrep -i '"source":"[0-9]+"'|sed 's|.*"source":"||'|sed 's/","object.*//g')
# Тип объекта проблемы 0 - триггер; 4 - элемент данных;5 - правило LLD.
#object=$(echo $strproblem|egrep -i '"object":"[0-9]+"'|sed 's|.*"object":"||'|sed 's/","objectid.*//g')
# ID связанного объекта триггера (узла,шаблона).
#objectid=$(echo $strproblem|egrep -i '"objectid":"[0-9]+"'|sed 's|.*"objectid":"||'|sed 's/","clock.*//g')
# Время, проблеме было создано.
clock=$(echo $strproblem|egrep -i '"clock":"[0-9]+"'|sed 's|.*"clock":"||'|sed 's/","ns.*//g')
# Наносекунды, проблеме было создано.
#ns=$(echo $strproblem|egrep -i '"ns":"[0-9]+"'|sed 's|.*"ns":"||'|sed 's/","r_eventid.*//g')
# ID события восстановления.
#r_eventid=$(echo $strproblem|egrep -i '"r_eventid":"[0-9]+"'|sed 's|.*"r_eventid":"||'|sed 's/","r_clock.*//g')
# Время, восстановления было создано.
#r_clock=$(echo $strproblem|egrep -i '"r_clock":"[0-9]+"'|sed 's|.*"r_clock":"||'|sed 's/","r_ns.*//g')
# Наносекунды, восстановления было создано.
#r_ns=$(echo $strproblem|egrep -i '"r_ns":"[0-9]+"'|sed 's|.*"r_ns":"||'|sed 's/","correlationid.*//g')
# ID правила корреляции, если событие было решено при помощи глобального правила корреляции.
#correlationid=$(echo $strproblem|egrep -i '"correlationid":"[0-9]+"'|sed 's|.*"correlationid":"||'|sed 's/","userid.*//g')
# ID пользователя, если проблема была закрыта вручную.
#userid=$(echo $strproblem|egrep -i '"userid":"[0-9]+"'|sed 's|.*"userid":"||'|sed 's/","name.*//g')
# Имя проблемы.
name=$(echo -e $strproblem|egrep -i '"name":".*"'|sed 's|.*"name":"||'|sed 's/","acknowledged.*//g'|sed -e '/\s+$/d')
# Состояние подтверждения проблемы. 0 - не подтверждена; 1 - подтверждена.
#acknowledged=$(echo $strproblem|egrep -i '"acknowledged":"[0-9]+"'|sed 's|.*"acknowledged":"||'|sed 's/","severity.*//g')
# Текущая важность проблемы.
#severity=$(echo $strproblem|egrep -i '"severity":"[0-9]+"'|sed 's|.*"severity":"||'|sed 's/","acknowledges.*//g')
# Обновлений проблемы
#acknowledges=$(echo -e $strproblem|egrep -i '"acknowledges":".*"'|sed 's|.*"acknowledges":"[||'|sed 's/]","suppression_data.*//g')
# Возврат списка обслуживаний в свойстве maintenanceid - (строка) ID обслуживания; suppress_until - (целое число) время, до которого проблема подавлена.
#suppression_data=$(echo -e $strproblem|egrep -i '"suppression_data":".*"'|sed 's|.*"suppression_data":"[||'|sed 's/]","suppressed.*//g')
# Подавлена ли проблема или нет. 0 - нет, 1 - Да
#suppressed=$(echo -e $strproblem|egrep -i '"suppressed":".*"'|sed 's|.*"suppressed":"||'|sed 's/","tags.*//g')
# Если тегов больше 1 нужно делать разбивку, тут выводится 1 тег последний доступный имя+значение
tags=$(echo -e $strproblem|egrep -i '"tag":".*"'|sed 's|.*"tag":||'|sed 's/}].*//g')

# Все теги для 1 триггера, имя+значение тегов
vsetag=$(echo -e $strproblem|egrep -i '"tag":".*"'|sed 's|.*"tags":\[||'|sed 's/].*//g')
echo -e '\n'"\033[1;35m""Все теги для 1 триггера:" $vsetag"\033[0m"
# Раздельно Имя тега и Значение тега.
nametag=$(echo -e $vsetag |grep -o '"tag":"[^"]*","value"'|sed 's/"tag":"\([^"]*\)","value"/\1/g'|tr '\n' ';'|sed 's/^;*//g; s/;;*/;/g; s/;*$//g')
echo -e '\n'"\033[1;35m""Имена тегов:" $nametag"\033[0m"
valuetag=$(echo -e $vsetags|grep -o '"value":"[^"]*"'|sed 's/"value":"\([^"]*\)"/\1/g'|tr '\n' ';'|sed 's/^;*//g; s/;;*/;/g; s/;*$//g')
echo -e '\n'"\033[1;35m""Значения тегов:" $valuetag"\033[0m"
# Сброс переменой
strproblem=""

echo -e '\n'"\033[1;36m""Тест переменых:" $eventid $clock $name $tags"\033[0m"

# Если триггер отрыт больше чем * по времени закрываем
data=`date +%c`
echo -e "\033[1;36m""Текущая дата :" $data"\033[0m"
opendata=`date -d@$clock`
echo -e "\033[1;35m""Дата открытия триггера :" $opendata"\033[0m"
# Unix, - это количество секунд, прошедших с 1 января 1970 года в 00:00:00 UTC, количество секунд от эпохи до текущего дня.
dataunix=`date +%s`
# Из текущей даты вычитаем дату срабатывания триггера
let "timepblem=$dataunix-$clock"
echo -e "\033[1;33m""разница :" $timepblem"\033[0m"
if [ -n "${CLOSETIME}" ]; then
if [ -n "${clock}" ]; then
# Закрыть если дата больше или равно $CLOSETIME
if [ $timepblem -ge $CLOSETIME ]; then close_trigger &echo -e '\n'"\033[33m"'По-дате-Авто-закрытие-триггера-eventid:' $eventid"\033[0m";fi
fi;fi

# Проверка на совпадение имени триггера
sovpadenname=$(echo $vsename|egrep -i "$name"|sed "s/.*/$name/g")
echo -e '\n'"\033[1;43m""Совпадения имен :" $sovpadenname"\033[0m"
#echo -e "\n"
#echo "Искомое имя"$name
#echo "текст для поиска"$vsename
#echo $vsename|grep -i "$name"
#echo -e "\033[33m"'триггер-eventid:' $eventid"\033[0m"
#echo -e "\n"

# По одному последнему (имя+значение) тега с триггера
sovpadentags=$(echo $vsetags|egrep -i "$tags"|sed "s/.*/$tags/g")
echo -e '\n'"\033[1;43m""Совпадения тегов :" $sovpadentags"\033[0m"

# Проверим все (имя+значение) тегов одного триггера
# Разделить строки по разделителю
IFS=';' read -ra tag_array <<< "$vsetag"
# Вывести строки в нужном формате
for tagnamevalue in "${tag_array[@]}"
do
 sovpadentagn=$(echo $vsetagi|egrep -i "$tagnamevalue"|sed "s/.*/$tagnamevalue/g") # Сравниваем со всеми тегами повторения
 sovpadentag=$sovpadentag\;"$sovpadentagn" # Накопительная совподающих тегов
 sovpadentag=$(echo "$sovpadentag"|sed 's/^;*//g; s/;;*/;/g; s/;*$//g') # Убрать пустые значения
done
echo -e '\n'"\033[1;43m""Совпадения всех (имен+значений) тегов для 1 триггера:" $sovpadentag"\033[0m"

# Проверим каждую группу(имя+значение) тегов раздельно
# Разделить строки по разделителю
IFS=';' read -ra tag_array <<< "$(echo $vsetag|sed 's/},/};/g')"
# Вывести строки в нужном формате
for tagnamevaluesep in "${tag_array[@]}"
do
#  echo "TEST" $tagnamevaluesep
#  tag=$(echo "$tagnamevaluesep"|sed 's/{"tag":"\([^"]*\)".*/\1/')
#  value=$(echo "$tagnamevaluesep"|sed 's/.*"value":"\([^"]*\)".*/\1/')
#  echo "Tag: $tag"
#  echo "Value: $value"
sovpadentagsepn=$(echo $vsetagi|egrep -i "$tagnamevaluesep"|sed "s/.*/$tagnamevaluesep/g") # Сравниваем со всеми тегами по
sovpadentagsep=$sovpadentagsep\;"$sovpadentagsepn" # Накопительная совподающих тегов
sovpadentagsep=$(echo "$sovpadentagsep"|sed 's/^;*//g; s/;;*/;/g; s/;*$//g') # Убрать пустые
done
echo -e '\n'"\033[1;43m""Совпадения (имен+значений) тегов по раздельности 1 триггера:" $sovpadentagsep"\033[0m"

# Каждое имя тега раздельно проверка на совпадение
# Разделить строку по разделителю ;
IFS=';' read -ra tag_array <<< "$nametag"
# Вывести теги по очереди
for tagname in "${tag_array[@]}"
do
sovvsenametagn=$(echo $vsenametag|egrep -i "$tagname"|sed "s/.*/$tagname/g") # Сравниваем со всеми тегами повторения
sovvsenametag=$sovvsenametag\;"$sovvsenametagn"  # Накопительная совподающих тегов
sovvsenametag=$(echo "$sovvsenametag"|sed 's/;;*//g') # Убрать пустые значения
done
echo -e '\n'"\033[1;43m""Совпадение всех имен тегов :" $sovvsenametag"\033[0m"

# Каждое значение тега раздельно проверка на совпадение
# Разделить строку по разделителю ;
IFS=';' read -ra tag_array <<< "$valuetag"
# Вывести теги по очереди
for tagvalue in "${tag_array[@]}"
do
sovvsevaluetagn=$(echo $vsevaluetag|egrep -i "$tagvalue"|sed "s/.*/$tagvalue/g") # Сравниваем со всеми тегами повторения
sovvsevaluetag=$sovvsevaluetag\;"$sovvsevaluetagn"  # Накопительная совподающих тегов
sovvsevaluetag=$(echo "$sovvsevaluetag"|sed 's/;;*//g') # Убрать пустые значения
done
echo -e '\n'"\033[1;43m""Совпадения всех значений тегов :" $sovvsevaluetag"\033[0m"


# В самом начале при открытии триггера были какие то ложные срабатывания при 4 парах дублей средние триггеры были как 3шт вместо 2х и закрывались полностью, а нетолько дубль.
# Если проходит 30-60 секунд после открытия все отрабатывает хорошо. Поэтому будем закрывать дубли которые открыти больше 1 минуты.
echo -e '\n'"\033[1;44m"$timepblem "Больше-Равно чем: 40 секунд ?""\033[0m"
if [ $timepblem -ge 40 ]; then
# Если совпадения Имени триггера и Тегов нAайдены закрываем одинаковые триггеры
if [ $SOVPAD == 1 ]; then
  if [ -n "${sovpadenname}" ]; then
    if [ -n "${sovpadentags}" ]; then
    close_trigger
    echo -e "\033[1;33m"'1-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
fi; fi; fi

# Если совпадения Имени триггера найдены закрываем одинаковые триггеры
if [ $SOVPAD == 2 ]; then
  if [ -n "${sovpadenname}" ]; then
    close_trigger
    echo -e "\033[1;33m"'2-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
fi; fi

# Если совпадения Тегов найдены закрываем одинаковые триггеры
if [ $SOVPAD == 3 ]; then
  if [ -n "${sovpadentags}" ]; then
    close_trigger
    echo -e "\033[1;33m"'3-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi; fi
fi

# 4 - Все теги (имя+значение) + Имени триггера
if [ $SOVPAD == 4 ]; then
  if [ -n "${sovpadenname}" ]; then
    if [ -n "${sovpadentag}" ]; then
      close_trigger
      echo -e "\033[1;33m"'4-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi; fi
fi

# 5 - Все теги раздельно с триггера (имя+значение) + Имени триггера
if [ $SOVPAD == 5 ]; then
  if [ -n "${sovpadenname}" ]; then
    if [ -n "${sovpadentagsep}" ]; then
      close_trigger
      echo -e "\033[1;33m"'5-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi; fi
fi

# 6 - Все имена тегов + Имени триггера
if [ $SOVPAD == 6 ]; then
  if [ -n "${sovpadenname}" ]; then
    if [ -n "${sovvsenametag}" ]; then
      close_trigger
      echo -e "\033[1;33m"'6-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi; fi
fi

# 7 - Все значения тегов + Имени триггера
if [ $SOVPAD == 7 ]; then
  if [ -n "${sovpadenname}" ]; then
    if [ -n "${sovvsevaluetag}" ]; then
      close_trigger
      echo -e "\033[1;33m"'7-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi; fi
fi

# 8 - Все теги (имя+значение)
if [ $SOVPAD == 8 ]; then
  if [ -n "${sovpadentag}" ]; then
  #if [ -n "${sovvsenametag}" ]; then
  #if [ -n "${sovvsevaluetag}" ]; then
    close_trigger
    echo -e "\033[1;33m"'8-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi
fi

# 9 - Все теги раздельно с триггера (имя+значение)
if [ $SOVPAD == 9 ]; then
  if [ -n "${sovpadentagsep}" ]; then
  #if [ -n "${sovvsenametag}" ]; then
  #if [ -n "${sovvsevaluetag}" ]; then
    close_trigger
    echo -e "\033[1;33m"'9-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi
fi

# 10 - Все имена тегов
if [ $SOVPAD == 10 ]; then
  if [ -n "${sovvsenametag}" ]; then
    close_trigger
    echo -e "\033[1;33m"'10-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi
fi

# 11 - Все значения тегов
if [ $SOVPAD == 11 ]; then
  if [ -n "${sovvsevaluetag}" ]; then
    close_trigger
    echo -e "\033[1;33m"'11-Авто-закрытие-триггера-eventid:' $eventid"\033[0m"
  fi
fi


vsename=$vsename" $name"
#echo -e '\n'"\033[1;47m""Совпадает с именем ?" $name"\033[0m"
#echo -e '\n'"\033[1;47m""Накопительная строка имен:" $vsename"\033[0m"
vsetags=$vsetags" $tags"
echo -e '\n'"\033[1;47m""Накопительная строка (по 1 последнему с триггера) тегов:" $vsetags"\033[0m"
vsetagi=$vsetagi\;"$vsetag"
vsetagi=$(echo "$vsetagi"|sed 's/^;*//g; s/;;*/;/g; s/;*$//g') # Убрать пустые значения
echo -e '\n'"\033[1;47m""Накопительная все теги:" $vsetagi"\033[0m"
vsenametag=$vsenametag\;"$nametag"
vsenametag=$(echo "$vsenametag"|sed 's/^;*//g; s/;;*/;/g; s/;*$//g') # Убрать пустые значения
echo -e '\n'"\033[1;47m""Накопительная всех имен тегов:" $vsenametag"\033[0m"
vsevaluetag=$vsevaluetag\;"$valuetag"
vsevaluetag=$(echo "$vsevaluetag"|sed 's/^;*//g; s/;;*/;/g; s/;*$//g') # Убрать пустые значния
echo -e '\n'"\033[1;47m""Накопительная всех значений тегов:" $vsevaluetag"\033[0m"

# Сброс переменых в цикле
strproblem=""
name=""
sovpadenname=""
sovpadentags=""
sovpadentag=""
sovvsenametag=""
sovvsevaluetag=""
sovpadentagsep=""

done

outapi
Скачать скрипт
duplicate-triggers-close.sh.zip
duplicate-triggers-close.sh.zip
(6.29 КБ) 0 скачиваний
количество слов: 3419

Вернуться в «API Zabbix»