Занятые лицензии интранет версии Консультант+ в Zabbix

консультант плюс в zabbix

В прошлом году мы перевели наше предприятие на использование Интранет версии правовой системы Консультант плюс. Сделано это было в большей степени ради отказа от тяжелого сервера терминалов для стандартной сетевой версии Консультант+ в пользу использования веб-версии.

Не буду описывать здесь саму процедуру установки, она хорошо документирована самим разработчиком. Поделюсь лишь решением, которое мне пришлось изобрести, чтобы отслеживать количество используемых лицензий Консультант+. Для эих целей был написан простенький скрипт на Python и добавлен счетчик в системе мониторинга Zabbix.

Анализ логов интранет версии Консультант+

Информация обо всех сессиях и используемых лицензиях пишется в файл C:\inetpub\wwwroot\cons\system\srvprot.txt. Структура у файла следующая:

ДД.ММ.ГГГГ ЧЧ:ММ:СС.МСК Действие                ИД сессии             Комплект   Кол-во сессий Логин                            Токен        Статус сессии Статус операции
04.10.2022 15:11:00.502 TokenUpdated 53E87AE9D81B4DC8B15F6BF30EE91BD6 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:03.673 TokenUpdated DC432C147B6C4E37805C31E0B98C20FD 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:07.048 TokenUpdated 53E87AE9D81B4DC8B15F6BF30EE91BD6 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:12.139 TokenUpdated D671E828CE524B7882B878817CEC9870 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:12.233 TokenUpdated D671E828CE524B7882B878817CEC9870 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:12.288 TokenUpdated 53E87AE9D81B4DC8B15F6BF30EE91BD6 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:12.383 TokenUpdated D671E828CE524B7882B878817CEC9870 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:13.325 TokenUpdated 53E87AE9D81B4DC8B15F6BF30EE91BD6 2280404505 00000250                                                    Invalid       FAIL
04.10.2022 15:11:13.955 Delete       5249C8085F114FEBA8C95C81626DAF1B 2280404505 00000250      DOMAIN2\User2                                 LoggedIn      OK
04.10.2022 15:11:15.341 TokenUpdated D671E828CE524B7882B878817CEC9870 2280404505 00000249                                                    Invalid       FAIL
04.10.2022 15:11:15.428 Create       86F1FC3F8B904A6C886095D656AA4A3F 2280404505 00000250      DOMAIN\User1                                  LoggedIn      OK
04.10.2022 15:11:19.821 TokenUpdated 610EC81239BC44288E5FCF05AF503175 2280404505 00000250                                                    Invalid       FAIL

Как можно увидеть в предпоследнем столбце записывается количество открытых сессий, а следовательно их количество можно получить просто проверив последнюю строку и указанный столбец данного файла.

Скрипт количество открытых сессий Консультант+

Уведомления о количестве свободных лицензий Консультант плюс в Zabbix
Сообщения о том, что лицензии заканчиваются в дашборде Zabbix

Скрипт написан на Python, соответственно на сервере с Консультант+ должен быть установлен данный интерпретатор.

import sys
import os
import re

from datetime import datetime

current_date = datetime.now().strftime("%Y-%m")
cfile=f"C:\inetpub\wwwroot\cons\system\SVRPROTSVRPROT._{ current_date }.TXT"

bufsize = 8192
lines = 1
fsize = os.stat(cfile).st_size

iter = 0
with open(cfile) as f:
    if bufsize > fsize:
        bufsize = fsize-1
    data = []
    while True:
        iter +=1
        f.seek(fsize-bufsize*iter)
        data.extend(f.readlines())
        if len(data) >= lines or f.tell() == 0:
            line=''.join(data[-lines:])
            res=line.split()
            print(int(res[5]))
            break

Данный скрипт размещаем в папке Zabbix агента на сервере Консультант+ и создаем пользовательскую команду в конфигурационном файле Zabbix агента:

UserParameter=cons_lic[*],C:\Python\Python38\python.exe "C:\Zabbix\plugins\check_cons_lic.py"

Ну а в настройках хоста на сервере Zabbix создаем соответствующий элемент и триггеры.

Добавление счетчика в Zabbix для учета количества лицензий Консультант+
Настройка элемента количество занятых лицензий Консультант+ в Zabbix
Триггеры Zabbix для оповещения о закончившихся лицензиях консультант плюс
Триггеры, которые срабатывают при достижении определенного уровня занятых лицензий.

