Отправка сообщений nxevent в cp1251

Started by IFriendly, October 21, 2014, 08:21:24 PM

Previous topic - Next topic

IFriendly

Добрый день!

Помогите пожалуйста разобраться в причине почему не отсылается русский текст (кодировка 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).

Заранее спасибо

Victor Kirhenshtein

Проблема в том, что nxevent не выставляет code page, и внутренние функции вызывают iconv используя ASCII. Я добавлю возможность выставлять code page для утилит. Как workaround можно добавить в main() в nxevent строчку

SetDefaultCodepage("CP1251");

IFriendly

Виктор,

Спасибо за информацию, добавлю.
Отпишусь о результатах.

IFriendly

Сработало, спасибо.
Изменения nxevent.cpp через command_line

static TCHAR m_szCP[MAX_DB_STRING] = _T("");
//...
while((ch = getopt(argc, argv, "deho:P:T:u:c:vw:")) != -1)
//...
"   -c <codepage> : Specify codepage (default UTF8).\n"
//...
         case 'c':
#ifdef UNICODE
            MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, optarg, -1, m_szCP, MAX_DB_STRING);
            m_szCP[MAX_DB_STRING - 1] = 0;
#else
            nx_strncpy(m_szCP, optarg, MAX_DB_STRING);
#endif
            SetDefaultCodepage(m_szCP);
            break;
//...

Вызов:
nxevent -u user -P pass -c CP1251 1.1.1.1 SYS_TEST_OK "Это тест"

для нормального отображения символов в CL
LANG=ru_RU.cp1251
export LANG