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的一個庫函數——
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以及相關的軟體包的順序如下版本僅為舉例):
gd:一個處理圖片包括繪製文字)的軟體包;
freetype:gd解析字型檔用到的軟體包;
libpng:gd解析png圖片用到的軟體包;
jpeg:gd解析jpeg圖片用到的軟體包。
安裝方法舉例:
安裝方法
安裝freetype
#cd /data/software
#tar xzvf freetype-2.1.5.tar.gz
#cd freetype-2.1.5
#./configure --prefix=/usr/local/modules/freetype
#make
#make install
安裝libpng
#cd /data/software
#tar xzvf libpng-1.2.5.tar.gz
#cd libpng-1.2.5
#cp scripts/makefile.std makefile \\不要用--prefix自訂安裝目錄,影響gd的安裝
#make
#make install
安裝jpeg
#mkdir /usr/local/modules/jpeg6
#mkdir /usr/local/modules/jpeg6/bin
#mkdir /usr/local/modules/jpeg6/lib
#mkdir /usr/local/modules/jpeg6/include
#mkdir /usr/local/modules/jpeg6/man
#mkdir /usr/local/modules/jpeg6/man/man1
#cd /data/software
#tar xzvf jpegsrc.v6b.tar.gz
#./configure --prefix=/usr/local/modules/jpeg6 --enable-shared --enable-static
#make
#make install
安裝gd
#cd /data/software
#tar xzvf gd-2.0.33.tar.gz
#./configure --prefix=/usr/local/modules/gd --with- jpeg=/usr/local/modules/jpeg6 --with-png --with-zlib --with-freetype=/usr/local/modules/freetype
#make
#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編碼,就能順利繪製中文字串。在我的調試環境下,修改如下:
原函數:
gdImageString(map_image,gdFontSmall,x-(string_width/2),y-(2*string_height),(unsigned char *)buffer,text_color);
修改後:
gdImageStringFT(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);
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處理。這樣的字串編碼轉換函式網上有很多資源,在此限於篇幅不詳述。
- Nagios飛信linux下免費簡訊通知配置
- 網路管理關於Nagios配置痛點解析
- Linux系統的Nagios網路管理模組的實現
- 營運監控Nagios連載3:部署、配置Nagios服務
- 營運監控Nagios連載2:部署apache伺服器