Подсчет количества лицензий Консультант+ по доменам

Если у вас многодоменная сеть, то вероятно имеет смысл считать по количеству занятых пользовательских лицензий по каждому домену. В решении этой задачи я не придумал ничего лучше как считать количество открытых сессий по каждому пользователю учитывая строки в которых создается (create) сессия и вычитая строки, в которых сессия закрывается (delete). Ночью все сессии закрываются, поэтому я решил обрабатывать строки только за текущую дату, хотя сам файл конечно проходит весь и на производительность это не влияет. Лог файл размером 180 мб обрабатывается пару секунд.

import sys, os, re, io
from datetime import datetime

now = datetime.now()
current_date = datetime.now().strftime("%Y-%m")
cfile=f"C:\inetpub\wwwroot\cons\system\SVRPROTSVRPROT._{ current_date }.TXT"


#проверка аргументов коммандной строки. принимает единственный параметр - имя домена по которому вывести количество сессий
if len(sys.argv)>1:
    checkdom = sys.argv[1].upper()
else:
    checkdom = ''

#список доменов
domains={'DOMAIN1':0, 'DOMAIN2':0, 'DOMAIN3':0}

date=now.strftime("%d.%m.%Y,")
iter = 0
users=set()
with io.open(cfile, encoding='windows-1251', errors='ignore') as lic:
    for line in lic:
        rec=line.split()
        if rec[2]!="SetAuth":
            if rec[0]==date:
                dom=rec[6].split('\\')
                if rec[2]=='Create':
                    users.add(rec[6])
                if rec[2]=='Delete':
                    users.discard(rec[6])
for user in users:
   dom=user.split('\\')
   domains[dom[0].upper()]+=1

#если не указан конкретный домен выводит список доменов с количеством открытых сессий по каждому домену    
if checkdom != '':
    print(domains[checkdom])
else:
    for domain,cnt in domains.items():
        print(domain,cnt)

Необходимо в начале скрипта перечислить список доменов по которым вести подсчет. Чтобы использовать скрипт в Zabbix необходимо запускать его с параметром передав имя домена. Вот как это настраивается в конфигурации Zabbix агента:

UserParameter=cons_lic_ltd[*],C:\Python\Python38\python.exe "C:\Zabbix\plugins\opensessions.py" $1

В настройках элемента на сервере Zabbix указываем в домен.

Учет количества лицензий Консультант+ по доменам в Zabbix
Указываем в квадратных скобках элемента имя домена в нужном регистре.

Далее по собранным данным можно строить графики и понимать кто использует больше лицензий чем положено. Так же можно доработать скрипт для определения кто конкретно, какие пользователи, занимают лицензии.

Ротация логов Консультант+ интранет версии

Спустя некоторое время заметил, что скрипт долго отрабатывает подсчет по доменам, если файл логов интранет-версии Консультант+ (C:\inetpub\wwwroot\cons\system\srvprot.txt) разрастается до больших размеров. Например при разросшемся размере до 1 гигабайта подсчет лицензий по доменам выходил за установленные таймауты элемента. Решить можно увеличив таймауты в Zabbix или подрезав логи Консультант+. Я пошёл по второму пути и раз в неделю обрезаю логи простым скриптом rotate_cons_log.bat:

mkdir C:\inetpub\wwwroot\cons\system\logs\
move C:\inetpub\wwwroot\cons\system\SRVPROT.TXT C:\inetpub\wwwroot\cons\system\logs\SRVPROT_%date%.txt
forfiles.exe -p C:\inetpub\wwwroot\cons\system\logs\ -d -90 -m *.txt -c "cmd /c del /q @path"

Данный скрипт создает папку для хранения старых логов, перемещает текущий лог в эту папку с указанием даты в имени файла, в конце ону удаляет в этой папке файлы логов старше 90 дней.

Рекомендую запускать раз в неделю в выходной день, либо раз в месяц, чтобы не сбрасывать в ноль данные подсчета по доменам.

Для удобства загрузил скрипты на GitHub.

https://github.com/dkplayer/consplus_zabbix_lic

Зеркало на GitFlick

https://gitflic.ru/project/dkplayer/consplus_zabbix_lic

Установка и настройка системы мониторинга Zabbix разобрана тут.

Замечания, предложения, конструктивная критика приветствуются в комментарии!

Константин Дьяченко

Классический сисадмин с 1997 г.