Ad Widget

Collapse

Значение элемента данных в протопите элемента данных

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • DShegolkov1
    Junior Member
    • Dec 2025
    • 4

    #1

    Значение элемента данных в протопите элемента данных

    Коллеги, приветствую.
    Исходные данные:
    Имеется прототип элемента данных. Строковое значение. Длина строки больше 2048.
    Имеется внешняя проверка, которая обрабатывает переменную (строка) и возвращает результат.
    Задача:
    Создать прототип элемента результатом которого является внешняя проверка аргументом которой является значение прототипа.


    Подскажите, пожалуйста, можно ли в качестве аргумента прототипа данных использовать значение прототипа другого элемента данных?
    Пытаюсь в качестве аргумента прототипа элемента данных (внешняя проверка) в "ключ" положить ключевое значение прототипа аргумента - ошибка некорректный синтаксис около "]".
    Со скобками - все нормально.
    Положить аргумент в макрос - не позволяет длина строки - больше 2048
    Версия 7.4.5.
    Click image for larger version

Name:	изображение.png
Views:	44
Size:	18.0 KB
ID:	509677


  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Честно говоря, не очень понятно, что вы подразумеваете под "значением прототипа". Значение будет у конкретного элемента данных, который создан из прототипа.
    Со скобками всё НЕ нормально (собственно, на это и ругается - у вас вложенные квадратные скобки); но ваш вопрос не об этом.

    Но если я правильно вас понял, то вы пытаетесь сделать следующее:
    • сделать один прототип элемента данных (cert.pem.[{#CERT_SERIALNUMBER}]), где сгенерированный из этого прототипа элемент данных будет по серийному номеру сертификата (макрос {#CERT_SERIALNUMBER}​) получать значение этого сертификата (в виде длинной текстовой строки, больше 2048 символов - видимо, в формате PEM);
    • сделать другой прототип, где сгенерированный из него элемент данных будет брать значение, полученное первым элементом данных (ту самую длинную текстовую строку), и передавать его в качестве параметра внешнему скрипту, чтобы тот вернул что-то ещё (судя по названию, дату окончания срока годности сертификата).
    Так работать не будет, как минимум по двум причинам. Во-первых, такие конструкции не поддерживаются Zabbix'ом; во-вторых - даже если бы поддерживались, то при вызове внешнего скрипта у операционной системы есть ограничение на длину передаваемых ему параметров (обычно этого не замечают, но если строка реально длинная - на это ограничение можно наткнуться).

    Что можно сделать? Я тут вижу два варианта, но оба не очень хороших:
    Вариант 1: писать свой внешний скрипт, который будет и извлекать сертификат, и проверять срок его действия, а назад возвращать уже готовый результат (без хранения в базе Zabbix'а его полного значения);
    Вариант 2: переносить проверку значения этого сертификата из внешнего скрипта в JavaScript, который будет работать в качестве шага предобработки (либо непосредственно первого элемента данных, либо зависимого от него).

    У меня, кстати, первый вариант вполне успешно работает (в ситуации, когда для некой прикадной программы сертификат хранится в базе данных, и во внешнем скрипте мы сначала ходим к этой базе и SQL-запросом его оттуда извлекаем, а затем выдёргиваем из него дату окончания срока действия и, сравнивая с текущей датой, возвращаем оставшееся количество дней).​

    Comment

    • DShegolkov1
      Junior Member
      • Dec 2025
      • 4

      #3
      Коллеги, приветствую.
      Kos, спасибо за подсказку. С первым и вторым вариантом вы правы.
      С передачей параметра скрипты большой длины - тут тоже правы.
      JavaScript (Duktape), который используется в Zabbix, не работает с SSL.
      Оптимальный вариант - делать полноценный внешний скрипт, который будет обрабатывать PEM сертификат и возвращать данные. В моем случае NotBefore, NotAfter.
      Еще раз спасибо.

      Comment

      • Kos
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • Aug 2015
        • 3404

        #4
        Чтобы не изобретать велосипед, я приложу свой скрипт, о котором упоминал (забирает сертификат в виде строки формата PEM из базы данных, проверяет его срок годности и возвращает количество оставшихся дней). Конкретный SELECT к базе я замаскирую (в данном случае он неважен), для вас важна последующая логика обработки срока годности.
        Code:
        #!/bin/bash
        # Author: Constantin Oshmyan, (C) 2023
        
        if [ $# -lt 3 ]
        then
            printf "Usage:\n\t$0 <DSN> <User> <Password>\n"
            printf "Returns: the number of days till certificate expiration (-65535 if some error occured)\n"
            exit 1
        fi
        
        DSN="$1"
        USER="$2"
        PASS="$3"
        DAYS_LEFT=-65535
        SQL="select value from [...] where id = '[...]'"
        DATE_CUR=$(date +%s)
        
        CERT=$(echo "$SQL" | isql -x0x09 -b -L4000 "$DSN" "$USER" "$PASS" 2>/dev/null) \
          && DATE_EXP=$(openssl x509 -enddate -noout <<< "$CERT" 2>/dev/null) \
          && DATE_EXP=$(date -d "${DATE_EXP#*=}" +%s) \
          && DAYS_LEFT=$(( ($DATE_EXP - $DATE_CUR)/(3600*24) ))
        
        printf "%s\n" $DAYS_LEFT

        Comment

        • DShegolkov1
          Junior Member
          • Dec 2025
          • 4

          #5
          Коллеги, приветствую.
          Kos, спасибо за информацию.

          У меня аналогичная задача. Необходимо мониторить сертификаты CUCM. Они хранятся в базе Infomix в формате PEM. В базе нет данных startdate и enddate. Почему индусы так сделали - не знаю.

          Элемент данных HTTP агент. Тип запроса - POST

          1. Получаю серийные номера сертификатов из базы CUCM

          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/{$CUCMDB_VERSION}">
          <soapenv:Header/>
          <soapenv:Body>
          <ns:executeSQLQuery>
          <sql>select serialnumber, subjectname, issuername from certificate</sql>
          </ns:executeSQLQuery>
          </soapenv:Body>
          </soapenv:Envelope>

          2. Скриптом выдергиваю сертификат из базы CUCM (Curl POST). openssl получаю startdate и enddate в вормате timestamp и передаю в Zabbix.
          (прошу не пинать - времени не было красиво расчесать).

          #!/usr/local/bin/bash

          NODENAME=$1
          SERIALNUMBER=$2
          AXLUSERNAME=$3
          AXLPASSWORD=$4
          CUCMVERSION=$5

          XMLCERT=$(/usr/local/bin/curl -s -k \
          -H 'Content-type: text/xml' \
          -H 'SOAPAction: "CUCMB ver='$CUCMVERSION' executeSQLQuery"' \
          -u $AXLUSERNAME:$AXLPASSWORD \
          -d '<?xml version="1.0" encoding="UTF-8"?>
          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/'$CUCMVERSION'">
          <soapenv:Header/>
          <soapenv:Body>
          <ns:executeSQLQuery>
          <sql>select certificate from certificate where serialnumber='\'$SERIALNUMBER\''</sql>
          </ns:executeSQLQuery>
          </soapenv:Body>
          </soapenv:Envelope> ' \
          https://$NODENAME:8443/axl/)

          CERT=$(echo $XMLCERT | /usr/local/bin/xml select -t -v '//certificate')

          NotBefore=$(echo $CERT | sed 's/ CERTIFICATE/___CERTIFICATE/g'|sed "s/ /\n/g"|sed "s/___CERTIFICATE/ CERTIFICATE/g" | openssl x509 -inform PEM -noout -startdate | cut -d= -f2 | xargs -I {} date -j -f "%b %d %H:%M:%S %Y GMT" {} "+%s")

          NotAfter=$(echo $CERT | sed 's/ CERTIFICATE/___CERTIFICATE/g'|sed "s/ /\n/g"|sed "s/___CERTIFICATE/ CERTIFICATE/g" | openssl x509 -inform PEM -noout -enddate | cut -d= -f2 | xargs -I {} date -j -f "%b %d %H:%M:%S %Y GMT" {} "+%s")

          echo '{"startdate":'$NotBefore',"enddate":'$NotAfter' }'

          Last edited by DShegolkov1; Today, 03:47.

          Comment

          Working...