View Full Version : Данные на русском языке
nitrogear
12-05-2009, 14:39
Через SNMPv2 получаю от устройства строку
SNMPv2-SMI::mib-2.43.16.5.1.2.1.1 = STRING: "Нет бумаги: Лоток 1"
Строка возвращается в юникоде, а в базу записываются такие данные: "??? ??????: ????? 1"
Таблица history_str, куда сохраняются данные имеет такую структура (выгружно pnpMyAdmin'ом):
CREATE TABLE `history_str` (
`itemid` bigint(20) unsigned NOT NULL default '0',
`clock` int(11) NOT NULL default '0',
`value` varchar(255) NOT NULL,
KEY `history_str_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В /etc/my.cnf прописано:
[client]
default-character-set=utf8
[mysqld]
init-connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci
OS: FreeBSD, Zabbix-v1.6.4, mysql-server-5.0.77
Подскажите как сделать чтобы сообщения на русском были читаемы?
Поддержки Utf8 еще нет у заббикса:)
soussine
06-07-2009, 11:26
Подскажите как сделать чтобы сообщения на русском были читаемы?
Если еще актуально проверь collate у поля value, д.б. utf-8
ALTER TABLE `history_str` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
nitrogear
06-07-2009, 12:27
Если еще актуально проверь collate у поля value, д.б. utf-8
ALTER TABLE `history_str` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
Структура таблицы такая:
CREATE TABLE `history_str` (
`itemid` bigint(20) unsigned NOT NULL default '0',
`clock` int(11) NOT NULL default '0',
`value` varchar(255) NOT NULL,
KEY `history_str_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Но как и писали выше, поддержки юникода в самих агентах еще нет.
soussine
06-07-2009, 13:18
Структура таблицы такая:
Но как и писали выше, поддержки юникода в самих агентах еще нет.
Перепутал SNMP c zabbix agent.
А в zabbix agent с utf-8 все ок нормально передает.
nitrogear
06-07-2009, 14:20
Перепутал snmp c zabbix agent.
А в zabbix agent с utf-8 все ок нормально передает.
Если локальные данные в юникоде агент отправляет нормально, то наверное он не умеет работать с юникод данными, получаемыми по snmp.
soussine
06-07-2009, 15:47
если локальные данные в юникоде агент отправляет нормально, то наверное он не умеет работать с юникод данными, получаемыми по snmp.
очень даже может быть.
сегодня потестирую.
soussine
06-07-2009, 16:33
Если локальные данные в юникоде агент отправляет нормально, то наверное он не умеет работать с юникод данными, получаемыми по snmp.
результаты тестирования пока получилсь весьма странные.
Тестировал на Ubuntu 8.04.3 LTS
в файле /etc/init.d/snmpd.conf
установил
syslocation Компьютер
и сохранил в utf8 кодировке
snmpwalk вот что дает.
root@ma2dy-laptop:~# snmpwalk -v 1 -c public 127.0.0.1 1.3.6.1.2.1.1.6.0
SNMPv2-MIB::sysLocation.0 = STRING: Компьютер
Т.е. все ок.
Везде стоит кодировка utf8 и в my.cnf тоже.Но у сервера zabbix вроде кодировка прописана в исходном коде.
Вставил item в zabbix.
получил его значение такое.
Компьютер
Уже ничего.
Хоть не вопросы.
А далее самое интересное.
Если сохранить файл в snmpd.conf в кодировке win-1251 то значения в базу будут писаться нормальные, т.е.
Компьютер
Буду дальше разбираться.Надо скомпилить zabbix_server c нуля с известными параметрами "set names XXX" и тестировать дальше.
nitrogear
06-07-2009, 21:11
Ждем результатов - тема очень актуальна
soussine
07-07-2009, 08:34
Ждем результатов - тема очень актуальна
Ок.
Ну с графиками и картами на русском я уже разобрался.
http://www.zabbix.com/forum/showthread.php?t=12227
nitrogear
07-07-2009, 14:27
ок.
ну с графиками и картами на русском я уже разобрался.
http://www.zabbix.com/forum/showthread.php?t=12227
с этим проблем нету ;-)
soussine
07-07-2009, 14:44
с этим проблем нету ;-)
кстати вопрос такой а что за аппарат ты мониторишь по snmp?
nitrogear
07-07-2009, 15:26
кстати вопрос такой а что за аппарат ты мониторишь по snmp?
Мониторю сетевые МФУ Gestetner DSm721 и DSm615. Они отдают в юникоде информацию:
snmpwalk -v1 -c public 10.0.0.44 SNMPv2-SMI::mib-2.43.16.5.1.2.1.1 | iconv -f utf-8 -t koi8-r
SNMPv2-SMI::mib-2.43.16.5.1.2.1.1 = STRING: "Готово"
Пока выкрутился с помощью value maps - настроил для каждого значения из вопросов его расшифровку. Однако это костыль, и хотелось бы решить вопрос "по-человечески".
Имеем следующее:
my.conf
default-character-set=utf8
character-set-server=utf8
init-connect="SET NAMES utf8"
Локаль UTF-8.
Zabbix 1.6.6
Все бы ничего, но письма на e-mail на русском языке приходят в виде вопросов.
Выяснил, что сервер заббикса пишет в базу в непонятной кодировке. Полез ковырять заббикс.
В файле /src/libs/zbxdb/db.c
закомментировал строки:
if (ZBX_DB_OK == ret)
DBexecute("SET CHARACTER SET utf8");
Сервер начал писать в базу нормально. Но заголовки письма приходят в виде XXXXXXXX.
Смотрим дальше.
Нужно закодировать заголовок письма в base64.
В файле /src/libs/zbxemail/email.c вставил кусок в 195-й строке
char *subj_base64=NULL;
char *tmp=NULL;
subj_base64=zbx_malloc(subj_base64,sizeof(char*)*s trlen(mailsubject));
tmp=zbx_malloc(tmp,sizeof(char*)*strlen(mailsubjec t)*2+20);
str_base64_encode(mailsubject,subj_base64,strlen(m ailsubject));
zbx_snprintf(tmp,sizeof(char*)*strlen(mailsubject) *2+19,"=?UTF-8?B?%s?=",subj_base64);
заменил строку
cp = zbx_dsprintf(cp, "From:<%s>\r\nTo:<%s>\r\nDate: %s\r\nSubject: %s\r\n"
"Content-Type: text/plain; charset=\"UTF-8\"\r\n\r\n%s",
smtp_email, mailto, str_time, tmp, mailbody);
что заменил показано жирным
и добавил ниже
zbx_free(tmp);
zbx_free(subj_base64);
Теперь все работает как надо!
Сам в СИ не силен да и времени нет разбираться, возможно сделал неоптимально. Кто силен, доработайте пожалуйста.