易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 3787|回复: 0
收起左侧

Nagios中文显示问题的解决方案

[复制链接]
发表于 2017-12-14 20:43:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
Nagios的Status Map功能链接能够显示被监控的网络拓扑图,并在节点图片上面显示节点设备名。遗憾的是,默认的Nagios不支持中文。为此我研究了两天Nagios以及GD的源代码,终于找到了解决方案,详述如下:
解压缩Nagios中文源代码包(以nagios-3.0.3为例),实现绘制网络拓扑图的源代码文件是nagios-3.0.3/cgi/statusmap.c,编译安装后,这个文件对应nagios/sbin/statusmap.cgi,当你在Nagios中文运行界面点击左侧的“Status Map”链接时,服务器(apache、tomcat等支持CGI的服务器软件)调用可执行文件statusmap.cgi,实现在浏览器客户区中绘制网络拓扑图。
statusmap.c中负责绘制节点设备名的函数是void draw_text(char *buffer,int x,int y,int text_color),就在本文件中定义,它调用GD的一个库函数——1 K% ~/ G4 b5 Q  t1 {
gdImageString(map_image,gdFontSmall,x-(string_width/2),y-(2*string_height),(unsigned char *)buffer,text_color);来绘制节点设备名。
这里先简单介绍一下GD以及其他一些软件与Nagios的关系。Nagios处理图片(包括绘制文字)需要借助于GD,有些版本的Linux已经集成了GD,所以可以直接安装使用Nagios。安装GD以及相关的软件包的顺序如下(版本仅为举例):
0 Q2 q$ I+ ]0 ]- ]: f. `. Wgd:一个处理图片(包括绘制文字)的软件包;5 e" K8 k/ K# s$ O* w, _
freetype:gd解析字库用到的软件包;
7 G* W' G$ K+ K) i' z- jlibpng:gd解析png图片用到的软件包;
7 p) Z+ ~# F+ u# y+ Z, W; @' ljpeg:gd解析jpeg图片用到的软件包。
安装方法举例:
安装方法0 y/ v( c' e  Z  z$ X" {
安装freetype
' u- p1 V9 k! Y( Q2 l#cd /data/software
$ U% F2 X5 |4 l6 Y$ b2 E% N7 U#tar xzvf freetype-2.1.5.tar.gz0 L4 P" w8 m# v4 Q1 S$ h% g. Y
#cd freetype-2.1.52 }8 |: M/ I4 P% l* K, W  r( ]
#./configure --prefix=/usr/local/modules/freetype) u9 r" s) T: ~- w
#make
, A: \* v- d9 j& B#make install
安装libpng
( c) p. Y4 h, V4 ?) Y  H#cd /data/software
$ [* n8 s; J: I! e1 B7 V* d#tar xzvf libpng-1.2.5.tar.gz; r; o* O- _, _; L  C
#cd libpng-1.2.5
# ?# w0 d& X* D* L8 Y' |9 S#cp scripts/makefile.std makefile \\不要用--prefix自定义安装目录,影响gd的安装, d! Z7 |0 K8 l! D# u' _. T
#make
& I# l8 U! a6 _5 d8 w. J7 {#make install
安装jpeg
" G& W: o; \( [7 X9 L4 E#mkdir /usr/local/modules/jpeg6# x' \9 z# s& d1 Q! U
#mkdir /usr/local/modules/jpeg6/bin7 s0 e4 n. \! u1 p
#mkdir /usr/local/modules/jpeg6/lib3 |8 P" S; R7 F5 ^7 P4 M4 s* f
#mkdir /usr/local/modules/jpeg6/include- [4 |. L( Y9 N) S! s
#mkdir /usr/local/modules/jpeg6/man
% I) O+ d6 O6 ]+ \, K#mkdir /usr/local/modules/jpeg6/man/man1
2 @. T2 m: ]. O#cd /data/software: Y+ C  J- t) n
#tar xzvf jpegsrc.v6b.tar.gz
* N7 m. W* J3 ~& D( {( Q7 B#./configure --prefix=/usr/local/modules/jpeg6 --enable-shared --enable-static
, L9 C' R: w+ ?, b$ U, ?#make9 h! j5 N- N8 a. ]2 u! G
#make install
安装gd
: r( b+ \9 l; {" A* s#cd /data/software
. N3 B* l& W& ^" O1 x#tar xzvf gd-2.0.33.tar.gz
, J% m# E* P: g0 a2 @#./configure --prefix=/usr/local/modules/gd --with- jpeg=/usr/local/modules/jpeg6 --with-png --with-zlib --with-freetype=/usr/local/modules/freetype. ^& U- c4 `0 L& ?" X
#make# a  ?1 S9 D  v4 ^; Y& H
#make install
最后,在安装nagios时#./configure步骤加一组参数:--with-gd-lib=/usr/local/modules/gd/lib
原始的Nagios中文版不能绘制中文字符串,与GD的字库处理方式有关。GD有自己的字库文件(点阵形式、ASC码编码)。gdImageString的第二个参数即GD自己的字库的索引,第五个参数则是一个ASC编码的字符串。而GD自己的字库是不支持中文的。显然,大名鼎鼎的GD不可能只支持自己的字库,他用函数gdImageStringFT来支持用外部字库绘制utf-8编码的字符串,这里面包含了中文的支持。
gdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist,double ptsize, double angle, int x, int y, char *string),函数名中的“FT”就是freetype的意思,这个函数通过调用freetype包,支持解析.ttf格式(ttf是TrueType Font的缩写)的字库文件,只要找到Linux下的中文字库的位置,作为第四个参数传给该函数,并且保证char *string是utf-8编码,就能顺利绘制中文字符串。在我的调试环境下,修改如下:/ o+ n/ [0 H9 L- d% V
原函数:
+ n3 u' T" |- C  M' HgdImageString(map_image,gdFontSmall,x-(string_width/2),y-(2*string_height),(unsigned char *)buffer,text_color);6 T+ R" l; y0 G$ y
修改后:
, \: B( b" N4 N$ v) WgdImageStringFT(map_image,&brect[0],text_color,"/usr/share/fonts/zh_CN/TrueType/gbsn00lp.ttf",10,0.0,x-(string_width/2),y-(2*string_height),buffer);
8 C1 Q+ R& X# o# L. g(gdImageString和gdImageStringFT详细的功能和参数说明见GD安装包下的说明文档index.html)
由于Nagios是从配置文件中读取设备名字符串然后绘制到屏幕上,所以如果配置文件本身是utf-8编码,如上修改后,重装Nagios就可以顺利显示了。如果配置文件不是utf-8,那么可以通过两种方法解决:
第一种:将配置文件转成utf-8编码。这样不用再度修改源码,但个人不赞成这种方法,理由是:由于Nagios的CGI是用C写的,而C是基于ASC编码的,Nagios又没有借助第三方数据库,而是依赖于读写自己创建的大量配置文件和日志文件,其中用到很多基于ASC编码的字符串处理函数,虽然都是英文的,而英文的ASC编码和utf-8完全相同,但是如果将Nagios的相关文件都转成utf-8编码,可能会导致一些潜在的问题。
第二种:在gdImageStringFT之前加一个字符串编码转换函数,将读入的非utf-8编码字符串buffer转换成utf-8编码,再传给gdImageStringFT处理。这样的字符串编码转换函数网上有很多资源,在此限于篇幅不详述。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 01:06 , Processed in 0.050032 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表