News:

We really need your input in this questionnaire

Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - IFriendly

#1
Добрый день!

Обнаружил ложное срабатывание при опросе конфигурации через агента (2.2.2, Linux Centos 7)
Решил проблему NXSL-фильтром на обработчике событий.

Но ситуация в принципе не корректная.

Причина в следующем.

Опрос ПО и установленных пакетов идет через агента по System.InstalledProducts событию и в хендлере H_InstalledProducts()
...
      command = "/bin/rpm -qa --queryformat '@@@ #%{NAME}:%{ARCH}|%{VERSION}|%{VENDOR}|%{INSTALLTIME}|%{URL}|%{SUMMARY}\\n'";
...

Интересующая часть результата опроса:
....
@@@ #gpg-pubkey:(none)|f4a80eb5|(none)|1512394964|(none)|gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>)
@@@ #gpg-pubkey:(none)|352c64e5|(none)|1512410575|(none)|gpg(Fedora EPEL (7) <[email protected]>)
@@@ #gpg-pubkey:(none)|442df0f8|(none)|1512403038|(none)|gpg(PostgreSQL RPM Building Project <[email protected]>)
.....

Обработка полученного результата идет на сервере в Node::updateSoftwarePackages()
...
SoftwarePackage *pkg = SoftwarePackage::createFromTableRow(table, i);
packages->add(pkg);
...
packages->sort(PackageNameComparator);

Компаратор производит сравнение по имени пакета, но имена из примера выше одинаковые.

static int PackageNameComparator(const SoftwarePackage *p1, const SoftwarePackage *p2)
{
   return _tcscmp((*p1)->getName(), (*p2)->getName());
}

В таких случаях хорошо бы сравнивать еще и по описанию, но метода для доступа к приватному полю в классе SoftwarePackage нет:

class SoftwarePackage{
...
public:
   ~SoftwarePackage();

   void fillMessage(NXCPMessage *msg, UINT32 baseId) const;
   const TCHAR *getName() const { return m_name; }
   const TCHAR *getVersion() const { return m_version; }

   static SoftwarePackage createFromTableRow(const Table table, int row);
};

Ложное срабатывание происходит при поиске:
         SoftwarePackage *p = m_softwarePackages->get(i);
         SoftwarePackage np = (SoftwarePackage )packages->find(p, PackageNameComparator);

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

Решение:
1. Добавить методы в класс SoftwarePackage для доступа к описанию пакета.
2. В случае одинаковых имен пакетов в компараторе провести сравнение по описанию.

Также можно расширить запрос rpm на один столбец: %{Packager} и сравнивать не по описанию, а по %{Packager}-у, при этом необходимо будет расширить таблицу с сохраненными параметрами пакетов (аналогично и для deb-пакетов).

#2
Общие вопросы / Feature Request #130
November 07, 2014, 11:12:59 PM
Добрый день!

Вопрос о реализации функционала

https://www.radensolutions.com/chiliproject/issues/130

Можно ли расчитывать на имплементацию в ближайшие релизы или может быть посоветуете способ, как реализовать на существующем функционале (например, установкой отдельных экземпляров серверов NetXMS для различных категорий пользователей, т.е. произвести настройку пересылки фильтрованных Event с центрального сервера NetXMS на "подчиненные" в зависимости от типа события: security_event, network_event, server_event, appl_event,...)? ИМХО не самый лучший и оптимальный способ...

Спасибо.

PS
Предыдущий пост по этой теме:
https://www.netxms.org/forum/oe-oo/o-ota-omota-ot/
#3
Добрый день!

Помогите пожалуйста разобраться в причине почему не отсылается русский текст (кодировка 1251) через nxevent на Linux сборке.

Конфигурация
1) Сервер. Linux SL 6.5. x86/Postgres. 1.2.16. netxms.conf->CodePage = CP1251
2) Клиент. Linux SL 6.5. x86. 1.2.16. --with-client  --with-all-static
Сборку клиента делал в 2х вариантах: UNICODE и не UNICODE.

msg="Это текст"
/usr/local/bin/nxevent -d -u user -P pass 1.1.1.1 SYS_TEST_OK "$msg"

*debug* SendMsg("CMD_GET_SERVER_INFO", id:0)
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:0)
*debug* SendMsg("CMD_LOGIN", id:1)
*debug* RecvMsg("CMD_LOGIN_RESP", id:1)
*debug* SendMsg("CMD_TRAP", id:2)
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:2)
*debug* Network receiver thread stopped

На сервер сообщение приходит без текста сообщения.

  ** 00130000000000800000000200000006
  ** 00000018000000000000000000000000
  ** 000000A9010000000000001600530059
  ** 0053005F0054004500530054005F004F
  ** 004B000019BE01000000000300BF0100
  ** 00000000281291090000012A01000000
  ** 0000000010F290090000005803000001
  ** 00008000010000000000000001000000
  ** code=0x0013 (CMD_TRAP) flags=0x0000 id=2 size=128 numFields=6
  ** [    24] INT32  0
  ** [   169] STRING "SYS_TEST_OK"
  ** [     3] INT32  0
  ** [   298] STRING ""
  ** [    88] INT16  1
  ** [ 32768] STRING ""

Использовал разные варианты LANG и iconv (-f utf8 -t cp1251, -f cp1251 -t utf8) на клиенте - не помогает.

Сделал в nxevent.cpp дополнительную отладку для вывода строки сообщения перед вызовом NXCSendEvent - мой  $msg присутствует в той кодировке, которая ушла из скрипта. Добавил оладку (dump)  перед отправкой сообщения в session.cpp Похоже теряется уже где-то внутри:

...
*debug* RecvMsg("CMD_LOGIN_RESP", id:1)
Message to be send: Это текст
*debug* SendMsg("CMD_TRAP", id:2)
*debug* Raw data:
  ** 00130000000000800000000200000006
  ** 00000018000000000000000000000000
  ** 000000A9010000000000001600530059
  ** 0053005F0054004500530054005F004F
  ** 004B6D7341BE01000000000300BF0100
  ** 0000000000A262080000012A01000000
  ** 00000000E88162080000005803000001
  ** 00008000010000000000000001000000
  ** code=0x0013 (CMD_TRAP) flags=0x0000 id=2 size=128 numFields=6
  ** [    24] INT32  0
  ** [   169] STRING "SYS_TEST_OK"
  ** [     3] INT32  0
  ** [   298] STRING ""
  ** [    88] INT16  1
  ** [ 32768] STRING ""
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:2)
...
При этом из Windows клиентов все работает (установка из готовой сборки 1.2.16).

Заранее спасибо
#4
Добрый день!

Небольшой вопросик.

Есть ли возможно разграничить уровень доступа пользователей/групп для просмотра только определенных событий (задать разрешенные EventCode для определенных пользователей/групп). Нужно для разделения функций мониторинга по юзерам (Network Group, Security Group, IT Group etc)?

Спасибо