Непонятки в dbquery.nsm

Started by slako, January 25, 2016, 12:08:08 PM

Previous topic - Next topic

slako

Имеем 2.0.1 сервер и агент. Оба виндовые( сервер win2003, агент win7sp1).
Задача - складывать в DCI размер определенной базы данных.
1. Конфиг агента подгружаем с сервера плюс добавляем полиси подгрузки нужного субагента:
SubAgent = dbquery.nsm
*DBQUERY
Database = id=mystat;driver=mysql.ddr;server=10.10.0.1;dbname=mystat;login=mylogin;password=mypassword

В результате в логе имеем:
[25-Jan-2016 14:44:39.922] [ERROR] DB Library: Unable to load database driver module "mysql.ddr": The specified module could not be found.

При этом <папка агента>\bin\mysql.ddr на месте.
Почемуто - не видит этот модуль.

2. Эксперимент с другой (MSSQL 2005) базой через другой полиси:
SubAgent = dbquery.nsm
*DBQUERY
Database = id=master;driver=mssql.ddr;server=10.10.0.2;dbname=master;login=newlogin;password=newpass

В логе получаем
[25-Jan-2016 14:40:47.505] [WARN ] DBQUERY: cannot connect to database master ([Microsoft][SQL Server Native Client 10.0][SQL Server]Login failed for user 'newlogin'.)

при этом такой юзер в базе прописан и без проблем доступается через студио.

slako

Проблема 1 (mysql) ушла на 2.0.2.
Проблема 2 без изменений.

slako

Разобрался с проблемой 2 - в реале значение mypassword (см выше) содержало символ решетки #, и видать поэтому пароль обрезался при чтении такого полиси, поскольку тут это знак коммента.
Отсюда вопрос - как экранировать такой символ в полиси?

slako

#3
Попутно еще один вопрос.
В DCI складываю текущий размер какой-либо базы данных в MBytes. Необходимо установить diff threshold который бы отслеживал порог увеличения в процентах от предыдущего значения. Как лучше это сделать?
Есть ли в Transformation возможность получить предыдущее значение?

kozlov_ao

diff можно получить выстатвив step1 в трансформации simple delta, но это будет абсолютное значение.. если надо % вычисять, то создавай еще один DCI, который будет получать общий размер БД и потом работай с ним через GetDCIValueByName и ему подобных (https://wiki.netxms.org/wiki/NXSL_Function_Reference). Ну или в  том же скрипте пользовать AgentReadParameter (но это доп.нагрузка)

Alex Kirhenshtein

Самый простой способ – использовать Encrypted password (на самом деле он obfuscated, конечно):

~/Development/netxms/netxms (develop↑1|...)% nxencpasswd login 'pa##ss'
7tiMbU5NgTZyfMtrUkpSO3J8y2tSSlI7cnzLa1JKUjs=


dbquery распознает, что это обфусцированный пароль:

Database = id=master;driver=mssql.ddr;server=10.10.0.2;dbname=master;login=newlogin;password=7tiMbU5NgTZyfMtrUkpSO3J8y2tSSlI7cnzLa1JKUjs=

Quote from: slako on February 04, 2016, 08:27:23 AM
Разобрался с проблемой 2 - в реале значение mypassword (см выше) содержало символ решетки #, и видать поэтому пароль обрезался при чтении такого полиси, поскольку тут это знак коммента.
Отсюда вопрос - как экранировать такой символ в полиси?

slako

Quote from: kozlov_ao on February 08, 2016, 10:14:06 AM
.. если надо % вычисять, то создавай еще один DCI, который будет получать общий размер БД и потом работай с ним через GetDCIValueByName и ему подобных (https://wiki.netxms.org/wiki/NXSL_Function_Reference).
так и сделал - 2 DCi с одинаковыми запросами вытягивающие размер БД. В одном из них скрипт пересчитывает в процентный diff вытягивая из другого предыдущий размер. Очередность пулинга DCI задал жестко через шедулер. Вот такой получился костыль.

Quote from: Alex Kirhenshtein on February 08, 2016, 10:40:25 AM
Самый простой способ – использовать Encrypted password (на самом деле он obfuscated, конечно):
Точно, что-то я про него и забыл. Спасибо!