Главная

Saturday, 22 July 2023

Invalid arithmetic operator в Zabbix.


Всем привет.

SSL (TLS) сертификаты стали важным компонентом современной инфраструктуры, поэтому администратору нужно следить за тем, чтобы они не истекали и вовремя их обновлять. Удобно отслеживать срок действия SSL сертификатов на ваших сайтах с помощью системы мониторинга Zabbix.

В ранних версиях Zabbix для мониторинга SSL сертификатов приходилось использовать консольные скрипты, которые передают значения в Zabbix через UserParameter. В Zabbix Agent 2 появись возможность получения информации о сертификате с помощью встроенного плагина WebCertificate. 

Вот здесь рассмотрены оба способа мониторинга срока действия SSL.

По второму способу скажу сразу что скрипт автора /usr/lib/zabbix/externalscripts/sslcert_expiration.sh однозначно рабочий:

#!/bin/bash

data=`echo | openssl s_client -servername $1 -connect $1:${2:-443} 2>/dev/null | openssl x509 -noout -enddate | sed -e 's#notAfter=##'`

ssldate=`date -d "${data}" '+%s'`

nowdate=`date '+%s'`

diffdate="$((${ssldate}-${nowdate}))"

echo $((${diffdate}/86400))

Кстати им же можно проверять сертификаты и на сереверах в локальной сети предприятия.

Но есть нюас.) В Linux без них никуда. При его тестировании на моем сервере Zabbix выскочил глюк на определении diffdate, что ему не делал скрипт тут падал в ошибку: «syntax error: invalid arithmetic operator (error token is «.

Решил я прибегнуть к помощи ChatGPT, сейчас это модно. Далее приведу варианты его решения которые он мне предлагал вчера вечером. Показываю только то те строки где он предлагал изменить в исходном коде для устранения ошибки:

1)

data=$(echo | openssl s_client -servername "$1" -connect "$1":${2:-443} 2>/dev/null | openssl x509 -noout -enddate | awk -F '=' '{print $2}')

2)

diffdate=$((`date -d "$ssldate" '+%s'`- `date -d "$nowdate" '+%s'`))

3)

# Using Python to calculate the difference in seconds

diffdate=$(python -c "from datetime import datetime; print(int((datetime.strptime('$data', '%b %d %H:%M:%S %Y %Z') - datetime.now()).total_seconds()))")

4)

# Retrieve the SSL certificate end date

data=$(echo | openssl s_client -servername "$1" -connect "$1":${2:-443} 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter' | cut -d '=' -f 2)

5)

# Calculate the difference in seconds using 'bc' command

diffdate=$(echo "$ssldate - $nowdate" | bc)


Проверка решений своим поиском по Google привела к тем же вариантам, так что ChatGPT не соврал. Но увы, ни один из способов к успеху не привел. Видно хорошо был сформатирован код моего Zabbix appliance.

Надеюсь вам повезет больше. Удачи.

2 comments:

  1. # cat /etc/zabbix/scripts/sslcheck/ssl_check.sh
    #!/bin/sh
    SERVER=$1
    TIMEOUT=25
    RETVAL=0
    TIMESTAMP=`echo | date`
    if [ -z "$2" ]
    then
    PORT=443;
    else
    PORT=$2;
    fi
    EXPIRE_DATE=`echo | openssl s_client -connect $SERVER:$PORT -servername $SERVER 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2`
    EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s`
    EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` ))
    if test $EXPIRE_TIME -lt 0
    then
    RETVAL=0
    else
    RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 ))
    fi
    echo ${RETVAL}

    ReplyDelete
  2. #!/bin/sh
    #Prepared by Marcin 'szremo' Szremski'
    #setenv LC_ALL en_GB.UTF-8
    LC_ALL=en_GB.UTF-8
    export LC_ALL

    SSL_DATE=$(echo | /usr/local/bin/openssl s_client -servername $1 -connect $1:443 2>/dev/null | /usr/local/bin/openssl x509 -noout -dates | /usr/bin/grep notAfter | /usr/bin/awk -F = '{ print $2 }' | /usr/bin/awk 'BEGIN {OFS = "-"} {print $1,$2,$4}')
    #echo $SSL_DATE
    EXPTIME=$(/bin/date -j -f "%b-%d-%Y" $SSL_DATE +%s)
    #echo $EXPTIME
    TODAY=$(/bin/date +"%b-%d-%Y")
    #echo $TODAY
    CURRENT=$(/bin/date -j -f "%b-%d-%Y" $TODAY +%s)
    #echo $CURRENT
    LC_ALL=ru_RU.UTF-8
    export LC_ALL
    NUM=$(($EXPTIME - $CURRENT))
    RESULT=$(($NUM/86400))
    echo $RESULT​

    ReplyDelete

А что вы думаете по этому поводу?